【TCP/IP】TCP报文段的首部格式和流量控制

news2024/11/26 20:50:25

TCP 报文段的首部格式

TCP 虽然是面向字节流的,但其传送的数据单元却是报文段。一个TCP报文段分为首部和数据两部分,而 TCP 的全部功能的体现在它首部中各字段的作用。 因此,弄清 TCP 报文段首部各字段的作用对掌握 TCP 的工作原理非常重要。TCP 报文段的首部格式如下图所示(由首部固定的 20 个字节+后面 4n 字节选择性添加选项组成):

在这里插入图片描述

首部固定部分各字段的意义(20字节)

  • 源端口和目的端口:各占两个字节,分别写如源端口号和目的端口号。目的端口号是为了接收方需要交付报文,源端口号是为了接收接收方的返回信息。
  • 序号:占 4 个字节。是指报文段中第一个字节的编号。(TCP 连接中传送的字节流中的每一个字节都按顺序编号。)
  • 确认号(ACKs):占 4 个字节。是指期望收到对方下一个报文段的第一个数据字节的序号。注意:若确认号 = N,则表面:到序号 N-1 为止的所有数据都已正确收到。

下图举个说明序号和确认号字段意义的例子
在这里插入图片描述

  • 确认 ACK:仅当 ACK = 1 时确认号字段才有效。当 ACK = 0 时,确认号无效。TCP 建立连接后所有的报文段都必须把 ACK 置为 1。
  • 同步 SYN:在连接建立时用来同步序号。SYN 置为 1 表示这是一个连接请求或连接接收报文。当 SYN = 1 而 ACK = 0 时,表明这是一个连接请求报文段。对方若同意建立连接的话,那对应的响应报文段中有 SYN= 1 和 ACK = 1.
  • 终止 FIN:用来释放一个连接。当 FIN = 1 时,表面该报文段的发送方的数据已经发送完毕,并要求释放运输连接。
  • 窗口:占 2 个字节。指发送本报文段的一方的接收窗口。表示接收方目前允许发送对方的数据量(以字节为单位,窗口值是[0,2^16-1])。之所以要有这个限制,是因为接收方的数据缓存空间有限,用于处理 TCP 流量控制。
  • 检验和:占 2 字节。检验和字段检验的范围包括首部和数据这两个部分。

TCP 的流量控制

流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。接收方是有缓存的,缓存中有空闲的空间,也有已接收到的数据,要使得发送方传的数据不让这个缓存容器溢出即为流量控制。下图是接收方缓存数据的结构和走向:

在这里插入图片描述

流量控制的实现原理

利用滑动窗口去实现流量控制。接收方在建立连接的时候会将返给发送方报文段首部窗口值赋值(接收方缓存支持量),窗口值会随着接收方缓存的可用空间而发生改变。当给发送方发送 0 窗口的时候,发送方停止发送,等待接收方的非零窗口通知。 下图是滑动窗口实现流量控制的例子:

在这里插入图片描述

死锁问题

引入死锁:
当接收方发送给发送方零窗口报文段后不久,接收方中缓存有了一些存储空间,给发送方发送报文段的时候,报文段在传送过程丢失了,接收方和发送方之间失去了联系,如果没有其他措施,这种一直延续的互相等待即为死锁。

解决方案:
TCP 为每一个连接设有一个持续计时器。TCP 连接的一方收到对方的零窗口通知的时候就开启持续计时器。若计时器时间到,就发送一个零窗口探测报文段, 而对方在确认到这个探测报文段时就给出当时的窗口值。如果窗口值仍然为 0 ,那继续设置持续计时器,如果不为 0 ,死锁问题即可解决。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

排查jacoco覆盖率对反射问题的影响

最近业务部门开始推行,在全部后台应用中自动开启覆盖率测试。然而,不久后就有业务测试的同学反馈出现问题。 问题的现象如下: 我们的业务通过 HTTP 调用腾讯OSS的服务,结果得到了以上的报错信息。测试同学验证后发现&#xff0c…

【RocketMQ】004-Spring Boot 集成 RocketMQ

【RocketMQ】004-Spring Boot 集成 RocketMQ 文章目录 【RocketMQ】004-Spring Boot 集成 RocketMQ一、基本使用1、创建 Spring Boot 项目,并引入 RocketMQ 依赖2、application.yml 配置3、消息生产者4、消息消费者5、消息调用接口6、启动 RocketMQ7、启动项目&…

(1)LED

LED正负极:大红旗——负极,小红旗——正极 如何看原理图电阻/电容值: eg: 102 10 2 10 * 10 ^ 2 1000 473 47 3 47 * 10 ^ 3 47000单片机使用TTL电频:高电平(逻辑1)5V 低电平&#xff…

C语言操作符详解(上)

C语言操作符详解&#xff08;上&#xff09; 前言1. 算术操作符2. 移位操作符2.1 左移操作符(<<)2.2 右移操作符&#xff08;>>&#xff09; 3. 位操作符3.1 按位与&#xff08;&&#xff09;3.2 按位或&#xff08;|&#xff09;3.4 按位异或&#xff08;^&am…

(4)定时器

51单片机的定时器属于单片机的内部资源&#xff0c;其电路的连接和运转均在单片机内部完成 作用&#xff1a; 用于计时系统替代长时间Delay&#xff0c;提高运行效率和速度任务切换 STC89C52定时器资源&#xff1a; 定时器个数&#xff1a;3个&#xff08;T0,T1,T2&#xf…

【MySQL】MySQL 运算符

