2014-11-25 2 views
6

Мы используем NSUrlConnection sendAsynchronousRequest для отправки простых запросов POST на наш JS-сервер Node. Проанализировав tcpdumps, мы заметили, что иногда заголовки запросов и тело запроса разделяются на 2 отдельных TCP-пакета.Случайная задержка между заголовками и телом POST

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 байт).

Кто-нибудь видел это раньше?

+1

Не отправляйте запрос http в основной очереди. – x4snowman

ответ

0

У меня нет конкретных представлений о быстрых API (NSUrlConnection и т. Д.), Но в общем случае, когда данные HTTP отправляются в виде кусков большого размера (которые могут вмещать 200 байтов в одном пакете), более гранулированные решения взяты на базовом уровне TCP, который может решить разделить их на куски меньших размеров.

Я наблюдал это в узле (как стороне отправки, так и принимающей стороне) на определенных платформах (таких как AIX), где пакеты разбиты по нелогичным границам через TCP. По спецификации TCP приложения не должны полагаться на определенный порядок или размер транспорта данных низкого уровня, это гарантирует целостность данных на заключительном этапе.

Одним из подозреваемых будет наличие алгоритма Nagile в TCP.

Я бы также рекомендовал изменить клиента на другую платформу (например, Linux) и сравнить поведение, если легко переносить код.

Надеюсь, это поможет.

Смежные вопросы