为什么tcp不采用停等协议_为什么TCP建立连接协议是三次握手,而关闭连接却是四次握手呢?...
看到了一道面试题:“为什么TCP建立连接协议是三次握手,而关闭连接却是四次握手呢?为什么不能用两次握手进行连接?”,想想最近也到金三银四了,所以就查阅了相关资料,整理出来了这篇文章,希望对你们有所帮助。
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不采用停等协议_为什么TCP建立连接协议是三次握手,而关闭连接却是四次握手呢?...相关推荐
- tcp port numbers reused出现原因_谈谈 TCP 的 TIME_WAIT
由来 最近有同事在用 ab 进行服务压测,到 QPS 瓶颈后怀疑是起压机的问题,来跟我借测试机,于是我就趁机分析了一波起压机可能成为压测瓶颈的可能,除了网络 I/O.机器性能外,还考虑到了网络协议的问 ...
- 为什么tcp不采用停等协议_为什么 TCP 协议有粘包问题
来自公众号:真没什么逻辑 链接:https://draveness.me/whys-the-design-tcp-message-frame/ 为什么这么设计(Why's THE Design)是一系 ...
- gns3中两个路由器分别连接主机然后分析ip数据转发报文arp协议_关于TCP/IP,必知必会的十个问题!...
本文整理了一些TCP/IP协议簇中需要必知必会的十大问题,既是面试高频问题,又是程序员必备基础素养. TCP/IP十个问题 TCP/IP十个问题 一.TCP/IP模型 TCP/IP协议模型(Trans ...
- tcp ip协议_网络通信-TCP/IP协议族简述
导读:计算机与网络设备要相互通信需要遵守同样的规则.例如,如何找到通信目标.该使用哪种语言通信.怎么结束通信等规则.不同的硬件.操作系统之间的通信都需要遵循同一种规则,这种规则也称为是协议.下面本文主 ...
- python实现mqtt协议_自己动手实现MQTT协议
写在前面 前段时间弄IoT相关的东西,系统学习了一下 MQTT 协议,在此分享出来. 本文先是对 MQTT 协议做了简单的介绍:接着是对 MQTT协议的内容做了较为全面的解读:最后使用 Python ...
- ethercat通讯协议_工业控制常用接口协议大全,长见识了
I/O接口概念 I/O接口是一电子电路(以IC芯片或接口板形式出现 ),其内有若干专用寄存器和相应的控制逻辑电路构成.它是CPU和I/O设备之间交换信息的媒介和桥梁.CPU与外部设备.存储器的连接和数 ...
- dhcp协议_记录一次DHCP协议的学习过程
DHCP 动态主机设置协议(Dynamic Host Configuration Protocol,缩写:DHCP)是一个局域网的网络协议,使用UDP协议工作. BOOTP BOOTP(Bootstr ...
- java ws协议_基于java实现websocket协议过程详解
最近了解了下websocket和socket这个东西,说不得不来说下为何要使用 WebSocket ,和为何不用http. 为何需要WebSocket ? HTTP 协议是一种无状态的.无连接的.单向 ...
- igmp是哪个层协议_【干货】IGMPv1协议闲聊
本期与大家聊聊IGMPv1(因特网组管理协议),分享我个人见解,以及梳理一下IGMPv1相关知识点. 一 它是干嘛用的? 我们学一个协议时,首先,最想知道的就是它是干嘛用的?什么时候才需要它?部署场景 ...
最新文章
- 网页开发 与数据联动的图_零基础学习数据可视化pyecharts人物关系图开发
- tensorrt yolov5 批量预测学习笔记
- python编程题-python编程练习题目
- 深入理解MFC消息循环和消息泵的原理
- ssl提高组周六备考赛【2018.10.27】
- Debian安装软件是Debian GNU/Linux 5.0.4 _Lenny_ - Official amd64 DVD Binary-1 20100131-22:09
- 学生信,不是贪多的,而是求精的!
- Spring 处理请求和响应相关的注解
- 【leetcode刷题笔记】Merge k Sorted Lists
- 教大家如何选购直播声卡
- BeanShell用法笔记
- MATLAB实现 ICA 鸡尾酒会语音分离
- 一行代码实现F11的功能,即让浏览器窗口全屏
- html5正在加载数据,JSP如何做正在加载数据,请稍等...这样的提示页面 loding。。。...
- 04Java异常-3. 异常处理方式之try..catch
- 三色过人脸脚本_格灵深瞳算法团队获得NIST人脸识别竞赛全球第一
- IDEA Intellij小技巧和插件
- 批量将所有图片的宽度和高度调整为固定的像素数值
- JADE盲源分离算法附MATLAB代码
- 微信小程序:2022强大的修复版趣味心理测试小程序源码,趣味测试引流裂变神器,流量主激励广告实现管道收益
热门文章
- 使用泰坦尼克号数据进行决策树、随机森林
- layui当前表格第一行_Excel表格如何写入组态王数据,看完就会了
- 有一间计算机教室英语,妙手巧动微机教室实施外语视听教学
- 上升沿_不懂上升、下降沿的我,高兴惨了!
- windows10下使用wget命令(安装失败,请大家提意见)
- Tensorflow 源码安装成功,导入报错 ImportError: cannot import name 'build_info'
- oracle 游标 内联,oracle – EXEC_SQL,EXECUTE IMMEDIATE,DBMS_SQL和内联SQL之间的区别
- 湖北孝感计算机职称考试,2015湖北职称计算机考试报名:孝感职称计算机报名入口...
- java web自定义监听器_Android自定义监听器Listener(自定义Java Callback回调事件)
- html与html5论文区别,HTML、XML、XHTML和HTML5的异同