理解TCP三次握手、四次挥手过程及TIME_WAIT状态产生和其原因

理解TCP三次握手、四次挥手过程及TIME_WAIT状态产生和其原因_第1张图片 TCP三次握手、四次挥手及阶段状态
理解TCP三次握手、四次挥手过程及TIME_WAIT状态产生和其原因_第2张图片

上图中有几个字段需要重点介绍下:
(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,两端配对。 (大写ACK表示报文中的一个标志位)

TIME_WAIT状态产生:
Client发送最后一个ACK,进入TIME_WAIT状态。此状态持续2MSL时间后,返回Closed状态,即TCP连接彻底断开。在TIME_WAIT的2MSL时间内,不能基于此连接的四元组client_ip、client_port、server_ip、server_ip重新创建新的TCP连接。 MSL:任何IP数据包能够在因特网中存活的最长时间。RFC 1122中的建议值是2min,不过源自Berkeley的实现传统上改为30s。

TIME_WAIT状态存在的原因:
1.保证TCP全双工连接的可靠释放:四次挥手client最后一个ACK可能丢失,那么server必须重发FIN,在该FIN到达之前,client必须维护连接状态2MSL,这样才能保证client能够收到server重发的FIN,后client重发ACK后,经过2MSL时间周期没有再收到另一方的FIN之后,该TCP连接才能恢复初始的CLOSED状态。
2.允许老的重复分节在网络中消逝 :如果在TCP连接中缺少维护TIME_WAIT状态这一操作,我们在关闭TCP1连接后,立刻基于TCP1四元组建立新的连接TCP2(TCP2称为TCP1的化身),TCP协议栈并不能区分TCP1和TCP2的区别,那么TCP1的数据就可能被TCP2处理,显然这样是错误的,因此维持TIME_WAIT状态2MSL时间,足够让TCP1上的重复分解在网络中消逝。
全双工:
a.单工:单方向的数据传输。
b.半双工:允许数据在两个方向传输,但是某一时刻只允许单方向的数据传输。
c.全双工:允许双向通信,某一时刻可以同时接收和发送数据。

你可能感兴趣的:(自己学习)