TCP является одним из основных протоколов в наборе протоколов TCP/IP. Он использует протокол IP сетевого уровня вниз и обеспечивает поддержку протоколов прикладного уровня, таких как HTTP, FTP, SMTP, POP3, SSH и Telnet вверх.
В этой статье дается подробное описание формата сообщения TCP, а также рассказывается, как выполнять разрешение адресов во время передачи пакетов сетевых данных, процесс трехстороннего установления связи для установления TCP-соединения и четырехволновой волновой процесс для отключения TCP-соединения.
Протокол управления передачей(Английский:Transmission Control Protocol,аббревиатура:TCP)это своего родаОриентированный на соединение, надежный, на основе потока байтовСвязь на транспортном уровнепротокол,Международной целевой группой по интернет-инжинирингу(The Internet Engineering Task Force, IETF) RFC793 определение. в упрощенных компьютерных сетях OSI В модели он выполняет функции, заданные транспортным уровнем.
В определении TCP,Есть три момента, которые требуют особого пояснения:,Иллюстрация: TCP и UDP протокол
Ориентированное соединение осуществляется относительно другого протокола транспортного уровня UDP (Пользовательский). Datagram Protocol, пользовательданныегазетапротокол)с точки зрения。TCPВ начале передачиданные Сначала он должен пройти три рукопожатия, чтобы установитьсоединять,и отправлять сообщения один на один через соединение,После завершения передачи отключите соединение, взмахнув рукой четыре раза.
UDP не требует установления соединения. Отправителю не требуется устанавливать соединение с получателем перед отправкой данных. Каждый пакет данных UDP независим и не коррелирует друг с другом. Таким образом, UDP может передавать данные друг другу. -один и один-к-одному. Отправка сообщений многим или многим-ко-многим.
Надежно оно или нет, также зависит отUDPс точки зрения。TCPИмеет три рукопожатияитайм-аутретранслироватьмеханизмы обеспеченияданныенадежная передача,После отправки пакета данных отправитель будет ждать, пока получатель отправит сообщение подтверждения (ACK). Если отправитель не получил подтверждающее сообщение в течение определенного периода времени,Предполагается, что данные отсутствуют.,и повторно отправить данные. Когда получатель получает дубликат пакета данных, он отправляет избыточное сообщение ACK для уведомления отправителя.,Во избежание потери данных.
В то же время TCP также обеспечивает управление потоком и контроль перегрузки.,Для поддержания стабильности и производительности сети. Так что как бы ни менялась сеть,Если нет простоя хоста или других причин, можно гарантировать, что сообщение достигнет целевого хоста.
Надежный транспорт по сравнению с TCP,UDP ненадежен. Процесс передачи пакета данных UDP не предоставляет таких механизмов, как подтверждение, повторная передача, управление потоком и контроль перегрузки.,поэтомуUDPданные Посылка может быть потеряна、повторить、Вышел из строя или поврежден.
TCP — это передача, ориентированная на поток байтов.,Хотя взаимодействие приложения и TCP происходит по одному блоку данных (разных размеров),Но TCP рассматривает приложения как серию неструктурированных потоков байтов. TCP имеет буфер,Когда блок данных, передаваемый приложением, слишком длинный,TCP может разделить его на более короткие фрагменты и затем передать. Если приложение отправляет только один байт за раз,TCP также может дождаться накопления достаточного количества байтов, прежде чем формировать сегмент и отправлять его.
В отличие от ориентированного на поток байтов, UDP ориентирован на пакеты. UDP не объединяет и не разделяет пакеты, переданные уровнем приложения. Вместо этого он сохраняет границы этих пакетов. То есть UDP отправляет пакеты до тех пор, пока уровень приложений передает их UDP, по одному пакету. Поэтому приложение должно выбрать пакет соответствующего размера. Если сообщение слишком длинное, уровень IP необходимо фрагментировать, что снижает эффективность. Если оно слишком короткое, IP-сообщение будет слишком маленьким.
Понимание формата сообщения — единственный способ понять протокол связи. TCP-сообщения состоят из TCP-заголовка (заголовка) и данных приложения.,Заголовок TCP является ядром протокола TCP.,Прикладная часть — это полезная нагрузка TCP-сообщения.,Как показано ниже.
Ниже подробно описывается значение каждого поля:
Мы представили его в других статьях официального аккаунта.IPгазетаголовасередина“Исходный адрес”и“адрес назначения”,с этой статьейTCPгазетаголовасерединаиз“исходный порт”и“порт назначения”совместно определенныеданные Процесс доставки пакетовсерединануждатьсяизадрес,Как показано ниже.
Аналогия с рассылкой писем в повседневной работе,Письма, которые мы кладем в конверт, эквивалентны данным, которые мы хотим доставить.,стандартныйизформат письмаданаписать на конверте“Адрес получателя”и“Обратный адрес”,Эквивалент IP-адреса,в,“Адрес получателя”переписыватьсяданные В сумкеIPгазетаголовасерединаиз“IP-адрес назначения”,“Обратный адрес”переписыватьсяданные В сумкеIPгазетаголовасерединаиз“Исходный IP-адрес”,Написав адрес отправителя и получателя, вы можете быть уверены, что письмо будет доставлено по назначению.
Но кто получит письмо после того, как оно будет отправлено по адресу назначения? Получение адреса получателя приведенного выше письма показывает, что этот адрес находится в «Отделе B компании А» в Чжанцзяне, Новый район Пудун, Шанхай. В этом отделе могут быть сотни или тысячи людей, и получатель не ясен. Даже если письмо отправлено по этому адресу, возможности доставить конкретному получателю нет.
поэтому,В почтовых письмах необходимо заполнить комбинацию «имя получателя», «адрес получателя» и «имя отправителя», «адрес отправителя».,Чтобы гарантировать, что письмо может быть точно доставлено конкретномуиз Рука получателясередина。здесьиз Имя получателякогда ВTCPгазетаголоваизпорт По назначению имя отправителя эквивалентно исходному в заголовке TCP. порт。
По сравнению с доставкой писем давайте рассмотрим пример процесса доставки сетевых пакетов. Ли Си (IP-адрес компьютера: 106.54.28.25) в Пекине отправляет сообщение Чжан Сану (IP-адрес компьютера: 114.92.67.193) в Шанхае через QQ (порт: 80), как показано на рисунке ниже:
первый,Компьютер Джона Доу упаковывает сообщение в отчет с данными TCP.,Добавьте заголовок IP и заголовок Ethernet для формирования пакета сетевых данных.,Отправить в компьютерную сеть。компьютерная сеть черезданные В сумкеIPгазетаголоваизIP-адрес def(114.92.67.193) точно доставляет пакет данных на компьютер Чжан Саня.
После того, как компьютер Чжан Сан получил пакет данных, отправленный компьютером Ли Си, поскольку на компьютере Чжан Саня одновременно запущено несколько программ (таких как QQ, WeChat, Foxmail и т. д. на рисунке), хотя компьютер Чжан Сан знал, что данные пакет был передан Да, но он не знает, какой программе передать данные в этом пакете.
Чтобы решить эту проблему, используйте исходный заголовок TCP в пакете данных. портипорт Для этого используйте разные номера портов в зависимости от разных программ для определения приложения, а также отправки и получения данных, чтобы пакет данных мог быть точно доставлен в указанную программу на конкретном компьютере, как отправленное по почте письмо. Например, мы указываем, что порты, используемые QQ, WeChat и Foxmail на компьютере Чжан Саня, равны 80 и 8900 и 110 соответственно. Затем при получении пакета данных порт. OF80 передается в QQ.
Приведенный выше пример также можно распространить на роль других полей в структуре пакета данных.,Например, после того, как мы получим письмо, мы можем просто проверить, цел ли конверт.,Проверить, не было ли письмо открыто кем-то во время передачи и не было ли подделано содержание письма. Для пакета сетевых данных,«Контрольная сумма» заголовка TCP может проверить, были ли данные полученного пакета данных открыты и изменены другими при передаче.
Почему нужно строитьTCPсоединять?первый,IPпротоколничегосоединятьиз,IP не сохраняет никакой информации о состоянии последующих отчетов о данных.,Каждый отчет с данными обрабатывается независимо друг от друга. Преимущество такого режима отсутствия соединения в том, что он не занимает линию.,Снижает требования к сетевым линиям.
также,IPпротокол ненадежен,Нет никакой гарантии, что отчет об IP-данных успешно достигнет места назначения.,это услуга передачи с максимальными усилиями,Маршрутизатор обрабатывает ошибки в IP-пакетах, отбрасывая пакеты.,и отправить ICMP (Интернет Control Message Протокол, Интернет-контрольный протокол) контролирует сообщения в Исходный адрес. Потому что IP-протокол ненадежен и ненадежен,
поэтому,Требуется верхний уровень TCP для установления соединения и повторной передачи ошибок.,выполнитьОриентированный на соединение, надежный, на основе потока байтовСвязь на транспортном уровнепротокол。
4.1 Подробное объяснение процесса трехстороннего установления связи
Поскольку процесс установления TCP-соединения требует трехкратного прохождения, этот процесс называется трехэтапным рукопожатием. Как только соединение установлено, два хоста могут взаимодействовать в полнодуплексном режиме.
Ниже приведен подробный процесс трехстороннего рукопожатия.,включая отправкуизгазетаискусствочастьсодержание(На примере моей девушки объясняю трехстороннее рукопожатие TCP/IP и четырехходовую волну.):
первый Клиент инициировалсоединятьпросить,Отправьте сегмент SYN (синхронизация) на сервер.,В абзаце указан порт назначаем родной порт, ставим SYN логотип Кусочекдля1,Прямо сейчасSYN=1,И установите в поле «Порядковый номер» случайно выбранный x.,Прямо сейчасseq=x,То есть первоначальный серийный номер(Initial Sequence Number, ISN), скорее всего 0, если это первое соединение. В это время порт, соответствующий серверу, должен находиться в состоянии прослушивания, и клиент войдет в него после выполнения запроса. SYN_SENT статус, ожидание подтверждения от сервера.
Сервер получает сообщение от клиента SYN газетаискусствочасть,Подтвердите этот сегмент SYN. Сервер отправляет клиенту в ответ сегмент SYN-ACK.,газетаискусствочастьсерединаизлоготип Кусочекнастраиватьустановлен наSYN=1иACK=1,Указывает одновременное подтверждение и синхронизацию; в поле порядкового номера устанавливается случайно выбранный начальный порядковый номер сервера y (порядковый номер TCP-сегмента сервера).,Прямо сейчасseq=y;Поле номера подтверждения(Acknowledgment Number)настраиватьустановлен наклиентизначальный серийный номер плюс1,Прямо сейчасack=x+1。Серверная часть объединяет всю вышеуказанную информацию в однуTCPчасть(Прямо сейчасSYN+ACKчасть)середина,Отправлено клиенту вместе,В этот момент сервер входит в состояние SYN_RECV.
Клиент получает сообщение от сервера SYN+ACK газетаискусствочастьназад,Чтобы отправить сегмент сообщения ACK (подтверждение) на сервер,верносоединятьпроситьиз Подтвердите, чтобы подтвердить。газетаискусствочастьсерединаизлоготип Кусочекнастраиватьустановлен наACK=1,Поле номера подтверждения содержит начальный порядковый номер сервера плюс 1.,Прямо сейчасack=y+1,В поле серийного номера указывается первоначальный серийный номер клиента плюс 1.,Прямо сейчасseq=x+1。этотчасклиент进入 Статус ESTABLISHED (подключен), сервер получает это TCP-сегменты также войдут ESTABLISHED статус, который указывает на окончание трехстороннего рукопожатия и успешное установление соединения.
После завершения трехстороннего рукопожатия,TCPсоединять официально учреждено,Обе стороны могут начать надежную передачу данных. Целью трехстороннего рукопожатия является обеспечение синхронизации исходного порядкового номера и номера подтверждения обеих сторон.,и проверьте достижимость обеих сторон. через этот процесс,TCP может установить надежный двусторонний канал связи.,Надежность и порядок данных гарантируются при последующих передачах данных.
Четыре волны — это процесс отключения TCP.
Отправка данных клиента завершена,отправляется на серверсоединятьвыпускатьпроситьизFINгазетаискусство(проситьсоединятьпрекращение:FIN=1),Активно закрыватьTCPсоединять。газетаискусствосередина Серийный номер будет присвоенseq=u,и прекратить отправку данных,но все еще способенперениматьданные。этотчасклиент处В FIN_WAIT_1 статус, ожидание подтверждения от сервера. TCP предусматривает, что даже если сообщение FIN не содержит данных, оно все равно использует порядковый номер.
После того, как сервер получит сообщение FIN,,Уведомить соответствующий процесс подачи заявки высокого уровня,Скажите ему, что соединение в направлении клиента к серверу освободилось. В это время сервер отправляет ответное сообщение ACK, выпущенное путем подключения клиенту.,и вошелCLOSE_WAIT(Закрыть, подождать)состояние。ACKгазетаискусствоголова包含:ACK=1,ack=u+1,и принеси себяизсерийный номерseq=v。здесьack=u+1дапервая волнаиззначение последовательности+1,Указывает, что он надеется получить сегмент сообщения, начиная с u+1-го байта.,И первые u байт были успешно получены.
После получения подтверждения от сервера клиент входит в состояние FIN_WAIT_2 и ожидает сегмента освобождения соединения, отправленного сервером.
Первые две волны не только сообщают серверу, что клиент хочет разорвать соединение, но также сообщают клиенту, что сервер понял его запрос на разрыв соединения.
Если сервер тоже хочет отключить соединение,Просто отправьте сообщение клиенту, чтобы освободить сообщение из-за состояния CLOS_WAIT.,Вероятно, сервер отправил еще какие-то данные.,假定этотчассоединятьвыпускатьгазетаискусствоизсерийный номердляseq=w,ack также является продолжением первой волны +1,Прямо сейчасack=u+1,этоти Помахать второй То же самое, когда раз.
В это время сервер входит в состояние LAST_ACK (последнее подтверждение), ожидает подтверждения клиента и прекращает отправку данных клиенту, но сервер все еще может принимать данные, передаваемые от клиента.
После того, как клиент получает сообщение об освобождении соединения от сервера, он также отправляет ACK газетаискусство作для应答(ack=w+1,seq=u+1), В это время клиент находится в состоянии TIME_WAIT (время ожидания) и ожидает в этом состоянии. 2MSL(Two Maximum Segment Lifetime, Максимальное время выживания сообщения).
После получения TCP-сообщения, отправленного от клиента, сервер завершает фазу LAST-ACK и переходит в фазу ЗАКРЫТИЯ. После того, как клиент ожидает 2MSL, он завершает фазу TIME-WAIT и переходит в фазу ЗАКРЫТИЯ, завершая таким образом четыре волны.
Почему клиент ждет на этапе TIME_WAIT? 2MSL? Есть два основных момента:
Один из них заключается в том, чтобы гарантировать, что последний сегмент ACK, отправленный клиентом, может достичь сервера, и гарантировать, что сервер может нормально перейти в состояние ЗАКРЫТО. Если сервер не получит сообщение подтверждения ACK от клиента в течение 1MSL, он снова отправит клиенту сообщение FIN.
Во-вторых, избежать путаницы между старыми и новыми связями. Из-за задержки в сети клиент мог отправить несколько запросов на установление соединения. По истечении времени 2MSL все сегменты сообщений, созданные во время действия этой ссылки, исчезнут из сети, так что следующим новым может быть этот старый сегмент запроса на соединение. не появится в соединении.