在linux核心中修改TCP MSS值

2021-07-02 07:03:43 字數 1739 閱讀 8215

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這兩個函式,但是這兩個函式沒有...