1. 引言
TCP 协议是计算机网络 [1] 中运输层的重要协议,深入理解 TCP 协议能够帮助我们 更好的理解计算机网络的原理。而 TCP 协议在连接建立和连接释放的过程中,会经历 三次握手和四次挥手,期间各种状态的转变较为复杂,对于初学者来说,由于状态较 多,过程较为复杂,理解难度较大。本文将从通信双方的单个状态开始出发,结合图 形,详细分析状态转化流程,以帮助其深入理解握手和挥手协议。
2. 三次握手
TCP 的连接需要经历三次握手,假设通信双方 A 主动首先发起连接建立请求,如图1所示,A 向 B 发起连接建立请求 A_SYN,B 在收到后,发送确认 A_SYN_ACK 和 B 连 接建立请求 B_SYN,随后 A 收到 B 发送的连接建立请求后,发送其确认 B_SYN_ACK, 经历三次报文交换后,A 收到了 A_SYN_ACK,B 收到了 B_SYN_ACK,从而完成连接 的建立。
Figure 1
当 A 和 B 同时主动建立连接请求时如图 2,即 A 主动向 B 发送了 A_SYN,其 B 也 主动向 A 发送了 B_SYN,一段时间后,设 A 先收到来自 B 的连接建立请求 B_SYN, 此时 A 一方面对其进行确认 B_SYN_ACK,另一方面再次发送连接建立请求 A_SYN, 最后当 B 收到来自 A 的 A_SYN 后完成对 A 的确认 A_SYN_ACK 即可完成连接建立。这种情况下,A 发送了两次 A_SYN,A 和 B 之间就经历了四次握手。
Figure 2
最后来总结一下 A 和 B 之间的状态变化情况,如图 3所示,A 发送 A_SYN 后 进入了 SYN_SEND 状态,当收到来自 B 的 B_SYN 以及 A_SYN_ACK 后直接进入ESTABLISHED 状态,在 SYN_SEND 状态下,如果只收到了来自 B 的 B_SYN 后,则除 了发送 B_SYN_ACK 外,还需要再次发送 A_SYN 给 B,并进入 SYN_RECV 状态,一 段时间后,收到来自 B 的 A_SYN_ACK 确认信息后,才进入 ESTABLISHED 状态。
Figure 3
3. 四次挥手
通信双方 A 和 B,经过一段时间的通信后,已经完成了数据的传输,随后进入通信 结束阶段。当双方结束通信的时候,需要 AB 双方都发出通信结束标记 FIN 后,才是完 全关闭通信,即 A 需要向 B 发出 FIN,同时 B 也需要向 A 发出 FIN。但是需要注意的 是,AB 双方发出 FIN 的时机可以不一致,A 先 B 后或者 B 先 A 后,第一次发出 FIN 的称为主动关闭通信的一方。
Figure 4: 某时刻 A 向 B 发送了 FIN
假设某时刻 A 主动提出结束通信,A 向 B 发送了通信结束标记 FIN,如图 4所示,
然后 A 进入等待,后续 A 收到来自 B 的信息有三种情况:
(1) 同时收到 FIN 和 ACK。
Figure 5
(2) 先收到 ACK,再收到 FIN。
Figure 6
(3) 先收到 FIN,再收到 ACK。
Figure 7
接下来将讨论这三种情况下 A 的状态变化,如图 8所示,开始 A 所处的状态是 Established 连接建立状态,当发出 A_FIN 后进入了 FIN_WAIT_1 状态,然后就对应了 上面讨论的三种情况:
(1) 如果同时收到A_FIN_ACK和B_FIN时,则进入TIME_WAIT状态,如图斜线所示。(2) 如果先收到 A_FIN_ACK,则进入 FIN_WAIT_2 状态,然后收到 B_FIN 后进入
TIME_WAIT 状态,如左下方所示。
(3) 如果先收到 B_FIN,则进入 CLOSING 状态,然后收到 A_FIN_ACK 后进入
TIME_WAIT 状态,如右上方所示。
上述所有的 TIME_WAIT 状态下,经过 2 倍的报文传输超时后,自动进入 CLOSED 状态。
Figure 8
从上面的分析可知,A 的状态变化主要有三种路线:
(1) ESTABLISHED → FIN_WAIT_1 → TIME_WAIT → CLOSED
(2) ESTABLISHED → FIN_WAIT_1 → FIN_WAIT_2 → TIME_WAIT → CLOSED
(3) ESTABLISHED → CLOSING → TIME_WAIT → CLOSED
A 的状态变化较为复杂,接下来将介绍简单的 B 的状态变化,如图 9所示,B 在收到 A 发来的 A_FIN 后,发送 A_FIN_ACK 后就进入了 CLOSE_WAIT 状态,然 后发送 B_FIN 后进入 LAST_ACK 状态,最后收到确认后,进入 CLOSED 状态,即 EST ABLISHED → CLOSE_WAIT → LAST _ACK → CLOSED。
4. 结束语
针对计算机网络运输层常见的 TCP 协议中三次握手和四次挥手,状态较多过程较为复 杂,初学者在理解时难度较大等问题,提出一种从通信双方的单个状态出发,结合详 细的图例和文字描述,深入分析各种状态变化,较为清晰的阐述了握手、挥手的状态变 化。
参考文献
[1] 谢希仁. 计算机网络 (第七版). 电子工业出版社, 2017-01-01.