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

我们使用NSUrlConnection sendAsynchronousRequest向我们的Node JS服务器发送简单的POST请求。 通过分析tcpdump,我们注意到有时请求头和请求体被分成两个独立的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字节)。

有没有人见过这个?

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

我已经在特定平台(如AIX)上的节点(发送端以及接收端)中观察到了这种情况,在这些平台上,数据包被TCP分裂成不合逻辑的边界。 通过TCP规范,应用程序不应该依赖于低级数据传输的特定顺序或大小,它保证了数据在最后阶段的完整性。

一名嫌疑人是TCP中存在Nagile的algorithm。

我也build议将客户端更改为另一个平台(如Linux),并比较行为,如果它很容易移植的代码。

希望这可以帮助。