Вопрос по буферам TCP-соединения - PullRequest
2 голосов
/ 10 ноября 2010

Linux.

У меня есть кабель Ethernet между двумя компьютерами.Простая программа клиент-сервер на C для передачи файла с клиента на сервер.Клиент считывает 100 байтов данных из файла и отправляет их на сервер, а затем ждет в течение 2 секунд перед отправкой следующего пакета.

Когда клиент отправлял данные, я вытащил сетевой кабель на стороне сервера, я ожидал от клиента некоторой ошибки, поскольку соединение разорвано.Но клиент продолжал записывать данные в канал, и сервер ничего не получил (но все еще ожидает получения). Клиент отправил весь файл и остановился.Теперь снова подключаю кабель Ethernet, сервер получает все данные, отправленные клиентом.Как это возможно?Сохраняются ли пакеты в каком-либо буфере и отправляются снова, когда соединение установлено?

Извините, что сделал это слишком долго.

Ответы [ 3 ]

8 голосов
/ 10 ноября 2010

Смысл TCP в том, чтобы обеспечить надежную передачу данных , несмотря на то, что под имеется ненадежная сеть. По сути, TCP работает только с данными, отправленными после получения пакета подтверждения от удаленного компьютера; до тех пор ядро ​​хранит данные локально. Время, в течение которого он будет буферизироваться, может быть довольно продолжительным, в зависимости от набора настроек в /proc, а также от измеренных параметров сети.

edit: приложение может проверить размер ожидающей очереди отправки, используя SIOCOUTQ ioctl; см. справочную страницу tcp (7). В той же man-странице также обсуждается обработка ошибок.

Если вы хотите, чтобы эти данные были утеряны вместо буферизации, используйте UDP.

2 голосов
/ 10 ноября 2010

Да.В зависимости от конфигурации, он может даже подождать некоторое время, чтобы посмотреть, сможет ли он восстановить соединение.Даже тайм-ауты tcp могут быть минут ... Примечание здесь , например, параметр tcp_fin_timeout и другие параметры, связанные с таймаутами.

1 голос
/ 11 ноября 2010

В Linux вы можете увидеть поддерживаемую ядром очередь отправки и тайм-ауты, выполнив:

netstat -tanpo

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...