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

时间:2015-02-16 10:30:03

标签: sockets tcp

在研究了窗口大小概念之后,我理解的是它在通过有线发送之前保留数据包,直到确认为最早的数据包。一旦这个填充后续数据包将丢弃。我在那里阅读的一些内容TCP是一种流协议,Packet是与网络层的IP协议相关的内容。

我所假设的是我在侧面代码中声明了一个缓冲区,我填充了一些数据并使用套接字发送此缓冲区。我声明了10000字节的缓冲区,并使用超过10 Gbps链路的套接字重复发送。

我有以下假设和问题请验证并提供帮助

  1. 如果我想发送一个64,256,512等字节的数据包,声明缓冲区在那个空间的代码内并通过套接字发送。每次执行send()命令都会发送一个这么大的数据包。

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

  3. 我们使用SO_SNDBUF和SO_RECVBUF设置的套接字缓冲区是什么,google说它的socket缓冲区空间。它与TCP窗口大小相同还是不同?哪个参数更适合变化以增加吞吐量?

  4. Socket Buffer min中有三个参数Default和Max。我应该根据我的实验改变哪一个以获得更多相关性

3 个答案:

答案 0 :(得分:2)

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

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

缓冲区设置与此任何内容无关。我知道无理由触摸它们。

一般来说,这个问题可能没什么问题,因为你似乎想要发送大量数据。只需启用Nagling和send大缓冲区(例如64KB)。

答案 1 :(得分:2)

  

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

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

  

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

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

  

我们使用SO_SNDBUFSO_RCVBUF

设置的套接字缓冲区是什么

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

  

与TCP窗口大小相同

见上文。

  

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

见上文。

  

Socket Buffer min中有三个参数Default和Max。我应该根据我的实验改变哪一个以获得更多相关性

他们都不是。这些是系统范围的参数。只需使用SO_SNDBUFSO_RCVBUF来播放应用中的特定套接字。

答案 2 :(得分:2)

我在Windows 10上有一些经验:

来自https://docs.python.org/3/library/socketserver.html#asynchronous-mixins

代码,

用于环回捕获的RawCap,

WireShark观看结果。

主要客户端代码是:

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): Here is the result

你可以看到,tcp recive窗口大小与SO_RCVBUF 相同,可能是平台独立的,你可以在其他平台上验证它。

on https://msdn.microsoft.com/en-us/library/windows/hardware/ff570832(v=vs.85).aspx

  

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

验证了这一点。

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

因此,如果您想将SO_RCVBUF更改为最大吞吐量,您可以参考http://packetbomb.com/understanding-throughput-and-tcp-windows/ ,操作系统可以提供func来检测理想的发送积压(ISB)。