搜故事,从300万个故事到海量知识百科的华丽转变!

为什么TCP建立连接协议是三次握手 而关闭连接却是四次挥手呢?

时间:2020-06-08

鬼5虐第一个故事解析

提示:本文共有 2489 个字,阅读大概需要 5 分钟。

TCP 连接

我们先来补一下基础什么是 TCP 协议?传输控制协议( Transmission Control Protocol, TCP )是种面向连接、确保数据在端到端间可靠传输的协议。面向连接是插在发送数据前,需要先建立一条虚拟的链路,然后让数据在这条链路上“流动”完成传输。

TCP 是可靠的,会尽自己最大的努力去完成数据传输,TCP 协议比较复杂,可以看下面这张 TCP 协议的报文头图片:

内容非常的丰富,跟我们今天要讨论的连接协议相关的就是中间那六个状态位: URG、ACK、PSH、RST、SYN、FIN ,都置为 1 表示有效,在这六个当中,我们主要关注重点关注 ACK、SYN、FIN 这三个。下面解释一下这三个状态位:

ACK:用于对收到的数据进行确认,所确认的数据由确认序列号表示。

SYN:用作建立连接时的同步信号

FIN:表示后面没有数据需要发送,通常意昧着所建立的连接需要关闭了。

好了,到这里,TCP 的基础知识我们就知道了,下面我们就来看看为什么是三次握手,而不是四次或者两次,为了让你更好的理解,我把知乎上一个高赞特别形象的比喻放在这里,希望对你有所帮助。

两次和四次都会出现问题,三次就刚刚好,希望这张图能够让你更好的理解为什么是三次握手。

我们已经知道了 TCP 协议是三次握手,为什么是三次握手呢?我们先来看看下面这张 TCP 协议建立连接的时序图。

总体来说就是呼叫、应答、回应,我们来详细的介绍每一步:

第一步: A 机器向 B机器发出一个数据包并将 SYN 设置为 1 ,表示希望建立连接。这个包中的序列号假设是 X。第二步: B 机器收到 A机器发过来的数据包后,通过 SYN 得知这是一个建立连接的请求,于是发送一个响应包并将 SYN 、ACK 标记都置为 1。假设这个包中的序列号是 y ,而确认序列号必须是 x+l ,表示收到了 发过来的 SYN,TCP 中, SYN 被当作数据部分的一个字节。第三步: A 收到 的响应包后需进行确认,确认包中将 ACK ,并将确认序列号设置为 y+ ,表示收到了来自B 的 SYN

经过这三步之后,两台服务器就建立连接了,可以进行通信数据传输了。为什么要三次握手呢?主要是为了信息对等和防止出现请求超时导致脏连接。

第一是为了保证两台机器信息对等,确保两台机器都没有什么问题:

只有三次握手之后才能够保证两台服务器都完全没有问题,各自具备发报和收报能力。

第二是防止出现请求超时导致脏连接,看下面这张图:

为什么会出现脏连接?因为TTL 网络报文的生存时间往往都会超 TCP 请求超时时间,如果两次握手就可以创建连接 ,传输数据并释放连接后,第一个超时的连接请求才到达 B 机器的话,B 机器会以为是 A 创建新连接的请求,然后确认同意创建连接。因为 A 机器的状态不是 SYl SENT ,所以直接丢弃了 B 的确认数据 ,以致最后只是 B 机器单方面创建连接完毕。

三次握手就可以解决这个问题,因为需要 A 服务器确认了才真正的建立了连接。

TCP 四次挥手

上面介绍了 TCP 协议连接,有连接就有断开,相对于三次连接,断开却需要四次挥手,怎么理解呢?先看下面这个场景:

A:B 啊,我不想玩了。

B:哦,你不想玩了啊,我知道了。

这个时候,还只是 A 不想玩了,也即 A 不会再发送数据,但是 B 能不能在 ACK 的时候,直接关闭呢?当然不可以了,很有可能 A 是发完了最后的数据就准备不玩了,但是 B 还没做完自己的事情,还是可以发送数据的,所以称为半关闭的状态。

这个时候 A 可以选择不再接收数据了,也可以选择最后再接收一段数据,等待 B 也主动关闭。

B:A 啊,好吧,我也不玩了,拜拜。

A:好的,拜拜。

这就是一个完整的关闭连接,在这个关闭的过程中,一共说了四句话,我们也称之为四次挥手。跟建立连接一样,断开时也是用状态来表示,下面是断开的时序图:

我们结合上面的时序图和场景再来分析一下 TCP 断开过程。

当 A 说“不玩了”,A 就进入 FIN WAIT 1 的状态,B 收到“A 不玩”的消息后,发送知道了,B 就进入 CLOSE WAIT 的状态。

A 收到“B 说知道了”,就进入 FIN WAIT 2 的状态,如果这个时候 B 直接跑路,则 A 将永远在这个状态。虽然 TCP 协议里面并没有对这个状态的处理,但是 Linux 有,可以调整 tcp fin timeout 这个参数,设置一个超时时间,最后 A 也会关闭的。

