对照面试题理解tcp的三次握手四次挥手
面试题:
下列TCP连接建立过程描述正确的是:
A : 服务端收到客户端的SYN包后等待2*ml时间后就会进入SYN_SENT状态
B : 服务端收到客户端的ACK包后会进入SYN_RCVD状态
C : 当客户端处于ESTABLISHED状态时,服务端可能仍然处于SYN_RCVD状态
D : 服务端未收到客户端确认包,等待2*ml时间后会直接关闭连接
正确答案:C
解析:
A:SYN_SENT是客户端发送SYN包之后的立即进入的状态,不用等待2ml
B:服务端收到客户端的SYN包后会进入SYN_RCVD状态,服务端收到ACK包后会进入established状态。
C: 当客户端处于ESTABLISHED状态时,服务端等待接收客户端的ACK,所以可能处于SYN_RCVD状态。
D: 客户端收到服务端确认包后,等待2*ml时间后会直接关闭连接。若没有收到,则不会关闭连接。
三次挥手:
面试题解析:
三次握手如下:
(此图第三次握手的ack应该等于y+1,而不是y,上面看不太清楚,但不影响解这题)
四次挥手如下:
TCP四次挥手:
理解 “三次握手”,“四次挥手”
需要知道 “客户端”与 ”服务器端“
“主动方” 与“ 被动方 ” 之间的语言的含义是什么,才能在心里有个印象,才能去正确理解四次挥手的含义:
下图中有几个字段需要重点介绍下:
(1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
(2)确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。
(3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
(A)URG:紧急指针(urgent pointer)有效。
(B)ACK:确认序号有效。
(C)PSH:接收方应该尽快将这个报文交给应用层。
(D)RST:重置连接。
(E)SYN:发起一个新连接。
(F)FIN:释放一个连接。
重点:
需要注意的是:
(A)不要将确认序号Ack与标志位中的ACK搞混了。
(B)确认方Ack=发起方Req+1,两端配对。
四次挥手的总结:能看懂的就,看不懂的回看下面的解释吧:
第一二次挥手: 主动方发送一条连接, 初始确认 确认序号为Z 发送序号为X 被动方确认 确认序号为X+1,发送序号为Z
(只有ACK标志位为1时,确认序号字段才有效)
第三四次挥手: 被动方发送一条连接 , 初始确认 确认序号为X 发送序号为Y 主动方确认 确认序号为Y 发送序号为X
四次挥手博主自我理解: :依照上方各种单词的含义总结:
可以将四次挥手看成是两个人:
四次挥手分别是 第一 ,二次是主动方挥手,被动方挥手回应 ,第三 ,四次是被动方主动挥手,,主动方挥手回应
1:(FIN:释放一个连接。) 2:确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。 3:序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记
第 一: 主动方---》发送Fin+Ack 报文,并发送序号为X
第一次挥手:主动方发送 :Fin=1 Ack=Z Seq=X
简单理解: 1.主动方释放一个连接 Fin=1 2.主动方发送一个待被动方接受的标志ACK=Z (等待被动方接受,并以序号的方式发回到主动方) 3. 主动方发送一个待确认的seq的序号 X(表示此序号是从TCP 的{”主动方“} 向 {”被动方“}发送的seq序号)等待被动方确认
第 二: 被动方---》发送Ack 报文,并置发送序号为Z 再确认序号为X+1
第二次挥手 : 被动方发送:ACK=X+1 Seq =Z
简单理解: ACK=X+1 指被动方确认主动方发送的序号 X 并 +1 回应主动方(只有ACK标志位为1时,确认序号字段才有效,)
Seq = Z 接受主动方发送的带接受的标志并将序号命名为Z
第三,四的挥手跟一二的相反
;;;;: 三:被动方---》 发送Fin+Ack 报文,并发送序号为Y
四:主动方---》 发送Ack 报文,并置发送序号为X 再确认序号为Y