目录 一、运算符简述 二、运算符使用 1.算术运算符 1.1 加法运算符 1.2 减法运算符 1.3 乘法与除法运算符 1.4 求模&#xff08;求余&#xff09;运算符 2.比较运算符 2.1 等号运算符 2.2 安全等于运算符 2.3 不等于运算符 2.4 空运算符 2.5 非空运算符 2.6 最小…

深度剖析Mybatis-plus Injector SQL注入器

背景 在项目中需要同时操作Sql Server 以及 MySQL 数据库&#xff0c;可能平时直接使用 BaseMapper中提供的方法习惯 了&#xff0c;不用的话总感觉影响开发效率&#xff0c;但是两个数据库的SQL语法稍微有点差别&#xff0c;有些暴露的方法并不能直接使用&#xff0c;所以便想…

WebSocket的那些事(3-STOMP实操篇)

目录 一、序言二、STOMP详解1、STOMP简单介绍2、STOMP协议内容3、使用STOMP的好处 三、代码示例1、Maven依赖2、开启WebSocket消息代理3、控制器4、前端页面greeting.html 四、测试1、连接服务端2、发送消息 五、STOMP消息传播流程六、结语 一、序言 上节中我们在 WebSocket的…

(11)LCD1602液晶显示屏

LCD1602&#xff08;Liquid Crystal Display&#xff09;液晶显示屏是一种字符型液晶显示模块&#xff0c;可以显示ASCII码的标准字符和其它的一些内置特殊字符&#xff0c;还可以有8个自定义字符&#xff0c;自带芯片扫描 显示容量&#xff1a;162个字符&#xff0c;每个字符…

【C++】STL六大组件简介

STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个包罗数据结构与算法的软件框架。 1.STL的版本介绍 原始版本 Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本&#xff…

Unity里面CG和HLSL在写法上的一些区别

大家好&#xff0c;我是阿赵。这里继续讲URP相关的内容。 这次想讲的是CG和HLSL在写法上的一些区别。 一、为什么开始用HLSL 首先&#xff0c;基本上大家都知道的事情再说一遍。 三种Shader编程语言&#xff1a; 1、基于OpenGL的OpenGL Shading Language&#xff0c;缩写GLSL…

接口测试中postman环境和用例集

postman的环境使用 postman里有环境的设置&#xff0c;就是我们常说的用变量代替一个固定的值&#xff0c;这样做的好处是可以切换不同的域名、不同的环境变量&#xff0c;不同的线上线下账户等等场景。下面就看下怎么用吧。 创建一个Environment postman有一个envrionment&am…

Java是如何实现双亲委托机制的

Java 是一种面向对象的编程语言&#xff0c;它有一套独特的类加载机制。其中&#xff0c;双亲委托加载机制是 Java 类加载机制中的一个重要概念。本文将介绍 Java 的双亲委托加载机制是如何实现的&#xff0c;并解释其作用和优点。 Java 类加载机制 在 Java 中&#xff0c;类的…

瀑布流组件陷入商品重复怪圈?我是如何用心一解的!

目录 背景 瀑布流组件 什么是瀑布流组件 如何实现一个瀑布流组件 商品重复的原因 解决方案 方法一&#xff08;复杂&#xff0c;不推荐&#xff09;&#xff1a;标记位大法 方法二&#xff08;优雅&#xff0c;推荐&#xff09;&#xff1a;Promise 队列 大法 总结 背…

解决新思路#报错:ping: www.baidu.com: 未知的名称或服务--照着步骤来还是ping不通的可能原因

最近由ubantu转为centos7,配置hadoop&#xff0c;配置静态ip的过程中一直ping不通。之前配置ubantu的也是&#xff0c;终于这次在重启虚拟机和主机后发现了原因。 中途尝试过: 1.三次以上命令行反复操作 2.图形界面设置 3.看是否主机的网络适配器的网关与设置的IP地址产生冲突…

JavaScript实现计算100之间能被5整除的数的代码

以下为实现计算100之间能被5整除的数的程序代码和运行截图 目录 前言 一、计算100之间能被5整除的数 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 前言 1.若有选择&#xff0c;您可以在目录里进行快速查找&#xff1b; 2.本博文代码可以根据题…

2023最新100道渗透测试面试题(附答案)

眨眼间2023年快过去一半了&#xff0c;不知道大家有没有找到心仪的工作呀&#xff0c;今天我给大家整理了100道渗透测试面试题给大家&#xff0c;需要答案的话可以在评论区给我留言哦~ 第一套渗透面试题 什么是渗透测试&#xff1f;它的目的是什么&#xff1f; 渗透测试的五个…

DirectX12 简单入门(一)

在很久以前写过关于DirectX9的一些应用&#xff0c;直到现在DirectX12已经普及了。写完几个DirectX12测试代码之后&#xff0c;写一篇DirectX12简单入门介绍一下基本概念&#xff0c;以及环境搭建和编程过程。 编程环境 与DirectX9不同&#xff0c;在DirectX12开发中微软将需…

『MySQL 实战 45 讲』“order by” 是怎么工作的

“order by” 是怎么工作的 首先创建一个表 CREATE TABLE t ( id int(11) NOT NULL, city varchar(16) NOT NULL, name varchar(16) NOT NULL, age int(11) NOT NULL, addr varchar(128) DEFAULT NULL, PRIMARY KEY (id), KEY city (city) ) ENGINEInnoDB;全字段排序 在 cit…

自己搭建go web 框架

思想base部分day1:封装gee封装context上下文封装tree路由树分组封装group与中间件封装文件解析封装封装错误处理 思想 web框架服务主要围绕着请求与响应来展开的 搭建一个web框架的核心思想 1 便捷添加响应路径与响应函数(base) 2 能够接收多种数据类型传入(上下文context) 3 构…