|
|
51CTO旗下网站
|
|
移动端

一组图带你读懂TCP连接的终止——四次挥手的原理~

TCP是一个面向连接的协议,无论哪一方向另一方发送数据之前,都必须先在双方之间家里一条连接。今天讲讲TCP连接的终止,也就是我们平时说的四次挥手。

作者:YAWEN来源:思科CCIE俱乐部|2019-07-26 07:02

TCP是一个面向连接的协议,无论哪一方向另一方发送数据之前,都必须先在双方之间家里一条连接。

而建立一个TCP连接需要三次握手,这个我在昨天的文章中已详细说明,这里就不提了。

还没看过的同学看这里👇

为什么TCP 要采用「3次握手」建立连接?1个例子教会你~

今天讲讲TCP连接的终止,也就是我们平时说的四次挥手。

这是由于TCP的半关闭 ( half-close)造成的。

因为一个TCP连接时全双工(即数据在两个方向上能同时传递),因此每个方面必须单独地进行关闭。

需要注意的是,收到一个FIN 只意味着在这一方向上没有数据流动,但一个TCP连接在收到一个FIN之后仍能发送数据。

TCP 连接终止过程,如图1所示 :

  • TCP 客户端发送一个FIN ,用来关闭从客户端到服务器的数据传送;
  • 当服务器收到这个FIN ,它发回一个ACK ,确认序号为收到的序号加1 。一个FIN 也将占用一个序号;
  • 服务器程序首先传送一个文件结束符,然后服务器关闭它的连接,发送一个FIN 到客户端;
  • 客户端回复一个确认。

最大报文段长度(MSS)表示TCP 传往另一端的最大块数据块的长度。当建立一个TCP连接时,每一方都有用于通告它期望接收的MSS选项 ( MSS选项只能出现在SYN报文段中) 。

如果一方没有接收到来自另一方的MSS值,则 MSS就定为默认值536字节(这个默认值允许20 字节的IP 首部和20字节的TCP首部以适合576 字节的IP数据报)。

MSS让主机限制另一端发送数据报的长度,加上主机也能控制它发送数据报的长度,这将使以较小MTU接收到一个网络上的主机避免分段。

图1

半连接:TCP 连接的一端在结束它的发送之后还能接收到来自另一端数据的能力。

TCP 的状态变迁图(如图所示):

ESTABLISHED状态是连接双方能够进行双向数据传送的状态。

当 SYN_RCVD(图中SYN 收到)状态是从LISTEN状态(正常情况)进入,而不是从SYN_SENT状态(同时打开)进入时,从SYN_RCVD回到 LISTEN状态变迁才是有效的。

这意味着如果执行被动打开(进入LISTEN),收到一个SYN,发送一个带ACK的 SYN(进入SYN_RCVD),然后收到一个RST,而不是一个ACK,便又回到LISTEN状态并等待另一个连接请求的到来。

TIME_WAIT状态也成为2MSL等待状态。

当 TCP 执行一个主动关闭,并发回最后一个ACK ,该连接必须在TIME_WAIT状态停留 的时间为2倍的MSL 。

这样可让TCP再次发送最后的ACK以防这个ACK丢失(另一端超时并重发组后的FIN )。

一个 socket对(即包含本地IP 地址、本地端口、远端IP 地址和远端端口的4 元组)在TCP连接处于2 MSL 等待期间,将不能再次被使用。

尽管许多具体的实现中允许一个进程重新使用仍处于2 MSL 等待的端口(通常是设置选项SO_REUSEADDR),但TCP 不能允许一个新的连接建立在相同的插口上。

无论何时一个报文段发往基准的连接(即,由目的IP地址和目的端口号以及源IP地址和源端口号指明的连接)出现错误,TCP都会发回一个复位报文段。

异常终止(发送一个复位(RST )报文段而不是FIN 来中途释放一个连接)一个连接对应用程序来说有两点好处:

  • 丢弃任何待发数据并立即发送复位报文段;
  • RST 的接收方会区分另一端执行的是异常关闭还是正常关闭。在正常关闭的情况,需要在所有排队数据都已发送之后才发送FIN 。因此,正常情况下没有任何数据丢失。

Socket API通过“ linger to close选项”(SO_LINGER)提供这种异常关闭的能力。

如果一方已经关闭或异常终止连接而另一方却还不知道,这样的TCP 连接成为半打开(Half-Open)的。

任何一端的主机异常都可能导致这种情况的发生。

只要不打算在半打开连接上传输数据,仍处于连接状态的一方就不会检测另一方已经出现异常。

发生半打开连接的另一个常见原因是,当客户主机突然掉电而不是正常的结束客户应用程序后在关机。

TCP 连接在同时打开的情况下,仅建立一条连接而不是两条连接。

下图显示了同时打开期间报文段的交换。

两端几乎在同时发送SYN ,并进入SYN_SENT状态。

当每一端收到SYN时,状态为SYN_RCVD,同时它们都再发送SYN并对收到的SYN进行确认。

当双方都收到SYN及相应的ACK时,状态都边前卫ESTABLISHED。

因此,一个同时打开的连接需要交换4个报文段。

同时关闭 :当应用层发送关闭命令时,两端均从ESTABLISHED变为 FIN_WAIT_1。

这将导致双方各发送一个FIN,两个FIN 经过网络传送后分别到达另一端。

收到FIN后,状态由FIN_WAIT_1变迁到CLOSING,并发送最后的ACK。

当收到最后的ACK时,状态变化为TIME_WAIT。

下图总结了这些变化。

再如下图,显示了当前TCP选项的格式,这些选项的定义来自于RFC 793和RFC1323 。

每个选项的开始是1字节kind字段,说明选项的类型。

好了,今天的分享就到这了。

【编辑推荐】

  1. TCP/IP,你必知必会的十个问题
  2. 你猜一个TCP连接上面能发多少个HTTP请求?
  3. TCP/IP 协议就是传输洋葱?一文带你深入了解
  4. 为什么TCP 要采用「3次握手」建立连接?1个例子教会你
【责任编辑:赵宁宁 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

订阅专栏+更多

16招轻松掌握PPT技巧

16招轻松掌握PPT技巧

GET职场加薪技能
共16章 | 晒书包

326人订阅学习

20个局域网建设改造案例

20个局域网建设改造案例

网络搭建技巧
共20章 | 捷哥CCIE

651人订阅学习

WOT2019全球人工智能技术峰会

WOT2019全球人工智能技术峰会

通用技术、应用领域、企业赋能三大章节,13大技术专场,60+国内外一线人工智能精英大咖站台,分享人工智能的平台工具、算法模型、语音视觉等技术主题,助力人工智能落地。
共50章 | WOT峰会

0人订阅学习

读 书 +更多

UNIX到Linux的移植

本书讲述怎样把UNIX环境下的应用程序移植到Linux环境上运行,是一本综合的开发和解决问题的参考手册 。本书详细描述了当前IT行业中被广泛应...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO播客