Несколько основанных на TCP вопросов, требующих четких ответов - PullRequest
0 голосов
/ 25 июня 2019

У меня есть несколько вопросов относительно TCP, на которые я еще не нашел подробных ответов. Учитывая полнодуплексную среду, как TCP должен работать в следующих сценариях.

  1. Почему в запрос на подключение не включена информация о размере окна двух хостов (хост A, хост B)?

  2. Для идентификации дубликатов достаточно ли отслеживать текущий ожидаемый порядковый номер другого хоста?

  3. В литературе, которую я использую, написано, что подтверждения также могут содержать данные. Означает ли это, что хосту B не разрешено отправлять другой сегмент данных, в то время как сегмент ACK (с данными) еще не подтвержден хостом A?

  4. Правильно ли, что сегменты ACK активно используют поле данных WIN, установленный флаг ACK и отсутствие порядкового номера, в то время как сегменты данных предоставляют только информацию относительно текущего порядкового номера?

Большое спасибо заранее. Я надеюсь, вы можете помочь мне в этом случае!

Мои мысли: 1. Во время запроса соединения узел A отправляет сегмент с установленным флагом SYN на узел B, также предоставляя свой начальный порядковый номер x. Хост B получает данные и принимает запрос, отправляя ACK-сегмент с ACK-номером x + 1, своим персональным начальным порядковым номером y и устанавливая SYN- и ACK-флаги для CONNECTION ACCEPTED. Хост A проверяет начальный порядковый номер хоста B, передавая пакет данных с ACK-номером = y + 1 и порядковым номером = x + 1. Здесь не приводится никакой информации о доступном размере буфера обеих сторон, поэтому возможно, что хост отправит поток байтов, что приведет к переполнению буфера.

  1. Этого должно быть достаточно, поскольку каждый байт назначается 32-битному порядковому номеру, что означает, что полученные данные с порядковым номером ниже ожидаемого должны быть дубликатами.

  2. С этим следует обращаться, поскольку это может привести к ложно-положительной идентификации дубликата. Пример: Хост B сначала отправляет ACK с данными, а затем сегмент данных. Сегмент данных сначала достигает хоста A, что приводит к передаче ACK с новым ожидаемым порядковым номером z_1 для хоста B. Теперь, если хост A получает ACK с данными, он отправит другой ACK с вновь обновленным ожидаемым порядковым номером z_2. Если первый ACK (хост A -> хост B) с устаревшим порядковым номером z_1 достигает хоста B, хост B может использовать его для новой передачи данных, что приведет к идентификации дубликата хостом A, поскольку он использует устаревшую последовательность число.

...