• d
    2019-08-30
    就拥塞控制算法这块,记得前一阵阿里发布一个HPCC算法,盛老师点评一下?谢谢

    作者回复: 哈哈,研究性质的算法,应该还不错吧,不知道什么时候可以实际使用

    
     5
  • 张立华
    2019-08-30
    非阻塞socket,对于write和send, 返回实际发送的字节数。所以一般在while里不断发送,直到全部发送完毕。 send根据只要根据要发送的buf做个偏移,很方便。 而writev 就很繁琐了啊

    作者回复: 你说的不错,一般我们只在合并缓冲区的时候才需要,绝大多数都是使用write和send 。

    
     5
  • _CountingStars
    2019-09-18
    问题1 : grep 'IOV_MAX' /usr/include/limits.h

    作者回复: 赞

    
     3
  • Donkey
    2019-09-18
    请教老师一个愚钝问题:大数据循环发送时,那接收方怎么接收才能接收完整的包?不会发生粘包等现象呢?

    作者回复: 我觉得这个问题不愚钝。

    每个包都有一个序列号,通过序列号按顺序就可以还原这个数据流;这个数据流本身也有例如checksum,序号大小等数据,这个数据流所有序列号的包都收到了,就可以完成数据流的拼装了。

    解决粘包问题的关键是区分出数据的边界,我在第16降:如何理解TCP的“流”里讲到了这部分内容,你可以参考一下。

     1
     2
  • 衬衫的价格是19美元
    2019-10-04
    拥塞控制算法的话,应该是bbr吧,已经被合入linux  4.9内核了。与传统的reno, cubic等策略相比,最大的不同是,bbr不会因为链路噪声而执行乘性减窗,导致延迟过大。实际上,目前gwf的随机丢包的策略也是链路噪声。

    作者回复: Google出品,名声不小。

    
     1
  • LDxy
    2019-08-30
    下载软件通常使用多线程建立多个TCP连接来下载一个大文件,是不是也是为了尽量避免TCP拥塞控制带来的影响,从而充分利用带宽?因为从实际使用来看,下载软件一旦跑满带宽,其他软件基本是是抢不过它的

    作者回复: 这是为了加速下载的时间,说白了就是抢带宽。

    
     1
  • 许童童
    2019-08-30
    TCP 拥塞控制算法,我知道最新的有BBR算法,这个算法在网络包填满路由器缓冲区之前就触发流量控制,而不在丢包后才触发,有效的降低了延迟。

    作者回复: 嗯,我也是刚知道这个算法。

    
     1
  • skye
    2019-12-31
    发送窗口的大小是怎么定的?

    作者回复: 协议栈实现的时候有默认值,而且算法可以动态调整;另外,也可以自己调用套接字接口函数来设置,不过一般不建议这么做。

    
    
  • 咸鱼强
    2019-12-06
    客户端代码的第30行 变量n 好像并没有用到?

    作者回复: 是的,本来想打印出这个n的。

    
    
  • godtrue
    2019-11-23
    概念较多,不过举个例子就好理解了,比如:在北京和华盛顿之间有一条可以双向传输货物的传送带,计算机的一切都是为了更快的速度和更大的容量,底层的实现更是如此,再对照各种概念就好理解了,他们所做的一切就是为了更有效地利用网络带宽。
    需要权衡的就是,发多少信息?啥时候发?收发之间怎么实现无缝衔接,都没有无谓的等待,各种设备都满负荷的运转。
    
    
  • 码农Kevin亮
    2019-11-17
    请问老师,文中提到的小数据包发送的场景二三都是基于同一个目的地的吧?不同目的地的数据包不管多小,也不能合并发送吧?

    作者回复: 是的,基于同一个目的地址。这里是说为了提高网络利用率,不能无限制的发送小数据包,也就是说,多个小数据包会在合适的时机合并成一个大的数据包发送出去。你的理解是相反的?

    
    
  • 夏目
    2019-11-04
    老师,我有个问题,你举的那个例子里面,取发送窗口和拥塞窗口最小值的80,缓冲区数据是100不能发送出去。那么这个缓冲区数据要什么时候才能发送出去呢,是等到发送缓冲区大于100吗?发送窗口是上一次的ack返回时发送端拿到的吗?那发送端怎么知道什么时候大于100的呢?

    作者回复: 需要等到发现窗口和拥塞窗口都要超过100才可以,发送窗口是在ACK返回时根据一定的算法更新的,一旦更新就会影响发送端的行为。

    
    
  • JasonZhi
    2019-09-25
    老师你好,有个问题想求证一下,对文件执行write 操作时会经过缓冲区,缓冲区满了才执行磁盘操作。而对socket 执行write 操作,虽然也会经过缓冲区,但是并不一定需要等到缓冲区满了才发送。不知我的理解是否正确?

    作者回复: 确实是两路不同的实现,但是我不理解为什么文件写需要缓冲区满才进行呢?应该会合并写入,但是不一定需要缓冲区满吧。

    
    
  • CCC
    2019-09-19
    「客户端分两次将一个请求发送出去」,这种情况我在本地模拟只看到了当数据包比MSS大的时候TCP才会拆包发送,请问老师还有别的情况会让一个请求多次发送出去吗?还有就是这种拆包发送有可能拆成两个小数据包(小于MSS)吗?

    作者回复: 我个人觉得不会,应该是拆分成MSS大小的包,否则会浪费带宽。

    
    
  • 徐凯
    2019-09-03
    老师 最后提到的那个问题 那些网络库会不会在内部做处理 就像是运行库函数内部还有缓存的原理一样

    作者回复: 当然有的。

    
    
  • yusuf
    2019-09-02
    1)、iov_len的总和<=32767, iovcnt <= 16
    
    
  • yusuf
    2019-09-01
    场景二中,发送端把接下来连续的几个小数据包存储起来,等待接收到前一个小数据包的 ACK 分组之后,再将数据一次性发送出去。

    是将多个数据包合并成了1个包吗?

    作者回复: 是的。

     3
    
  • 谢童
    2019-08-31
    老师,writev 是原子操作吗?在多线程的情况下可以不加锁使用吗?

    作者回复: 不是原子操作,不过建议还是单线程来处理一个socket,因为加锁的读写操作太重了。

    
    
  • 不动声色满心澎湃
    2019-08-31
    writev是减少write的使用次数吧。一次writev中的数据也有可能分多个包发出去。我说的对吗老师

    作者回复: 当然,我们决定不了发包的次数。只不过合并写的方式,让操作系统可以一次性发送出去的几率更大。

    
    
  • 锦
    2019-08-30
    请教老师一个问题,慢启动是因为需要探测网络带宽质量,快恢复,快重连是什么意思呢?

    作者回复: TCP在收到乱序到达包会立即发送ACK,TCP利用3个相同的ACK来判定数据包的丢失,进行快速重传,以便让对方能在较短的时间内接受到丢失的包,本质上是一种通过"弥补"机制保证拥塞控制能完成。

     1
    
我们在线,来聊聊吧