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)
else
// 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
在linux核心中讀寫檔案
1.序曲 在使用者態,讀寫檔案可以通過read和write這兩個系統呼叫來完成 c庫函式實際上是對系統呼叫的封裝 但是,在核心態沒有這樣的系統呼叫,我們又該如何讀寫檔案呢?閱讀linux核心原始碼,可以知道陷入核心執行的是實際執行的是sys read和sys write這兩個函式,但是這兩個函式沒有...
在linux核心中讀寫檔案
1.序曲 在使用者態,讀寫檔案可以通過read和write這兩個系統呼叫來完成 c庫函式實際上是對系統呼叫的封裝 但是,在核心態沒有這樣的系統呼叫,我們又該如何讀寫檔案呢?閱讀linux核心原始碼,可以知道陷入核心執行的是實際執行的是sys read和sys write這兩個函式,但是這兩個函式沒有...
在linux核心中讀寫檔案
1.序曲 在使用者態,讀寫檔案可以通過read和write這兩個系統呼叫來完成 c庫函式實際上是對系統呼叫的封裝 但是,在核心態沒有這樣的系統呼叫,我們又該如何讀寫檔案呢?閱讀linux核心原始碼,可以知道陷入核心執行的是實際執行的是sys read和sys write這兩個函式,但是這兩個函式沒有...