Linux网络编程: TCP协议之序号和确认号详解

一、TCP协议首部

在这里插入图片描述

二、序号(Sequence Number)

32位,表示该报文段所发送数据的第一个字节的编号。

实际上 TCP 的序号并不是按照 “一条两条” 这样的方式来编号的。在TCP连接中所传输字节流的每一个字节都会按顺序编号,由于序列号是由32位表示,所以每2^32个字节,就会产生序列号回绕,再次从0开始。

TCP在建立连接时由计算机生成的随机数作为其初始值,通过SYN包传给接收端主机,每发送一次数据,就「累加」一次该值。

每个TCP数据报报头填写的序号只需要写TCP数据的头一个字节的序号即可。

这样设计序号的好处?
TCP首部时可以携带选择性确认(Selective Acknowledgment,SACK)选项。如果通信双方支持SACK,那么在数据传输过程中发生了数据丢失或延迟等其他原因造成的接收端数据不连续,那么接收端就可以发送一个SACK包,通知哪一部分失序了。
在这里插入图片描述

  • Left Edge of Block, 不连续块的第一个数据的序列号
  • Right Edge of Block, 不连续块的最后一个数据的序列号之后的序列号
    该选项参数告诉对方已经接收到并缓存的不连续的数据块,注意都是已经接收的,发送方可根据此信息检查究竟是哪个块丢失,从而发送相应的数据块。

这样就不用重传整个数据包。

三、确认号(Acknowledgment Number)

32位,表示接收方期望收到发送方下一个报文段的第一个字节数据的编号,也就是告诉发送方:我希望你下次发送的数据的第一个字节数据的编号为此确认号。确认号只有在ACK标志为1时才有效。发送端收到确认应答后代表确认序号之前的数据都已经被正常接收。

TCP规定,建立连接后,ACK必须为1,带ACK标志的TCP报文段称为确认报文段,也就是说连接建立之后所有的数据包都会设置确认号。

四、抓包测试

启动一个TCP server

https://github.com/NoevilMe/tinymuduo
这里是我改写的一个muduo网络库,去掉了boost依赖,带了一个sample tcp server。

# 编译
mkdir build && cd build && cmake .. -DBUILD_TINYMODUO_EXAMPLES=ON && make


# 启动
./test_tcp_server 38880

监听38880端口。

启动一个客户端

直接使用了网络调试助手,选择tcp client, 填写好地址和端口,然后连接
在这里插入图片描述

tcp server 日志

包含了整个过程的连接与断开,发送了两次TCP数据,每次发送3068字节,发送内容我省去了。

