Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets TCP中的数据包大小、窗口大小和套接字缓冲区_Sockets_Tcp - Fatal编程技术网

Sockets TCP中的数据包大小、窗口大小和套接字缓冲区

Sockets TCP中的数据包大小、窗口大小和套接字缓冲区,sockets,tcp,Sockets,Tcp,在研究了“窗口大小”的概念之后,我所理解的是,它在通过网络发送数据包之前一直保存数据包,直到确认最早的数据包。一旦这个数据包被填满,随后的数据包将被丢弃。在某个地方,我还读到TCP是一种流协议,而数据包是与网络层的IP协议相关的 我一直以为我已经声明了一个缓冲区(内部代码),我用一些数据填充它,并使用套接字发送这个缓冲区。我声明了一个10000字节的缓冲区,并使用socket over 10 Gbps链接重复发送它 我有以下假设和问题。请核实并提供帮助 若我想发送一个64256512等字节的数据

在研究了“窗口大小”的概念之后,我所理解的是,它在通过网络发送数据包之前一直保存数据包,直到确认最早的数据包。一旦这个数据包被填满,随后的数据包将被丢弃。在某个地方,我还读到TCP是一种流协议,而数据包是与网络层的IP协议相关的

我一直以为我已经声明了一个缓冲区(内部代码),我用一些数据填充它,并使用套接字发送这个缓冲区。我声明了一个10000字节的缓冲区,并使用socket over 10 Gbps链接重复发送它

我有以下假设和问题。请核实并提供帮助

  • 若我想发送一个64256512等字节的数据包,在那个么多空间的代码中声明缓冲区并通过套接字发送。每次执行send()命令都会发送一个如此大的数据包

  • 因此,如果我想研究数据包大小变化对吞吐量的影响,我必须做什么?我需要改变代码中的缓冲区大小吗

  • 我们使用SO_SNDBUF和SO_RECVBUF设置的套接字缓冲区是什么?谷歌称这是套接字的缓冲空间。它与TCP窗口大小相同还是不同?哪个参数更适合改变或增加吞吐量


  • 套接字缓冲区中还有三个参数:Min、Default和Max。我应该根据我的实验改变哪一个参数,以获得更大的相关性?

    TCP没有直接公开控制数据包发送方式的方法,因为它是一种流协议。但是可以通过禁用Nagle算法使TCP堆栈发送数据包。这样,您
    发送的所有数据将立即发送出去,而不是缓冲。数据将被分成MTU大小的数据包,大约1400字节。取决于链接

    回答(2):禁用nagling并使用小于1400字节的缓冲区调用send。使用Wireshark确保你得到了你想要的

    缓冲区设置与此无关。我不知道有什么正当的理由去碰它们

    一般来说,这个问题可能没有实际意义,因为您似乎想要发送大量数据。只需启用唠叨,然后发送大缓冲区(如64KB)

    如果我想发送一个64256512等字节的数据包,在代码中声明缓冲区,并通过套接字发送。每次执行send()命令都会发送一个如此大的数据包

    仅当禁用Nagle算法且大小小于路径MTU时。你不能依赖这个

    所以,如果我想研究数据包大小变化对吞吐量的影响,我必须做什么,改变代码中的缓冲区空间

    否。在接收器处改变
    SO_RCVBUF
    。这是吞吐量的最大决定因素,因为它决定了最大接收窗口

    我们使用
    SO\u SNDBUF
    SO\u RCVBUF
    设置的套接字缓冲区是什么

    发送方发送缓冲区大小,接收方接收缓冲区大小。在内核中

    它与TCP窗口大小相同

    见上文

    还是不同?哪个参数更适合改变以增加吞吐量

    见上文

    套接字缓冲区中还有三个参数mindefault和Max。为了让我的实验更具相关性,我应该改变哪一个


    没有。这些是全系统的参数。对于应用程序中的特定套接字,只需使用
    SO_SNDBUF
    SO_RCVBUF

    我在Windows 10上有一些经验:

    代码来自

    用于环回捕获的RawCap

    观看结果的有线鲨鱼

    主要客户端代码为:

    def client(ip, port, message):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.setsockopt(socket.SOL_SOCKET,socket.SO_RCVBUF, 100000)
        sock.connect((ip, port))
        sock.sendall(bytes(message, 'ascii'))
        response = str(sock.recv(1024), 'ascii')
        print("Received: {}".format(response))
    
    以下是结果(服务器端口为11111):

    您可以看到,tcp接收窗口大小与SOrcvbuf相同,可能与平台无关,您可以在其他平台上进行验证

    SO_RCVBUF套接字选项确定底层传输使用的套接字接收缓冲区的大小

    证实了这一点

    另外,当我设置SO_SNDBUF=100000时,它对客户端和服务器之间的tcp传输没有影响,因为如果客户端一次发送大量数据,服务器就可以丢弃数据


    因此,如果您想将So_RCVBUF更改为最大吞吐量,您可以参考,操作系统可能提供func来检测理想的发送积压(ISB)。

    缓冲区大小不应该自动调整吗?我从未见过有人调整缓冲区大小并获得更好的结果。而且,这些缓冲区大小选项是否真的控制了TCP窗口的任何部分?它们似乎是内核缓冲区。TCP窗口是动态的,因此静态缓冲区大小不能与TCP窗口大小相对应。@usr so_RCVBUF确定最大接收窗口。我已经说过了。它不是自动调谐的。我对1700个数据点进行了一个大型实验,实验清楚地表明,接收缓冲区的大小很容易成为决定吞吐量的最重要因素。这意味着我们不能发送超过MTU大小的数据包?您如何发送大于数据包最大大小的数据包?这显然是不可能的。所以我不知道你的问题是针对什么的。@CarloWood你能解释一下这会以什么方式给网络带来问题吗?禁用唠叨后,流控制仍然有效。@usr感谢您的友好回复。。。我想我弄错了:/。我很久以前就记得,当你禁用Nagle算法时,你会以任何速率继续广播,即使路由器缓冲区已经满了。我刚刚阅读了它的实际功能(),现在可以看出,如果您的应用程序需要(否则)小数据包的高响应性,那么关闭它可能是可取的(因此,我删除了我的评论)。@CarloWood我明白了,没问题。你可以删除你的评论,并标记我的评论,以便版主删除以进行清理。