45、TCP的几个常用选项

前面用两节内容的篇幅介绍了TCP协议首部格式,TCP的基本功能都是靠其首部这些字段的支持。那么在固定首部之后,还有长度可变的选项字段,可以提供一些附加功能。既然是长度可变,说明选项肯定不止一个,这里面有些比较重要的,也是常用的选项,我们也有必要学习一下。


最大报文段长度(MSS)

MSS是TCP最初规定的一种选项,该字段的值规定了TCP报文数据部分的最大长度。这是一个值得注意的点,虽然它的名字是报文段长度,但实际上它是指去除了首部的数据部分的最大长度,我们是不是可以把它理解成是一种传输层TCP的“MTU值”呢。

从数据链路层的角度来看,我们知道以太网最初规定最小帧长的目的是:为了能在争用期时间之内检测到数据帧的是否发生碰撞的情况。如果是很短的帧,那么在检测碰撞的时候有可能就会发生问题。那如果我们从另一方面来看,如果是数据部分很短的帧,只有1个字节的数据,加上帧首部和帧尾部等开销,那么整体的网络利用率就不高,因为大部分的网络资源都用在传输开销上面。

类似的道理,传输层TCP要设置一个最大报文段长度也是为了解决网络利用率不高的问题。我们可以想一下这种情况:

如果在极端情况下,应用层传递下来的数据只有1个字节,传输层TCP要给它加上首部(最少20字节),到了网络层加上IP首部(最少20字节),到了数据链路层还要加上帧首部。这样来看的话,利用率就很低。相当于是用了一个大盒子里面装了一个小的瓜子。

所以从这个角度看,MSS应该设置的尽量大一些,尽量提高网络利用率。那么应该设置到什么样的程度呢?当然不能设置的太大,因为还要考虑到数据链路层规定了MTU值,如果在传输层把MSS设置的太大,那么整个的TCP报文就大,到了网络层之后这些都变成了IP包的数据部分,太大的数据部分通不过数据链路层的MTU,所以IP就要进行数据包的分片,分的片太多就有一定的安全隐患,因为只要接收端少收到其中一个片,整个的IP包就组装不成,无法向上层交付。

所以把MSS要设置为一个合适的大小,需要通信双方在TCP连接建立时进行确定,双方都把自己能够支持的MSS写入这一字段,以后就按照这个数值传送数据。但如果没有对这个值做出设置,那MSS就取默认值:536字节


选择确认(SACK)

“选择确认”要和我们前面学习过的“连续ARQ的选择重传”联想起来,选择确认的意思是说:如果数据传输中,丢失了一些报文段,使得接收方接收的时候“缺少”中间的一些报文段,这时候接收方可以不把它们全部丢弃,而是可以先暂存下来,但是要告诉发送方丢失了哪些数据。这种“告诉”的方法就是使用选择确认。

我们前面学习确认号的时候,知道了确认号的意思是我期望接下来收到的数据序号,选择确认也是这样的。比如发送的是序号为1~4000的数据,但是接收方只收到了1~1000、1500~3000、3500~4000。那么接收方就要发送确认号为1001、3001、4001的选择确认,以便让发送方知道哪些数据是正常收到的。

如果使用选择确认,那么原来首部中的“确认号”字段用法仍然不变,只是增加了SACK选项。所以在建立TCP连接的时候,通信双方必须都约定好“允许SACK”。


用户超时(UTO)

“用户超时”选项用来设置TCP“超时定时器”的超时时间。前面在学习ARQ自动重传的时候,我们分析过,超时定时器的时间应该设置的比平均往返时间长一点是比较合理的。但这并不是固定的,TCP通信双方可以通过“用户超时”选项设置一个超时数值,并将设置的这个数值告诉对方。这个数值指出了:发送方愿意等待对方发来ACK的时间,也就是超时的时间


窗口缩放(WSOPT)

