C/C++ Socket 获取或设置 TCP MSS 大小

通过 Socket 系统接口,链接到一个TCP服务器,那么在链接成功之后会被配置一个从本地端到目的端最佳的TCP_MSS大小。

我们通过这个特点,即可轻松的实现,链路MTU大小发现功能,在不依赖ROOT管理员权限的情况下,推算出一个较为OK的MTU大小。

一般来说,TCP在服务器SYN|ACK的时候,指定的TCP选项设置的最大分段大小,通常是需要-12字节的,这是因为在PUSH/ACK分段的时候头部有扩展12字节的TCP选项,两个NOP填充,一个TIMESPAN时间戳。

所以:

 当如上图,TCP选项协商设置最大分段大小为;1332,那么意味着TCP_MSS为1320,扣除TCP PUSH/在协议头上额外设定的12字节,一个TCP选项占四个字节,三个则12字节。

 

所以:

我们只要需要通过 socket 接口,获取 TCP_MAXSEG 的值,加12,那么就是TCP的大小,IPV4头20字节,那么意味着;

MTU=1320+12+20=1352,则:从本机到目的主机最佳MTU大小为1352,理论更大会导致传输效率的降低,因为这意味着沿途某一个路由需要进行分片传输。

注意:

TCP是通过 “Path MTU Discovery(PMTUD)” 路径MTU发现机制来探测MTU大小的,但是这个在非TCP模式下不可用。

其原理大致为:

1、 发送端发送一个较大尺寸的数据包,并将 "Don't Fragment"(DF)标志位置为1,这样数据包就不会在传输过程中被分片。

2、如果数据包超出了某个路由器的MTU,该路由器将会丢弃数据包,并向发送端发送一个 "ICMP Fragmentation Needed" 消息,其中包含其MTU值。

3、发送端收到 "ICMP Fragmentation Needed" 消息后,会调整其传输数据包的大小,使其不超过最小的发现的MTU值。然后继续发送新的数据包进行测试,直到找到两个节点之间的最佳MTU值。

PMTUD机制是操作系统内核协议栈已经实现的功能,当我们调用 connect 函数的时候,内核那边就会做这样的行为,当然如果已有缓存就不会触发PMTUD机制,这个可以抓包工具来分析。

函数: 

 GetTcpMss 获取TCP_MSS大小 

SetTcpMss 设置TCP_MSS大小

        /* TCP MSS values – what’s changed?* https://blog.apnic.net/2019/07/31/tcp-mss-values-whats-changed/ */int Socket::GetTcpMss(int fd) noexcept {if (fd == -1) {return -1;}int mss = 0;socklen_t mss_len = sizeof(mss);if (::getsockopt(fd, IPPROTO_TCP, TCP_MAXSEG, (char*)&mss, &mss_len) < 0) {return -1;}return mss;}bool Socket::SetTcpMss(int fd, int mss) noexcept {static constexpr int TCP_MIN_MSS = 536;static constexpr int TCP_MAX_MSS = 1460;if (fd == -1) {return false;}if (mss < TCP_MIN_MSS) {mss = TCP_MIN_MSS;}elif(mss > TCP_MAX_MSS) {mss = TCP_MAX_MSS;}int err = ::setsockopt(fd, IPPROTO_TCP, TCP_MAXSEG, (char*)&mss, sizeof(mss));return err == 0;}

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

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

相关文章

免费阅读篇 | 芒果YOLOv8改进111:注意力机制CBAM:轻量级卷积块注意力模块,无缝集成到任何CNN架构中,开销可以忽略不计

&#x1f4a1;&#x1f680;&#x1f680;&#x1f680;本博客 改进源代码改进 适用于 YOLOv8 按步骤操作运行改进后的代码即可 该专栏完整目录链接&#xff1a; 芒果YOLOv8深度改进教程 该篇博客为免费阅读内容&#xff0c;YOLOv8CBAM改进内容&#x1f680;&#x1f680;&am…

Linux ispell命令教程:如何在命令行中检查拼写错误(附实例详解和注意事项)

Linux ispell命令介绍 ispell&#xff08;Interactive Spelling Checker&#xff09;是一个用于检查和纠正文本文件中拼写错误的命令行工具。它可以处理超过50种语言的文本文件。 Linux ispell命令适用的Linux版本 ispell命令在大多数Linux发行版中都可以使用&#xff0c;包…

ansible 部署FATE集群单边场景

官方文档&#xff1a; https://github.com/FederatedAI/AnsibleFATE/blob/main/docs/ansible_deploy_FATE_manual.md https://github.com/FederatedAI/AnsibleFATE/blob/main/docs/ansible_deploy_two_sides.md gitee详细文档&#xff1a; docs/ansible_deploy_one_side.md…

确保云原生部署中的网络安全

数字环境正在以惊人的速度发展&#xff0c;组织正在迅速采用云原生部署和现代化使用微服务和容器构建的应用程序&#xff08;通常运行在 Kubernetes 等平台上&#xff09;&#xff0c;以推动增长。 无论我们谈论可扩展性、效率还是灵活性&#xff0c;对于努力提供无与伦比的用…

服务器遭遇挖矿病毒syst3md及其伪装者rcu-sched:原因、症状与解决方案

01 什么是挖矿病毒 挖矿病毒通常是恶意软件的一种&#xff0c;它会在受感染的系统上无授权地挖掘加密货币。关于"syst3md"&#xff0c;是一种特定的挖矿病毒&#xff0c;它通过在受感染的Linux系统中执行一系列复杂操作来达到其目的。这些操作包括使用curl从网络下载…

