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…

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、 指…

【网络安全】 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…

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…

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

收藏和点赞&#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;开源爬虫架…

专业无网设备如何远程运维?向日葵远程控制能源场景案例解析

清洁能源领域&#xff0c;拥有庞大的上下游产业链&#xff0c;涉及的相关工业设备门类多、技术覆盖全、行业应用广。在这一领域内&#xff0c;相关专业设备的供应商的核心竞争力除了本身产品的技术能力之外&#xff0c;服务也是重要的一环。 某企业作为致力于节能环保方向的气…

由浅到深认识C语言(7)

该文章Github地址&#xff1a;https://github.com/AntonyCheng/c-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.csdn…

云仓酒庄东莞分公司2024年日常沙龙:葡萄酒文化与品鉴之旅

原标题&#xff1a;云仓酒庄东莞分公司日常沙龙&#xff1a;葡萄酒文化与品鉴之旅&#xff0c;招商新机遇共融 在东莞这座充满活力的城市&#xff0c;云仓酒庄分公司近日举办了一场别开生面的日常沙龙活动。此次活动以葡萄酒文化与品鉴为主题&#xff0c;旨在让参与者深入体验…

Typecho CMS 反序列化漏洞(CVE-2018-18753)复现

1.环境搭建 项目地址&#xff1a;Release Typecho 1.0(14.10.10) typecho/typecho GitHub 安装&#xff1a; 创建数据库typecho create database typecho; 再进入安装程序&#xff0c;输入数据库密码&#xff0c;设置登录密码即可 直接使用即可 2.漏洞分析 install.php文…