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

1400

设置MSS为1400

6 内核对于TCP MSS的处理

那么内核对于TCP

MSS的处理到底在哪边呢? 主要是在net/netfilter/xt_TCPMSS.c里面:

static

int

tcpmss_mangle_packet(struct

sk_buff **pskb,

const struct xt_tcpmss_info *info,

unsigned int tcphoff,

unsigned int minlen)

{

struct

tcphdr *tcph;

unsigned

int tcplen, i;

__be16

oldval;

u16

newmss;

u8

*opt;

if

(!skb_make_writable(pskb, (*pskb)->len))

return -1;

tcplen =

(*pskb)->len - tcphoff;

tcph =

(struct tcphdr *)(skb_network_header(*pskb) + tcphoff);

if (tcplen

!= tcph->doff*4) {

if (net_ratelimit())

printk(KERN_ERR "xt_TCPMSS:

bad length (%u bytes)\n",

(*pskb)->len);

return -1;

}

if

(info->mss == XT_TCPMSS_CLAMP_PMTU) {

if (dst_mtu((*pskb)->dst)

<= minlen) {

if (net_ratelimit())

printk(KERN_ERR "xt_TCPMSS: "

"unknown or invalid path-MTU (%u)\n",

dst_mtu((*pskb)->dst));

return -1;

}

根据目的网卡的MTU进行newMSS的设置

newmss =

dst_mtu((*pskb)->dst) - minlen;

} else

newmss = info->mss;

opt =

(u_int8_t *)tcph;

for (i =

sizeof(struct tcphdr); i <

tcph->doff*4; i += optlen(opt, i)) {

if (opt[i] == TCPOPT_MSS

&& tcph->doff*4 - i

>= TCPOLEN_MSS

&&

opt[i+1]

== TCPOLEN_MSS) {

u_int16_t oldmss;

oldmss =

(opt[i+2] << 8) | opt[i+3];

if (info->mss

== XT_TCPMSS_CLAMP_PMTU &&

oldmss <= newmss)

return

0;

opt[i+2] = (newmss

& 0xff00) >> 8;

opt[i+3] = (newmss

& 0x00ff);

nf_proto_csum_replace2(&tcph->check,

*pskb,

htons(oldmss), htons(newmss),

0);

return 0;

}

}

if

(skb_tailroom((*pskb)) < TCPOLEN_MSS) {

struct sk_buff *newskb;

newskb = skb_copy_expand(*pskb,

skb_headroom(*pskb),

TCPOLEN_MSS, GFP_ATOMIC);

if (!newskb)

return -1;

kfree_skb(*pskb);

*pskb = newskb;

tcph = (struct tcphdr

*)(skb_network_header(*pskb) + tcphoff);

}

skb_put((*pskb), TCPOLEN_MSS);

opt =

(u_int8_t *)tcph + sizeof(struct tcphdr);

memmove(opt + TCPOLEN_MSS, opt, tcplen - sizeof(struct

tcphdr));

nf_proto_csum_replace2(&tcph->check,

*pskb,

htons(tcplen), htons(tcplen + TCPOLEN_MSS),

1);

opt[0] =

TCPOPT_MSS;

opt[1] =

TCPOLEN_MSS;

设置新的MSS值

opt[2] = (newmss &

0xff00) >> 8;

opt[3] = (newmss &

0x00ff);

nf_proto_csum_replace4(&tcph->check,

*pskb, 0, *((__be32 *)opt), 0);

oldval =

((__be16 *)tcph)[6];

tcph->doff += TCPOLEN_MSS/4;

nf_proto_csum_replace2(&tcph->check,

*pskb,

oldval,

((__be16 *)tcph)[6], 0);

return

TCPOLEN_MSS;

}

