我们正在使用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) { }];
问题是偶尔会将标头发送到服务器,从而打开与API的连接,然后在几秒钟后发送正文包。我们看到的是>标头和正文之间有1秒的延迟,服务器端每隔一百个请求就会随机发生。它是我们API上最大的延迟来源。
对于大多数请求,标题和正文大小相同(每个200字节)。
有没有人见过这个?
答案 0 :(得分:0)
我对swift API(NSUrlConnection等)没有具体的见解,但一般来说,虽然HTTP数据是以大容量的块(可以容纳一个数据包中的200个字节)发送的,但更细粒度的决策是取决于底层的TCP级别,可能决定将这些级别拆分为较小大小的块。
我在特定平台(例如AIX)上的节点(发送方和接收方)中观察到了这一点,其中数据包在不合逻辑的边界被TCP分割。根据TCP规范,应用程序不应该依赖于低级数据传输的特定顺序或大小,它保证了最后阶段的数据完整性。
一个嫌疑人将是在TCP中存在Nagile的算法。
我还建议将客户端更改为另一个平台(例如Linux)并比较行为,如果它很容易移植代码。
希望这有帮助。