Скажем, два хоста, A и B, оба пытаются установить соединение друг с другом, но SYN от A достигает B до того, как SYN B достигает A.

Мой ответ таков: A послал бы SYN ACK и проигнорировал бы SYN из B. Я прав?

3 ответа3

2

Помните, что сокет TCP - это четверка srcHost:srcPort:dstHost:dstPort и что для установления соединения один хост должен прослушивать определенный порт.

Поэтому для первого соединения A:portA:B: сокет portB будет (B прослушивает portB):

  • в состоянии SYN_SENT на A
  • в состоянии SYN_RECEIVED на B

А для второго соединения A:portA ':B:portB' (A прослушивает portA ')

  • в SYN_SENT на B
  • в СЛУШАТЬ на А
1

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

1

Два соединения будут сделаны. TCP не осведомлен о состоянии таким образом - ни одно соединение не будет иметь никакого понятия о другом соединении.

Например:

Connection 1:
192.168.1.5 sends SYN to 192.168.1.6 on port 80.

Connection 2:
192.168.1.6 sends SYN to 192.168.1.5 on port 80.

Чтобы это продолжалось, обоим потребуется служба прослушивания на порту 80, поэтому у каждого будет что-то прослушивать TCP для порта 80, и эта служба получит SYN и ответит SYN-ACK:

Connection 1:
192.167.1.6 responds with SYN-ACK to 192.168.1.5 on port 80

Connection 2:
192.167.1.5 responds with SYN-ACK to 192.168.1.6 on port 80

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

Как предписывает протокол TCP, как только исходящая сторона получит SYN-ACK, она ответит:

Connection 1:
192.168.1.5 sends ACK to 192.168.1.6 on port 80.

Connection 2:
192.168.1.6 sends ACK to 192.168.1.5 on port 80.

Теперь у вас есть два независимых соединения с завершенными рукопожатиями TCP. Как упоминалось в комментариях SvW: если это плохо, то любое приложение должно инициировать соединения, чтобы определить наличие этого состояния и выяснить, какое соединение разорвать - эта часть не является работой TCP.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .