linux 内核参数mss,linux 内核对于TCPMSS的处理
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的处理相关推荐
- linux 内核 修改mss,Linux下TCP-MSS 修改,实验以及测试(详细)
TCP-MSS文档,问题及实验 TCP-MSS介绍 MSS(Maximum Segment Size,最大报文段大小)的概念是指TCP层所能够接收的最大段大小,该值只包括TCP段的数据部分,不包括选项 ...
- 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_ ...
- linux 的内核参数优化,Linux服务器内核参数优化
Linux服务器内核参数优化 cat >> /etc/sysctl.conf << EOF #kernel optimization net.ipv4.tcp_fin_time ...
- 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 ...
- linux ipv4参数查看,Linux内核参数之IPV4变量引用
变量路径在/proc/sys/net/ipv4/目录下面,关于ipv4的内核参数如下: ip_autoconfig 参数:0或1 1表示通过RARP,BOOTP,DHCP或者其它协议获取主机的IP地址 ...
- 开机时设置linux 内核参数 mem,Linux内核开机保留大块内存的方法总结
在网上搜了很久,才慢慢了解在开机保留内存的方法,现在总结一下这阶段的学习过程!(我是在ARM板子上进行的实验,内核版本是2.6.38) 在开机保留内存的方式一共有三种方法: 1. reserve_bo ...
- linux内核参数分析,linux内核启动第一阶段分析
linux内核启动第一阶段分析 http://blog.csdn.net/aaronychen/article/details/2838341 本文的很多内容是参考了网上某位大侠的文章写的<&l ...
- 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 ...
- linux 内核参数 杨,Linux 内核参数
牢记!内核参数可以调整,但不是随便乱调,需要根据业务进行判断,并且要知道调整的后果是什么,存在哪些风险. 牢记!!!调整参数时,做好记录!!! 网络参数 /proc/sys/net/core/wmem ...
最新文章
- CODE FESTIVAL 2017 qual B
- SAP ERP差异来源和差异处理
- 在jquery mobile制作app的几个页利用ajax将后台数据json数组动态加载到列表里面
- [AHOI2008] 紧急集合
- 学习vi和vim编辑器(8):全局替换(1)
- 德佑地产房产经纪人区域总监访谈:有肌肉,更有内涵!
- Windows环境下Anaconda-Navigator出现闪退、无法打开问题的解决方案记录
- 2013-01-09 13:31 IE不支持textarea的maxlength属性,Firefox支持
- 用python进行文本分析_用Python分析文本文件
- Android+SpringBoot+Vue实现安装包前台上传,后台管理,移动端检测自动更新
- win32 mysql误删数据恢复_mysql误删数据恢复
- 玩3D游戏头晕怎么办?为什么会头晕?如何解决?
- Android中收货地址管理Demo
- shared_preload_libraries
- mysql grant用法_十六、MySQL授权命令grant的使用方法
- OSGI框架嵌入Http服务器的环境配
- 哔哩下载姬 - DownKyi
- Cisco三层交换机的配置详解
- Linux Get!
- 法拉第未来出售其洛杉矶总部 以弥补资金不足
热门文章
- R语言实现统计分析——非参数假设检验
- [软工]概要设计说明书(GB8567-88)
- 研究生阅读文献的门道
- 解决时区导致druid任务构建失败的问题:No buckets?? seems there is no data to index.
- for循环定义生成列表
- 文件服务器 监控,zabbix监控文件服务器
- UE5 蓝图节点图文大全(300+蓝图,7万字+)
- 支持向量机(四)——深入理解SMO优化算法
- AI无处不在,科技改变生活:开放原子全球开源峰会参会感悟
- 修改Virtualbox的默认安装路径