TCP的三次握手与四次挥手学习笔记
TCP的三次握手与四次挥手学习笔记
参考资料
1. 三次握手
1.1 三次握手的流程
SYN为1代表这是一个建立链接的请求
ACK代表确认序号是有效的,即接收到之前报文的序号是正确的
序号、确认序号:
TCP开始,客户端初始化时请求报文随机生成一个序号c
服务端收到序号后,设置确认序号为c+1
同时服务端设置序号为s
客户端收到后,设置确认序号为s+1
设置序号为c+1
此阶段报文可以发送数据,上面两个阶段报文处于未确认连接阶段。
1.2 为什么要三次握手
两次握手,可以证明通信是可达的。
此时服务端已经确认了来自客户端的client-isn序号
但是客户端还未确认来自服务的的server-isn序号
所谓SYN,就是Synchronize的缩写,它之所以只存在在建立连接的阶段,是因为它存在的目的就是为了同步客户端和服务端的初始序号。这个序号是随机生成的,所以需要去确认。
如果未进行第三次握手,这个时候去通信,因为SYNACK报文的缺失,客户端并不知道server-isn,则无法完成通信。
2. 四次挥手
2.1 挥手状态
时间 | 状态(客/服) | 有无发送功能(断开方/被动方) |
---|---|---|
第一次 | FIN1 | 1/1 |
第二次 | ACK1 | 0/1 |
第三次 | FIN2 | 0/1 |
第四次 | ACK2 | 0/0 |
在第四次时,主动断开方也收到了被动断开方的断开报文,会回复一个ACK到被动断开方。被动断开方确认后,会释放相关的资源;主动断开方会在发送后等待一段时间(半分钟、一分钟或两分钟),再释放资源。
2.2 为什么要等待一段时间后再释放
-
因为第三次挥手时,会回送一条报文(第四次挥手)。第四次挥手时,如果出现损坏、丢失或超时,导致被动断开方收不到ACK,那么被动断开方会再次发送一次FIN到主动断开方(重新开始第二次挥手)。如果主动断开方此时已经释放资源,则无法处理这次请求。因此不能立即释放资源!
-
另一个原因,是在断开之后,可能还会存在一些断开之前还在进行的网络传输。如果此时又建立了一个新的,端口和IP都一样的连接,那么遗留的网络报文此时会被当作新连接的报文做处理,这中不确定性会导致一些不可预估的问题。因此要在断开后,等待所有的传输都死掉,才释放资源。(未释放资源时,无法以同一IP和端口创建新连接)
2.3 为什么需要四次挥手
TCP连接是全双工的,即双方都可以主动发送报文。如果某一方断开连接,代表这一方不会再发送数据到另一方。但是不代表,另一方就不会再发送数据到断开方了。所以,一定要双方都确认断开才行。