前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深入理解 TCP 协​议的握手和挥手

深入理解 TCP 协​议的握手和挥手

作者头像
算法与编程之美
发布2019-10-10 17:18:27
3120
发布2019-10-10 17:18:27
举报

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.

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法与编程之美 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档