在收到一個(gè)TCP SYN包請(qǐng)求的時(shí)候,我發(fā)現(xiàn)回應(yīng)的SYN+ACK包的窗口大小固定在5792左右
非常想改變一下,比如把5792改成8192之類(lèi)
可是實(shí)驗(yàn)了幾種方法都沒(méi)有成功
比如:
擴(kuò)大或縮小了rmem_default、wmem_default、rmem_max、wmem_max,但沒(méi)有什么效果
是不是需要修改協(xié)議棧?需要的話(huà)怎樣修改?
這個(gè)問(wèn)題困擾我很久了,希望得到大家的指點(diǎn),謝謝!
我的機(jī)器是linux 2.6.21
[[i] 本帖最后由 ssd6166 于 2008-4-23 17:17 編輯 [/i]]
jerrywjl
這應(yīng)該是固定在內(nèi)核里的參數(shù),無(wú)法改變。
platinum
[quote]原帖由 [i]ssd6166[/i] 于 2008-4-21 18:04 發(fā)表 [url=http://linux.chinaunix.net/bbs/redirect.php?goto=findpost&pid=6562912&ptid=994152][img]http://linux.chinaunix.net/bbs/images/common/back.gif[/img][/url]
在收到一個(gè)TCP SYN包請(qǐng)求的時(shí)候,我發(fā)現(xiàn)回應(yīng)的SYN+ACK包的窗口大小固定在5792左右
非常想改變一下,比如把5792改成8192之類(lèi)
可是實(shí)驗(yàn)了幾種方法都沒(méi)有成功
比如:
擴(kuò)大或縮小了rmem_default、wmem_default、 ... [/quote]
回應(yīng)的 ACK 中的 window 是根據(jù)回應(yīng)端的 TCP 棧自己計(jì)算出來(lái)的,他負(fù)責(zé)控制 TCP 的慢啟動(dòng)效果
若要改變,除非修改對(duì)方 TCP 協(xié)議棧,或?qū)λl(fā)過(guò)來(lái)的包做手腳
但是你修改他的目的是什么呢?
ssd6166
回復(fù) #3 platinum 的帖子
首先感謝您和jerrtwjl的回應(yīng)
您這里說(shuō)的除非“修改對(duì)方的TCP協(xié)議棧”是指發(fā)送方還是回應(yīng)方?我要在回應(yīng)方上進(jìn)行修改。
我是發(fā)現(xiàn)windowsXP發(fā)送的窗口大小和linux不一樣,所以想知道為什么
并且想嘗試更改下linux的發(fā)送窗口大小
我覺(jué)得發(fā)送窗口大小應(yīng)該和緩沖區(qū)的大小有關(guān),所以我嘗試著擴(kuò)大了緩沖區(qū),但是不行
我又覺(jué)得這應(yīng)該和一個(gè)初始值有關(guān),可是又沒(méi)找到這個(gè)初始值……
如果找到了這個(gè)初值是不是就能修改了?可這個(gè)初始值在哪定義的呢?
可能我對(duì)慢啟動(dòng)的原理還是不太清楚吧……
希望得到大家指點(diǎn),謝謝!
platinum
窗口在 TCP 棧里面是用來(lái)控制速率的,窗口大小和延時(shí)結(jié)合起來(lái)就是速率
Linux 和 Windows 的 TCP 棧的確是不一樣的,比如結(jié)束一個(gè) TCP 的時(shí)候,Windows 是發(fā)送 RST,而 Linux 則是雙向 FIN
在網(wǎng)絡(luò)質(zhì)量發(fā)生變化時(shí),TCP 的 window 會(huì)自動(dòng)調(diào)整,這個(gè)動(dòng)作叫窗口滑動(dòng),而這個(gè)窗口的全名叫滑動(dòng)窗口
具體 TCP 的實(shí)現(xiàn)很復(fù)雜,需要看 TCP/IP 詳解卷一,大概是從 17 章的位置往后看,先把原理看懂,卷二再看實(shí)現(xiàn)
ssd6166
我找到在哪里改動(dòng)了!
首先說(shuō)下5972這個(gè)數(shù)字是怎么出來(lái)的,在此轉(zhuǎn)貼一段文章以作解釋?zhuān)?br>
---------------------
tcp_sock->rcv_wnd表示當(dāng)前接收窗口的大小,這個(gè)值在收到對(duì)方的數(shù)據(jù)后,會(huì)變動(dòng)的。它的初始值取接收緩存大小的3/4跟MAX_TCP_WINDOW之間的最小值,MAX_TCP_WINDOW在系統(tǒng)中的定義為32767U。然后,還要根據(jù)mss的值作一個(gè)調(diào)整,調(diào)整邏輯是:如果mss大于 3*1460,則如果當(dāng)前的rcv_wnd大于兩倍的mss,就取兩倍的mss作為rcv_wnd的值;如果mss大于1460,則如果當(dāng)前的rcv_wnd大于3倍的mss,就取3倍的mss作為rcv_wnd的新值;否則,如果rcv_wnd大于4倍的mss,就取4倍的mss作為rcv_wnd的新值,我們的實(shí)驗(yàn)環(huán)境的mss值為1448(因?yàn)閠cp首部有12字節(jié)的時(shí)間戳選項(xiàng)),所以rcv_wnd最后被調(diào)整為1448*4 = 5792。
---------------------
按照上述說(shuō)明,找到具體修改的地方是tcp
_select_initial_window()函數(shù)
由于SYN+ACK的包只是回應(yīng)SYN的,所以還沒(méi)有到滑動(dòng)的時(shí)候,這時(shí)初值就是窗口值了
^^
platinum
感覺(jué)他說(shuō)的可能還是有問(wèn)題的,我的環(huán)境 MSS 是 1440,但是 SYN/ACK 中的 WND 卻是 5808
SYN/ACK 中的 MSS 是 1412,回去的 WND 卻是 372768