[Linux][网络][TCP][一][TCP基础][TCP报头]详细讲解
目录
- 1.TCP头部格式
- 2.TCP协议的特点
- 3.TCP如何封装与分用
- 4.通过序列号和确认应答号提高可靠性
- 1.32位序列号
- 2.32位确认应答号
- 3.保证可靠性
- 4.为什么序列号和确认应答号是单独的字段
- 5.窗口大小
- 1.TCP的发送和接收缓冲区
- 2.窗口大小
- 6.连接管理机制
1.TCP头部格式
-
TCP全称为"传输控制协议"(Transmission Control Protocol),人如其名, 要对数据的传输进行一个详细的控制

-
源/目标端口号:表示数据是从哪个进程来,到哪个进程去
-
序列号:在建立连接时由计算机生成的随机数作为初始值,通过SYN包传给接收端主机,后续每发一次数据,就累加一次数据字节数大小
- 用来解决网络包乱序问题
-
确认应答号:指下一次期望收到的序列号,发生端收到这个确认应答号后可以认为这个序列号之前的数据都已经被正常接收
- 用来解决丢包问题
-
序列号和确认应答号:
- 将请求和应答进行一一对应
- 允许部分确认丢失,或者不给应答
-
4位TCP报头长度:表示该TCP头部有多少个32位bit(有多少个4字节),所以TCP头部最大长度是15 * 4 = 60
-
6位标志位:
- URG:该位为1时,表明紧急指针字段有效
- 它告诉系统此报文段中有紧急数据,应当尽快传输(相当于高优先级的数据),而不要按原来的排队顺序来传送
- ACK:该位为1时,表明确认应答字段有效
- TCP规定除了最初建立连接时的SYN包之外,该位必须置为1
- PSH:该位为1时,提示接收端应用程序立刻从TCP缓冲区把数据读取走
- 督促对方尽快将数据进行向上交付
- RST:该位为1时,表示要求重新建立连接,以下四种情况会发送RST包
- 端口未打开
- 请求超时
- 提前关闭
- 在一个已关闭的socket上收到数据
- SYN:该位为1时,表示希望建立连接,并在序列号的字段进行初识序列号值的设定
- FIN:该位为1时,表示今后不会再有数据发送,希望断开连接
- URG:该位为1时,表明紧急指针字段有效
-
16位窗口大小
-
16位校验和:发送端填充,CRC校验。接收端校验不通过,则认为数据有问题。此处的检验和不仅包含TCP首部,也包含TCP数据部分
-
16位紧急指针:标识哪部分数据是紧急数据
-
40字节头部选项
2.TCP协议的特点

- 面向连接:一定是一对一才能连接,不能像UDP协议那样可以一个主机同时向多个主机发生消息,也就是一对多是无法做到的
- 可靠的:无论网络链路层出现了什么变化,TCP都可以保证一个报文一定能够到达接收端
- 字节流:
- 消息是没有边界的,所以无论消息有多大都可以进行传输
- 并且消息是有序的,当前一个消息还没收到的时候,即便收到了后面的字节,那么也不能交付给应用层去处理,同时对重复的报文会自动丢弃
3.TCP如何封装与分用

- 4位首部长度:
- 它表示的是TCP的首部长度,基本单位是4字节 ,能够表示的范围 [0000 , 1111]
- 当这个字段填入的是1111时**(即15)**,那么TCP首部长度为 15 * 4 = 60 字节
- TCP首部长度 - TCP标准长度 = 60 - 20 = 40字节,这个就表示选项字段的长度
- 一般4位首部长度用0101表示(即5),那么TCP首部长度就等于20字节,也就是TCP的标准长度
- 如何封装:将应用层的有效载荷加上TCP的首部长度,交付给下一层
- 如何分用:
- 根据4位首部长度,计算出TCP的标准长度与选项长度
- 如果TCP的标准长度刚好是20字节,那么剩下的就是有效载荷
- 如果大于20字节,则减去20字节后,得到选项字段的长度,再读取完选项的长度后,便可得到有效载荷
4.通过序列号和确认应答号提高可靠性
1.32位序列号
- 对于32位序列号,TCP将每个字节的数据都进行了编号,即为序列号
- 从下图可以看出,当想要发送比较大的数据时,TCP会将这些数据按字节进行编号,然后按照编号的顺序发送给服务器
- 这样一来,32位序列号的作用就是能够保证报文的按序到达
- **注意:**客户端向服务端发送报文时,序列号初始值并非为0,而是随机初始化这个序列号

