让你真实的看见 TCP 三次握手和四次挥手到底是什么样!

news2025/1/11 14:16:56

前言

TCP 建立连接是三次握手,而断开连接是四次挥手。

但事实上从你打开这篇文章,到关掉这篇文章,你是看不见这个过程的。

那 TCP 建立连接和断开连接的过程是不是真的如大多数文章所描绘的一样?

带着这些疑问,那就不如真正去实战看一下。

为了能“看见”TCP,我们需要借助 Wireshark 分析网络的利器。

Wireshark 是 Windows 最常用的网络抓包和分析工具,称得上手好剑大利器把我们对数据包一目了然。(也是分析网络性能必不可少的利器)

如果是在 Linux 上网络抓包,那可以使用 tcpdump。

(分析网络的工具还有很多,但是工具只是手段,重要的是能实现目的)

————《用 Wireshark 让你看见 TCP 到底是什么样!》

看得见的 TCP 的三次握手过程是什么样?

如下图模型所示, TCP 建立连接过程三次握手是这样。

Wireshark 中我们对请求网址后,可以使用表达式,筛选出网址源地址目标地址对应的请求信息。

ip.dst == xxx.xxx.xxx.xxx or ip.src == xxx.xxx.xxx.xxx
复制代码

如下图所示,筛选后如下,就可以清楚的看到 TCP 三次握手的信息。

通过直接看标志位来看三次握手的数据包,第一个数据包标志位 SYN 是第一次握手;第二个数据包标志位 SYN,ACK 是第二次握手;第三个数据包标志位 ACK 是第三次握手。

注意:如果你用Wireshark抓包程序看3次握手,你会发现SeqNum总是为0,是因为 Wireshark为了显示更友好,使用了Relative SeqNum——相对序号,你只要在右键菜单中的protocol preference 中取消掉就可以看到“Absolute SeqNum”了)

第一次握手

A主机发送一个请求的数据包,并将SYN (建立连接时的同步信号)置为1seq置为 0 ,表示A主机请求建立连接。

我们可以再通过TCP 三次握手确认的信息图示,来看A主机和B主机在三次握手请求接收的能力。

A主机向B主机第一次请求时,所能确认的事情,只有在B主机知道,B主机一旦确认接收到了对方的请求,那么也就确认了自己具备接收和对方请求的能力。如下图所示。

第二次握手

B主机收到A主机发过来的请求数据包后,通过SYN得知是一个建立连接的请求,于是响应一个确认数据包,并将 SYNACK (对收到的数据进行确认,即表示响应) 状态都置为 1

并且将确认序列号 ACK 设置为序号 seq = 0 + 1 = 1,表示B主机收到A主机发过来的SYN。如下图示。

而在到了第二次握手后,A主机就可以确认自己和对方的请求的能力,但B主机还有两个信息无法确认,自己的请求和对方的请求。

第三次握手

A 收到B的响应包后需确认序号ACK是否正确,如果正确,A主机会再向B主机发送一个数据包,数据包中将SYN置为 0ACK 置为 1,并将确认序列号设置为 y+1 = 1,表示收到了来自 BSYN。于是,AB两端就TCP建立起三次握手的连接。

如下图可以直观看到在第三次握手后,B主机就能确认自己的请求和对方的接收都是正常的。

为什么需要三次握手?两次可以吗?

这是一个好工程师,会提出想要优化的好问题。

这要说到在IP数据包中历史存在的问题,IP数据包在发送时,为了防止出现数据包不断在网络上永不终止地循环和收发,所以在数据报文中会加上数据包报文的生存时间,也就是 TTL(time to live) 来解决这个问题。

但是在TCP中,网络报文的生存时间往往会超过TCP请求超时的时间,如果两次握手来创建连接,传输数据并释放连接后,一旦第一个超时的连接通过重试机制后,请求才到达 B 主机的话,那么 B 主机会以为是 A 创建新连接的请求,然后确认同意创建连接。就会直接导致A主机丢弃了 B 原来的确认数据,最后只有 B 主机方面创建连接完毕。

