织梦CMS - 轻松建站从此开始!

罗索

在linux内核中修改TCP MSS值

jackyhwei 发布于 2011-08-31 10:48 点击:次 
MSS: Maxitum Segment Size TCP数据包每次能够传输的最大数据分段。为了达到最佳的传输效能TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替,通讯双方会根据双方提供的MSS值得最小值确定为这次连接的最大MSS值。
TAG:

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的代码:

  1. static inline u32 set_tcp_mss(struct sk_buff *pskb, struct tcphdr *tcph, u16 mtu) 
  2.     u32 optlen, i; 
  3.     u8 *op; 
  4.     u16 newmss, oldmss; 
  5.     u8 *mss; 
  6.  
  7.     if ( !tcph->syn ) 
  8.         return 0; 
  9.  
  10.     // 判断是否为合法tcp选项 
  11.  
  12.     if (tcph->doff*4 < sizeof(struct tcphdr)) 
  13.         return 0; 
  14.  
  15.     optlen = tcph->doff*4 - sizeof(struct tcphdr); 
  16.     if (!optlen) 
  17.         return 0; 
  18.  
  19.     // 扫描是否有MSS选项 
  20.  
  21.     op = ((u8*)tcph + sizeof(struct tcphdr)); 
  22.     for (i = 0; i < optlen; ) { 
  23.         if (op[i] == TCPOPT_MSS 
  24.             && (optlen - i) >= TCPOLEN_MSS 
  25.             && op[i+1] == TCPOLEN_MSS) { 
  26.             u16 mssval; 
  27.              
  28.             //newmss = htons( 1356 ); 
  29.  
  30.             oldmss = (op[i+3] << 8) | op[i+2]; 
  31.             mssval = (op[i+2] << 8) | op[i+3]; 
  32.              
  33.             // 是否小于MTU-( iphdr + tcphdr ) 
  34.  
  35.             if ( mssval > mtu - 40 ) { 
  36.                 newmss = htons( mtu - 52 );  
  37.             } 
  38.             else { 
  39.                 break
  40.             } 
  41.      //  
  42.  
  43.      mss = &newmss; 
  44.             op[i+2] = newmss & 0xFF; 
  45.             op[i+3] = (newmss & 0xFF00) >> 8; 
  46.             // 计算checksum 
  47.  
  48.             inet_proto_csum_replace2( &tcph->check, pskb, 
  49.                 oldmss, newmss, 0); 
  50.              
  51.             mssval = (op[i+2] << 8) | op[i+3]; 
  52.             dprintf( "Change TCP MSS %d to %d\n", ntohs( oldmss ), mssval ); 
  53.             break
  54.              
  55.         } 
  56.         if (op[i] < 2) 
  57.             i++; 
  58.         else 
  59.             i += op[i+1] ? : 1; 
  60.     } 
  61.     return 0; 

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

(max415)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201108/14923.html]
本文出处:blog.csdn.net/max415 作者:max415
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容