linux 内核参数mss,linux 内核对于TCPMSS的处理相关推荐

  1. linux 内核 修改mss,Linux下TCP-MSS 修改,实验以及测试(详细)

    TCP-MSS文档,问题及实验 TCP-MSS介绍 MSS(Maximum Segment Size,最大报文段大小)的概念是指TCP层所能够接收的最大段大小,该值只包括TCP段的数据部分,不包括选项 ...

  2. linux查询内核参数命令,Linux内核启动参数详解

    1.环境: Ubuntu 16.04 Linux linuxidc 4.4.0-89-generic #112-Ubuntu SMP Mon Jul 31 19:38:41 UTC 2017 x86_ ...

  3. linux 的内核参数优化,Linux服务器内核参数优化

    Linux服务器内核参数优化 cat >> /etc/sysctl.conf << EOF #kernel optimization net.ipv4.tcp_fin_time ...

  4. linux系统内核参数命令,Linux内核启动参数解析及添加

    1.环境: Linux linuxidc 4.4.0-89-generic #112-Ubuntu SMP Mon Jul 31 19:38:41 UTC 2017 x86_64 x86_64 x86 ...

  5. linux ipv4参数查看,Linux内核参数之IPV4变量引用

    变量路径在/proc/sys/net/ipv4/目录下面,关于ipv4的内核参数如下: ip_autoconfig 参数:0或1 1表示通过RARP,BOOTP,DHCP或者其它协议获取主机的IP地址 ...

  6. 开机时设置linux 内核参数 mem,Linux内核开机保留大块内存的方法总结

    在网上搜了很久,才慢慢了解在开机保留内存的方法,现在总结一下这阶段的学习过程!(我是在ARM板子上进行的实验,内核版本是2.6.38) 在开机保留内存的方式一共有三种方法: 1. reserve_bo ...

  7. linux内核参数分析,linux内核启动第一阶段分析

    linux内核启动第一阶段分析 http://blog.csdn.net/aaronychen/article/details/2838341 本文的很多内容是参考了网上某位大侠的文章写的<&l ...

  8. linux查内核参数命令,linux 下查看cpu位数 内核等参数命令

    linux 下查看cpu位数 内核等参数命令. # uname -a Linux euis1 2.6.9-55.ELsmp #1 SMP Fri Apr 20 17:03:35 EDT 2007 i6 ...

  9. linux 内核参数 杨,Linux 内核参数

    牢记!内核参数可以调整,但不是随便乱调,需要根据业务进行判断,并且要知道调整的后果是什么,存在哪些风险. 牢记!!!调整参数时,做好记录!!! 网络参数 /proc/sys/net/core/wmem ...

最新文章

  1. CODE FESTIVAL 2017 qual B
  2. SAP ERP差异来源和差异处理
  3. 在jquery mobile制作app的几个页利用ajax将后台数据json数组动态加载到列表里面
  4. [AHOI2008] 紧急集合
  5. 学习vi和vim编辑器(8):全局替换(1)
  6. 德佑地产房产经纪人区域总监访谈:有肌肉,更有内涵!
  7. Windows环境下Anaconda-Navigator出现闪退、无法打开问题的解决方案记录
  8. 2013-01-09 13:31 IE不支持textarea的maxlength属性,Firefox支持
  9. 用python进行文本分析_用Python分析文本文件
  10. Android+SpringBoot+Vue实现安装包前台上传,后台管理,移动端检测自动更新
  11. win32 mysql误删数据恢复_mysql误删数据恢复
  12. 玩3D游戏头晕怎么办?为什么会头晕?如何解决?
  13. Android中收货地址管理Demo
  14. shared_preload_libraries
  15. mysql grant用法_十六、MySQL授权命令grant的使用方法
  16. OSGI框架嵌入Http服务器的环境配
  17. 哔哩下载姬 - DownKyi
  18. Cisco三层交换机的配置详解
  19. Linux Get!
  20. 法拉第未来出售其洛杉矶总部 以弥补资金不足

热门文章

  1. R语言实现统计分析——非参数假设检验
  2. [软工]概要设计说明书(GB8567-88)
  3. 研究生阅读文献的门道
  4. 解决时区导致druid任务构建失败的问题:No buckets?? seems there is no data to index.
  5. for循环定义生成列表
  6. 文件服务器 监控,zabbix监控文件服务器
  7. UE5 蓝图节点图文大全(300+蓝图,7万字+)
  8. 支持向量机(四)——深入理解SMO优化算法
  9. AI无处不在,科技改变生活:开放原子全球开源峰会参会感悟
  10. 修改Virtualbox的默认安装路径