所以两次握手会请求超时导致的脏连接,而三次握手可以防止超时,同时保证信息对等

看得见的 TCP 的四次挥手的过程是什么样?

接着TCP如果断开连接, Wireshark 自然也不会放过,可以看到如下图所示。

(会发现对应上图模型是不是就很具体了)

第一次挥手

A主机想断开连接,则在数据发送完毕后,传递FIN(表示关闭连接)信号给B主机。FINACK置为1,序号seq=X=4335,确认序号ACK=Z=10615.

第二次挥手

B 主机收到FIN后,则响应 ACK,告诉 A 主机可以断开,seq序号=确认序号ack=10615;并将ACK=1

第三次挥手

B 主机做好连接关闭前的准备工作后,发再次发送FINA主机,此时B主机也进入半关闭状态。因为A主机可能还有没发完的数据,所以需要等B主机发送完数据会发送一个FIN + ACK进行最后的确认。

第三次挥手的序号确认序号不需要改变,只是多了一个FIN来确认结束。

第四次挥手

A主机收到B主机的FIN后,会发送ACK来确认后会进入TIME-WAIT状态,经过2MSL(Maximum Segment Lifetime)后,没有收到B主机传来的报文,则确定B 主机已经收到A主机最后发送的ACK 指令,此时TCP连接正式释放。

最后

好了,这些天就到这里了。但TCP还有很多东西,除了各种实现可靠的机制和治理交通似的算法,而且还有很多优化和变种。

想想到如今车一旦多起来,交通还是面临很多问题,你就知道TCP好像没那么简单了。

所以TCP的文章也相当多,但是不是真的是这样?就不如实际去看看。

计算机本就是一个实践性很强的的学科啊。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/54004.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

揭晓:一条SQL语句的执行过程是怎么样的?

数据库系统能够接受 SQL 语句,并返回数据查询的结果,或者对数据库中的数据进行修改,可以说几乎每个程序员都使用过它。 而 MySQL 又是目前使用最广泛的数据库。所以,解析一下 MySQL 编译并执行 SQL 语句的过程,一方面…

seata在nacos上注册IP为内网,启动时加了 -h 外网ip还是显示内网?

版本: 部署位置:Linux seata版本:1.5.1 问题: seata在nacos上注册IP为内网,启动时加了 -h 外网ip还是显示内网? 解决: 该版本存在-h失效问题,后面1.5.2就修掉-h失效的问题了。 可以在sea…

Web前端大作业——城旅游景点介绍(HTML+CSS+JavaScript) html旅游网站设计与实现

👨‍🎓学生HTML静态网页基础水平制作👩‍🎓,页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码,这是一个不错的旅游网页制作,画面精明,排版整洁,内容…

更新UpdatePanel外部控件

