在 TCP 中,tcp_rmem
参数的三个值分别具有以下含义和作用:
一、含义
“4896”:
- 通常代表 TCP 接收缓冲区的最小大小。这是接收端为接收数据预先分配的最小内存空间。当网络中数据量较小时,这个最小缓冲区可以确保有足够的空间来存储少量的数据,避免数据丢失。
“131072”:
- 一般是接收缓冲区的默认大小。在正常的网络状况下,系统会使用这个大小的缓冲区来接收数据。它是一个较为平衡的默认值,既不会占用过多内存,又能满足大部分情况下的数据接收需求。
“6291456”:
- 是接收缓冲区的最大大小。当网络流量非常大或者有特殊需求时,接收缓冲区可以动态扩展到这个最大值,以容纳大量的数据。
二、作用
- 提高数据接收效率:
- 合适的接收缓冲区大小可以减少数据接收过程中的中断和等待时间。如果缓冲区过小,接收端可能频繁地需要处理数据,导致 CPU 开销增加。而如果缓冲区过大,可能会浪费内存资源。通过调整这三个值,可以根据实际网络状况和应用需求,优化数据接收效率。
- 适应不同网络环境:
- 在不同的网络条件下,数据传输的速度和稳定性会有所不同。例如,在高速宽带网络中,可以适当增大接收缓冲区以充分利用带宽;而在网络拥塞或不稳定的情况下,可能需要减小缓冲区大小,以避免数据积压和丢失。
- 满足特定应用需求:
- 不同的应用程序对数据接收的要求也不同。一些实时性要求高的应用(如在线游戏、视频会议)可能需要较小的缓冲区以降低延迟;而一些大数据传输的应用(如文件下载、视频流)则可能需要较大的缓冲区来确保数据的连续接收。
设置TCP缓冲区接收大小的测试代码
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
/*
设置TCP接收缓冲区大小测试程序
*/
#define BUFFER_SIZE 1024
int main(int argc,char*argv[])
{
if(argc <=2)
{
printf("usage: %s ip_address port_number recv_buffer_size \n",
basename(argv[0]));
return 1;
}
const char* ip = argv[1];
int port = atoi(argv[2]);
/*创建一个IPv4 socket地址*/
struct sockaddr_in address;
bzero(&address,sizeof(address));
address.sin_family = AF_INET;
inet_pton(AF_INET,ip,&address.sin_addr);
address.sin_port= htons(port);
int sock = socket(PF_INET,SOCK_STREAM,0);
assert(sock>=0);
int recvbuf = atoi(argv[3]);
int len = sizeof(recvbuf);
/*先设置TCP接收缓冲区的大小,然后立即读取之*/
setsockopt(sock,SOL_SOCKET,SO_RCVBUF,&recvbuf,sizeof(recvbuf));
getsockopt(sock,SOL_SOCKET,SO_RCVBUF,&recvbuf,(socklen_t*)&len);
printf("the tcp reveive buffer size after setting is %d\n",recvbuf);
int ret = bind(sock,(struct sockaddr*)&address,sizeof(address));
assert(ret != -1);
ret = listen(sock,5);
assert(ret !=-1);
struct sockaddr_in client;
socklen_t client_addrlength = sizeof(client);
int connfd = accept(sock,(struct sockaddr*)&client,&client_addrlength);
if(connfd <0)
{
printf("errno is: %d\n",errno);
}
else{
char buffer[BUFFER_SIZE];
memset(buffer,'\0',BUFFER_SIZE);
while(recv(connfd,buffer,BUFFER_SIZE-1,0)>0){}
close(connfd);
}
close(sock);
return 0;
}
程序使用示例
$ ./set_recv_buffer 192.168.186.135 54321 50
the tcp reveive buffer size after setting is 2304
^C
$ ./set_recv_buffer 192.168.186.135 54321 100
the tcp reveive buffer size after setting is 2304
^C
$ ./set_recv_buffer 192.168.186.135 54321 2304
the tcp reveive buffer size after setting is 4608