2.32位确认应答号
- 32位确认应答号主要是用来对历史报文数据的一个响应,以客户端发送报文给服务端为例:
- 当客户端发送报文给服务端时,本质上发送的是序列号,如果发生的序列号为100,当服务端收到客户端发来的序列号后,服务端就会给客户端响应一个报文,报文内部附带着确认应答号,这个确认应答号就是对客户端发来的序列号+1

- 当客户端发送报文给服务端时,本质上发送的是序列号,如果发生的序列号为100,当服务端收到客户端发来的序列号后,服务端就会给客户端响应一个报文,报文内部附带着确认应答号,这个确认应答号就是对客户端发来的序列号+1
3.保证可靠性
-
最核心的机制就是基于序号的确认应答机制 ,TCP不能做到100%可靠,但是通过应答机制来确保上一条信息是不是100%被对方收到
- 只要有一条信息应答了,就可以肯定上一条消息是可靠的被对方收到了

- 只要有一条信息应答了,就可以肯定上一条消息是可靠的被对方收到了
-
当客户端向服务端发送了0~100之间的数据时,本质上就是发送了一个报文,如果服务端没有响应,那么客户端就不知道自己发出的数据是否被服务端收到,所以只有当服务端给客户端一个响应后,客户端就知道自己刚刚发出的数据已经被服务端收到了,这个确认应答号就保证了历史报文的可靠性
4.为什么序列号和确认应答号是单独的字段
-
如果TCP的报头将这两个字段设计成了一个字段(这里假设为序列号),那么新的TCP头部格式如下

-
如下图所示:当客户端向服务端发送数据时,服务端给出响应;当服务端给客户端发送数据时,客户端再给出响应

-
这样的效率明显很低,并且TCP是全双工通信协议,双方通信时,一个报文,既可以携带要发送的数据,也可以携带对历史报文的确认
- 即:TCP是全双工的,任何一方,既可以收,又可以发

- 即:TCP是全双工的,任何一方,既可以收,又可以发
5.窗口大小
1.TCP的发送和接收缓冲区
-
TCP本身是具有接收缓冲区和发送缓冲区的
- 接收缓冲区用来暂时保存接收到的数据
- 发送缓冲区用来暂时保存还未发送的数据
- 这两个缓冲区都是在TCP传输层内部实现的
-
可以理解为在TCP内部malloc了2段空间

-
当客户端的应用层调用write/send时,并不是将数据发送到网络上,而是将应用层的数据拷贝到TCP自带的发送缓冲区中,在已经连接好的客户服务器中,经由网络传输到服务端的接收缓冲取中,服务端的接收缓冲区有数据后,调用read/recv时,是将服务端的接收缓冲区的数据拷贝给应用层

-
当数据写入到TCP的发送缓冲区后,对应的write/send函数就可以返回了,至于发送缓冲区当中的数据具体什么时候发,怎么发等问题实际都是由TCP决定的
-
之所以称TCP为传输层控制协议,就是因为最终数据的发送和接收方式,以及传输数据时遇到的各种问题应该如何解决,都是由TCP自己决定的,用户只需要将数据拷贝到TCP的发送缓冲区,以及从TCP的接收缓冲区当中读取数据即可
-
TCP的发送缓冲区和接收缓冲区存在的意义?
- 数据在网络中传输时可能会出现某些错误,此时就可能要求发送端进行数据重传,因此TCP必须提供一个发送缓冲区来暂时保存发送出去的数据,以免需要进行数据重传。只有当发出去的数据被对端可靠的收到后,发送缓冲区中的这部分数据才可以被覆盖掉
- 接收端处理数据的速度是有限的,为了保证没来得及处理的数据不会被迫丢弃,因此TCP必须提供一个接收缓冲区来暂时保存未被处理的数据,因为数据传输是需要耗费资源的,不能随意丢弃正确的报文
- 此外,TCP的数据重排也是在接收缓冲区当中进行的
- 因为缓冲区的存在,所以可以做到应用层和TCP进行解耦
2.窗口大小
-
窗口大小反映的就是客户端或服务端发送和接收缓冲区剩余空间的大小
-
如下图所示,假设客户端和服务端各自的缓冲区只能容纳100字节的数据,当客户端向服务端发送20个字节的数据后,服务端的接收缓冲区的大小就变成了80字节;反过来对于客户端也是一样

