Когда теряется HTTP-запрос?

Мне нужно отправить довольно большие HTTP-запросы с мобильного устройства. В какой ситуации запрос теряется (чтобы отправленные данные были отправлены повторно)?

Что будет, например, если в течение нескольких секунд не будет радиосвязи? Зависит ли это от какого-то решения в сети, которым я не могу управлять?

На сервере нет тайм-аутов. Я контролирую клиента, и мы можем предположить, что он стабилен. Вызовы поступают в некоторые библиотеки Curl (POSIX C++, встроенный Linux), и он ограничен, насколько я могу его изменить.

2 ответа

Некоторые ситуации, когда запрос теряется:

  • В мобильном устройстве теряется энергия
  • Мобильное устройство теряет связь с сетью (радиоволны не могут достичь пункта назначения)
  • Ошибка программирования / ошибка памяти на мобильном устройстве
  • Слишком много мобильных устройств пытаются отправлять данные одновременно
  • Внешние помехи на радиолинии
  • Потеря питания в сетевой инфраструктуре
  • Кабели по ошибке перерезаны рабочими
  • Огонь, наводнение, землетрясение и т.д...

И затем все проблемы на стороне сервера, такие как нехватка памяти, тайм-ауты запроса и т. Д.

Если возможно, попробуйте разбить информацию на более мелкие сегменты. Если что-то пойдет не так, информации будет меньше.


Обновлено 2011-01-27:

Мне может показаться немного пессимистичным, когда я говорю, что слишком много вещей может пойти не так, и если что-то может пойти не так, то так и будет.

Со стороны передатчиков довольно легко проверить, была ли передача успешной, если сервер посылает какое-то подтверждение. Он может быть отправлен как ответ на запрос на передачу или отдельным запросом.

В зависимости от того, что вы используете на стороне сервера, вы можете определить, было ли потеряно соединение (и все данные этого запроса также были потеряны). Мое мнение таково, что отправители несут ответственность за проверку успешности передачи и повторную отправку, если это не так.

Я не знаю, какие у вас есть данные, но я почти уверен, что их можно разбить на более мелкие куски. Однако я не могу решить, желательно это или нет. Но если у вас есть мобильные устройства, и для передачи данных требуется много времени, это, вероятно, так и есть.

Как сказали "некоторые", вы должны разбить свою загрузку на части, пронумеровать их и собрать на другом конце. Однажды я написал веб-сервис для этого, чтобы у клиента было подтверждение, что определенная часть была получена с правильной контрольной суммой (например, хэш SHA-1).

Если подтверждение не пришло из-за истечения времени ожидания или хэш не совпадает, клиент должен повторно отправить часть. Я бы посоветовал сделать каждый чанк достаточно маленьким, например, 1-10 кбайт, в зависимости от ожидаемой скорости сети (медленные чанки сети меньше).

Другие вопросы по тегам