本文共 787 字,大约阅读时间需要 2 分钟。
看图就明了 这里主要说明一下 为什么TCP建立连接不是4次 很简单 因为TCP是全双工,所以服务端接收到请求后可以将ACK和SYN一起发送,客户端最后只需要一次ACK 至于问为什么不是2次的。。。。。。。。。。。。。。 下面会说既然是全双工为什么挥手要4次不是3次
上面既然说了TCP是全双工,为什么断开连接不是3次而是4次?
看看具体过程第一次:客户端发送FIN,状态变为FIN_WAIT1
第二次:服务端接收到断开请求,发送ACK ,状态变为CLOSE WAIT,客户端变为FIN_WAIT2
重点来了,第二次的时候服务端为什么不直接FIN+ACK?因为服务端不知道客户端什么时候会突然发送一个FIN,在接收到客户端第一次发送的FIN之前可能正好服务端write了一条正常数据,所以服务端需要等这条数据的ACK,不能接收到客户端的FIN后直接发送FIN+ACK。所以只能先发个ACK给客户端了第三次:服务端发FIN,状态变为LAST-ACK
第四次:客户端发送ACK 状态变为TIME_WAIT
- 为什么服务端发送FIN后客户端需要等待2MSL才能从TIME_WAIT转为CLOSED? TCP协议设计时考虑到了很多因素,为什么客户端不在接收到服务端的最后一次FIN后发送ACK直接变为CLOSED呢? 首先需要知道: 每个数据包能保持 1MSL 时长的寿命。 客户端最后发送的ACK也许没有被服务端接收到,过一段时间后服务端尝试重新发送FIN,如果没有这个TIME_WAIT,也许客户端建立新连接后又收到了服务端的上一次的FIN和这次的SYN的ACK(老的FIN+新的ACK),这时客户端发现SEQ对不上了,发送RST请求复位。新的连接无法建立,报错终止。 等待2MSL就是为了保证不会出现上面这种情况。
转载地址:http://xtlsi.baihongyu.com/