13 | 小数据包应对之策:理解TCP协议中的动态数据传输
13 | 小数据包应对之策:理解TCP协议中的动态数据传输
讲述:冯永吉
时长12:32大小11.47M
调用数据发送接口以后……
流量控制和生产者 - 消费者模型
拥塞控制和数据传输
一些有趣的场景
禁用 Nagle 算法
将写操作合并
总结
思考题
赞 13
提建议
精选留言(28)
- 张立华2019-08-30非阻塞socket,对于write和send, 返回实际发送的字节数。所以一般在while里不断发送,直到全部发送完毕。 send根据只要根据要发送的buf做个偏移,很方便。 而writev 就很繁琐了啊
作者回复: 你说的不错,一般我们只在合并缓冲区的时候才需要,绝大多数都是使用write和send 。
18 - Donkey2019-09-18请教老师一个愚钝问题:大数据循环发送时,那接收方怎么接收才能接收完整的包?不会发生粘包等现象呢?
作者回复: 我觉得这个问题不愚钝。 每个包都有一个序列号,通过序列号按顺序就可以还原这个数据流;这个数据流本身也有例如checksum,序号大小等数据,这个数据流所有序列号的包都收到了,就可以完成数据流的拼装了。 解决粘包问题的关键是区分出数据的边界,我在第16降:如何理解TCP的“流”里讲到了这部分内容,你可以参考一下。
共 5 条评论16 - 许童童2019-08-30TCP 拥塞控制算法,我知道最新的有BBR算法,这个算法在网络包填满路由器缓冲区之前就触发流量控制,而不在丢包后才触发,有效的降低了延迟。
作者回复: 嗯,我也是刚知道这个算法。
共 4 条评论9 - 一凡2020-04-13telnet是使用Nagle 算法的吗,但是远程操作是实时性的呀?额
作者回复: 默认是使用的,批量发送小数据包在系统层面显然是得到充分的优化的,并不是我们想象中的经过很长时间之后才会发送出来,在telnet操作下,这个时间对操作人员是无感的。
共 2 条评论9 - 衬衫的价格是19美元2019-10-04拥塞控制算法的话,应该是bbr吧,已经被合入linux 4.9内核了。与传统的reno, cubic等策略相比,最大的不同是,bbr不会因为链路噪声而执行乘性减窗,导致延迟过大。实际上,目前gwf的随机丢包的策略也是链路噪声。
作者回复: Google出品,名声不小。
6 - mgxian2019-09-18问题1 : grep 'IOV_MAX' /usr/include/limits.h
作者回复: 赞
共 3 条评论6 - 不动声色满心澎湃2019-08-31writev是减少write的使用次数吧。一次writev中的数据也有可能分多个包发出去。我说的对吗老师
作者回复: 当然,我们决定不了发包的次数。只不过合并写的方式,让操作系统可以一次性发送出去的几率更大。
6 - D2019-08-30就拥塞控制算法这块,记得前一阵阿里发布一个HPCC算法,盛老师点评一下?谢谢
作者回复: 哈哈,研究性质的算法,应该还不错吧,不知道什么时候可以实际使用
6 - LDxy2019-08-30下载软件通常使用多线程建立多个TCP连接来下载一个大文件,是不是也是为了尽量避免TCP拥塞控制带来的影响,从而充分利用带宽?因为从实际使用来看,下载软件一旦跑满带宽,其他软件基本是是抢不过它的
作者回复: 这是为了加速下载的时间,说白了就是抢带宽。
4 - 码农Kevin亮2019-11-17请问老师,文中提到的小数据包发送的场景二三都是基于同一个目的地的吧?不同目的地的数据包不管多小,也不能合并发送吧?
作者回复: 是的,基于同一个目的地址。这里是说为了提高网络利用率,不能无限制的发送小数据包,也就是说,多个小数据包会在合适的时机合并成一个大的数据包发送出去。你的理解是相反的?
2 - 锦2019-08-30问题一:Linux中最多允许1024个元素 请教一个问题,tcp中有各种窗口,很头晕,比如,发送窗口,接收窗口,通告窗口(Advertised window),滑动窗口,拥塞窗口。为什么要弄这么多窗口呢?都是为了做流量控制吗?如何去理解呢?
作者回复: 发送窗口和接收窗口都是通过滑动窗口机制来实现的,这是为了流量控制而引入的概念;而拥塞窗口则是为了拥塞控制而引入的概念。
共 3 条评论2 - 西门吹牛2022-01-25老师问个问题,客户端向服务端发送数据,在服务端,数据到达 socket 缓存区后,就给户 ack 确认,还是 socket 缓存区中的数据,被应用层从缓存中读取后才返回 ack 确认,我理解的是,只要到达服务端 socket 缓存区就给出 ack
作者回复: 我同意你的理解。
1 - skye2019-12-31发送窗口的大小是怎么定的?
作者回复: 协议栈实现的时候有默认值,而且算法可以动态调整;另外,也可以自己调用套接字接口函数来设置,不过一般不建议这么做。
1 - 钱2019-11-23概念较多,不过举个例子就好理解了,比如:在北京和华盛顿之间有一条可以双向传输货物的传送带,计算机的一切都是为了更快的速度和更大的容量,底层的实现更是如此,再对照各种概念就好理解了,他们所做的一切就是为了更有效地利用网络带宽。 需要权衡的就是,发多少信息?啥时候发?收发之间怎么实现无缝衔接,都没有无谓的等待,各种设备都满负荷的运转。1
- 夏目2019-11-04老师,我有个问题,你举的那个例子里面,取发送窗口和拥塞窗口最小值的80,缓冲区数据是100不能发送出去。那么这个缓冲区数据要什么时候才能发送出去呢,是等到发送缓冲区大于100吗?发送窗口是上一次的ack返回时发送端拿到的吗?那发送端怎么知道什么时候大于100的呢?
作者回复: 需要等到发现窗口和拥塞窗口都要超过100才可以,发送窗口是在ACK返回时根据一定的算法更新的,一旦更新就会影响发送端的行为。
1 - lixin2022-08-21 来自广东老师,请教一下一个场景: 如果发送方使用writev()发送多个buf数据,接收端 用read(),而不是readv() 来读取数据,能否把writev的数据原样读取到么?是否 writev/readv 需要配对使用?谢谢
- 🐗Jinx2020-12-20老师,为什么很多网络库都自己设计了一套缓冲区?其最大的目的是为了什么呢?如果自己要实现一个,应该要从哪些方面考虑和入手呢?
作者回复: 最大的目的是方便网络程序库的使用者使用,如果没有这个封装,网络程序库基本是不可用的。 设计的话,你往后面读,后面的章节有一个设计可以参考。
- pc2020-05-26老师举例中的一个请求拆成一个包的例子--可以在代码中处理合并写入缓冲区。那么对于一个请求数据过大,缓冲区放不下一次请求包,不得已拆成两次进行两次请求,这种怎么办?是必然会造成延迟么?
作者回复: 为啥缓冲区放不小呢?除非是传递大文件,需要flush到磁盘上,大部分网络程序处理报文的时候,都会把数据缓存到内存缓冲区处理的。
- 扩散性百万咸面包2020-04-18老师,这一章好像没有server端的代码,无法复现。是需要自己实现吗?使用readv接受数据后打印吗?有没有特别的地方呢?
作者回复: 有一个batchwrite程序哦。
共 2 条评论 - 绿箭侠2020-02-14老师,代码的例子,服务端数据是怎么分清是两条数据的?根据换行符?
作者回复: 这个,怎么说呢,纯粹是为了演示,因为系统很空闲,发送的数据有先有后,处理起来自然有先有后,也就是说,先发送的报文被先接收,后发送的报文后接收,自然就分成了两条数据。 在实战中,这个情况是不正确的,有可能先发送的后到达,所以需要对报文进行解析,例如你提到的换行符。