> 文档中心 > 网络中的拥塞控制与数据传输

网络中的拥塞控制与数据传输

        网络调用send并不意味着将数据立刻发送,这些数据只是从应用程序中被拷贝到了系统内核的套接字发送缓冲区中。至于什么时候发生出去,有TCP内核协议栈决定。

拥塞控制与数据传输

        拥塞控制常用的算法

        “慢启动”算法,慢慢地将网络发送数据的速率增加到一个阈值。超过这个阈值之后,慢启动就结束了。

        “拥塞避免”算法,TCP 会不断地探测网络状况,并随之不断调整拥塞窗口的大小。


发送窗口与拥塞窗口

        TCP 发送缓冲区的数据是否能真正发送出去,至少取决于两个因素,一个是当前的发送窗口大小,另一个是拥塞窗口大小,而 TCP 协议中总是取两者中最小值作为判断依据。

区别:

        发送窗口反应了作为单 TCP 连接、点对点之间的流量控制模型,它是需要和接收端一起共同协调来调整大小的;

        拥塞窗口则是反应了作为多个 TCP 连接共享带宽的拥塞控制模型,它是发送端独立地根据网络状况来动态调整的。

内核中收发数据

  1. 发送窗口用来控制发送和接收端的流量;阻塞窗口用来控制多条连接公平使用的有限带宽。
  2. 小数据包加剧了网络带宽的浪费,为了解决这个问题,引入了如 Nagle 算法、延时 ACK 等机制。

写操作合并

在写数据之前,将数据合并到缓冲区,批量发送出去,这是一个比较好的做法

struct iovec {void *iov_base; /* starting address of buffer */size_t iov_len; /* size of buffer */};”

ssize_t writev(int filedes, const struct iovec *iov, int iovcnt)ssize_t readv(int filedes, const struct iovec *iov, int iovcnt);

示例

    char buf[128];    struct iovec iov[2];    char *send_one = "hello,";    iov[0].iov_base = send_one;    iov[0].iov_len = strlen(send_one);    iov[1].iov_base = buf;    strcpy(buf,"world");    iov[1].iov_len = strlen(buf);    writev(socket_fd, iov, 2);