在研究了窗口大小概念之后,我理解的是它在通过有线发送之前保留数据包,直到确认为最早的数据包。一旦这个填充后续数据包将丢弃。我在那里阅读的一些内容TCP是一种流协议,Packet是与网络层的IP协议相关的内容。
我所假设的是我在侧面代码中声明了一个缓冲区,我填充了一些数据并使用套接字发送此缓冲区。我声明了10000字节的缓冲区,并使用超过10 Gbps链路的套接字重复发送。
我有以下假设和问题请验证并提供帮助
如果我想发送一个64,256,512等字节的数据包,声明缓冲区在那个空间的代码内并通过套接字发送。每次执行send()命令都会发送一个这么大的数据包。
因此,如果我想研究数据包大小变化对吞吐量的影响,我需要做什么,改变代码中的缓冲区空间?
我们使用SO_SNDBUF和SO_RECVBUF设置的套接字缓冲区是什么,google说它的socket缓冲区空间。它与TCP窗口大小相同还是不同?哪个参数更适合变化以增加吞吐量?
Socket Buffer min中有三个参数Default和Max。我应该根据我的实验改变哪一个以获得更多相关性
答案 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_SNDBUF
和SO_RCVBUF
在发送方发送缓冲区大小,并在接收方接收缓冲区大小。在内核中。
与TCP窗口大小相同
见上文。
还是不同?哪个参数更适合变化以增加吞吐量?
见上文。
Socket Buffer min中有三个参数Default和Max。我应该根据我的实验改变哪一个以获得更多相关性
他们都不是。这些是系统范围的参数。只需使用SO_SNDBUF
和SO_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))
你可以看到,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)。