MTU: Maxitum Transmission Unit 最大传输单元

MSS: Maxitum Segment Size 最大分段大小

MSS最大传输大小的缩写,是TCP协议里面的一个概念。
MSS就是TCP数据包每次能够传输的最大数据分段。为了达到最佳的传输效能TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes), 通讯双方会根据双方提供的MSS值得最小值确定为这次连接的最大MSS值。

而一般以太网MTU都为1500, 所以在以太网中, 往往TCP MSS为1460。

协商TCP MSS大小具体过程如下:
TCP client发出SYN报文,其中option选项填充的MSS字段一般为(MTU-IP头大小-TCP头大小),同样TCP server收到SYN报文后,会发送SYN+ACK报文应答,option选项填充的mss字段也为(MTU-IP头大小-TCP头大小);协商双方会比较SYN和SYN+ACK报文中MSS字段大小,选择较小的MSS作为发送TCP分片的大小。

对于涉及PPPOE+NAT、IPsec、L2TP、GRE等组网,通常由于报文太大需要分片,这样会降低传输速率; 所以选择一个合适的MSS对传输数据来说比较重要. linux中一般可以通过netfilter iptables设置TCP MSS来解决。

iptables -A FORWARD -p tcp- -tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

这条规则的目的就是改变TCP MSS以适应PMTU(Path MTU)

iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN- j TCPMSS --set-mss 128

设置MSS为128

以下是一段内核中修改TCP MSS的代码:

