抓包分析TCP首部,三次牵手四次分手过程,序列号确认号计算,为什么握手是三次挥手是四次?
目录
- 抓包过程
- TCP 首部分析
- TCP 三次牵手过程
- TCP 四次分手过程
- 常见面试经典问题
- 为什么牵手是三次,分手是四次?
- 为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
抓包过程
使用了 Wireshark 进行抓包,用两个最常用的 curl 和 ping 命令来演示抓包情况,开启抓包。
## 先访问我自己的网站首页curl https://zengzhiqin.kuaizhan.com
## 再查看我自己网站的地址ping https://zengzhiqin.kuaizhan.com
Wireshark根据 ping 命令得到的地址进行条件过滤,得到上面两个命令所得到的包,主要有 TCP(https基于tcp协议)协议和 ICMP(ping命令是基于 ICMP 协议)协议的包,如下图所示:
TCP 首部分析
首部内容简单分析:
源端口目标端口
包通过传输层千辛万苦找到了机器,机器那么多应用,假如这个时候艾莉给洪世贤发微信撩sao,世贤开了 QQ 又开了微信,这个时候就靠端口号来区分不同服务,QQ和微信的端口号肯定不一样,因此才能消息才能正确找到微信应用。
序列号和确认号
数据分段传输过程中,序列号可以保证所有传输的数据按照正常的次序进行重组,而且通过确认保证数据传输的完整性。
如图所示,整理分析五个连续的请求包数据的 序列号
和确认号
进行序列号分析:
整理分析如下:
序列号可以用来确定传输内容的位置,传输到哪一个字节了,接收端接收到好根据序列号进行重组数据。相对序列号和相对确认号是用来简化随机序列号和随机确认号的。
下一个请求包的序列号 = 上一个请求包序列号 + 数据长度
请求应答过程如下
确认号就是用来确认回复哪个序列号的多大的数据包,所以Ack=请求包的Seq+数据长度
。并且通过确认序列号,确认号,数据长度的值,可以确定此数据包是否完整。
数据偏移
就是首部长度,因为首部除了 20 字节固定长度之外,还有选项部分,是可选可变长度,所以需要有个偏移量告诉数据首部长度位置。
保留
此 6 bit 二进制没有用到
状态位
小说明:大写的表示状态,如ACK,小写的表示确认号,如Ack;
窗口
tcp是可靠传输,有接收缓存和发送缓存,缓存被叫做窗口,通过滑动窗口技术实现可靠传输(这个地方还挺复杂的,下一篇会写关于可靠传输和拥塞控制相关的)
检验和
用来保证 TCP 头和数据的内容在抵达目的时的正确性完整性
紧急指针
如果设置了 URG 位,这个域将被检查作为额外的指令,告诉 CPU 从数据包的哪里开始读取数据,优先处理此包的命令。插队打乱了原来的队伍顺序,把列宁同志的团队人员单独优先处理,需要记录下这部分人的信息,是这个团队的就先走。
选项
可以规定最大数据报的长度为多少,还可以支持选择性的进行确认。
填充
选项和填充一共40个字节,如果不够需要进行填充凑够了
TCP 三次牵手过程
洪世贤饰客户端,林品如饰服务端
牵手过程:
(客户端)世贤:品如,你好美客户端发起请求,头部设置为SYN为1表示他要请求建立连接,并且发送一个随机序列号x,此时世贤进入 SYN_SENT 求婚等待爱情状态;
SYN包:SYN=1, ACK=0, Seq=x
(服务端)品如:世贤,你好帅服务端接收到连接请求,头部设置SYN+ACK表示他要回应了,并且自己也随机生成一个序列号标识自己y,通过将ack确认号设置为客户端的请求序列号x +1 的方式来告诉请求的客户端他回应的是哪个客户端,因为可能有很多个客户端同时向他请求建立连接,进行相应回应,此时品如进入了 SYN_RCVD 收到求婚并且同意等待下一步指示状态
SYN+ACK包:SYN=1, ACK=1, Seq=y, Ack=x+1
(客户端)世贤:品如,我们结婚客户端接收到服务端回复之后,再次确认连接,头部设置为ACK表示他收到了服务端的确认请求现在进行确认,ACK为1表示他要进行确认了,ack=y+1=服务端的请求序列号+1,表示他确认的是服务端这个包的请求,seq=x+1因为上一个客户端请求序列号是x,这个请求包从 x+1 开始,此时世贤收到同意回复进入了宣布结婚 ESTABILSHED 状态, 品如收到了结婚请求也进入了结婚状态
ACK包:ACK=1, Seq=x+1, Ack=y+1
小结:
因为建立连接之前是没有数据传输的,但是 SYN,ACK 等状态需要占用一个序号,所以这个地方请求序列号加的数据都是1,建立连接之后有数据传输,序列号和确认号加的数据都会是数据的长度;
Ack=请求序列号+数据长度;
包的序列号Seq = 同一端上一个包的序列号+数据长度;
下一个包的Seq = 上一个应答包的Ack
涨姿势:
借助wireshark的分析工具,点击 wireshark 的 Statistic 下面的Follow Graph,能得到如下的分析图,也可以很直观的看到牵手分手以及序列号:
TCP 四次分手过程
四次分手过程的序列号和确认号,和上面牵手是一样的分析,就不贴图了贴个世贤。
(客户端)世贤:你不够骚
(服务端)品如:我的衣柜不好看吗
(服务端)品如:算了衣服你们玩,我去跳海
(客户端)世贤:你喜欢大海,我爱过你
这个分手过程读者自己看图吧,写下来太多了,注意看双方状态,序列号和确认号。
常见面试经典问题
为什么牵手是三次,分手是四次?
三次牵手原因:
一般如果客户端给服务端发起一个请求,服务端回复了,一来一回就能表示网络是畅通的,可以发数据。那么为什么需要第三个数据包呢?
首先,客户端请求建立连接如果没有成功是会一直重试的,那么就会有多个建立连接请求。
世贤和品如的故事
世贤饰客户端A数据包,窃格瓦拉饰客户端B数据包,品如饰服务端
假如世贤第一次求爱之前先绕远路去美国买了束玫瑰花,然后 窃格瓦拉 从牢里出来了直接就去找品如求爱了,品如这时候答应了窃格瓦拉的求爱,品如等着和窃格瓦拉来约她看海;
然后世贤也到了,品如一看世贤好帅反正她没有结婚又答应了世贤的求爱,于是品如又等着世贤约她看海;
试想一下全世界男的都去找品如告白一次,那品如就有看不完的海了,
主要原因是因为品如不知道哪一个男的是来真的
。所以需要有人求婚,也就是第三次确认,结婚了就不用和别的男的看海了,直接放弃掉别人。
如果只有两次,那么服务端回应了就算是建立了连接,但是服务端没法判断他回应的请求连接是否在使用
,这就会导致下面两种情况:
第一种是会造成很多无效连接资源不能释放。请求包因为网络慢耗时严重,客户端重复发了很多包,一段时间后这些包到了服务端回复建立起了很多不必要的连接,这些连接资源无法释放,三次牵手第三次再次确认之后服务端建立连接并且将其他的无效连接释放掉。
第二种是确认包丢失造成循环死锁问题,如下图
四次分手原因
牵手容易分手难,都市的饮食男女应该都能感受到这点。
主要是因为服务端收到关闭请求之后,服务端的数据可能还没有传完,这个时候服务端会继续把数据传输完,然后再告诉客户端可以关闭了,客户端再关闭。
为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
MSL指一个片段在网络中最大的存活时间,2MSL是两倍的MSL(Maximum Segment Lifetime),就是一个发送和一个回复所需的最大时间。
网络是不可靠的,如果最后的ACK包丢失了
然后客户端又已经关闭了,那么服务端还会一直发送 FIN 请求关闭但是没人理他,他就会一直发FIN,那么服务端就会一直持续发 FIN 从而没法关闭了。所以客户端需要再等2MSL,这段时间一来一回的路上再也没有 FIN 包过来了,因此客户端可以放心关闭了。
感觉自己在写剧本,满脑子都是品如的衣柜,有收获的老铁点赞
或者点在看
来鼓励一下作者吧,感谢观看~
下期预告: tcp流量控制和拥塞控制的实现
欢迎关注我的公众号看更多内容
抓包分析TCP首部,三次牵手四次分手过程,序列号确认号计算,为什么握手是三次挥手是四次?相关推荐
- 用wireshark抓包分析TCP协议的三次握手连接、四次握手断开
用wireshark抓包分析TCP协议的三次握手连接.四次握手断开 一.TCP三次握手图解 二.TCP得四次挥手过程 三.用Fiddler抓包,分析验证一个HTTPS网站的TCP连接过程 一.TCP三 ...
- Wireshark抓包分析TCP建立/释放链接的过程以及状态变迁分析
Wireshark抓包分析TCP建立/释放链接的过程以及状态变迁分析 一.介绍计算机网络体系结构 1.计算机的网络体系结构 在抓包分析TCP建立链接之前首先了解下计算机的网络通信的模型,我相信学习过计 ...
- 接口协议之抓包分析 TCP 协议
TCP 协议是在传输层中,一种面向连接的.可靠的.基于字节流的传输层通信协议. 环境准备 对接口测试工具进行分类,可以如下几类: 网络嗅探工具:tcpdump,wireshark 代理工具:fiddl ...
- Wireshark抓包分析TCP连接、发送数据与断开过程
准备工具: 1. 两台连接到同个局域网的电脑,或者虚拟机; 2. 在其中一台电脑安装Wireshark; 3. 在两台电脑上面都有TCP&UDP测试工具软件 TCP连接建立过程(三次握手): ...
- wireshark抓包分析TCP数据包
1.直接从TCP的三次握手开始说起 三次握手就是客户与服务器建立连接的过程 客户向服务器发送SYN(SEQ=x)报文,然后就会进入SYN_SEND状态 服务器收到SYN报文之后,回应一个SYN(SEQ ...
- socket抓包_64、抓包分析tcp与udp
从前面的两个案例,我们了解到了如何通过原生socket函数分别创建tcp和udp服务,以及通过相应的客户端进行连接测试.在本文中,我们将继续深入地去了解tcp和udp的差别,和思考它们两者如何应该多个 ...
- 【大白话系列】图解TCP三次握手【使用wireshark工具抓包分析TCP三次交互流程】
文章目录 1.首先准备好抓包工具wireshark 2.准备一段简单的socket程序 3.打开wireshark工具进行抓包 4.举例了解一下TCP报文段中的ACK和Seq的含义 5.流程分析 6. ...
- 【极客思考】计算机网络:Wireshark抓包分析TCP中的三次握手与四次挥手
[前提说明] 前段时间突然看到了一篇关于TCP/IP模型的文章,心想这段时间在家里也用wireshark抓了点包,那么想着想着就觉得需要复习一下网络知识,于是就有这篇博文的诞生.当然网上关于TCP相关 ...
- 客户端主动断开连接_Go实现客户端和服务器抓包分析TCP三次握手和断开操作
本文主要是想通过抓包工具分析一下TCP三次握手和断开过程: 1.TCP三次握手建立连接和断开连接解释,如下图: TCP三次握手建立连接和断开连接 2.通过WireShark抓包查看这个TCP过程,数据 ...
- Wireshark抓包分析TCP的三次握手
一.TCP三次握手连接建立过程 Step1:客户端发送一个SYN数据包(SYN=1,Seq=X,ACK=0)给服务端,请求进行连接,这是第一次握手: Step2:服务端收到请求并且允许连接的话,就会发 ...
最新文章
- Aurora 8B/10B、PCIe 2.0、SRIO 2.0三种协议比较
- 在C#中选择“.NET研究”正确的集合进行编码
- IIS的安装和配置全过程
- C#中容器控件GroupBox、Panel、TabControl
- 使用Eclipse+PyDev创建Django项目一windows下
- 递归生成数独java_[leetcode] 37. 解数独(Java)(dfs,递归,回溯)
- java 内存机制(堆和栈),内存地址
- Slimer软工课设日报-2016年6月30日
- TCP协议中的三次握手和四次挥手(图解)【转】
- 作为前端程序员,你不能不知道的这个小技巧
- java download oracle,Java Archive Downloads - Java SE 6 | Oracle 中国
- 利用workbench建立的响应面模型质量很差,该如何解决?求指点
- 运筹优化(十三)--大规模优化方法
- 求一个乘法算式采用几进制
- java调用kettle自定义kettle.properties配置文件路径
- leetcode背包问题416、494、474、879、1049、279、322、377、518
- 一节前端课:html+css+js做个计算器
- 在Linux中,_exit()、exit(0)、exit(1)、和return的区别!!
- vue 生命周期(详解)
- java 栈和队列实现迷宫代码_算法图解:如何用两个栈实现一个队列?
热门文章
- 编写站点robots文件
- 【Hive】Establishing SSL connection without server‘s identity verification is not recommended. Accord
- 理论小知识:获取AUTO_INCREMENT值
- 输入一个字符串,判断它的所有字符中否全部是大写字母,如不是,统计小写字母个数,并将其转换成大写字母后输出
- 100个思维模型(不一定都适用,各取所需)
- python针对Excel表格的操作
- Springboot整合Redis实现腾讯云发送短信验证码并实现注册功能
- 道道通导航linux升级,道道通导航升级免费版
- 小明一家人,如何在30秒内过桥
- vscode中setting设置