TCP协议三次握手和四次挥手
2021-07-13 20:52:17 21 举报
TCP三次握手和四次挥手状态变化
作者其他创作
大纲/内容
接收到FIN之后会立即回复一个ACK,且携带序号seq为服务端最后一次发送的数据包的序号+1,发送ACK之后处于半关闭状态。此时TCP服务会通知上层应用,即将关闭连接,是否还有数据要发送。此时客户端已经不会再发数据,但是服务端还是需要向客户端发数据。
接收到第三次握手之后
主动监听
CLOSED
注意:在握手和挥手的时候会有一个ACK和ack,前一个是一个位,是确认位;第二个是号码,是确认号
发送剩下的报文段
开始连接服务器
SYN_SENT
等待2MSL
第三次握手之后
客户端项服务端发送SYN以及自己的初始序号之后状态变为SYN_SENT消息发送完毕之后客户端确认了自己的发送能力正常
发送FIN
接收到服务端的FIN报文后,客户端会向服务端发送ACK报文段,完毕之后进入TIME_WAIT状态,会等待2MSL之后才关闭,MSL是最长报文段寿命(Maximum Segment Lifetime)
客户端
SYN_REVD
接收到FIN,并发送ACK
服务端
通知应用层将要释放连接了
1. 需要保证服务端的剩下的报文段能完整的发送过去2. 需要保证整个连接中产生的报文段消失3. 需要保证双方都能完整的释放掉当前连接的相关资源
ESTABLISHED
接收到ACK
为了保证最后的ACK能到达服务端,因为ACK报文段有可能丢失。,如果服务端没有接收到ACK报文段,会超时重传FIN,当A收到后,就可以重新发送ACK。另外一个就是可以让整个连接持续时间内所产生的的报文段都在网络中消失。
(1)socket通过系统调用socket建立一个连接,并绑定到一个fd上(2)bind将这个socket返回的fd绑定一个端口号(3)listen开始监听这个端口号(4)accept接收来自这个端口号的连接,并为这个连接生成一个新的Socket并分配新的fd
接收到客户端的ACK之后就可以直接关闭连接了。
接收到服务端的消息时,确认了服务端接收消息的能力和发送消息的能力正常的,自己的接收消息的能力也是正常的。至此,客户端可以确认双发的消息发送和接收能力都是正常的向服务端发送SYN=0,以及自己的初始序号+1,以及服务端的初始序号+1,表示客户端也同意连接,那我们就连接吧之后状态变为ESTABLISHED且第三次握手可以携带应用数据
CLOSED_WAIT
FIN_WAIT_2
接收到客户端消息是,服务端确认了客户端的发送消息的能力和自己的接收消息的能力是正常的向客户端返送自己的初始序号,以及客户端发送的初始序号+1,向客户端表示自己接收到了你的连接请求,并同意了你的连接请求,并向客户端发起连接请求发送之后状态变为SYN_REVD发送完毕之后,服务端确认了自己的发送消息的能力是正常的
LAST_ACK
TCP设有一个保活计时器,当接收到一个客户端的报文段,就重置这个计时器。如果超过这个计时器还没收到报文段,则发送一个探测报文段,之后每隔75秒发送一个,如果连续发送10个探测报文段后还是没有反应,则可以确认客户端出现了问题,就可以关闭这个连接。
LISTEN
客户端发送关闭连接请求,之后会停止发送数据,seq序号的值是最后一次发送的数据的序号+1,此时虽然没有携带数据,也会消耗一个序号
中间的服务端发送的ACK和FIN能否合并在一起?不行,因为,需要先发送一个ACK报文段,告诉客户端我收到了你的释放连接的请求,我也同意了。但是之后会将剩下耳朵报文段发送过去,中间可能隔了好几个报文段。
FIN_WAIT_1
如果服务端已经没有向客户端发送的数据了,应用程序就会通知TCP程序,可以发送释放连接了,此时发送的序号为其他序号(因为处于半关闭状态期间有可能还会发送数据包,序号是不一定的),还会携带上次ACK的客户端序号+1作为确认号码。发送完毕之后进入LAST_ACK状态。
回应客户端
TIME_WAIT
收到确认之后,进入FIN_WAIT_2状态,并等待接收服务端的释放报文段
接收到客户端的消息时,确认了客户端的接收消息的能力也是正常的,至此,服务端可以确认双方的发送和接收消息的能力都是正常的
\t在关闭连接的时候,因为需要关闭资源,所以需要谨慎,必须需要双方都确认关闭才能释放资源。
收藏
0 条评论
下一页