POST 的标头和正文之间的随机延迟

Posted

技术标签:

【中文标题】POST 的标头和正文之间的随机延迟【英文标题】:Random latency between headers and body of POST 【发布时间】:2014-11-25 00:30:06 【问题描述】:

我们使用 NSUrlConnection sendAsynchronousRequest 向我们的 Node JS 服务器发送简单的 POST 请求。通过对 tcpdump 的分析,我们注意到有时请求头和请求体会被拆分为 2 个独立的 TCP 数据包。

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:url]];
[request setTimeoutInterval:3];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-type"];
[request setHTTPBody:postData];

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler: ^(NSURLResponse *response, NSData *POSTReply, NSError *error)  ];

问题是有时标头会发送到服务器,这会打开与我们的 API 的连接,然后在几秒钟后发送正文数据包。我们看到标头和正文之间的延迟 > 1 秒,服务器端每一百个请求随机出现一次。这是我们 API 上最大的单一延迟来源。

对于大多数请求,标头和正文的大小大致相同(每个 200 字节)。

有人见过吗?

【问题讨论】:

不要在主队列中发送http请求。 【参考方案1】:

我对 swift API(NSUrlConnection 等)没有具体的见解,但总的来说,虽然 HTTP 数据是以大块的形式发送的(可以在一个数据包中容纳 200 个字节),但更精细的决策是在底层 TCP 级别采取,这可能决定将这些拆分成更小的块。

我在特定平台(例如 AIX)上的节点(发送端和接收端)中观察到了这种情况,其中数据包被 TCP 在不合逻辑的边界处拆分。根据 TCP 规范,应用程序不应该依赖于特定的顺序或大小的底层数据传输,它保证了最后阶段的数据完整性。

一个怀疑是在 TCP 中存在 Nagile 算法。

如果便于移植代码,我还建议将客户端更改为另一个平台(例如 Linux)并比较行为。

希望这会有所帮助。

【讨论】:

以上是关于POST 的标头和正文之间的随机延迟的主要内容,如果未能解决你的问题,请参考以下文章

HTTPS 标头或帖子正文更安全吗?

NS2:链接的随机延迟

带有标头和原始 json 正文的 Volley POST 请求

授权请求标头与凭据的 POST 请求正文

如何在 Flutter/Dart 中使用 url 编码的标头和正文发出 HTTP POST 请求

带有标头和正文的 HTTPClient 发布请求