在linux内核中修改TCP MSS值
来源:互联网 发布:同一个单元格数据拆分 编辑:程序博客网 时间:2024/04/29 19:48
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 1400
iptables -t mangle -A PREROUTING -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1400
设置MSS为1400
以下是一段内核中修改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值
- 在linux内核中修改TCP MSS值
- 在linux内核中修改TCP MSS值
- 在linux内核中修改TCP MSS值
- 在linux内核中修改TCP MSS值
- 关于TCP MSS值
- 关于TCP MSS值
- 关TCP MSS值
- tcp mss
- tcp mss
- TCP 协议中MSS的理解
- TCP 协议中MSS的理解
- TCP 协议中MSS的理解 【转】
- TCP 协议中MSS的理解
- Linux如何在系统运行过程中修改内核参数
- Linux如何在系统运行过程中修改内核参数
- 利用iptables设置tcp的mss值
- Linux下更改TCP window size, MSS, RTT
- 腾讯面试题:查找单链表的中间节点
- 在discuz上实现模糊查询出现的问题及解决方法
- Volley框架
- 微时代网络科技有限公司
- 【OC语言基础】之面向对象开发(类和对象)
- 在linux内核中修改TCP MSS值
- 数字证书原理
- git push
- 股票的成交量和成交额
- 如何获取e.printStackTrace()的内容
- java 小Tips之避免switch 语句 忘记break
- 链接中 href='#' 和 href='###' 的区别
- R+Hadoop大数据方案有哪些坑?
- 初识Composer