2014-01-20 2 views
0

Я использую сокет TCP-потока в программе Linux C для передачи данных. Мой вопрос: что происходит при потере пакетов?TCP-механизм в Linux-потоке C

Соединились ли сокеты Linux с механизмами восстановления TCP-пакетов, чтобы потерянные пакеты были повторно отправлены после таймаута, если они потерялись? Или мне нужно проверить возвращаемое значение send() и отправить данные, если он равен нулю?

+3

TCP обрабатывает его, то есть в основном его цель ... все эти acks и windows и фреймы 'n' мусор ... но вы должны проверить свои возвращаемые значения ... –

+0

Подумайте об этом - он * должен * обрабатывать потерю пакетов - или есть серьезная ошибка в API, потому что он представляет интерфейс потока! API просто не дает вам достаточной информации для повторной отправки, даже если вы этого хотели. –

ответ

4

Ваш вопрос не проясняется, если вы используете сокет TCP или сокет домена unix (который появляется в файловой системе с типом файла 's', когда вы используете ls -l). Но в любом из двух случаев ответ да, они реализуют восстановление пакетов (не так много потерять/восстановить из сокетов unix), и нет, вам не нужно повторно отправлять данные.

Однако вы все равно должны проверить send() на наличие ошибок; соединение может быть отключено, потому что кто-то просто отключил ваш сетевой кабель, или ваш send() может переполнить внутренние буферы, что приведет к частичной отправке (есть много других причин, почему почему отправка может пойти не так). Но как только вы закончите с send(), и его возвращаемое значение не предполагает, что он «забыл» некоторые данные, все готово.

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