yuanrongxi / razor

A google's congestion Control Algorithm
MIT License
352 stars 152 forks source link

请教袁老师您一个代码细节问题 #16

Closed shentu521 closed 5 years ago

shentu521 commented 5 years ago

`static void real_video_evict_frame(sim_session_t s, sim_frame_cache_t c, uint32_t fid) { uint32_t pos, i;

for (pos = c->max_fid + 1; pos <= fid; pos++)
    real_video_clean_frame(s, c, &c->frames[INDEX(pos)]);//需要把以前的缓冲区给清了,给新进来的数据腾空间

//1.最开始最小的min_fid肯定为0,所以fid肯定会小于 c->min_fid + c->size
if (fid < c->min_fid + c->size) //新进来的元素已经跨越了一个缓冲区的长度
    return;

//删除一个GOP序列??? -- 有什么特殊的设计意义吗?
for (pos = c->min_fid + 1; pos < c->max_fid; ++pos){ 
    if (c->frames[INDEX(pos)].frame_type == 1)
        break;
}

for (i = c->min_fid + 1; i < pos; ++i)
    real_video_clean_frame(s, c, &c->frames[INDEX(i)]);

}`

当清除过期的槽位的时候,思路卡主了,

当我们缓存的帧数据超过了数组的大小后,此时需要先清除以前缓存的数据,然后在存储新的数据.

但是有2个地方我始终没有想明白:

后面的代码: 清除的以前的数据,就作为了最小的min_fid,但是后面紧接着就把这个min_fid开始的一个GOP给清空了?请问这样做有什么单独的目的吗?

还有:

if (fid < c->min_fid + c->size) //新进来的元素已经跨越了一个缓冲区的长度 return;

上面这样代码:

如果缓冲区的长度 < cache size,那么很容易理解.

但是如果超过了cache size 后,这行代码的意义,好像就有点多余.

因为超过cache size后:

fid = c->min_fid + c->size ;

shentu521 commented 5 years ago

还有就是关于丢包重传模块,当我们接收端判断出了丢包后,最近要到下一个RTT周期后才去发送重传的请求,这个由是为什么呢?

shentu521 commented 5 years ago

还有就是关于丢包重传模块,当我们接收端判断出了丢包后,最近要到下一个RTT周期后才去发送重传的请求,这个由是为什么呢?

哦,这个原因我知道了:

假设一个周期内我发送了5,6,7三个包,但是我只接收了到了7,这个时候和缓冲区中最大max_seq比较,我第一步判断出,是少了5,6号包.

因为我们检测出发送是一个数据包往返的时间是RTT,这个时候,其实这个时候人如果过了 (RTT + RTT_VAR)/2 后我们还没有收到这个包,那么基本就可以判断出这个包已经丢了.

yuanrongxi commented 5 years ago

OK