当前位置: 首页 > 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的一站式前后端分离快速开发平台,通过整合微信…...

24年最新抖音、视频号0成本挂机,单号每天收益上百,可无限挂

详情介绍 这次给大家带来5月份最新的短视频挂机项目,简单易上手,而且不需要任何投入,经过测试收益非常可观,软件完全免费,特别适合没有时间但是想做副业的家人们...

Day31:单元测试、项目监控、项目部署、项目总结、常见面试题

单元测试 保证独立性。 Assert:断言,一般用来比较是否相等,比如 Assert.assertEquals 在JUnit测试框架中,BeforeClass,Before,After和AfterClass是四个常用的注解,它们的作用如下: …...

Flutter笔记:使用Flutter私有类涉及的授权协议问题

Flutter笔记 使用Flutter私有类涉及的授权协议问题 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.cs…...

面试过程种遇到的面试题收集

文章目录 讲一讲这个项目是干什么的?需求规格说明书有哪些章节?职工部门层级如何显示在一张SQL表上?需求开发用到了哪些技术?HashMap 底层数据结构说一下?介绍一下红黑树?HashMap是线程不安全的&#xff0c…...

Vue学习:21.mixins混入

在Vue中,mixins(混入)是一种用于分发Vue组件中可复用功能的灵活机制。它们允许你抽取组件中的共享功能,如数据、计算属性、方法、生命周期钩子等,并将其作为单独的模块复用到多个组件中。这种方式有助于保持代码的DRY&…...

上传文件到 linux

一、mac 法一:scp 先进入mac的 Node_exporter文件(要上传的文件)目录下 输入scp -P 端口号 文件名 rootIP:/存放路径 scp -P 22 node_exporter-1.8.0.linux-amd64.tar.gz root192.***.2:/root 法二、 rz mac 安装 lrzsz,然后…...

NEO 学习之session7

文章目录 选项 A:它涉及学习标记数据。 选项 B:它需要预定义的输出标签进行训练。 选项 C:它涉及在未标记的数据中寻找模式和关系。 选项 D:它专注于根据输入-输出对进行预测。 答案:选项 C 描述了无监督学习的本质&am…...

毕业设计uniapp+vue有机农产品商城系统 销售统计图 微信小程序

本人在网上找了一下这方面的数据发现农村中的信心普及率很是低农民们都不是怎么会用手机顶多就是打打电话发发短信,平时不太会上网更不会想到通过网络手段去卖出自己的劳作成果—农产品,这无疑大大浪费了农民的劳动成果和国家资源也大大打击了人们的生产…...

php使用Canal监听msyql

canal需要java8 去官网下载java8 安装JAVA #创建目录 mkdir -p /usr/local/java/ #解压到目录 tar zxvf jdk-8u411-linux-x64.tar.gz -C /usr/local/java/配置环境变量在 /etc/profile 最后加入 export JAVA_HOME/usr/local/java/jdk1.8.0_411 export CLASSPATH.:$JAVA_HOM…...

metabase部署与实践

1. 项目目标 (1)了解metabase特点 (2)熟练部署metabase工具 (3)掌握metabase基本使用 2. 项目准备 2.1. 规划节点 主机名 主机IP 节点规划 metabase 10.0.1.141 metabase 2.2. 基础准备 系统镜…...

建立网站是什么建立的/免费行情软件网站下载

由于单机Redis存储能力受单机限制,以及无法实现读写操作的负载均衡和读写分离,无法保证高可用。本篇就来介绍 Redis 集群搭建方案及实现原理,实现Redis对数据的冗余备份,从而保证数据和服务的高可用。主从复制是哨兵和集群的基石&…...

那些网站可以找得到做货代的/最新热点新闻事件

将角色导航里的Angular Speed设置为0 //方向 var speed new Vector3(x, 0, y); //手动设置旋转 //LookAt&#xff08;目标点的位置&#xff09; 旋转到目标点的方向 //目标点的位置 自己的坐标 方向 GetComponent<Transform>().LookAt(GetComponent<Transform>…...

中企动力做网站的价格/权重查询工具

结婚钻戒是结婚的时候&#xff0c;女生佩戴的婚戒&#xff0c;铂金或者18K金的戒托上镶嵌有一颗钻石&#xff0c;闪闪发亮&#xff0c;代表着真挚的爱情。从恋爱到婚姻&#xff0c;需要真挚的爱情的支撑&#xff0c;男生为她用心的挑选这枚结婚钻戒&#xff0c;能够表达对她真挚…...

cms免费企业网站/百度客服电话24小时人工服务热线

CDR绘制简单logo教程&#xff1a;步骤1&#xff1a;第一步是创建一个空白文档空间,供我们设计和处理,页面大小或文档大小可以是网页,A4或可以自定义宽度和高度的像素,例如800 * 600像素.根据我们要创建的内容,方向可以是横向或纵向.原色模式将为CMYK,还有另一种选择,例如RGB.最…...

wordpress数字交易模板/营销型网站建设套餐

本博客仅记录自己在代码中&#xff0c;多个源文件共享或限制全局变量、函数作用域的常用用法。 扩展全局变量、函数作用域 1. 多个源文件使用其中一个源文件的外部变量 外部变量是在函数外部定义的全局变量&#xff0c;它的作用域从定义开始&#xff0c;到本程序文件的末尾。…...

网站制作免费/成人零基础学电脑培训班

拓扑结构&#xff1a;实验规划&#xff1a;把后端的mysql做成“一主多从”复制架构&#xff0c;主的mysql将提供“写”操作&#xff0c;从的mysql将提供“读”操作&#xff0c;两台服务器做lvs-keepalived实现高可用&#xff0c;正常情况下&#xff0c;一台服务器获得对mysql“…...