IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> ACK的累加规则-wireshark抓包分析-不包含tcp头部、ip头部、数据链路层头部等。 -> 正文阅读

[网络协议]ACK的累加规则-wireshark抓包分析-不包含tcp头部、ip头部、数据链路层头部等。

我们知道,TCP协议是通过ACK来确保报文有序的。

序列号(Sequence Number)字段标识了TCP发送端到TCP接收端的数据流的一个字节,该字节代表着包含该序列号的报文段的数据中的第一个字节。

ack的作用

确认号字段(也简称ACK号或ACK字段)包含的值是该确认号的发送方期待接收的下一个序列号。即最后被成功接收的数据字节的序列号加1。

ack是累计的

ACK是累计的,表示的是已收到的有序字节流的最后一个字节+1

累加的字节流数据,包含哪些数据?

我们还是通过实例来说明,看下面一个示例,一个普通的http请求,先看一下Client发送个Server的请求报文:
在这里插入图片描述
如上图所示:
它的Sequence Number为926731958,http层报文的长度为931。

需要注意的是,这里的Length指的是tcp上层的数据长度,本示例中是http层的数据,不包含tcp header、ip header 和 数据链路层的header。

如果这个报文发送成功,下次接收到的ACK应该是926732889(926731958 + 931)。

我们看下对应的响应报文,验证下这个逻辑:
在这里插入图片描述
如上图所示,Server端发送给Client端的ACK是926732889(926731958 + 931),等于Server端上一个接收到的报文的起始序列号(926731958)+ 报文长度(931)。

同理,当前Server端发送给Client端的报文的序列号和长度分别是796375356和195,所以下一次Client发送的ACK中应该是796375356 + 195 = 796375551。
在这里插入图片描述
我们看下下一个报文:
在这里插入图片描述
bigo,完全符合预期。

我们用图例来表示一下:
在这里插入图片描述
总结一下,当前报文对应的ACK = 当前报文的第一个字节的序列号 + 报文长度(http层)

当然了,这里的示例是最简单的场景。因为我们的ACK的发送时间,不是收到报文后立即发送的。

当TCP接收到连接的另一端的数据时,它会发送一个ACK。这个确认可能不会立即发送,而一般会延迟片刻。TCP使用的ACK是累积的,从某种意义来讲,一个指示字节号IV的ACK暗示着所有直到IV的字节(但不包含IV)已经成功被接收了

实际的场景中,可能返回的ACK大于我们这里计算的数字,也是合理的,因为ACK表示的是之前的数据都是正确、有序收到了。

三次握手、四次挥手中的ACK变化

发送在本次连接的这个方向上的数据的第一个字节的序列号是ISN加1,因为SYN位字段会消耗一个序列号。消耗一个序列号也意味着使用重传进行可靠传输。因此,SYN和应用程序字节(还有FIN)是被可靠传输的。不消耗序列号的ACK则不是。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CSMQzP9y-1646284881642)(evernotecid://5E413247-DCB6-499B-8453-F2A2C2DF33A4/appyinxiangcom/13182898/ENResource/p18380)]

上图是经典的三次握手、四次挥手的示意图,可以看出,三次握手中,第一阶段的SYN确实是消耗掉了一个序列号,因为Client在收到Server的ACK之后,第三次握手的报文中,序列号Seq变为了ISN?+1。

在关闭连接过程中,第二次握手和第三次握手的ACK都是L+1,因为这期间没有收到新的报文;再看第四次握手,Client即使已经收到了ACK为L+1,但是它发送出去的Seq依然是K,跟第一次握手一样的序列号,表明ACK不消耗序列号。

参考

TCP/IP详解 卷1:协议 原书第二版
确认消息
Acknowledgement (data networks)

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-03-04 15:57:23  更:2022-03-04 15:57:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年10日历 -2024/10/5 13:24:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码