如果 B 没有跑路,发送了“B 也不玩了”的请求到达 A 时,A 发送“知道 B 也不玩了”的 ACK 后,从 FIN WAIT 2 状态结束,按说 A 可以跑路了,但是最后的这个 ACK 万一 B 收不到呢?则 B 会重新发一个“B 不玩了”,这个时候 A 已经跑路了的话,B 就再也收不到 ACK 了,因而 TCP 协议要求 A 最后等待一段时间 TIME WAIT,这个时间要足够长,长到如果 B 没收到 ACK 的话,“B 说不玩了”会重发的,A 会重新发一个 ACK 并且足够时间到达 B。

要求 A 等待 TIME WAIT还有一个原因就是防止产生混乱,A 直接关闭了,但是这个时候 B是不知道的,可能在 A 关闭之前 B还发送了很多数据包,如果这时候 A 的端口被一个新的应用占用了的话,那么新的应用就会接收到上个连接中 B发送过来的数据包,这样就混乱了,虽然这个数据包是无效的,但是等待 TIME WAIT 可以是一个双保险,因而也需要等足够长的时间,等到原来 B 发送的所有的包都死翘翘,再空出端口来。

以上就是 TCP 协议三次握手,四次挥手的原因,希望这篇文章对您的学习或者工作有所帮助,如果您觉得文章不错,还请您帮忙点个赞和转发,谢谢。

最后

目前互联网上很多大佬都有 TCP 协议相关文章,如有雷同,请多多包涵了。原创不易,码字不易,还希望大家多多支持。若文中有所错误之处,还望提出,谢谢。

欢迎扫码关注微信公众号:「平头哥的技术博文」,和平头哥一起学习,一起进步。

看到此处说明本文对你还是有帮助的,关于“为什么TCP建立连接协议是三次握手 而关闭连接却是四次挥手呢?”留言是大家的经验之谈相信也会对你有益,推荐继续阅读下面的相关内容,与本文相关度极高!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。
相关阅读
亚运会Uzi与Faker表情包出炉!小花生:我跟Uzi三个月握手三次!

亚运会Uzi与Faker表情包出炉!小花生:我跟Uzi三个月握手三次!

中国队,韩国队,中国,冠军,压力,亚运会,举旗,事件,金牌,奇迹,大逆转,大部分,小组,时候,弟弟,表情,皮肤,游戏,自闭,网友,纷纷表示,翻墙,观众,对话,比赛,不能抵抗,一张图,中国人,了解一下,众多玩家

2007-10-28 #长篇故事

网络编程 UDP&TCP详解

网络编程 UDP&TCP详解

接收端,数据,网络,发送端,窗口大小,缓冲区,速度,字段,部中,慢启动,拥塞窗口,这个时候,吞吐量,增长速度,字节,时间,机制,服务器,通知,问题,阈值,流量控制,传输效率,创建一个,拥塞控制,给客户,网络吞吐量,重传,多大,回一

2011-09-03 #故事会

天猫精灵通信技术揭秘:采用何种通讯协议进行连接?

天猫精灵通信技术揭秘:采用何种通讯协议进行连接?

猫精,处理器,协议,无线通信,实时,天线,无线连接,成本,智能,板载,芯片,电路,蓝牙,音箱,设计,可实现,用的是,通信方式,使用了,集成了

2024-01-25 #综合

在LabVIEW平台中 你会编程实现TCP数据通信么?

在LabVIEW平台中 你会编程实现TCP数据通信么?

程序,函数,服务器端,客户端,字符串,内容,数据,地址,端口,端口号,参数,字节,客户端程序,节点,信息,时间,服务器,框图,消息,协议,通信,侦听,客户,实际,所示,才能,方法,程序框图,类型,如下图

2016-08-31 #短篇故事

将计算机思维故事化——之计算机网络TCP拥塞控制算法

将计算机思维故事化——之计算机网络TCP拥塞控制算法

奏章,算法,驿卒,京城,地方官员,上呈,发送端,窗体,大小,网络,阶段,上限,治安,重臣,又一次,拥塞控制,指数增长,拥塞避免,时候,问题,通信,交通拥挤,时延,交通,皇帝,运行,恢复算法,重传,互联网,国事

2019-04-04 #故事会在线阅读

微信小程序中如何使用WebSocket实现长连接(含完整源码)

微信小程序中如何使用WebSocket实现长连接(含完整源码)

小程序,微信,域名,服务,源码,剪刀石头布,运行,即时通讯,协议,服务器,镜像,代码,客户端,技术,房间,平台,推送,消息,玩家,通信,关系,分数,框架,次数,游戏,证书,附件,可以直接,技术原理,刨根问底

2020-08-07 #小故事

微博里的链接打不开 win10解决方法

微博里的链接打不开 win10解决方法

链接,微博,网络,问题,解决方法,属性,服务器,管理员,微博里,设置为,双击,命令提示符,行里,中心,协议,图标,名称,命令,版本,方法,网页,网络连接,身份,重置,页面,运行,系统用户,为大家,中运行,只需要

2020-09-08 #长篇故事

win10系统下微博链接无法打开如何解决-系统城

win10系统下微博链接无法打开如何解决-系统城

系统,微博,网络,问题,链接,属性,服务器,管理员,无法打开,解决方法,设置为,双击,命令提示符,行里,中心,协议,发布者,多用户,图标,名称,命令,小群,方法,版本,网页,网络连接,身份,重置,页面,运行

2020-09-09 #小故事