爬虫逆向实战(36)-某建设监管平台(RSA,魔改)

一、数据接口分析 主页地址&#xff1a;某建设监管平台 1、抓包 通过抓包可以发现网站首先是请求了一个/prod-api/mohurd-pub/vcode/genVcode的接口&#xff0c;用于获取滑块验证码的图片 滑块验证之后&#xff0c;请求了/prod-api/mohurd-pub/dataServ/findBaseEntDpPage这…

【C语言】—— 指针一 : 初识指针(上)

【C语言】—— 指针一 &#xff1a; 初识指针&#xff08;上&#xff09; 一、内存和地址1.1、如何理解内存和地址1.2、 如何理解编址 二、指针变量和地址2.1、取地址操作符 &2.2、 指针变量2.3、 解引用操作符 ∗ * ∗2.4、指针变量的大小 三、指针变量类型的意义3.1、 指…

CentOS 7 / Linux 安装Redis(超简单版)

查看本站其他文章写的极其复杂&#xff0c;给我看乐了 原文链接&#xff1a;https://zhuanlan.zhihu.com/p/626263224 安装 redis 的安装极为简单&#xff0c;使用 CentOS 7 自带的 yum 安装即可 yum install redis 启动等操作 启动 systemctl start redis 查看状态 syst…

【网络安全】 MSF提权

本文章仅用于信息安全学习&#xff0c;请遵守相关法律法规&#xff0c;严禁用于非法途径。若读者因此作出任何危害网络安全的行为&#xff0c;后果自负&#xff0c;与作者无关。 环境准备&#xff1a; 名称系统位数IP攻击机Kali Linux6410.3.0.231客户端Windows 76410.3.0.234…

计算机考研|408专业课复习教程+注意事项

408其实把真题琢磨透就已经可以了&#xff01;其实大部分考研党复习到最后真题都来不及刷完就要上考场 因为在考研后期时间分配真的很困难&#xff01;特别是数学和408 本人双非科班出身备考408成功上岸&#xff0c;在这里也想给想考408的学弟学妹们一些很中肯的&#xff0c;…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Slider)

滑动条组件&#xff0c;通常用于快速调节设置值&#xff0c;如音量调节、亮度调节等应用场景。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 Slider(options?: SliderOption…

C++Qt学习——QPushButton、QRadioButton(单选按钮)、QCheckBox(复选按钮)

目录 1、QPushButton 1.1、创建一个新的项目&#xff0c;转到UI界面拖一个Push Button 1.2、Push Button的常用信号主要有四个&#xff0c;分别为 clicked(), pressed(), released(), toggled() 1.2.1、按住Push Button右键转到槽&#xff0c;选择信号函数 1.2.2、在Widget…

【C/C++ 学习笔记】函数进阶

【C/C 学习笔记】函数进阶 视频地址: Bilibili 函数默认值 如果某个位置有默认值&#xff0c;那么从此参数向右都需要有默认值如果函数声明有默认值&#xff0c;那么函数实现就不能设置默认值 function add(int a 10, int b 20) {return a b; }函数占位参数 直接使用数…

1.2 课程架构介绍:STM32H5 芯片生命周期管理与安全调试

1.2 课程架构介绍&#xff1a;STM32H5 芯片生命周期管理与安全调试 下面开始学习课程的第二节&#xff0c;简单介绍下STM32H5芯片的生命周期和安全调试&#xff0c;具体课程大家可以观看STM32官方录制的课程&#xff0c;链接&#xff1a;1.2. 课程架构介绍&#xff1a;STM32H5…

闪电网络协议设计思想剖析

1. 引言 闪电网络可能是比特币之上部署的最受期待的技术创新。闪电网络&#xff0c;为由 Joseph Poon 和 Tadge Dryja 于2015年首次提出的支付层&#xff0c;承诺支持&#xff1a; 用户之间几乎无限数量的链下交易&#xff0c;几乎免费&#xff0c;同时利用比特币提供的安全性…

IDEA编译安卓源码TVBox(2)

一、项目结构&#xff1a;主要app和player app结构 二、增加遥控器按键选台 修改LivePlayActivity.java 1、声明变量 public String channelId "";public Timer timer new Timer();public Toast mToast;2、定义方法 private void mToastShow(String s){mToast …

微信小程序-webview分享

项目背景 最近有个讨论区项目需要补充分享功能&#xff0c;希望可以支持在微信小程序进行分享&#xff0c;讨论区是基于react的h5项目&#xff0c;在小程序中是使用we-view进行承载的 可行性 目标是在打开web-view的页面进行分享&#xff0c;那就需要涉及h5和小程序的通讯问…

Unity类银河恶魔城学习记录10-10 p98 UI health bar源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili HealthBar_UI.cs using System.Collections; using System.Collections.G…

vue2和vue3部署到服务器子目录为空白页

问题&#xff1a;今天遇到vue项目部署到服务器默认hash没问题但是hhistory为空白的问题。研究了一下找到了答案记录一下 vue项目history模式部署在子路径 项目打包后默认只能部署在服务器根路径&#xff0c;如果想 http://www.xxx.com/demo/ 这种形式 vue3vite配置方法 在 …

计算机毕业设计-基于大数据技术下的高校舆情监测与分析

收藏和点赞&#xff0c;您的关注是我创作的动力 文章目录 概要 一、研究背景与意义1.1背景与意义1.2 研究内容 二、舆情监测与分析的关键技术2.1 robot协议对本设计的影响2.2 爬虫2.2.1 工作原理2.2.2 工作流程2.2.3 抓取策略2.3 scrapy架构2.3.1 scrapy&#xff1a;开源爬虫架…