Java 为什么当数据报套接字缓冲区大小较大时,丢弃率较高

Java 为什么当数据报套接字缓冲区大小较大时,丢弃率较高,java,networking,network-programming,udp,Java,Networking,Network Programming,Udp,我正在编写基于UDP的网络协议。我面临着DatagramSocket的奇怪行为。当我设置大发送缓冲区时,丢弃率很高,但应该相反 你知道它为什么会这样吗 感谢联合国的支持 我所说的“大缓冲区大小”是指16-32MB 我的测试环境是1Gbit网络,具有高延迟(240毫秒往返)网络适配器和路由器中的缓冲区有限。如果你填充它们,即使有很多小消息,数据包也会被丢弃。有些路由器每个连接的缓冲区大小为1 MB(因此,如果连接到路由器,则该缓冲区大小为该连接上所有内容的总和)当你说你正在写一个基于UDP的网络协

我正在编写基于UDP的网络协议。我面临着DatagramSocket的奇怪行为。当我设置大发送缓冲区时,丢弃率很高,但应该相反

你知道它为什么会这样吗

感谢联合国的支持

我所说的“大缓冲区大小”是指16-32MB


我的测试环境是1Gbit网络,具有高延迟(240毫秒往返)

网络适配器和路由器中的缓冲区有限。如果你填充它们,即使有很多小消息,数据包也会被丢弃。有些路由器每个连接的缓冲区大小为1 MB(因此,如果连接到路由器,则该缓冲区大小为该连接上所有内容的总和)

当你说你正在写一个基于UDP的网络协议时,你能再描述一下你的意思吗?你的测试环境是什么?我从伦敦经纽约到东京的往返延迟为240毫秒。我假设您正在测试最坏情况下的延迟?如果您使用的是WAN,那么在发送方和接收方之间,最薄弱的环节就是使用率最高的路由器。链中的所有路由器都可能丢弃一些数据包(以及网络适配器)@glebreutov您可能在软件中使用了一个大的缓冲区,但这不会改变所涉及硬件的缓冲区大小。它有一个固定的且通常相当小的缓冲区大小,当它出于任何原因暂时填充时,即使它与您正在做的事情无关,数据包也可能被丢弃。许多银行所做的就是购买专用硬件,为UDP构建专用网络,并控制从发送方到接收方的流量。它们还确保所有路由器都能轻松缓冲发送的所有数据。@glebreutov回答您的问题,发送缓冲区越大,下游缓冲区容纳的数据就越少。尝试使用每个字节接近512字节的数据包。正确。如果我们使用大缓冲区,TCP/IP堆栈将以高速率发送更多数据包,中间主机将因为没有大缓冲区而丢弃。实际上OP必须测量连接速度并以该速率发送数据包。。。。要非常小心地寻找微爆发。这是导致辍学的最高缓冲级别。i、 e.如果您的数据特别突发,因为它在0.1%的时间内100%繁忙,那么您可以以0.1%的网络利用率退出。