LINUX.ORG.RU

Процесс установления TCP соединения (+)


0

0

Клиент который желает установить соединение посылает SYN
пакет, ядро его обрабатывает и ставит в очередь,
либо посылает пакет RST если она заполнена...
затем мы выполняем сискол accept в результате которого
клиенту отправляется SYN+ACK после чего ждем пакета ACK
от клиента после чего соединение считается установленым
Меня интерисует ряд вопросов:
1) Клиент если не получает ответа посылает SYN пакеты
еще несколько раз, что ядро делает со старыми SYN пакетами
которые уже стоят в очереди но на которые accept сделан небыл
вернее не успели мы его сделать...
пакеты просто добавляються в очередь либо таки есть
какой-то механизм удаления старых пакетов ?
2) После того как мы сделали accept пакет SYN+ACK
отправляется, но если удаленная сторона прождала
довольно много то как я понимаю она уже либо прекратила
попытки установки соединения и этот пакет будет проигнорирован
либо послала другой SYN пакет с другим номером последовательности
и тут поможет ответ на первый вопрос, либо всеже повторные SYN
пакеты имеют тот же номер и клиент примет пакет ?
3) Как я понимаю, клиент на устаревший пакет SYN+ACK должен
ответить RST и соответственно наш сискол accept должен
завершиться с ошибкой при получении этого пакета, в виндовой
реализации TCP (Win XP) RST посылается как положено или как ?
4) Мы сделали accept пакет SYN+ACK отослался, какое время
Linux система будет ждать ACK пакета от клиента ?
И что произойдет если мы прервем сискол ? Что происходит
с незавершенным соединением оно удаляется либо как-то по другому ?

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

anonymous

> затем мы выполняем сискол accept в результате которого
> клиенту отправляется SYN+ACK после чего ждем пакета ACK

нет. accept() вызывать не нужно. соединение (с точки зрения
клиента) происходит _дo_ того, как сервер сделает accept().

более того, у нас даже есть TCP_DEFER_ACCEPT, то есть, с точки
зрения сервера, соединение нет до тех пор, пока клиент что-то
не напишет в socket.

idle ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.