static inline u32 set_tcp_mss(struct sk_buff *pskb, struct tcphdr *tcph, u16 mtu) { u32 optlen, i; u8 *op; u16 newmss, oldmss; u8 *mss; if ( !tcph->syn ) return 0; // 判断是否为合法tcp选项 if (tcph->doff*4 < sizeof(struct tcphdr)) return 0; optlen = tcph->doff*4 - sizeof(struct tcphdr); if (!optlen) return 0; // 扫描是否有MSS选项 op = ((u8*)tcph + sizeof(struct tcphdr)); for (i = 0; i < optlen; ) { if (op[i] == TCPOPT_MSS && (optlen - i) >= TCPOLEN_MSS && op[i+1] == TCPOLEN_MSS) { u16 mssval; //newmss = htons( 1356 ); oldmss = (op[i+3] << 8) | op[i+2]; mssval = (op[i+2] << 8) | op[i+3]; // 是否小于MTU-( iphdr + tcphdr ) if ( mssval > mtu - 40 ) { newmss = htons( mtu - 52 ); } else { break; } // mss = &newmss; op[i+2] = newmss & 0xFF; op[i+3] = (newmss & 0xFF00) >> 8; // 计算checksum inet_proto_csum_replace2( &tcph->check, pskb, oldmss, newmss, 0); mssval = (op[i+2] << 8) | op[i+3]; dprintf( "Change TCP MSS %d to %d/n", ntohs( oldmss ), mssval ); break; } if (op[i] < 2) i++; else i += op[i+1] ? : 1; } return 0; }

windows可以通过一个工具来修改  DrTCP  http://www.dslreports.com/drtcp

在linux内核中修改TCP MSS值相关推荐

  1. linux tcp header更改,Linux Netfilter中修改TCP/UDP Payload的方法

    来自linux-2.6.36/net/ipv4/netfilter/nf_nat_helper.c 注:该代码可以移植到ebtables中使用,但需要注意struct rtable *rt结构在ebt ...

  2. Linux内核中影响tcp三次握手的一些协议配置

    在Linux的发行版本中,都存在一个/proc/目录,有的也称它为Proc文件系统.在 /proc 虚拟文件系统中存在一些可调节的内核参数.这个文件系统中的每个文件都表示一个或多个参数,它们可以通过 ...

  3. linux下IPROTO_TCP,TCP/IP协议栈在Linux内核中的运行时序分析

    可选题目三:TCP/IP协议栈在Linux内核中的运行时序分析 在深入理解Linux内核任务调度(中断处理.softirg.tasklet.wq.内核线程等)机制的基础上,分析梳理send和recv过 ...

  4. TCP三次握手在linux内核中的实现

    TCP三次握手在linux内核中的实现 以下基于linux内核2.4.0源码(转自www.yuanma.org/) 以前一直使用的网络通讯的函数都是工作在阻塞模式.在看connect实现源码时,突然想 ...

  5. TCP/IP协议栈在Linux内核中的运行时序分析

    本文主要是讲解TCP/IP协议栈在Linux内核中的运行时序,文章较长,里面有配套的视频讲解,建议收藏观看. 1 Linux概述 1.1 Linux操作系统架构简介 Linux操作系统总体上由Linu ...

  6. linux内核中TCP接收的实现

    linux内核中TCP接收的实现入口函数是tcp_v4_rcv 1. 数据包检查处理 一开始做一些数据包详细检查处理,一旦出错,可能导致内核挂掉 int tcp_v4_rcv(struct sk_bu ...

  7. TCP/IP网络协议栈在Linux内核中的如何使用丨内核开发丨驱动开发丨操作系统丨内核源码

    TCP/IP网络协议栈在Linux内核中的如何使用 视频讲解如下,点击观看: TCP/IP网络协议栈在Linux内核中的如何使用丨内核开发丨驱动开发丨操作系统丨内核源码 C/C++Linux服务器开发 ...

  8. linux cookie 地址,SYN Cookie原理及其在Linux内核中的实现

    在目前以IPv4为支撑的网络协议上搭建的网络环境中,SYN Flood是一种非常危险而常见的DoS攻击方式.到目前为止,能够有效防范SYN Flood攻击的手段并不多,而SYN Cookie就是其中最 ...

  9. linux 内核flush,armv8(aarch64)linux内核中flush_dcache_all函数详细分析

    /* *  __flush_dcache_all() *  Flush the wholeD-cache. * Corrupted registers: x0-x7, x9-x11 */ ENTRY( ...

  10. linux内核中锁有哪些,Linux内核中有哪些锁

    Linux内核中的各种锁 在LInux操作系统里,同一时间可能有多个内核执行流在执行,因此内核其实象多进程多线程编程一样也需要一些同步机制来同步各执行单元对共享数据的访问.尤其是在多处理器系统上,更需 ...

最新文章

  1. matlab直流输电,重金悬赏matlab编程(电力方向,轻型高压直流输电的小信号模型)...
  2. 用物理学突破深度学习理论瓶颈? Google-斯坦福发布《深度学习统计力学》综述论文,30页pdf阐述深度学习成功机制...
  3. python2升级_把Python2.6升级到Python2.7(适用于把Python2升级到Python3)
  4. python有道翻译接口-【Python】Python利用有道翻译开发API应用示例
  5. 【网络安全】文件上传绕过思路总结
  6. 学习用户连接性要素之连接性(附XMIND整理笔记)
  7. SAP CRM partner function在客户项目中的实际用途
  8. IP3 三阶交调截取点测试(转帖)
  9. 互联网日报 | 苏宁易购拿下英雄联盟职业联赛赞助权;荣耀游戏本年内将推出;英特尔芯片总设计师辞职...
  10. 以普通用户启动的Vim如何保存需要root权限的文件
  11. alwayson高可用组_AlwaysOn可用性组–如何在集群实例和独立实例之间设置AG(第3部分)
  12. 最近新建了一个米表站
  13. LayaAir UI 组件 # Image 位图、Label 标签
  14. 【linux】通过xshell上传文件
  15. chrome无法打开应用商店添加扩展程序的解决方案
  16. 【落谷1957】口算练习题题解
  17. python爬取图片代码可替换网站_Python爬虫(批量爬取某网站图片)
  18. 江苏凤凰职教计算机教案,2017年江苏省职业学校教学大赛方案
  19. [经验教程]在拼多多上发起拼单和参与拼单有什么区别?
  20. 2016年计算机b级考试试题,2016年全国计算机等级考试模拟试题一级B.doc

热门文章

  1. 【git体验】git基础-3目录之间关系
  2. whoami 显示“我是谁”
  3. linux docker安装_Linux -- Docker安装
  4. linux java 栈_JVM 与 Linux 的内存关系详解
  5. mysql 核对_mysql索引 (校验规则引发的血案)
  6. 代码高亮_安卓集成代码高亮显示开源包
  7. 基础连接已关闭解决办法_解决|罗技蓝牙键盘连接ipad后打不出字?
  8. 关于eclipse编译出错,缺失tools.jar 1.8
  9. (1)关于File类你知道多少
  10. Deepgreen DB 是什么(含Deepgreen和Greenplum下载地址)