2024/03/20 12:10:43.148583 109826 INFO  TcpServer::NewConnection [Sample Tcp Server] - new connection[Sample Tcp Server-0.0.0.0:38880#3] from 180.165.165.51:2142 - tcp_server.cxx:56
2024/03/20 12:10:43.148635 109826 DEBUG TcpConnection TcpConnection::ctor[Sample Tcp Server-0.0.0.0:38880#3] at 0x562100CCD100 fd=23 - tcp_connection.cxx:23
2024/03/20 12:10:43.148714 109829 INFO  new connection from 180.165.165.51:2142 - test_tcp_server.cxx:14
2024/03/20 12:10:46.762928 109829 TRACE HandleRead TcpConnection::HandleRead length 3068 - tcp_connection.cxx:129
2024/03/20 12:10:46.762982 109829 INFO  Sample Tcp Server-0.0.0.0:38880#3 receive 3068 bytes, content: http://www.cmsoft.cn- ...
 - test_tcp_server.cxx:26
2024/03/20 12:10:48.987427 109829 TRACE HandleRead TcpConnection::HandleRead length 3068 - tcp_connection.cxx:129
2024/03/20 12:10:48.987481 109829 INFO  Sample Tcp Server-0.0.0.0:38880#3 receive 3068 bytes, content: http://www.cmsoft.cn- ...
 - test_tcp_server.cxx:26
2024/03/20 12:10:51.141446 109829 TRACE HandleRead TcpConnection::HandleRead length 0 - tcp_connection.cxx:129
2024/03/20 12:10:51.141487 109829 DEBUG HandleClose TcpConnection::HandleClose 23 - tcp_connection.cxx:177
2024/03/20 12:10:51.141499 109829 INFO  destory connection from 180.165.165.51:2142 - test_tcp_server.cxx:18
2024/03/20 12:10:51.141513 109829 INFO  TcpServer::RemoveConnection [Sample Tcp Server] - connection Sample Tcp Server-0.0.0.0:38880#3 - tcp_server.cxx:77
2024/03/20 12:10:51.141539 109826 INFO  TcpServer::RemoveConnectionInLoop [Sample Tcp Server] - connection Sample Tcp Server-0.0.0.0:38880#3 - tcp_server.cxx:85
2024/03/20 12:10:51.141565 109829 DEBUG ConnectDestroyed TcpConnection::ConnectDestroyed 23 - tcp_connection.cxx:214
2024/03/20 12:10:51.141574 109829 DEBUG ~TcpConnection TcpConnection::dtor[Sample Tcp Server-0.0.0.0:38880#3] at 0x562100CCD100 fd=23 - tcp_connection.cxx:29

五、测试结论

1. 序号是按发送数据长度增长的

也就是说,数据是按字节编号,报文段首部填写的序号就是所发送数据的第一个字节的编号。

413抓包显示是10.10.11.14第一次发送的3068字节数据。
在这里插入图片描述

421抓包显示10.10.11.14在收到服务器数据之后发送的一个ACK包,它的seq已经变了,距离上一次发送的序号正好等于上一次发送的数据长度。
在这里插入图片描述

452抓包显示10.10.11.14在发送ACK包之后,没有收到服务器数据包,但是又要发送第二个3068字节数据了。
在这里插入图片描述

2. 序号是依赖通信对端确认号的

确认号的本质就是接收方期望收到发送方下一个报文段的第一个字节数据的编号。所以有了ACK报文,己方的seq才会增长。

如下图,服务器方期望下一次收到3069编号
在这里插入图片描述

客户端发出的ACK包seq就变成了3069
在这里插入图片描述

3. 不带数据的纯ACK包不会增长seq

不带数据的ACK包发出之后,对方不会再发送一个ACK包过来,所以也就不会增长seq了。

如下图:客户端发送ACK包时候用的序号3069。
在这里插入图片描述

当发送第二次数据的时候仍然使用序号3069。
在这里插入图片描述

4. 如果没有收到新数据,确认号不会增长

如果一方需要连续发出报文,这时间段内没有收到任何数据,就会继续沿用上一次的确认号。
在这里插入图片描述

下一个报文虽然发送了数据出去,但是上一次发送之后没有收到数据,所以仍然使用同样的确认号。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CTF-reverse-每日练题-xxxorrr

题目链接 https://adworld.xctf.org.cn/challenges/list 题目详情 xxxorrr ​ 解题报告 下载得到的文件使用ida64分析,如果报错就换ida32,得到分析结果,有main函数就先看main main函数分析 v6 main函数中,v6的值是__readfsqwor…

Java基础学习笔记三

环境变量CLASSPATH classpath环境变量是隶属于java语言的,不是windows操作系统的,和PATH环境变量完全不同classpath环境变量是给classloader(类加载器)指路的java A 。执行后,先启动JVM, JVM启动classload…

聚类算法( clustering algorithm):

在前两章,我们学的是:线性回归,逻辑回归,深度学习(神经网络),决策树,随即森林算法。他们都是监督学习的例子。 在这一章里,我们将学习非监督学习的算法。 什么是聚类算法: 聚类算…

C语言结构体详解

1、结构体的声明 结构体是一些值的集合,这些值被称为成员变量。结构体中的每个成员可以是不同类型的变量。 语法: struct tag //关键词 标签 { member- list ;//成员清单 }variable- list ;//变量清单 通常结构体描述的是一个复杂对象,比…

【Linux】多线程概念 | POSIX线程库

文章目录 一、线程的概念1. 什么是线程Linux下并不存在真正的多线程,而是用进程模拟的!Linux没有真正意义上的线程相关的系统调用!原生线程库pthread 2. 线程和进程的联系和区别3. 线程的优点4. 线程的缺点5. 线程异常6. 线程用途 二、二级页…

2023 re:Invent | Amazon Q 与 Amazon CodeWhisperer 面向企业开发者提效利器

2023 年,以 GPT 为代表的生成式 AI 引爆了新一轮技术热潮,短短一年的时间内,生成式 AI 已经成为科技世界发展的核心。作为云计算的行业风向标盛会 re ,本届: Invent 全球大会紧跟生成式 AI 浪潮,推出名为“ Amazon Q ”…

【方法】想要修改PDF文件怎么办?

在工作上,我们经常需要用到PDF文件,但需要修改PDF时,有些小伙伴却不知道怎么办,那就一起来看看以下两个方法吧! 方法一:使用PDF编辑器 PDF文件可以通过PDF阅读器或者浏览器在线打开,但无法进行…

【DFS】第十三届蓝桥杯省赛C++ B组《扫雷》(C++)

【题目描述】 小明最近迷上了一款名为《扫雷》的游戏。 其中有一个关卡的任务如下: 在一个二维平面上放置着 n 个炸雷,第 i 个炸雷 (xi,yi,ri) 表示在坐标 (xi,yi) 处存在一个炸雷,它的爆炸范围是以半径为 ri 的一个圆。 为了顺利通过这片…

GIS设计与开发的学习笔记

目录 一、简答题 1.GeoDatabase数据模型结构类型与四种关系。 2.组件式GIS的基本思想是什么? 3.请简述创建空间书签的实现逻辑。 4.请问与地理要素编辑相关的类有哪些?(列举至少五个类) 5.利用ArcGIS Engine提供的栅格运算工…

电玩体验店怎么计时,佳易王ps5计时计费管理控制系统操作教程

电玩体验店怎么计时,佳易王ps5计时计费管理控制系统操作教程 一、前言 以下软件操作教程以 佳易王电玩计时计费管理系统软件V17.9为例说明 件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、电玩体验馆管理软件在计时的同时可以设置定时提醒&…

大模型第一讲笔记

目录 1、人工智能基础概念全景介绍... 2 1.1 人工智能全景图... 2 1.2 人工智能历史... 2 1.3 人工智能——机器学习... 3 监督学习、非监督学习、强化学习、机器学习之间的关系... 3 监督学习... 4 无监督学习... 5 强化学习... 5 深度学习... 6 2、语言模型的发展及…

视频素材库app推荐的地方在哪里找?

视频素材库app推荐的地方在哪里?这是很多短视频创作者都会遇到的问题。别着急,今天我就来给大家介绍几个视频素材库app推荐的网站,让你的视频创作更加轻松有趣! 蛙学网:视频素材库app推荐的首选当然是蛙学网啦&#xf…

OKR如何与组织的整体战略和计划相结合?

OKR(Objectives and Key Results,目标与关键成果)作为一种流行的目标管理方法,正逐渐成为组织实现战略目标的重要手段。本文将探讨OKR如何与组织的整体战略和计划相结合,从而推动组织的持续发展。 首先,我…

dlib:人脸识别的魔法工具箱

引言 在数字化的世界中,人脸识别技术已经不再是科幻小说的专利,而是我们日常生活中的一部分。从解锁手机到机场安检,人脸识别技术正在逐步改变我们与世界的互动方式。而在这个领域中,有一个名为dlib的英雄,以其强大的功…

LLM之RAG实战(三十三)| 探索RAG在Table的应用

实现RAG是一个挑战,尤其是在有效解析和理解非结构化文档中的表格时,对于扫描的文档或图像格式的文档来说尤其困难。这些挑战至少有三个方面: 扫描文档或图像文档的复杂性,如其多元化的结构、非文本元素以及手写和打印内容的组合&…

前端基础篇-深入了解 Ajax 、Axios

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 Ajax 概述 2.0 Axios 概述 3.0 综合案例 1.0 Ajax 概述 通过 Ajax 可以给服务器发送请求,并获取服务器响应的数据。异步交互是指,可以在不…

InnoDB存储引擎中的锁(整理)

目录 什么是锁 InnoDB存储引擎中的锁 锁的类型 锁的兼容性 一致性非锁定读 一致性锁定读 锁的算法 行锁的三种算法 Phantom Problem(幻像问题) 锁问题 脏读 不可重复读 丢失更新 死锁 什么是锁 在数据库中锁是为了解决资源争抢的问题&…

Linux操作系统——多线程

1.线程特性 1.1线程优点 创建一个新线程的代价要比创建一个新进程小得多与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多线程占用的资源要比进程少很多能充分利用多处理器的可并行数量在等待慢速I/O操作结束的同时,程序可执行其他的计…

先进的人工智能促进更好的业务沟通

提升商务沟通效率:了解SaneBox智能电子邮件管理工具 在现代商业环境中,有效的沟通至关重要。 先进的人工智能技术,特别是在电子邮件管理方面,正在改变企业处理沟通的方式,提高效率和个性化。 下面,我们深入…

【1】THIS IS NOT PROLIFIC PL2303. PLEASE CPMTACT YOUR SUPPLIER

0x01 问题描述 连接COM口连接不上,出现THIS IS NOT PROLIFIC PL2303. PLEASE CPMTACT YOUR SUPPLIER.如下图 0x02 问题解决 1、分析后,因为是windows 11 系统,就装一下驱动。右键单击--》属性 2、更新驱动程序--》浏览我的电脑以查找驱动程序…