免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1342 | 回复: 4
打印 上一主题 下一主题

请教牛人,TCP中的一段代码 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-05-03 16:48 |只看该作者 |倒序浏览
谁能帮我解释1701-1715之间的意思?我不是很清楚,一起讨论也可以
qq:121035422
////////////////////////
/* This is Jacobson's slow start and congestion avoidance.
1697  * SIGCOMM '88, p. 328.
1698  */
1699 static __inline__ void tcp_cong_avoid(struct tcp_opt *tp)
1700 {
1701         if (tp->;snd_cwnd <= tp->;snd_ssthresh) {
1702                 /* In "safe" area, increase. */
1703                 if (tp->;snd_cwnd < tp->;snd_cwnd_clamp)
1704                         tp->;snd_cwnd++;
1705         } else {
1706                 /* In dangerous area, increase slowly.
1707                  * In theory this is tp->;snd_cwnd += 1 / tp->;snd_cwnd
1708                  */
1709                 if (tp->;snd_cwnd_cnt >;= tp->;snd_cwnd) {
1710                         if (tp->;snd_cwnd < tp->;snd_cwnd_clamp)
1711                                 tp->;snd_cwnd++;
1712                         tp->;snd_cwnd_cnt=0;
1713                 } else
1714                         tp->;snd_cwnd_cnt++;
1715         }
1716         tp->;snd_cwnd_stamp = tcp_time_stamp;
1717 }

论坛徽章:
0
2 [报告]
发表于 2005-05-03 17:10 |只看该作者

请教牛人,TCP中的一段代码

TCP的拥塞控制吧。
701-1704,当拥塞窗口小于阈值时,增长;1705-1715,当拥塞窗口大于阈值时缓慢增长。
好像跟网络书上写的不一样,书上写的TCP拥塞控制算法是当拥塞窗口小于阈值时以“指数速率”快速增长;当超过阈值时线性增长。

论坛徽章:
0
3 [报告]
发表于 2005-05-04 07:48 |只看该作者

请教牛人,TCP中的一段代码

的确如您所说;这是网站上的,是redhat linux;书上是BSD的;所以有些是不一样的,上面的代码有些难理解。

其实,最主要是理解:tp->;snd_cwnd, tp->;snd_cwnd_clamp和
tp->;snd_ssthresh的含义;


我认为:tp->;snd_cwnd并不是拥塞窗口的阀值,而是
tp->;snd_cwnd_clamp;
tp->;snd_ssthresh应该是从慢启动到拥塞避免的阀值。
例如:
拥塞避免窗口阀值为 tp->;snd_ssthresh =32(k)
拥塞窗口初试值为1(k)则tp->;snd_cwnd_clamp依次为2->;4->;8->;16->;32;
当tp->;snd_cwnd_clamp=8时,tp->;snd_cwnd++; 从1到8,每发送一个包,则加1;

但1705-1715就有些不理解了。

论坛徽章:
0
4 [报告]
发表于 2005-05-06 01:35 |只看该作者

请教牛人,TCP中的一段代码

从名字来看,snd_cwnd应该是拥塞窗口,snd_ssthresh应该是阈值,clamp就不知道了~~~虽然实现方法不一样,但是加性增、乘性减的原理应该是一样的吧。

论坛徽章:
0
5 [报告]
发表于 2005-05-06 10:34 |只看该作者

请教牛人,TCP中的一段代码

tp->;snd_cwnd是当前拥塞窗口的大小,是个不断变化的值。
tp->;snd_ssthresh是从慢启动到拥塞避免的阀值。
tp->;snd_cwnd_clamp是拥塞窗口的阀值
tp->;snd_cwnd_cnt是当tp->;snd_cwnd达到tp->;snd_ssthresh后,开始线性增长时用到的一个计数值。

主要分两个过程,tp->;snd_cwnd达到tp->;snd_ssthresh前,是慢启动过程:

每收到一个ack响应,tp->;snd_cwnd增加一(见1704 ),也即增加了一个packet. 实际上, 每次收到一个ack响应,窗口增加了两个packet,因为即要再产生一个原来位置的packet,又要增加一个packet. 这样下来,一个RTT时间,窗口则扩大为原来的两倍. 所以窗口大小是随RTT时间指数增加的.


tp->;snd_cwnd达到tp->;snd_ssthresh后是在线性增长阶段:
若当前的拥塞窗口的大小为cwnd,要保证一个RTT时间里tp->;snd_cwnd增加一个packet,则应当每收到一个ack响应时,tp->;snd_cwnd增加1/cwnd(这里应当理解,一个大小为cwnd的窗口在一个RTT时间里能够产生最多cwnd个ack响应)。其方法就是把tp->;snd_cwnd_cnt初始值设为0(见1712),然后每次收到ack响应就增一(见1714),当tp->;snd_cwnd_cnt的值达到当前的tp->;snd_cwnd值(见1709  ),就意味着一个RTT时间到,此时tp->;snd_cwnd就应该增加一个packet(见1711 ).而因为tp->;snd_cwnd的改变又会导致新的一轮tp->;snd_cwnd_cnt递增,则tp->;snd_cwnd_cnt应当再设为0(见1712),迎接下一轮的递增. 在这个过程里,每个RTT时间,窗口增加一个packet,因此是线性增加的.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP