tcp_rmem中有三个值4896 131072 6291456是什么意思,有什么作用?

发布于:2024-10-13 ⋅ 阅读:(11) ⋅ 点赞:(0)

在 TCP 中,tcp_rmem参数的三个值分别具有以下含义和作用:

一、含义

  1. “4896”:

    • 通常代表 TCP 接收缓冲区的最小大小。这是接收端为接收数据预先分配的最小内存空间。当网络中数据量较小时,这个最小缓冲区可以确保有足够的空间来存储少量的数据,避免数据丢失。
  2. “131072”:

    • 一般是接收缓冲区的默认大小。在正常的网络状况下,系统会使用这个大小的缓冲区来接收数据。它是一个较为平衡的默认值,既不会占用过多内存,又能满足大部分情况下的数据接收需求。
  3. “6291456”:

    • 是接收缓冲区的最大大小。当网络流量非常大或者有特殊需求时,接收缓冲区可以动态扩展到这个最大值,以容纳大量的数据。

二、作用

  1. 提高数据接收效率:
    • 合适的接收缓冲区大小可以减少数据接收过程中的中断和等待时间。如果缓冲区过小,接收端可能频繁地需要处理数据,导致 CPU 开销增加。而如果缓冲区过大,可能会浪费内存资源。通过调整这三个值,可以根据实际网络状况和应用需求,优化数据接收效率。
  2. 适应不同网络环境:
    • 在不同的网络条件下,数据传输的速度和稳定性会有所不同。例如,在高速宽带网络中,可以适当增大接收缓冲区以充分利用带宽;而在网络拥塞或不稳定的情况下,可能需要减小缓冲区大小,以避免数据积压和丢失。
  3. 满足特定应用需求:
    • 不同的应用程序对数据接收的要求也不同。一些实时性要求高的应用(如在线游戏、视频会议)可能需要较小的缓冲区以降低延迟;而一些大数据传输的应用(如文件下载、视频流)则可能需要较大的缓冲区来确保数据的连续接收。

设置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