TCP三次握手、四次挥手及特殊情况总结
前言
TCP协议是一个非常重要的传输层协议,它是一个基于连接的、具有可靠性的数据流协议。
TCP三次握手
流程
- 发送方向接受方发送
SYN
,进入SYN_SENT
阶段。 - 接受方收到后若接受连接请求,向发送方发送
SYN ACK
,进入SYN_RCVD
阶段。 - 发送方收到后,向接受方发送
ACK
,进入ESTABLISHED
阶段。 - 接受方收到ACK后进入
ESTABLISHED
阶段。
为什么是三次握手而不是两次或是四次?
- 三次握手是保证连接的最少次数。
- 如果是两次连接:
- 不能有效防止洪范攻击,没有半连接队列,无法连接数量进行控制;
- 假定当前网络状况不佳,A向B发送了SYN请求连接,此时因网络原因阻塞造成超时。A重发SYN,B收到后建立起连接并传输数据后关闭,此时之前阻塞的SYN再次到达B,B会以为A又要建立连接。
TCP连接的特殊情况
这种情况是极为少见的,发送方和接受方几乎同时发起连接请求,此时并不会建立起两条连接,而是会经历四次交互。
TCP四次挥手
流程
- 发送方向接受方发送
FIN
,进入FIN_WAIT1
阶段。 - 接受方收到后向发送方发送
ACK
,进入CLOSE_WAIT
阶段。 - 发送方收到后进入
FIN_WAIT2
阶段。此时链路进入到一个半双工阶段,接受方仍可以向发送方发送数据。 - 接受方准备好关闭连接后,向发送方发送
FIN
,进入LASR_ACK
阶段。 - 发送方收到后,向接受方发送
ACK
,进入TIME_WAIT
阶段,等待2MSL后关闭连接。 - 接受方收到ACK后就进入了
CLOSED
阶段。
为什么是四次挥手?
TCP协议是一个全双工协议,当收发双方中一方关闭了连接,进入半双工状态,仍能向对方发送数据。
为什么要等待2MSL?
2MSL(Maximum Segment Lifetime)
连接化身:在关闭一个TCP连接后,马上又重新建立起一个相同五元组的连接,后一个连接被称为前一个连接的化身。
1.确保最后一个ACK能到达接受方。
若发生超时,可以及时补发ACK
2.让延时的报文在网络中消失。
在2MSL内不允许一个新的连接化身建立,因为这样之前延时的报文会发送到新的连接上,发生混乱。
特殊情况
同建立连接时的特殊情况类似,收发双方几乎同时关闭连接,此时会有一个新的状态CLOSING
。
总结
以上简单介绍了一下TCP三次握手、四次挥手以及一些常规问题,特殊情况的总结。