之前的项目里用到了TCP进行网络通讯,这里把TCP的建立连接与断开的机制总结一下。
TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,位于IP层之上,应用层之下的中间层。http协议同样是基于TCP协议进行的实现。
建立连接——三次握手
1)客户端发送带有SYN标志的报文到服务器,申请建立连接。
2)服务器接收到SYN标志报文后,向客户端回复一个带ACK标志和SYN标志的报文。其中ACK标志表示同意建立连接,SYN表示再次询问客户端是否准备建立连接。(由于网络通讯并不一定非常稳定,可能会有较长时间的延迟,服务器回复的SYN报文可以认为是服务器确定客户端是否还在等待建立连接的作用)
3)最后客户端回复一个带ACK标志的TCP报文,表示客户端仍在等待建立连接,并没有因为超时等原因而关闭,服务端接收到确认报文,即开启一次连接。
断开连接——四次握手
1)A发送带FIN标志的报文给B,表示申请关闭连接。此时发起者A进入FIN-WAIT-1状态。
2)B接收到FIN报文后,首先会回复一个ACK报文,A在接收到ACK后会关闭向A发送数据的连接,但还会接收B发送的数据。此时A进入FIN-WAIT-2状态,TCP是单向关闭的。
3)当B发送完关闭之前需要发送的其他数据之后,最后会向A发送一个FIN标志的报文,表示B也准备进行关闭。此时B的状态为LAST-ACK,等待A进行确认。
4)A收到FIN后,向B回复ACK,A进入TIME-WAIT状态。等待2MSL时间后,A关闭,进入CLOSE状态。
MSL:Maximum Segment Lifetime英文的缩写,中文可以译为“报文最大生存时间”,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。
这里2MSL及等待2倍的报文最大生存时间,等待2MSL时间是怕第4步中的ACK报文B没有收到,而如果B没有收到最后的ACK报文,则会重发第3步中的FIN报文,A在再次接收到FIN报文后可以再回复一次ACK报文。在TIME_WAIT状态时两端的端口不能使用,要等到2MSL时间结束才可继续使用。
参考文章:这里