当前位置: 首页 > news >正文

[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时,表示今后不会再有数据发送,希望断开连接
  • 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
      请添加图片描述

3.保证可靠性

  • 最核心的机制就是基于序号的确认应答机制 ,TCP不能做到100%可靠,但是通过应答机制来确保上一条信息是不是100%被对方收到

    • 只要有一条信息应答了,就可以肯定上一条消息是可靠的被对方收到了
      请添加图片描述
  • 当客户端向服务端发送了0~100之间的数据时,本质上就是发送了一个报文,如果服务端没有响应,那么客户端就不知道自己发出的数据是否被服务端收到,所以只有当服务端给客户端一个响应后,客户端就知道自己刚刚发出的数据已经被服务端收到了,这个确认应答号就保证了历史报文的可靠性

4.为什么序列号和确认应答号是单独的字段

  • 如果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 输出&#xff0…...

网络培训议题@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的一站式前后端分离快速开发平台,通过整合微信…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 ​ 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...

【Oracle APEX开发小技巧12】

有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes&#xff0…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...