在学习TCP报文首部格式的时候,我们知道了“窗口”的概念,窗口值指的是接收窗口的大小,实际上也就是接收缓存能够容纳对方发来多少数据。

那么,“窗口缩放”选项,顾名思义就是可以扩大接收窗口的大小,也可以将扩大后的窗口缩小回来。TCP首部“窗口值”字段长度是16位,也就意味着窗口最大是2^16大小,如果使用窗口缩放选项,则允许窗口可以扩大为2^30的大小。

当然,是否使用“窗口缩放”选项,由通信双方在TCP建立连接时进行协商,如果有一方使用了窗口扩大,当它不再需要扩大其窗口时,可以使窗口大小再回到2^16。


以上就是TCP首部中常用的几个选项,当然我们前面还学过一个“时间戳”的选项,具有防止序号绕回的功能,这也是一种选项。到这里,TCP首部就基本学完了(但是还没全部学完,“检验和”放到后面和UDP一起学习)。下一节我们学习TCP建立连接的过程。

参考教材:W.Richard Stevens《TCP/IP详解   卷一:协议》

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

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

相关文章

python 打印一个条形堆积图

背景 今天介绍一个不使用 matplot,通过 DebugInfo模块打印条形堆积图 的方法。 引入模块 pip install DebugInfo打印销售转化数据 下面的代码构建了两个销售团队,团队A 和团队B;两个团队的销售数据构成了公司总的销售成果。以条形堆积图的…

SQL Server、MySQL和Oracle数据库分页查询的区别与联系

摘要:本文将通过一个现实例子,详细解释SQL Server、MySQL和Oracle这三种常见关系型数据库在分页查询方面的区别与联系。我们将提供具体场景下的SQL语句示例,并解释每个数据库的分页查询用法以及优化方法,帮助读者更好地选择适合自…

Apache JMeter

