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
在这里插入图片描述
如果是重传数据,可以根据SACK信息直接重传区间数据,这时候的seq是可以计算出来的,就不是上次接收到的ack了,后面会写相关文章

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

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

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

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【物联网开源平台】tingsboard二次开发环境搭建+编译

文章目录 一,需要准备的环境二,获取tingsboard源码1.git拉取源码2.下载源码压缩包 三.新建仓库存放依赖文件四,编译五,遇到的错误 提示: 1.这篇只要准备两个环境,方法更简单! 2.基于tingsboard …

谷歌seo营销服务有哪些服务?

以我们举例,如果你在做B2B外贸建站,这里有全套保姆式托管服务,让你既省心又省力,七天就能搞定网站建设,快速上线,再来就是谷歌白帽SEO,我们这边强调的是纯白帽操作,专注于高质量的原…

在Sequence中缓存Niagara粒子轨道

当Sequence中粒子特效较多时,播放检查起来较为麻烦,而使用Niagara缓存功能可将粒子特效方便的缓存起来,并且还可以更改播放速度与正反播放方向,便于修改。 1.使用Niagara缓存需要先在插件里打开NiagaraSimCaching 2.创建一个常…

Visual Studio - Platform Toolset

Visual Studio - Platform Toolset 1. Microsoft Visual Studio 2013 - Platform Toolset2. Microsoft Visual Studio 2015 - Platform ToolsetReferences 1. Microsoft Visual Studio 2013 - Platform Toolset (right mouse click on the project) -> 属性 -> 配置属性…

10、chrome拓展程序的实现

一、拓展程序的实现 拓展程序项目的构成 和前端项目一样,拓展程序也是有Html、CSS、JS文件实现的,现在看来它就是一个静态的前端页面。但是不同的是,拓展程序中还需要额外的一个清单文件,就是manifest.json,清单文件可…

Spark Stage

Spark Stage 什么是Stage Spark中的一个Stage只不过是物理执行计划其中的一个步骤,它是物理执行计划的一个执行单元。一个Job会被拆分为多组Task,每组任务被称为一个Stage,可以简单理解为MapReduce里面的Map Stage, Reduce Stag…

下载最新VMware,社区版本(免费)

VMware - Delivering a Digital Foundation For BusinessesRun any app on any cloud on any device with a digital foundation built on VMware solutions for modern apps, multi-cloud, digital workspace, security & networking.https://www.vmware.com/ 官网地址

城管智慧执法系统源码,基于微服务+java+springboot+vue开发

城管智慧执法系统源码,基于微服务javaspringbootvue开发 城管智慧执法系统源码有演示,自主研发,功能完善,正版授权,可商用上项目。 一套数字化的城管综合执法办案系统源码,提供了案件在线办理、当事人信用…

适配器模式与桥接模式-灵活应对变化的两种设计策略大比拼

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》 💪🏻 制定明确可量化的目标,坚持默默的做事。 🚀 转载自:设计模式深度解析:适配器模式与桥接模式-灵活应对变…

C语言——字符函数

前言 字符函数是C语言中专门用来处理字符的函数,再C语言中,我们有时需要大量的处理有关字符的问题,所以字符函数就由此应运而生,接下来我来为大家简单介绍一下字符函数。 一.字符分类函数 函数如果它的参数满足下列条件就返回真…

数据之王国:解析Facebook的大数据应用

引言 作为全球最大的社交媒体平台之一,Facebook拥有庞大的用户群体和海量的数据资源。这些数据不仅包括用户的个人信息和社交行为,还涵盖了广告点击、浏览记录等多方面内容。Facebook通过巧妙地利用这些数据,构建了强大的大数据应用系统&…

AbstractQueuedSynchronizer 独占式源码阅读

概述 ● 一个int成员变量 state 表示同步状态 ● 通过内置的FIFO队列来完成资源获取线程的排队工作 属性 AbstractQueuedSynchronizer属性 /*** 同步队列的头节点 */private transient volatile Node head;/*** 同步队列尾节点,enq 加入*/private transient …

政安晨:【深度学习实践】【使用 TensorFlow 和 Keras 为结构化数据构建和训练神经网络】(二)—— 深度神经网络

政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras实战演绎 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 概述 深度神经网络(Deep Neural Network…

web前端之行为验证码、不同设备和屏幕尺寸呈现不同大小、元素宽度根据视口宽度进行调整、元素或图片裁剪、图片验证码

MENU 前言版本一(htmlJScss)版本二(htmlJScsscanvas) 前言 1、版本一的样式比较齐全; 2、版本二的JS逻辑和功能效果比较完善,且是别人的代码,后续会对样式进行完善。[Gitee | 哔哩哔哩]; 3、两个版本各有千秋,主要学习…

HTTPS协议的工作原理:保护网络通信的安全盾牌

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【深度学习】四种天气分类 模版函数 从0到1手敲版本

引入该引入的库 import torch import torch.nn as nn import matplotlib.pyplot as plt import torch.nn.functional as F import torchvision import torch.optim as optim %matplotlib inline import os import shutil import glob os.environ["KMP_DUPLICATE_LIB_OK&q…

SQLiteC/C++接口详细介绍sqlite3_stmt类(六)

返回:SQLite—系列文章目录 上一篇:SQLiteC/C接口详细介绍sqlite3_stmt类(五) 下一篇: SQLiteC/C接口详细介绍sqlite3_stmt类(七) 17. sqlite3_clear_bindings函数 sqlite3_clear_bindings函…

微服务高级篇(一):微服务保护+Sentinel

文章目录 一、初识Sentinel1.1 雪崩问题及解决方案1.2 微服务保护技术对比1.3 Sentinel介绍与安装1.4 微服务整合Sentinel 二、Sentinel的流量控制三、Sentinel的隔离与降级四、Sentinel的授权规则五、规则持久化5.1 规则管理模式【原始模式、pull模式、push模式】5.2 实现push…

Spark-Scala语言实战(4)

在之前的文章中,我们学习了如何在scala中定义无参,带参以及匿名函数。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。 Spark-Scala语言…

基础:TCP四次挥手做了什么,为什么要挥手?

1. TCP 四次挥手在做些什么 1. 第一次挥手 : 1)挥手作用:主机1发送指令告诉主机2,我没有数据发送给你了。 2)数据处理:主机1(可以是客户端,也可以是服务端)&#xff0c…