《网络编程实战》笔记 | 13 小数据包的应对之策:理解 TCP协议中的动态数据传输
0 前言
果然还是要写笔记才能记得牢靠,虽然是会慢好多,总是比过了就忘的差不多好。
这一节其实是讲 TCP 的流量控制、拥塞控制,说的比较通俗易懂。
1 流量控制的生产者-消费者模型
接收端限于缓存大小和处理速度,不能让发送端没有限制的一直发送数据,当接收端来不及处理的时候,就需要告知发送端慢下来,甚至停下来,这就是流量控制。发送端相当于生产者,接收端相当于消费者,生产的物品用不完可不得停下来,不然等着发霉?
在 TCP 中,流量控制是通过发送窗口和接收窗口大小来进行的。接收窗口就是接收缓存还能存入的字节数,发送窗口表示允许发送的字节数,报文中携带的窗口值是发送方的接收窗口大小,对端通过该值进行发送窗口大小设置。缓存与窗口关系如下图所示:
- 发送窗口用来控制发送和接收端的流量;阻塞窗口用来控制多条链接公平使用有限带宽;
- 小数据包加剧了网络带宽的浪费,针对糊涂窗口综合征,引入Nagle算法和延时ACK机制;
- 程序设计层面,不要多次频繁地发送,使用writev批量发送;
#include <sys/uio.h>
ssize_t readv(int fd, const struct iovec *iov, int iovcnt);
ssize_t writev(int fd, const struct iovec *iov, int iovcnt);