Почему в TCP используется трехстороннее рукопожатие при установлении соединения? То есть, почему недостаточно использовать двухстороннее рукопожатие?
Так что оба конца могут быть достаточно уверены, что другой конец знает, что соединение установлено.
РЕДАКТИРОВАТЬ: двухстороннего недостаточно, так как получатель не может знать, что отправитель знает, что получатель ответил, и соединение готово к работе, и это делает его (соединение двухстороннего рукопожатия) ненадежным по сравнению с трехсторонним рукопожатием
Механизм квитирования, используемый в TCP, разработан таким образом, что два хоста, пытаясь установить связь, могут согласовывать параметры сетевого соединения перед началом связи. Обе стороны могут предположить, что другой компьютер готов, и начать надежную отправку данных.
Вот упрощенная схема пакетов, отправляемых с обеих сторон во время рукопожатия:
SYN -> SYN received Host A <- SYN ACK Host B SYN ACK received ACK -> ACK received TCP connection is established
Сообщения SYN (синхронизация) и ACK (подтверждение) указываются битом / числом в заголовке TCP сегмента.
Процесс также разработан таким образом, что оба конца могут инициировать и согласовывать отдельные соединения одновременно.
Чтобы разорвать соединение между двумя компьютерами, выполняется еще одно трехстороннее соединение для разрыва TCP-соединения. Инициирование и разрыв TCP-соединения - это часть того, что делает TCP надежным протоколом.
Смотрите также: В чем разница между UDP и TCP?
Поймите, что это действительно четырехстороннее рукопожатие (по два в каждую сторону). Есть SYN -> ACK и SYN <- ACK. Host-B просто экономит время, отправляя свой SYN одновременно с хостом A ACK.
Также у Dentrasi был комментарий, что трехстороннее рукопожатие предотвращает спуфинг, но это не совсем так.
Смотрите дополнительную информацию на сайте nmap: http://nmap.org/book/osdetect-usage.html
«Системы прогнозирования последовательности TCP с плохой генерацией начального порядкового номера TCP уязвимы для слепых атак с подделкой TCP. Другими словами, вы можете установить полное соединение с этими системами и отправлять (но не получать) данные, подделывая другой IP-адрес. В журналах будет отображаться поддельный IP-адрес, и вы сможете воспользоваться любыми доверительными отношениями между ними. Эта атака была очень популярна в середине девяностых, когда люди обычно использовали rlogin, чтобы разрешить вход в свою учетную запись без пароля с доверенных IP-адресов. Кевин Митник якобы использовал эту атаку для взлома компьютеров Цутому Шимомуры в декабре 1994 года ".
Дополнительная информация об атаках с предсказанием последовательности TCP здесь: http://en.wikipedia.org/wiki/TCP_sequence_prediction_attack
Нетехническое объяснение - для полнодуплексного разговора / соединения требуется трехстороннее рукопожатие. Соединение означает соглашение между двумя сторонами. Соглашение означает, что когда X отправляет, то Y получает, а когда Y отправляет, X получает. Каждое из этих односторонних соглашений требует двух шагов для каждого: запросить разрешение (SYN) и знать, что другие будут слушать / получать / принимать (ACK) то, что вы отправляете. Итак, два шага SYN-ACK.
По сути, это 4-стороннее рукопожатие, этап 2 (отправка ACK в X по Y) и этап 3 (отправка SYN в X по Y) объединены (этап 3 совмещен с этапом 2) в конец приводит к одному шагу. Это возможно, поскольку оба отправляются одновременно с Y (одного и того же хоста), и информация передается в виде бита в заголовке TCP (нет проблем с превышением размера). Таким образом, всего 3 шага из 4 шагов.
техническое объяснение - TCP - это протокол с отслеживанием состояния, его конечный автомат работает и меняет свои состояния симметрично на обоих концах. Установленное состояние достигается, когда вы получаете ACK от другого компьютера. Для того чтобы оба объекта достигли состояния установленного соединения, конечный автомат должен получить ACK. Таким образом, получение ACK важно, и чтобы получить ACK, хост должен отправить SYN. Итак, снова 4-этапный процесс объединен в 3-этапный, см. Процитированное объяснение.
Остальное - это детали - например, выбор случайного значения SYN, чтобы можно было предотвратить атаки предсказаний. Что касается атаки, то «Человек посередине» неизбежен. ps ставьте комментарий, если кто хочет знать как. Я думаю, что большинство из вас знают, как это сделать, это очень очевидно, поэтому я экономлю вам время на чтение.
Трехстороннее рукопожатие устанавливает соединение. Точно так же, как когда вы берете трубку, получаете гудок, набираете номер, слышите звонок, а затем собеседник говорит «привет».
Давным-давно была попытка сократить количество «административных» пакетов, необходимых для установки и разрыва кратковременного TCP-соединения. Он назывался «TCP для транзакций» или «T / TCP» и описан в RFC1644:
http://www.faqs.org/rfcs/rfc1644.html
Первоначально TCP был разработан для обеспечения виртуального канала для долговременных соединений, где время установки и отключения не было столь важным. По мере того как модель клиент-сервер становилась все более распространенной, потребность в чем-то вроде T / TCP становилась все более очевидной.
T / TCP использует некоторые механизмы кэширования сервера, чтобы первый пакет нового соединения мог содержать данные. Запрос на удаление со стороны сервера также может быть использован с последним пакетом данных. Это сокращает количество пакетов, требуемых для сообщения с одним пакетом полезной нагрузки, до трех.
К сожалению, T / TCP так и не достигла критической массы.