在 tcp_wmem
中的 “4096 16384 4194304” 这三个值分别具有以下含义和作用:
- 4096:
- 含义:代表 TCP 发送缓冲区分配的最少字节数。即使在系统资源较为紧张的情况下,每个 TCP 连接的发送缓冲区也会至少分配这么多字节的内存空间。
- 作用:确保即使在不太理想的网络状况或系统负载较高时,也有一定的发送缓冲区可用,避免因为缓冲区过小而导致数据发送失败或延迟。它为 TCP 连接提供了一个最基本的发送数据的内存保障。
- 16384:
- 含义:是发送缓冲区的默认字节数。在正常的网络和系统负载状况下,TCP 连接的发送缓冲区大小会初始化为这个值。
- 作用:对于大多数常规的网络通信场景,这个默认值可以提供一个较为合理的发送缓冲区大小,既不会因为缓冲区过小而影响数据发送效率,也不会占用过多的内存资源。它是系统认为在一般情况下能够满足正常数据发送需求的缓冲区大小设定。
- 4194304:
- 含义:表示发送缓冲区空间的最大字节数。当网络状况非常好,或者有大量数据需要快速发送时,发送缓冲区可以扩展到这个最大值。
- 作用:在网络带宽充足、数据发送量较大的情况下,允许发送缓冲区增大到该最大值,可以充分利用网络带宽,提高数据发送的效率和速度。同时,它也限制了发送缓冲区的最大占用内存,防止某个 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 \n",
basename(argv[0]));
return 1;
}
const char* ip = argv[1];
int port = atoi(argv[2]);
/*创建一个IPv4 socket地址*/
struct sockaddr_in server_address;
bzero(&server_address,sizeof(server_address));
server_address.sin_family = AF_INET;
inet_pton(AF_INET,ip,&server_address.sin_addr);
server_address.sin_port= htons(port);
int sock = socket(PF_INET,SOCK_STREAM,0);
assert(sock>=0);
int sendbuf = atoi(argv[3]);
int len = sizeof(sendbuf);
/*先设置TCP接收缓冲区的大小,然后立即读取之*/
setsockopt(sock,SOL_SOCKET,SO_SNDBUF,&sendbuf,sizeof(sendbuf));
getsockopt(sock,SOL_SOCKET,SO_SNDBUF,&sendbuf,(socklen_t*)&len);
printf("the tcp reveive buffer size after setting is %d\n",sendbuf);
if(connect(sock,(struct sockaddr*)&server_address,sizeof(server_address)))
{
printf("connection failed\n");
}
else{
char buffer[BUFFER_SIZE];
memset(buffer,'a',BUFFER_SIZE);
send(sock,buffer,BUFFER_SIZE,0);
}
close(sock);
return 0;
}
测试程序输出示例:
$ ./set_send_buffer 192.168.186.135 54321 2000
the tcp send buffer size after setting is 4608
$ ./set_send_buffer 192.168.186.135 54321 4096
the tcp send buffer size after setting is 8192