网络编程8 流量控制和拥塞控制

流量控制:流量控制就是在发送端和接收端之间的协调,当发送端发送过多的数据,而接收端来不及接收,为了防止丢包需要调整发送窗口和接收窗口的大小。

拥塞控制:拥塞控制就是协调发送者和接收者与网络带宽之间的关系,tcp协议中拥塞控制是通过拥塞控制窗口来实现的,同时为了进一步提高网络带宽的利用率增加了delay ack和nagle算法,前者降低网络中的ack报文数量,后者降低网络中小数据包的报文数量。
delay ack:在接收到数据后并不马上回复,而是累计需要发送的ack报文一次性回复,这种方式降低了网络中大量的ack报文。
nagle算法:nagle算法的本质是限制小批量的数据包重复发送,nagle算法规定在任意时刻未确认的小数据包的数量不能超过一个。发送者可以将接下来连续的几个小数据包存储起来等待接收到前面一个小数据包的ack分组后再将后面的数据一次性发送出去。

delay ack和nagle算法结合存在的问题
在这里插入图片描述

不过幸运的是我们可以关闭nagle算法

int on = 1; 
setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (void *)&on, sizeof(on)); 

不过现代操作系统对nagle和daley ack的优化已经很好了,一般不要禁用nagle算法

在应用层面我们可以通过将小数据合并的方式减少小数据包的数量


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);

示例:


int main(int argc, char **argv) {
    if (argc != 2) {
        error(1, 0, "usage: tcpclient <IPaddress>");
    }

    int socket_fd;
    socket_fd = socket(AF_INET, SOCK_STREAM, 0);

    struct sockaddr_in server_addr;
    bzero(&server_addr, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(SERV_PORT);
    inet_pton(AF_INET, argv[1], &server_addr.sin_addr);

    socklen_t server_len = sizeof(server_addr);
    int connect_rt = connect(socket_fd, (struct sockaddr *) &server_addr, server_len);
    if (connect_rt < 0) {
        error(1, errno, "connect failed ");
    }

    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;
    while (fgets(buf, sizeof(buf), stdin) != NULL) {
        iov[1].iov_len = strlen(buf);
        int n = htonl(iov[1].iov_len);
        if (writev(socket_fd, iov, 2) < 0)
            error(1, errno, "writev failure");
    }
    exit(0);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值