TCP三次握手和四次挥手是可靠传输的保证。
三次握手和四次挥手的过程:
TCP有限状态机:
![](https://i-blog.csdnimg.cn/blog_migrate/4586e9f98c2d160c62342431a9839212.png)
三次握手
建立连接有三步:
1.Client发送SYN至Server
2.Server收到SYN之后,对此SYN进行回应:发送包含ACK和SYN的数据包至Client。
3.Client也对此SYN进行回应,发送ACK至Server。
四次挥手
释放连接有四步:
1.客户端发送FIN至Server。
2.Server对此FIN进行回应:发送ACK给Client。
3.Server也请求关闭连接,发送FIN给Client。(这时FIN和ACK分开,而三次握手中SYN和ACK为同一个包)
4.Client对FIN进行回应:发送ACK至Server。
seq和ack设置原则
起初seq为随机值。之后发送的seq为上一个发送的数据包seq值+1
ack对上一个收到的数据包进行回应,为上一个收到的数据包seq值+1。
若连续发送多个包,则ack不变,依然为上一个收到的数据包seq值+1。seq每一次都自增。
小贴士
注意观察Client和Server的状态变化。
问答环节
为什么会有TIME_WAIT这种状态?为什么要等待两倍报文段寿命后才Close?
参考文档:https://zhuanlan.zhihu.com/p/40013724
主要是为了解决最后FIN的ACK没有收到的情况(比如网络拥塞)。
来看看后果:如果过早的变成Close,但是对方还没有收到ACK,就一直处在LAST_ACK状态。这个时候如果再建立一个连接,发送SYN,对方觉得这是异常,收到的应该是ACK。这时候就会发送RST,连接失败。
来看看作用:超时后,"被动关闭方"如果超时没有收到FIN的ACK,就会重发一遍FIN,收到ACK后连接正常关闭。注意这时候有一方还是会处于TIME_WAIT状态,等待超时。
所以并不是所有的超时都是一场,TIME_WAIT超时后大概率说明对方收到了ACK,连接已经正常关闭了。