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

6 iphone nsurlconnection node.js ios express

我们使用NSUrlConnection sendAsynchronousRequest向我们的Node JS服务器发送简单的POST请求.通过分析tcpdumps,我们注意到有时请求头和请求体被分成两个独立的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) { }];
Run Code Online (Sandbox Code Playgroud)

问题是偶尔会将标头发送到服务器,从而打开与我们的API的连接,然后在几秒钟后发送正文包.我们在标题和正文之间看到了> 1秒的延迟,服务器端的每100个请求随机发生.它是我们API上最大的延迟来源.

对于大多数请求,标题和正文大小相同(每个200字节).

谁看过这个吗?

小智 0

我对 swift API(NSUrlConnection 等)没有具体的见解,但一般来说,虽然 HTTP 数据以大块的形式发送(可以容纳一个数据包中的 200 字节),但在底层 TCP 级别,它可能决定将它们分割成较小大小的块。

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

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

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

希望这可以帮助。