ssd6166
如何改变TCP WINDOW SIZE?
在收到一个TCP SYN包请求的时候,我发现回应的SYN+ACK包的窗口大小固定在5792左右
非常想改变一下,比如把5792改成8192之类
可是实验了几种方法都没有成功
比如:
扩大或缩小了rmem_default、wmem_default、rmem_max、wmem_max,但没有什么效果
是不是需要修改协议栈?需要的话怎样修改?
这个问题困扰我很久了,希望得到大家的指点,谢谢!
我的机器是linux 2.6.21
[[i] 本帖最后由 ssd6166 于 2008-4-23 17:17 编辑 [/i]]
platinum
[quote]原帖由 [i]ssd6166[/i] 于 2008-4-21 18:04 发表 [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]
在收到一个TCP SYN包请求的时候,我发现回应的SYN+ACK包的窗口大小固定在5792左右
非常想改变一下,比如把5792改成8192之类
可是实验了几种方法都没有成功
比如:
扩大或缩小了rmem_default、wmem_default、 ... [/quote]
回应的 ACK 中的 window 是根据回应端的 TCP 栈自己计算出来的,他负责控制 TCP 的慢启动效果
若要改变,除非修改对方 TCP 协议栈,或对他发过来的包做手脚
但是你修改他的目的是什么呢?
ssd6166
我找到在哪里改动了!
首先说下5972这个数字是怎么出来的,在此转贴一段文章以作解释:
---------------------
tcp_sock->rcv_wnd表示当前接收窗口的大小,这个值在收到对方的数据后,会变动的。它的初始值取接收缓存大小的3/4跟MAX_TCP_WINDOW之间的最小值,MAX_TCP_WINDOW在系统中的定义为32767U。然后,还要根据mss的值作一个调整,调整逻辑是:如果mss大于 3*1460,则如果当前的rcv_wnd大于两倍的mss,就取两倍的mss作为rcv_wnd的值;如果mss大于1460,则如果当前的rcv_wnd大于3倍的mss,就取3倍的mss作为rcv_wnd的新值;否则,如果rcv_wnd大于4倍的mss,就取4倍的mss作为rcv_wnd的新值,我们的实验环境的mss值为1448(因为tcp首部有12字节的时间戳选项),所以rcv_wnd最后被调整为1448*4 = 5792。
---------------------
按照上述说明,找到具体修改的地方是tcp_select_initial_window()函数
由于SYN+ACK的包只是回应SYN的,所以还没有到滑动的时候,这时初值就是窗口值了
^^