计算机网络面经+复习
1.协议总览
五层协议的体系结构主要包括:应用层、运输层、网络层,数据链路层和物理层。
OSI七层协议模型主要包括是:应用层(Application)、表示层(Presentation)、会话层(Session)、运输层(Transport)、网络层(Network)、数据链路层(Data Link)、物理层(Physical)。
2.TCP/UDP
UDP | TCP | |
是否连接 | 无连接,减小开销和发送数据的延迟 | 面向连接,需要先握手 |
是否可靠 |
不可靠:尽最大努力交付,不需要维持复杂的连接状态表 |
可靠:无差错,不丢失不重复,按序到达 |
连接对象个数 | 支持一对一,多对一,一对多 |
只支持一对一(点对点): 通信双方能在任何时候彼此发送数据,两端都设有发送缓存和接受缓存 |
传输方式 | 面向报文 | 面向字节流:把应用层交付的数据看作无结构的字节流 |
首部开销 | 8字节 | 20字节 |
场景 | 实时应用(IP电话,视频会议,直播等) | 可靠传输(文件传输) |
运行在TCP的协议:
-
HTTP(Hypertext Transfer Protocol,超文本传输协议)
,主要用于普通浏览。 -
HTTPS(HTTP over SSL,安全超文本传输协议)
,HTTP
协议的安全版本。 -
FTP(File Transfer Protocol,文件传输协议)
,用于文件传输。 -
POP3(Post Office Protocol, version 3,邮局协议)
,收邮件用。 -
SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)
,用来发送电子邮件,很多邮件服务器都是这个协议。 -
TELNET(Teletype over the Network,网络电传)
,通过一个终端(terminal)
登陆到网络。 -
SSH(Secure Shell,用于替代安全性差的TELNET)
,用于加密安全登陆用。
运行在UDP的协议:
-
DNS(Dynamic Name Service,域名服务)
,将主机名解析成IP地址。 -
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)
,动态配置IP地址。
3.1 TCP
(1)序号:seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
(2)确认序号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。
(3)保留字段:供以后使用,暂时为0
(4)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
- ACK:ACK=1时,确认号才有效,ACK=0时无效
- FIN:FIN=1时,表示发送端的数据已经发送完毕,释放连接。
- PSH(push):PSH=1时,TCP会尽快交付给应用程序而不再等到缓存填满再交付。
- RST(reset):RST=1时,表明连接中出现严重差错,应重新连接。
- SYN:SYN=1时,表示这是一个连接请求或连接接受报文。
- URG:当URG=1时,紧急指针(urgent pointer)有效。
(5)允许对方发送的数据量
3.2 UDP
注:伪首部
- 计算校验和需要在UDP数据报之前增加12字节的伪首部。
- 伪首部仅仅是为了计算校验和,不向下传送也不向上递交。
- 这样的校验和,既检查了UDP数据报,又对IP数据报的源IP地址和目的IP地址进行了检验。
- 伪首部供12个字节
4. TCP三次握手和四次挥手
一个TCP连接由一个4元组构成,分别是两个IP地址和两个端口号。
4.1 三次握手
三次握手的本质是确认通信双方收发数据的能力
第一次握手:测试客户端的发送能力和服务端的收件能力
第二次握手:客户端发送能力和服务端的收件能力得到肯定;开始测试客户端的收件能力和服务端的发件能力
第三次握手:客户端的收件能力和服务端的发件能力得到肯定。握手成功
第一步:客户向服务器:SYN=1(表示这是一个建立连接请求),序号seq=x(随机)
第二步:服务器向客户:SYN=1,ACK=1,seq=y(随机),ack=x+1
第三步:客户向服务器:ACK=1,seq=x+1(第一次握手时发送报文是占据一个***的,所以这次seq就从x+1开始,需要注意的是不携带数据的ACK报文是不占据***的,所以后面第一次正式发送数据时seq还是x+1),ack=y+1
4.2 四次挥手
四次挥手的目的是关闭一个连接
比如客户端初始化的***ISA=100,服务端初始化的***ISA=300。TCP连接成功后客户端总共发送了1000个字节的数据,服务端在客户端发FIN报文前总共回复了2000个字节的数据。
第一步:客户向服务器:FIN=1(释放连接请求),seq=1101(100+1+1000,其中的1是建立连接时占的一个***)。需要注意的是客户端发出FIN报文段后只是不能发数据了,但是还可以正常收数据;另外FIN报文段即使不携带数据也要占据一个***。
第二步:服务器向客户:ACK=1(确认收到),ack=1102,seq=2300(300+2000)。此时服务端处于关闭等待状态,而不是立马给客户端发FIN报文,这个状态还要持续一段时间,因为服务端可能还有数据没发完。
第三步:服务器向客户:FIN=1,ACK=1,ack=1102,seq=2350(2300+50)。服务端将最后数据(比如50个字节)发送完毕后就向客户端发出连接释放报文
第四步:客户向服务器:ACK=1,,ack=2351,seq=1102。注意客户端发出确认报文后不是立马释放TCP连接,而是要经过2MSL(最长报文段寿命的2倍时长)后才释放TCP连接。而服务端一旦收到客户端发出的确认报文就会立马释放TCP连接,所以服务端结束TCP连接的时间要比客户端早一些。
4.3 常见面试题
为什么TCP连接的时候是3次?4次不可以吗?
1.1 A发送 SYN + seq(X)给B
1.2 B回复 ACK + ack(X+1),记录X到本地
1.3 B发送 SYN + seq(Y)给A
1.4 A回复 ACK +seq(X+1) + ack(y+1),记录Y到本地
其中1.2和1.3可以合并为一步,四步冗余了。
为什么TCP连接的时候是3次?2次不可以吗?
1.1 A发送 SYN +seq(X)
1.2 B回复 SYN + seq(Y) + ack(X+1)
B无法知道A是否收到了,如果第二封丢失了,B认为连接已经开启,A认为没有开启并且不知道B的seq(Y)。所以需要A再给B回复确认自己已经收到。
三次握手丢包情况
第一个包丢失,B没收到:A会周期性超时重传,直到收到B的确认
第二个包丢失,A没收到:B会周期性超时重传,直到收到A的确认
第三个包丢失:A发完包会单方面认为连接建立,B却不知情
a.双方都没有数据发送:B会超时重传,直到收到A的确认
b.A有数据发送,B收到之后自动开启连接
c.B有数据发送:数据发送不了,因为B不知道是否建立连接。会一直超时重发第二个包直到收到连接建立的确认
如果已经建立了连接,但是客户端突然出现故障了怎么办?
TCP设有一个保活计时器,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。