-
当发送端要将数据发送给对端时,本质是把自己发送缓冲区当中的数据发送到对端的接收缓冲区当中。但缓冲区是有大小的,如果接收端处理数据的速度小于发送端发送数据的速度,那么总有一个时刻接收端的接收缓冲区会被打满,这时发送端再发送数据过来就会造成数据丢包,进而引起丢包重传等一系列的连锁反应
-
在TCP报文中有了这个字段后, 接收端在对发送端发来的数据进行响应时,就可以通过16位窗口大小这个字段告知发送端自己当前接收缓冲区剩余空间的大小,此时发送端就可以根据这个窗口大小字段来调整自己发送数据的速度
- 窗口大小字段越大,说明接收端接收数据的能力越强,此时发送端可以提高发送数据的速度
- 窗口大小字段越小,说明接收端接收数据的能力越弱,此时发送端可以减小发送数据的速度
- 如果窗口大小的值为0,说明接收端接收缓冲区已经被打满了,此时发送端就不应该再发送数据了
6.连接管理机制
- 服务端状态转化:
- [CLOSED -> LISTEN]:服务器端调用listen后进入LISTEN状态,等待客户端连接
- [LISTEN -> SYN_RCVD]:一旦监听到连接请求(同步报文段),就将该连接放入内核等待队列中,并向客户端发送SYN确认报文
- [SYN_RCVD -> ESTABLISHED]:服务端一旦收到客户端的确认报文,就进入ESTABLISHED状态,可以进行读写数据了
- [ESTABLISHED -> CLOSE_WAIT]:当客户端主动关闭连接(调用close),服务器会收到结束报文段,服务器返回确认报文段并进入CLOSE_WAIT
- [CLOSE_WAIT -> LAST_ACK]:进入CLOSE_WAIT后说明服务器准备关闭连接(需要处理完之前的数据),当服务器真正调用close关闭连接时,会向客户端发送FIN,此时服务器进入LAST_ACK状态,等待最后一个ACK到来(这个ACK是客户端确认收到了FIN)
- [LAST_ACK -> CLOSED]:服务器收到了对FIN的ACK, 彻底关闭连接
- 客户端状态转化:
- [CLOSED -> SYN_SENT]:客户端调用connect,发送同步报文段
- [SYN_SENT -> ESTABLISHED]:connect调用成功,则进入ESTABLISHED状态,开始读写数据
- [ESTABLISHED -> FIN_WAIT_1]:客户端主动调用close时,向服务器发送结束报文段,同时进入FIN_WAIT_1
- [FIN_WAIT_1 -> FIN_WAIT_2]:客户端收到服务器对结束报文段的确认,则进入FIN_WAIT_2,开始等待服务器的结束报文段
- [FIN_WAIT_2 -> TIME_WAIT]:客户端收到服务器发来的结束报文段,进入TIME_WAIT,并发出LAST_ACK
- [TIME_WAIT -> CLOSED]:客户端要等待一个2MSL(Max Segment Life,报文最大生存时间)的时间,才会进入CLOSED状态
相关文章:
[Linux][网络][TCP][一][TCP基础][TCP报头]详细讲解
目录 1.TCP头部格式2.TCP协议的特点3.TCP如何封装与分用4.通过序列号和确认应答号提高可靠性1.32位序列号2.32位确认应答号3.保证可靠性4.为什么序列号和确认应答号是单独的字段 5.窗口大小1.TCP的发送和接收缓冲区2.窗口大小 6.连接管理机制 1.TCP头部格式 TCP全称为"传输…...
java-函数式编程-函数对象
定义 什么是合格的函数?无论多少次执行函数,只要输入一样,输出就不会改变 对象方法的简写 其实在类中,我们很多参数中都有一个this,被隐藏传入了 函数也可以作为对象传递,lambda就是很好的例子 函数式接口中…...
致远oa实时获取第三方自定义组件实现
背景 最近的一个需求不好处理,甲方没有准确的数据支撑,各种问题踢皮球,所以有时间实现一个实时获取数据的组件 需求 为了实现方便,封装了一个第三方数据实时展示的组件 只要修改配置,就可以实现字段的删除增加&…...
【Linux-点灯烧录-SD卡/USB烧写】
目录 1. 烧写方式2. 烧写之代码编译2.1 led.s->led.o2.2 led.o->led.elf2.3 led.elf->led.bin2.4 反汇编:led.elf->led.dis 3. 烧写之烧录到SD卡上:3.1 开启烧录软件权限:3.2 确定SD卡的格式:FAT323.3 烧录到SD卡上3.…...
PostgreSQL自带的命令行工具06- pg_isready
PostgreSQL自带的命令行工具06- pg_isready 基础信息 OS版本:Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本:16.2 pg软件目录:/home/pg16/soft pg数据目录:/home/pg16/data 端口:5777pg_isready 是 Po…...
【请投票】嘉立创EDA中LED发光二极管是否应有统一的引脚定义?
LED发光二极管的引脚定义应该是唯一的吗? 从下面原理图可以看到,器件型号仅尾缀不同,R代表RED红色发光二极管,W代表WHITE指白色发光二极管,是同一家制造商KENTO, 左侧红色发光二极管的1脚是阴极K,2脚是阳极…...
LT6911UXB HDMI2.0 至四端口 MIPI DSI/CSI,带音频 龙迅方案
1. 描述LT6911UXB 是一款高性能 HDMI2.0 至 MIPI DSI/CSI 转换器,适用于 VR、智能手机和显示应用。HDMI2.0 输入支持高达 6Gbps 的数据速率,可为4k60Hz视频提供足够的带宽。此外,数据解密还支持 HDCP2.2。对于 MIPI DSI / CSI 输出࿰…...
网络培训议题@2
目录 1. 如何通过IP和掩码确定网关:2. 网络路由的意义和配置方法:3. 网络Bond模式的区别和配置场景:4. 堆叠、VLAN、Trunk、聚合的意义:5. 虚拟机环境下VIP配置和常见问题:6. VXLAN拓展: 1. 如何通过IP和掩…...
linux文本三剑客之sed
目录 1、sed特点 1)sed命令格式 2)sed命令核心功能"增删改查" 2、sed命令执行过程 3、sed核心应用 1)sed-查找p 2)sed-删除d 3)sed-增加cai 4) sed-替换s 1、sed特点 sed stream editor 流编辑器…...
nginx封禁恶意IP
网络攻击时有发生 TCP洪水攻击、注入攻击、DOS等比较难防的有DDOS等 为了数据安全,防止对手爬虫恶意爬取,封禁IP 一般封禁ip linux server层面封IP:iptablesnginx层面封IP,方式多种(但req还是会打进来,让…...
「PHP系列」PHP MySQL 简介及运用
文章目录 一、PHP MySQL 简介二、MySQL安装三、相关链接 一、PHP MySQL 简介 PHP MySQL是一个结合了PHP和MySQL的组合,用于在Web应用程序中处理数据库操作。 MySQL: 定义:MySQL是一个流行的开源关系型数据库管理系统(RDBMS&…...
深度学习论文: XFeat: Accelerated Features for Lightweight Image Matching
深度学习论文: XFeat: Accelerated Features for Lightweight Image Matching XFeat: Accelerated Features for Lightweight Image Matching PDF: https://arxiv.org/pdf/2404.19174 PyTorch代码: https://github.com/shanglianlm0525/CvPytorch PyTorch代码: https://github.…...
C++之Eigen库基本使用
目录 1、矩阵的构造和初始化操作 2、矩阵的算术运算 3、矩阵的分解和求解 4、矩阵的变换 5、矩阵的访问和修改 6、矩阵遍历 7、线性方程组求解 8、其他操作 Eigen库是一个高级的C库,用于线性代数,矩阵和向量运算,数值分析和相关的数学…...
2024年 Java 面试八股文——SpringBoot篇
目录 1. 什么是 Spring Boot? 2. 为什么要用SpringBoot 3. SpringBoot与SpringCloud 区别 4. Spring Boot 有哪些优点? 5. Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的? 6. Spring Boot 支持哪些日志框架&#…...
C/C++的指针、万能指针、常量指针和指针常量
C/C的指针 1、 指针的概念: 指针是一个变量,它存储的是另一个变量的内存地址,而不是变量的值。 指针变量的声明:在C/C等语言中,我们通过使用星号*来声明一个指针变量。例如,int *ptr; 这行代码声明了一个…...
【讲解下如何解决一些常见的 Composer 错误】
🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…...
qq空间:图片批量下载js脚本工具,javascript批量下载图片
qq空间:图片批量下载js脚本工具,javascript批量下载图片 QQ空间很多老照片想下载,但是腾讯没放开,只能一张张下载太麻烦。用前端js写了一个脚本支持批量下载。另外就是空间内的照片会被压缩,过几年再看,个…...
滑动验证码登陆测试编程示例
一、背景及原理 处理登录时的滑动验证码有两个难点,第一个是找到滑块需要移动的距离,第二个是模拟人手工拖动的轨迹。模拟轨迹在要求不是很严的情况下可以用先加速再减速拖动的方法,即路程的前半段加速度为正值,后半段为负值去模…...
爬取89ip代理、 爬取豆瓣电影
1 爬取89ip代理 2 爬取豆瓣电影 1 爬取89ip代理 import requests from fake_useragent import UserAgent from bs4 import BeautifulSoup from requests.exceptions import ProxyErrorclass SpiderIP:def __init__(self):# 定义目标地址哦self.tag_url "https://www.89i…...
XBoot:基于Spring Boot 2.x的一站式前后端分离快速开发平台
XBoot:基于Spring Boot 2.x的一站式前后端分离快速开发平台 摘要 随着信息技术的迅速发展,快速构建高质量、高可靠性的企业级应用成为了迫切需求。XBoot,作为一个基于Spring Boot 2.x的一站式前后端分离快速开发平台,通过整合微信…...
Cursor AI开发助手功能体验优化技术探索指南
Cursor AI开发助手功能体验优化技术探索指南 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your trial request limit. / …...
如何彻底解决百度网盘分享链接失效问题:秒传脚本终极指南
如何彻底解决百度网盘分享链接失效问题:秒传脚本终极指南 【免费下载链接】rapid-upload-userscript-doc 秒传链接提取脚本 - 文档&教程 项目地址: https://gitcode.com/gh_mirrors/ra/rapid-upload-userscript-doc 你是否经常遇到百度网盘分享链接失效的…...
PvZ Toolkit:5大核心功能让你的植物大战僵尸体验全面升级
PvZ Toolkit:5大核心功能让你的植物大战僵尸体验全面升级 【免费下载链接】pvztoolkit 植物大战僵尸 PC 版综合修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztoolkit 你是否曾经在植物大战僵尸的无尽模式中苦苦挣扎?是否想要轻松管理游…...
新手轻松学i2c:基于快马生成arduino主从通信完整示例与详解
今天想和大家分享一个特别适合嵌入式新手的I2C通信入门实践。作为一个刚接触I2C协议时被各种专业术语绕晕的过来人,我发现在InsCode(快马)平台上通过实际代码示例学习效果特别好。下面就用Arduino主从机通信的例子,带大家轻松理解I2C的核心要点。 I2C协议…...
智能小车转向核心:基于STM32F103C8T6与CubeMX的舵机控制库封装实战
智能小车转向核心:基于STM32F103C8T6与CubeMX的舵机控制库封装实战 在智能小车开发中,转向控制是决定运动精度的关键模块。许多开发者习惯在main函数中直接调用HAL库的PWM控制函数,但随着项目复杂度提升,这种"面条式代码&qu…...
AI软件框架概述
AI软件框架是人工智能开发中的核心基础设施,被誉为“AI时代的操作系统”。它为开发者提供了构建、训练和部署AI模型所需的标准接口、工具库和运行时环境,极大地降低了AI应用开发的门槛和复杂度。什么是AI框架?根据IBM的定义,AI框架…...
ESP32无人机开发指南:从硬件到飞控系统解析
1. SkyByte Mini无人机项目概述SkyByte Mini是一款基于ESP32-WROOM-32模块的微型WiFi/蓝牙控制无人机,采用开源ESP32-Drone固件,专为爱好者和教育用途设计。这款无人机的核心特点在于其"all-in-one"的PCB设计,无需3D打印部件即可完…...
【AI面试临阵磨枪-40】文本切块(Chunking)策略:固定长度、语义切块、递归切块、重叠设计
一、面试题目请详细介绍 RAG 中文本切块(Chunking)四大核心策略:固定长度切块、语义切块、递归字符切块、切块重叠设计,分别原理、优缺点、适用场景、工程选型建议。二、知识储备1. 基础概念Chunking 文本切块把长文档切分成小块&…...
macOS光标卡顿修复:基于NSCursor与CGEvent的系统级解决方案
1. 项目概述:解决macOS光标卡顿的终极方案如果你是一名macOS的深度用户,尤其是像我这样经常在多个显示器、虚拟机窗口和复杂应用之间切换的开发者或设计师,那么你大概率遇到过那个令人抓狂的问题:鼠标光标“卡住”了。具体来说&am…...
内容生产,正在进入“工业化时代”
01|一个被忽视的变化:内容正在被重新定义过去,内容是“创意产物”。现在,内容更像“生产结果”。从一篇文案、一张海报,到一条视频,企业越来越依赖持续稳定的内容输出能力,而不是偶发灵感。这意…...