下载 Apache JMeter 并安装 java链接 打开 apache-jmeter-5.4.1\bin 找到jmeter.bat 双击打开 或者 ApacheJMeter.jar 双击打开 设置中文 找到 options 》choose Language 》chinese 新建 计划 创建线程组 添加Http请求 配置元件添加请求头参数(content-type&…

什么是PPS和TOD时序?授时防护设备是什么?

介绍 PPS和TOD PPS和TOD是两种用于精确时间同步的技术,它们在许多领域都有广泛的应用,总的来说,PPS和TOD被广泛应用于各种需要高度精确时间同步的领域,包括通信、测量、测试、系统集成和计算机网络等。 一、PPS PPS&#xff08…

RedisDesktopManager 连接redis

redis查看是否启动成功 ps -ef | grep redis以上未启动成功 cd /usr/local/bin/ 切换根目录 sudo -i 开启服务端 ./redis-server /usr/local/redis/redis.conf 开启客户端 ./redis-cli

Java【SpringBoot】SpringBoot 和 Spring 有什么区别? SpringBoot有哪些优点?

文章目录 前言一、Spring 特点二、SpringBoot 特点和优点总结 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你: 📕 JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等 📗 Java数据结构: 顺序表, …

ElasticSearch学习2

1、索引的操作 1、创建索引 对ES的操作其实就是发送一个restful请求,kibana中在DevTools中进行ES操作 创建索引时需要注意ES的版本,不同版本的ES创建索引的语句略有差别,会导致失败 如下创建一个名为people的索引,settings&…

Java智慧工地系统源码(微服务+Java+Springcloud+Vue+MySQL)

智慧工地系统是依托物联网、互联网、AI、可视化建立的大数据管理平台,是一种全新的管理模式,能够实现劳务管理、安全施工、绿色施工的智能化和互联网化。围绕施工现场管理的人、机、料、法、环五大维度,以及施工过程管理的进度、质量、安全三…

Day19-异步请求-axios文件上传

Day19-异步请求 什么是同步请求当前浏览器刷新或者改变浏览器地址栏地址才能发送请求,这种请求称为同步请求 什么是异步请求当我们发送请求时,浏览器不会刷新,浏览器地址栏也不会变化,这种请求称为异步请求异步请求用到的前端技术: ajax 或 axios一 封装Ajax /*** 编写ajax函…

cdh6.3.2 Flink On Yarn taskmanager任务分配倾斜问题的解决办法

业务场景: Flink On Yarn任务启动 组件版本: CDH:6.3.2 Flink:1.13.2 Hadoop:3.0.0 问题描述: 在使用FLink on Yarn调度过程中,发现taskmanager总是分配在集中的几个节点上,集群…

2023年Java核心技术面试第七篇(篇篇万字精讲)

十二 . Java 提供了哪些IO方式?NIO如何实现多路复用? IO是软件开发中的核心部分之一,伴随着海量数据增长和分布式系统的发展,IO扩展能力愈发重要。 12.1 典型回答:

记一次从Redis弱口令到RCE

Fscan扫描网段发现了一些开启了6379的服务器,逐个尝试了下未授权,然后尝试了下爆破 hydra爆破redis hydra -P [字典目录] redis://xxx.xxx.xxx.xxx结果还真让爆出来一个 得到密码后,连接上去,这里用的是Another Redis Desktop M…

飞机打方块(四)游戏结束

一、游戏结束显示 1.新建节点 1.新建gameover节点 2.绑定canvas 3.新建gameover容器 4.新建文本节点 2.游戏结束逻辑 Barrier.ts update(dt: number) {//将自身生命值取整let num Math.floor(this.num);//在Label上显示this.num_lb.string num.toString();//获取GameCo…

分布式 - 消息队列Kafka:Kafka 消费者消费位移的提交方式

文章目录 1. 自动提交消费位移2. 自动提交消费位移存在的问题?3. 手动提交消费位移1. 同步提交消费位移2. 异步提交消费位移3. 同步和异步组合提交消费位移4. 提交特定的消费位移5. 按分区提交消费位移 4. 消费者查找不到消费位移时怎么办?5. 如何从特定…

基于springboot+vue的食材商城(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

Dockerfile快速搭建自己专属的LAMP环境

目录 编写Dockerfile 1.文件内容需求: 2.值得注意的是centos6官方源已下线,所以需要切换centos-vault源! 3.Dockerfile内容 4.进入到 lamp 开始构建镜像 推送镜像到私有仓库 1.创建用户并添加到私有仓库:​编辑​编辑 2.推…

Android2:构建交互式应用

一。创建项目 项目名Beer Adviser 二。更新布局 activity_main.xml <?xml version"1.0" encoding"utf-8"?><LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"…

计算机网络第2章(物理层)

计算机网络第2章&#xff08;物理层&#xff09; 2.1 物理层的基本概念2.2 物理层下面的传输媒体2.2.1 导引型传输媒体2.2.2 非导引型传输媒体 2.3 传输方式2.3.1 串行传输和并行传输2.3.2 同步传输和异步传输2.3.3 单向通信&#xff08;单工&#xff09;、双向交替通信&#x…

Java中使用MongoTemplate 简单操作MongoDB

Autowired private MongoTemplate mongoTemplate; User&#xff1a;封装的对象 插入&#xff1a;mongoTemplate.insert(user); 根据id查询&#xff1a;mongoTemplate.findById(id, User.class); 查询所有&#xff1a;mongoTemplate.findAll(User.class); 条件查询&#…

[ubuntu]ubuntu安装vncserver后,windows连接灰屏解决方法

修改配置文件~/.vnc/xstartup为如下内容&#xff1a; #!/bin/bash export $(dbus-launch) export XKL_XMODMAP_DISABLE1 unset SESSION_MANAGERgnome-panel & gnome-settings-daemon & metacity & nautilus & gnome-terminal &# [ -x /etc/vnc/xstartup…