如何防止HttpWebRequest的数据包碎片

pie*_*rs7 8 .net sockets httpwebrequest fragmentation

我在针对嵌入式设备上的HTTP守护进程使用HttpWebRequest时遇到问题.问题似乎是在写入套接字流的http标头与http有效负载(POST)之间存在足够的延迟,即套接字将套接字缓冲区中的内容释放到服务器.这导致HTTP请求被分割为两个数据包(碎片).

当然,这是完全有效的,但是如果分组被分割超过大约1.8ms,则另一端的服务器不能处理它.所以我想知道是否有任何现实的方法来控制它(在客户端上).

在HttpWebRequest上似乎没有任何属性可以对用于发送的套接字进行这种级别的控制,并且似乎无法访问套接字本身(即通过反射),因为它仅在发送期间创建,并且之后发布(作为出站http连接池的一部分).BufferWriteStream属性只缓冲webrequest中的正文内容(因此它仍然可用于重定向等...),并且似乎不会影响整个请求写入套接字的方式.

那么该怎么办?

(我真的试图避免从套接字重新编写HTTP客户端)

一种选择可能是编写HttpWebRequest发送给的某种代理(可能通过ServicePoint),并在该实现缓冲区中写入整个TCP请求.但这似乎是一项艰苦的工作.

当我运行Fidder时也会正常工作(出于同样的原因)但在我们的生产环境中这不是一个真正的选择......

[ps:我知道这肯定是碎片数据包之间的间隔问题,因为我敲了一个套接字级别的测试,我使用NoDelay套接字显式控制了碎片]

pie*_*rs7 2

最后,供应商推出了包含新版本 HTTPD 的固件升级,问题就消失了。他们使用的是 BusyBox linux,显然他们所遇到的 HTTPD 实现还存在一些其他问题。

就我最初的问题而言,除了编写套接字代理之外,我认为没有任何可靠的方法可以做到这一点。我上面使用的一些解决方法是靠运气而不是设计(因为它们意味着 .net 一次性发送了整个数据包)。