在收到一个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]]
jerrywjl
这应该是固定在内核里的参数,无法改变。
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
回复 #3 platinum 的帖子
首先感谢您和jerrtwjl的回应
您这里说的除非“修改对方的TCP协议栈”是指发送方还是回应方?我要在回应方上进行修改。
我是发现windowsXP发送的窗口大小和linux不一样,所以想知道为什么
并且想尝试更改下linux的发送窗口大小
我觉得发送窗口大小应该和缓冲区的大小有关,所以我尝试着扩大了缓冲区,但是不行
我又觉得这应该和一个初始值有关,可是又没找到这个初始值……
如果找到了这个初值是不是就能修改了?可这个初始值在哪定义的呢?
可能我对慢启动的原理还是不太清楚吧……
希望得到大家指点,谢谢!
platinum
窗口在 TCP 栈里面是用来控制速率的,窗口大小和延时结合起来就是速率
Linux 和 Windows 的 TCP 栈的确是不一样的,比如结束一个 TCP 的时候,Windows 是发送 RST,而 Linux 则是双向 FIN
在网络质量发生变化时,TCP 的 window 会自动调整,这个动作叫窗口滑动,而这个窗口的全名叫滑动窗口
具体 TCP 的实现很复杂,需要看 TCP/IP 详解卷一,大概是从 17 章的位置往后看,先把原理看懂,卷二再看实现
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的,所以还没有到滑动的时候,这时初值就是窗口值了
^^
platinum
感觉他说的可能还是有问题的,我的环境 MSS 是 1440,但是 SYN/ACK 中的 WND 却是 5808
SYN/ACK 中的 MSS 是 1412,回去的 WND 却是 372768