博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TCP拥塞控制算法 — CUBIC的补丁(一)
阅读量:4954 次
发布时间:2019-06-12

本文共 2358 字,大约阅读时间需要 7 分钟。

cubic从2.6.37到3.0之间有7个patch,从3.0到3.8(当前最新版本)中无patch。

 

描述

 

以下是提交者Stephen Hemminger对这个patch的描述:

fix comparison of jiffies

Jiffies wraps around therefore the correct way to compare is to use cast to signed value.

Note: cubic is not using full jiffies value on 64 bit arch because using full unsigned long

makes struct bictcp grow too large for the available ca_priv area.

Includes correction from Sangtae Ha to improve ack train detection.

 

代码

 

--- a/net/ipv4/tcp_cubic.c+++ b/net/ipv4/tcp_cubic.c@@ -342,9 +342,11 @@ static void hystart_update(struct sock *sk, u32 delay)                u32 curr_jiffies = jiffies;                 /* first detection parameter - ack-train detection */-               if (curr_jiffies - ca->last_jiffies <= msecs_to_jiffies(2)) {+               if ((s32)(curr_jiffies - ca->last_jiffies) <=+                   msecs_to_jiffies(2)) {                        ca->last_jiffies = curr_jiffies;-                       if (curr_jiffies - ca->round_start >= ca->delay_min>>4)+                       if ((s32) (curr_jiffies - ca->round_start) >+                           ca->delay_min >> 4)                                ca->found |= HYSTART_ACK_TRAIN;                }

 

分析

 

@arch/x86/include/asm/posix_types_64.h:typedef long __kernel_time_t;typedef long __kernel_suseconds_t;@include/linux/time.h:struct timeval {    __kernel_time_t tv_sec; /* seconds */    __kernel_suseconds_t tv_usec; /* microseconds */}@include/linux/raid/pq.h:typedef uint32_t u32;#define jiffies raid6_jiffies()#undef HZ#define HZ 1000static inline uint32_t raid6_jiffies(void){    struct timeval tv;    gettimeofday(&tv, NULL);    return tv.tv_sec * 1000 + tv.tv_usec/1000;}

我们可以看到jiffies为u32类型,单位为毫秒。这样一来jiffies在49.7天后就会溢出。

当jiffies达到最大值后,它的值就会回绕到0。

u32 a;

u32 b;

(a - b)为u32的,如果a < b,但是这时的结果为正数,则不能正确表示a和b的大小关系。

所以需要把结果转化为有符号的,即(s32)(a - b)。

 

评价

 

我们知道从道理上讲curr_jiffies应该总大于last_jiffies和round_start的,因为后两个是过去的时间。

这个patch并不能保证这一点,所以当curr_jiffies回绕时,还是会出现错误判断!

因为这个时候 (curr_jiffies - ca->round_start )总是小于0的。 

当然,回绕发生的概率低(49.7天一次),被这个函数遇到的概率更低,并且除了ack train方法外还有

delay increase来检查退出点,所以影响微乎其微。

其实要更彻底解决这个问题,只需要把ca->round_start和ca->last_jiffies换为u64类型,再使用64位

jiffies即可。这样在任何人的有生之年都别指望看到jiffies溢出了。提交者没有这样做的原因是这会使

bictcp结构的大小超出icsk_ca_priv所指向空间的大小,而其实增大icsk_ca_priv所指向空间大小是很

方便的。

 

Author

 

zhangskd @ csdn blog

转载于:https://www.cnblogs.com/aiwz/archive/2013/03/02/6333353.html

你可能感兴趣的文章
HashMap详解
查看>>
js05-DOM对象二
查看>>
mariadb BINLOG_FORMAT = STATEMENT 异常
查看>>
C3P0 WARN: Establishing SSL connection without server's identity verification is not recommended
查看>>
iPhone在日本最牛,在中国输得最慘
查看>>
动态方法决议 和 消息转发
查看>>
WPF自定义搜索框代码分享
查看>>
js 基础拓展
查看>>
SpringBoot访问html访问不了的问题
查看>>
{width=200px;height=300px;overflow:hidden}
查看>>
C#生成随机数
查看>>
CSS基础学习 20.CSS媒体查询
查看>>
2019春季第十一周作业
查看>>
洛谷P4591 [TJOI2018]碱基序列 【KMP + dp】
查看>>
iOS CoreData介绍和使用(以及一些注意事项)
查看>>
OS笔记047代理传值和block传值
查看>>
Android应用程序与SurfaceFlinger服务的连接过程分析
查看>>
coco2dx服务器简单例子
查看>>
Java回顾之多线程
查看>>
sqlite
查看>>