目前处理项目问题的时候,发现有个功能有问题。 界面大致如下 版本radiobuttonlist(在UpdatePanel外) UpdatePanel 上传按钮 文件列表 UpdatePanel 正常逻辑: 上传文件后,文件列表会刷新。(这块没问…

[附源码]Python计算机毕业设计Django家庭教育app

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,我…

[附源码]Python计算机毕业设计Django惠农微信小程序论文

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

B树(BTree)与B+树(B+Tree)

B树是什么? B树是一种多路平衡查找树 平衡,指的是子树高度相同(即所有叶子结点均在同一层),即每个结点的平衡因子均等于0 多路,就是它除了根结点外(之所以根结点的分叉数不限定,是…

【java】多线程

文章目录进程和线程继承Thread类的方式实现多线程设置和获取线程的名称线程优先级 线程调度控制线程线程的生命周期多线程的实现方式案例--卖票同步方法解决数据安全问题线程安全的类Lock锁生产者消费者模式概述案例进程和线程 继承Thread类的方式实现多线程 MyThread.java pa…

懵了,阿里一面就被虐了,幸获内推华为技术四面,成功拿到offer

上个月,哥们从某小厂离职,转投阿里云,简历优秀,很顺利地拿到了面试通知,但之后的进展却让哥们怀疑人生了,或者说让哥们懵逼的是,面试阿里云居然第一面就被吊打?让哥们开始怀疑自己&a…

【OpenCV-Python】教程:3-12 模板匹配

OpenCV Python 模板匹配 【目标】 利用模板匹配的方法寻找目标cv2.matchTemplate(), cv2.minMaxLoc() 【理论】 模板匹配是一个寻找大图像中目标位置的方法。OpenCV提供了函数 cv2.matchTemplate() 函数,通过在输入图像上滑动模板,将目标与滑动处的图…

[附源码]计算机毕业设计JAVA校园淘宝节系统

[附源码]计算机毕业设计JAVA校园淘宝节系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis …

【c++】STL--string

前言 最开始我们学习c语言的时候,我们发现刷题或者写代码都是比较麻烦的,如果说用c语言造一辆车,那么我需要用c语言先把轮子造好--各个零件,当我们造好之后再组装。那么c则是造好了轮子,只需要我们组装就好了。这里的的…

岩藻多糖-聚乙二醇-过氧化氢酶,Catalase-PEG-Fucoidan,过氧化氢酶-PEG-岩藻多糖

岩藻多糖-聚乙二醇-过氧化氢酶,Catalase-PEG-Fucoidan,过氧化氢酶-PEG-岩藻多糖 中文名称:岩藻多糖-过氧化氢酶 英文名称:Fucoidan-Catalase 别称:过氧化氢酶修饰岩藻多糖,过氧化氢酶-岩藻多糖 过氧化氢…

LiteFlow v2.9.4发布!一款能让你系统支持热更新,编排,脚本编写逻辑的国产规则引擎框架

前言 上海的天气降温让人猝不及防,但是我们的迭代速度却井然有序。 今天我们带来了LiteFlow v2.9.4版本。 我们每次的发布的issue有很大一部分依托于我们的使用者社区,社区人越来越多。我看到了使用者在使用过程中遇到的问题,也收集了很多…

【Java实战】这样写SQL语句性能嘎嘎好

目录 一、前言 二、SQL语句 1.【强制】不要使用 count(列名) 或 count(常量) 来替代 count(*),count(*) 是 SQL92 定义的标准统计行数的语法,跟数据库无关,跟 NULL 和非 NULL 无关。 2.【强制】count(distinct col) 计算该列除 NULL 之外的…

如何实现网站首页变为黑白色?

某些时候,网站会根据要求将页面调成黑白色,一开始我还以为是将连夜把图片和文字都搞成黑白色,但是转念一想,像推送产品的京东、淘宝,以及展示up内容的B站、CSDN等,刷新之后可能展示的内容均不同&#xff0c…

从上帝视角认识SpringMVC预览

前言 SpringMVC提供了很多可拓展的组件,例如:参数解析器、拦截器、异常处理器等等。但是如果想要理解/找到这些组件工作的位置/时机,很多时候总是容易迷失在其层层调用的源码之中。因此才想从上帝视角来剖析它。而所谓上帝视角,就…

[附源码]Python计算机毕业设计Django海南琼旅旅游网

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

22.12.1打卡 漫步校园 记忆化搜索

题目里很显然只走最短路, 直接用bfs从终点到起点搜一遍将每一步到终点所需要的最短的时间存在一个dis数组中, 然后你就会发现原来的地图变成了这样 上面是地图下面是dis数组, 再看看经典记忆化搜索模板题滑雪的地图 对的, 非常地相似, 接下来的操作和滑雪基本一样, 只不过起点是…

SQL创建新的输出字段

SQL创建新的输出字段1、准备数据2、对单个字段或者多个字段进行数值计算3、数值计算4、字段拼接5、字段使用别名6、 CASE WHEN逻辑转换case when 语法一case when 语法二case when 注意点查询的值可以为任何值(例如可以: select *)可以重命名…