Скажем, два хоста, A и B, оба пытаются установить соединение друг с другом, но SYN от A достигает B до того, как SYN B достигает A.
Мой ответ таков: A послал бы SYN ACK и проигнорировал бы SYN из B. Я прав?
Скажем, два хоста, A и B, оба пытаются установить соединение друг с другом, но SYN от A достигает B до того, как SYN B достигает A.
Мой ответ таков: A послал бы SYN ACK и проигнорировал бы SYN из B. Я прав?
Помните, что сокет TCP - это четверка srcHost:srcPort:dstHost:dstPort и что для установления соединения один хост должен прослушивать определенный порт.
Поэтому для первого соединения A:portA:B: сокет portB будет (B прослушивает portB):
А для второго соединения A:portA ':B:portB' (A прослушивает portA ')
Если предположить, что оба хоста используют одну и ту же пару портов, соединение будет установлено. На практике этого не происходит, потому что, когда узлы устанавливают соединение, они используют случайный локальный порт и хорошо известный удаленный порт, поэтому оба узла не будут использовать одну и ту же пару портов. Тогда, даже если бы они это сделали, время должно быть точно таким, чтобы SYN передавали друг друга в полете. Если один хост получает SYN перед отправкой своего собственного, тогда он отвечает RST.
Два соединения будут сделаны. 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.