- 轻量级网站评论系统Commento安装教程 - 2024年8月25日
- CMS超级播放器artplayer、dplayer跳过片头片尾源码 - 2024年8月19日
- Google Adsense 申请记录 - 2024年8月14日
TCP四次挥手
在讲解tcp四次挥手之前我们也先来认识一下tcp首部中的某些字段:
ACK:只有该字段置1时ack(确认号)才有效
FIN:当该字段置1时用于请求释放连接
seq:序列号,表示该报文段的序号
ack:确认号,表示希望收到的下一个报文段,并且该报文段以前的报文已经收到
四次挥手
先来讲解一下大体的一个过程:(以客户端先主动释放连接为例)
一、 客户端释放连接,客户端进入FIN-WAIT1状态
二、 服务端收到tcp报文段,并发出确认 服务端进入CLOSE-WAIT状态
客户端收到确认后进入FIN-WAIT2状态。
这两个步骤完成后该tcp进入半关闭状态,即客户端到服务端的连接已经关闭,但有可能服务端需要向客户端发送数据,所以有可能需要等待服务端继续发送数据
三、 服务端释放连接 服务端进入LAST-ACK状态
四、 客户端收到该报文段,发出确认,客户端进入TIME-WAIT状态,在经过2MSL(最长报文段寿命)时间后进入CLOSED状态
服务端收到确认报文后也进入COISED状态。
为什么最后客户端需要等待2MSL的时间,原因有两个:
一、 保证客户端最后发送的确认报文段可以被服务端收到,使服务端顺利进入CLOSED状态。因为最后客户端发出的确认请求报文可能不能到达服务端,而2MLS的时间可以保证服务端重发释放连接的报文可以到达客户端,这样才能保证客户端确认报文一定可以到达服务端。
二、 防止已失效的连接请求报文。
2MLS时间可以让本报文段所产生的所有报文都从网络中消失。
具体过程:
一、 客户端将tcp头部 FIN置1,seq=u(u等于前面发送报文段序号+1),向服务端发送该报文,客户端进入FIN-WAIT1状态
二、 接收到客户端的报文后,将tcp头部ACK置1, ack=u+1,seq=v(v等于前面发送报文段序号+1),服务端进入CLOSE-WAIT状态
客户端收到确认报文后进入FIN-WAIT2状态,整个tcp连接进入半关闭状态
中间可能服务端依然向客户端发送数据
三、 服务端数据发送完成后,将tc头部FIN置1,seq=w(w等于v加上中间向服务端发送的数据),ack=u+1(这里需要注意),发送该报文段,服务端进入LAST-ACK状态
四、 客户端收到服务端报文后,将tcp头部ACK置1,ack=w+1,seq=u+1,发送该报文后客户端进入TIME-WAIT状态,再等待2MSL时间后进入到CLOSED状态。
服务端收到确认后也进入到CLOSED状态。
评论0