TCP滑动窗口和socket缓冲区之间的关系(记录)

一、TCP的滑动窗口大小实际上就是socket的接收缓冲区大小的字节数

二、对于server端的socket一定要在listen之间设置缓冲区大小,因为,accept时新产生的socket会继承监听socket的缓冲区大小。对于client端的socket一定要在connet之前设置缓冲区大小,因为connet时需要进行三次握手过程,会通知对方自己的窗口大小。在connet之后再设置缓冲区,已经没有什么意义。

三、由于缓冲区大小在TCP头部只有16位来表示,所以它的最大值是65536,但是对于一些情况来说需要使用更大的滑动窗口,这时候就要使用扩展的滑动窗口,如光纤高速通信网络,或者是卫星长连接网络,需要窗口尽可能的大。这时会使用扩展的32位的滑动窗口大小。

四、滑动窗口听移动规则:

1、窗口合拢:在收到对端数据后,自己确认了数据的正确性,这些数据会被存储到缓冲区,等待应用程序获取。但这时候因为已经确认了数据的正确性,需要向对方发送确认响应ACK,又因为这些数据还没有被应用进程取走,这时候便需要进行窗口合拢,缓冲区的窗口左边缘向右滑动。注意响应的ACK序号是对方发送数据包的序号,一个对方发送的序号,可能因为窗口张开会被响应(ACK)多次。

2、窗口张开:窗口收缩后,应用进程一旦从缓冲区中取出数据,TCP的滑动窗口需要进行扩张,这时候窗口的右边缘向右扩张,实际上窗口这是一个环形缓冲区,窗口的右边缘扩张会使用原来被应用进程取走内容的缓冲区。在窗口进行扩张后,需要使用ACK通知对端,这时候ACK的序号依然是上次确认收到包的序号。

3、窗口收缩,窗口的右边缘向左滑动,称为窗口收缩,Host Requirement RFC强烈建议不要这样做,但TCP必须能够在某一端产生这种情况时进行处理。

TCP 协议中,滑动窗口是用来控制数据流量的一个重要机制。它可以让发送方和接收方之间的数据传输更加高效和可靠。 在 C 语言中,我们可以使用套接字编程来实现 TCP 协议的通信。下面是一个简单的示例代码,演示了如何设置 TCP 滑动窗口: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/socket.h> #define SERVER_PORT 8888 #define MAXLINE 1024 int main(int argc, char *argv[]) { int sockfd; struct sockaddr_in servaddr; if (argc != 2) { printf("usage: ./client <IPaddress>\n"); exit(1); } sockfd = socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(SERVER_PORT); inet_pton(AF_INET, argv[1], &servaddr.sin_addr); connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); // 设置滑动窗口大小为 1024 字节 int windowsize = 1024; setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &windowsize, sizeof(int)); char buf[MAXLINE]; while (fgets(buf, MAXLINE, stdin) != NULL) { write(sockfd, buf, strlen(buf)); int n = read(sockfd, buf, MAXLINE); buf[n] = '\0'; fputs(buf, stdout); } close(sockfd); return 0; } ``` 在上面的代码中,我们使用 `setsockopt` 函数来设置滑动窗口大小。`SO_RCVBUF` 参数表示接收缓冲区大小,而 `windowsize` 参数则表示滑动窗口的大小。 需要注意的是,滑动窗口大小的设置需要根据具体情况来确定,不宜过大或过小。过大会占用过多内存资源,过小会导致传输效率低下。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值