Из-за подробного содержания,что приводит к чрезмерной длине,Поэтому он будет разделен натри частирассказать,Каталог выглядит следующим образом:
Протокол управления передачей (TCP, Передача Control Protocol) да Что-то вродеориентированный на соединение, надежность, на основе потока байтов из протокола связи транспортного уровня, путем IETF из RFC 793 определение;
TCP Цель существования адаптирована для поддержки многосетевых приложений с многоуровневой иерархией протоколов. соединяться с разными, но взаимосвязанными из компьютерной сети связи с главным компьютером между парами процессов TCP Обеспечить надежные услуги связи. TCP Если предположить, что это может быть получено просто из протоколов нижнего уровня, это может быть ненадежная служба отчетов. В принципе, TCP Должен уметь работать в различных системах связи, от проводных до сетей с коммутацией пакетов или сетей с коммутацией каналов.
TCP даа протокол связи для глобальных сетей,При общении в нескольких сетях,Предоставьте метод связи между двумя конечными точками связи со следующими характеристиками:
(1)Потоковый подход;
(2)ориентированный на соединение;
(3)Надежный метод связи;
(4) При плохом состоянии сети попытайтесь уменьшить нагрузку на полосу пропускания системы, вызванную повторной передачей;
(5) Связь. Техническое обслуживание ориентировано на связь между двумя конечными точками, без учета промежуточного сегмента сети и узлов.
удовлетворить TCP Протокол с этими характеристиками TCP Соглашение предусматривает следующее:
① Фрагментация данных: пользовательские данные фрагментируются на отправляющей стороне и повторно собираются на принимающей стороне. TCP Определить шардингизразмер и управление шардингоми Реорганизация;
② Подтверждение прибытия: когда принимающая сторона получает фрагментированные данные, она отправляет подтверждение отправляющей стороне на основе порядкового номера фрагментированных данных;
③ Ретрансляция тайм-аута: оставить сторону существованияотрегулировать запуск таймера тайм-аута при фрагментации.,Если соответствующее подтверждение не получено по истечении времени существования таймера,Повторная отправка фрагментов;
④ Раздвижное окно: TCP объединять Размер принимающего буфера каждой стороны фиксирован, сторона Разрешить только другую сторонуотправлятьпринимающая боковой буфер может вместить изданные TCP обеспечивает управление потоком на основе скользящего окна.,Предотвратить переполнение буфера более быстрыми хостами на более медленных хостах;
⑤ Обработка неисправностей: как IP отчет о данных для передачи из TCP Фрагменты могут приходить не по порядку, TCP Полученные изданные будут переупорядочены, а полученные изданные будут переданы на прикладной уровень в правильном порядке;
⑥ Дублирующая обработка: как IP отчет о данных для передачи из TCP Фрагменты будут дублироваться, TCP изпринимающая сторона должна отказаться от изданных дубликатов;
⑦ Проверка данных: TCP буду держать это первым частичная проверка и, это сквозная проверка, объект обнаруживает данныесуществовать из любых изменений во время передачи. Если есть ошибка в полученной фрагментации и контрольной сумме, TCP Этот фрагмент будет отброшен, и получение этого сегмента не будет подтверждено, что приведет к тайм-ауту узла и повторной отправке.
TCP да Протокол байтового потока, поток в смысле да не имеет фиксированных границ изсообщения.
Когда сообщение пользователя проходит TCP Во время передачи протокола,Сообщение может быть сгруппировано операционной системой в несколько TCP-сообщений.,То есть полное сообщение пользователя разбивается на несколько сообщений TCP для передачи.,Также возможно объединить несколько сообщений в одно. TCP сообщениепередача。
Это потому, что на отправляющей стороне, когда мы вызываем send
данные завершения функции отправлять после,данные реально не выходят из интернета отправить,И да копируется из прикладной программы в стек протоколов ядра операционной системы.,Что касается того, когда это было на самом деле,Зависит от таких условий, как окно отправки, окно перегрузки и текущий размер буфера отправки.。То естьдаобъяснять,Мы не можем думать так каждый раз send
При вызове отправленных, полное сообщение будет отправлено целиком.
В это время,Получатель из программы, если нет Знать отправить из длины сообщения,То есть, когда да не Знать сообщение из границы,да Невозможно прочитать действительное сообщение пользователя;
Например, терминал отправляет вызовы один за другим send
Функция отправила сообщение 「Hello World,
」「sid10t.
」,
Затем рассмотрите различные воздействия во время фактического процесса передачи данных по сети.,Во время фактического процесса отправки могут возникнуть следующие ситуации:,Не учитывается фактический размер двух сообщенийиз :
remove
Сохранять изданные структуру и информацию для другой стороны, а последующий отправленный пакет другой стороны не будет перениматься до тех пор, пока соединение не будет создано снова. TCP Учреждатьсоединятьизприродадасуществоватьклиентконеци СерверКаждый из них имеет определенную структуру.(Что-то вродегосударственная машина), чтобы записывать и сохранять это соединять изостояние, а не да Истинное изсуществовать Между этими двумя концами есть похожая линия «Сетевая выделенная линия» вещь.
существовать IP Уровень, ситуация в сети должна быть нестабильной или нет, а путь передачи находится вне контроля верхнего уровня TCP. Единственный способ оптимизировать — делать больше суждений, повторных попыток, контроля перегрузки и других вещей.
Пакеты в конечном итоге передаются слой за слоем через канальный уровень, физический уровень и т. д.,Так что объединять - это всего лишь логический термин,Трубы не существует,соединять Существование здесь эквивалентно соглашению между двумя сторонами. Две стороны ведут переговоры по правилам статуса. обслуживания。
три рукопожатияпосле,Клиенты могут подтвердить, что к ним могут обращаться друг друга, поэтому им нужно только поддерживать такое состояние.,таким образом устанавливается единение;
соединятьда Что-то вродесостояние,установить взаимодействие, поддерживать состояние,Поддержание состояния осуществляется через определенные изданные структуры;
Ты в моем сердце,Нет, ты действительно есть в моем сердце (соединять, нет, ты действительно есть в моем сердце),И даа чувство,Я думаю о тебе каждый день,Ты занимаешь место в моем сердце (данные структуры),да Что-то вродесостояние,Мне нужно поддерживать это все время,Я скучаю по тебе каждый день (государственная машина). Когда ты злишься,я буду внимательнее,Когда ты счастлив,Я немного расслабляюсь (контроль пробок,Есть степени скорости),Пока я не встретил другую ее,До свидания (удалить структуру данных),хорошо,мужчина!
IP да Что-то вродениктосоединять、Нет Надежныйпротокол:это всемаксимумможетданныеподчинятьсяотправлятьпередает получателю,Однако нет никакой гарантии, что порядок поступления пакетов будет соответствовать порядку их передачи.,Нет гарантии, будет ли пакет дублироваться.,Даже не Нетгарантировать Сумкададойдет до получателя。Нетгарантировать有序、Удалить дубликаты、весь.
TCP хочусуществовать IP Чтобы построить на его основе надежный протокол транспортного уровня, должен существовать сложный механизм обеспечения надежности. В основном включают Вниз Столкнуться с несколькими аспектами,существоватьвышеОбзорсередина Все упомянутые:
Полнодуплексную связь также называют двусторонней одновременной связью.,То есть обе стороны связи могут получать информацию одновременно. РС-422 РС-422 Дуплекс) дареаловать микропроцессор и периферийные устройства с использованием линий отправки и приема независимо от метода.,Возможно осуществление операций передачи в обоих направлениях одновременно.
существовать TCP серединаотправлятьконеципринимающая Сторона может быть клиентом/сервером или сервером/клиентом. Обе стороны связи могут получать данные или управлять данными в любое время. Каждое направление изданного потока независимо управляет порядковым номером, размером скользящего окна и MSS. и другая информация.
ACK
:Должен Бит 1 Когда поле «Ответ подтверждения» становится действительным, TCP Положения, отличные от тех, которые были первоначально установлены SYN Вне пакета этот бит должен быть установлен в значение 1 。RST
:Должен Бит 1 час,выражать TCP Если в соединении возникает неисправность, соединение должно быть принудительно отключено.SYN
:Должен Бит 1 Когда выражение надеется создать соединение и установить начальное значение серийного номера в поле «Серийный номер».FIN
:Должен Бит 1 Когда в будущем у выражения больше не будет данныхотправлять, я надеюсь отключить соединение. Когда связь заканчивается и вы хотите отключиться, общающиеся стороны и хосты могут обмениваться данными друг с другом. FIN Бит 1 из TCP часть.URG
:Аварийный флаг,выражатьиздаэтотсообщениечастьсередина Существует чрезвычайная ситуацияданные,Поместите экстренные данные перед обычными данными. Когда принимающая сторона получает это сообщение, экстренные данные должны быть обработаны в первую очередь;,Дальше разберитесь с обычными данными.PSH
:Срочный флаг,когдаотправлятьконец Воля PSH Если установлено значение 1, TCP немедленно создаст сообщение и отправит его. Принимающая сторона получает PSH Как только получено 1 изсообщение, данные в приемном буфере доставляются приложению, не дожидаясь заполнения буфера перед доставкой.состояние | описывать |
---|---|
CLOSED | закрытиесостояние,Нет никаких связанных событий или продолжающегося существования; |
LISTEN | мониторсостояние,Сервер ожидает подключения для входа; |
SYN_SENT | был сделан запрос на объединение,Дождитесь подтверждения; |
SYN_REVD | Получил запрос на соединение,Еще не подтверждено; |
ESTABLISHED | соединять Учреждать,нормальныйданныепередача инфекциисостояние; |
FIN_WAIT_1 | (активное закрытие) отправить запрос на закрытие,Подождите, пока другая сторона закроется и подтвердит; |
FIN_WAIT_2 | (Активное закрытие) Получите подтверждение закрытия от другой стороны и дождитесь запроса на закрытие; |
CLOSE_WAIT | (Пассивное выключение) Получение запроса на выключение от другой стороны,отправить подтвердить запрос; |
LAST_ACK | (Пассивное выключение) Дождитесь последнего подтверждения выключения и дождитесь, пока все группы умрут; |
TIME_WAIT | Полное двунаправленное отключение и дождитесь гибели всех групп; |
CLOSING | Обе стороны пытаются закрыть сделку одновременно и ждут подтверждения от другой стороны; |
существоватьверно TCP Имея определенное понимание, давайте перейдем к делу, TCP даориентированный на соединение, то TCP дакак Учреждатьсоединятьиз Шерстяная ткань,Это тоже горячий вопрос на собеседовании,TCP изтри рукопожатияипомахать рукой четыре раза,Нет Проходитьсуществоватьофициальное представление Три захвата и четыре волны До,Первыйсуществовать Linux Установите артефакт тестирования стека сетевых протоколов на packetdrill,Удобен для последующих экспериментальных операций;
packetdrill да Google Открытый исходный код Инструмент тестового сценария, который можно использовать для тестирования. TCP、UDP、IP сетевой протоколкуча,Он состоит из строк сценария, основанных на временной последовательности.,Выполняйте пункт за пунктом в хронологическом порядке.
Его языковой дизайн очень близок к tcpdump и strace и содержит четыре типа операторов:
%{ command }%
Сделайте звонок, вы можете вывести или подтвердить подтверждение TCP состояние。о packetdrill Блогер по установке и настройке да ссылается на эту статью из установка инструмента packagedrill,чиновник github адрес:google/packetdrill;
После завершения установки вы можете протестировать ее. tests/linux/fast_retransmit/
Каталог из fr-4pkt-sack-linux.pkt
,Этот официальный представитель предоставляет тестовый скрипт:
./packetdrill tests/linux/fast_retransmit/fr-4pkt-sack-linux.pkt
Примечание: существуют при написании скрипта самостоятельно,необходимо обеспечитьпоследовательность конца строкидляLF
,В противном случае просто подождите и усомнитесь в своей жизни.,Кто кого использует Знать точно так же копировать прошлый код;,потому чтопоследовательность конца строка другая, существование продолжает сообщать об ошибках:
Если ответа нет, это означает успех, в противном случае внесите изменения согласно сообщению об ошибке;
потому что socket Привязать порт по умолчанию да 8080, так что может пройти tcpdump руководитьмонитор,tcpdump -t -i any port 8080
,Если ты знаешь себя через сетевую карту,напримерда eth0
,Затем поместите any
Заменить на eth0
;
если ты чувствуешь tcpdump Не нравится из, вы также можете сопоставить данные с Wireshark серединаидти,существовать Wireshark Открыть в папке cmd и используйте следующую команду:
ssh root@host -p port "tcpdump -i any -n tcp port 8080 -s 0 -l -w -" | "Wireshark.exe" -k -i -
Тогда давайте исследуем TCP да Как построить бар объединения;
Перед рукопожатием: клиент и Сервер включены. CLOSED
состояние. Во-первых, да Сервер активно мониторит определенный порт, в LISTEN
состояние;
Клиент случайным образом инициализирует серийный номер (client_isn) и поместит этот серийный номер в TCP первая частьиз поля «Серийный номер» и вставьте SYN Положение отметки 1 ,выражать SYN сообщение. Тогда поставь первый SYN сообщениеотправлять к Серверу,выражать инициировать подключение к Серверу, сообщение которого не содержит данных прикладного уровня, после чего клиент находится в режиме SYN-SENT
состояние。
Первое сообщение – SYN-сообщение показано на рисунке ниже:
Серверполучил клиент из SYN После сообщения сначала Сервер также случайным образом инициализирует свой серийный номер (server_isn) и заполняет этот серийный номер. TCP первая частьиз Поле «Серийный номер», за которым следует TCP первая частьиз Заполните поле «Номер ответа на подтверждение» client_isn + 1, Затем поместите SYN и ACK Положение отметки 1. Наконец, сообщение отправляется клиенту. Сообщение не содержит данных уровня приложения. После этого сервер подключается. SYN-RCVD
состояние。
Второе сообщение — сообщение SYN+ACK показано на рисунке ниже:
После получения сообщения сервера клиент должен ответить серверу последним ответным сообщением. Первое ответное сообщение. TCP первая часть ACK Положение отметки 1 , затем заполните поле «Номер ответа на подтверждение» server_isn + 1 , напоследок дайте сообщение отправить Серверу, на этот раз сообщение можно нести клиента на изданный сервер, и тогда клиент в ESTABLISHED
состояние。
Третье сообщение – сообщение ACK показано на рисунке ниже:
После рукопожатия: После того, как сервер получит ответное сообщение клиента, он также вводит ESTABLISHED
состояние;
сверхуиз Проходить程可以发现Нет.три рукопожатияда может передавать данные (да не может передавать данные в первых двух рукопожатиях), сервер должен ждать получения ACK Только после группировки можно отправлять данные,Это тоже часто задаваемый вопрос на собеседованиях.
После завершениятри рукопожатия, обе стороны находятся в ESTABLISHED
состояние,На данный момент соединение создано.,Клиенты могут взаимодействовать друг с другом.
Нет в мире банкета, который длился бы вечно,Для TCP-соединения тоже нравится это, TCP отключитьсясоединятьдапроходитьпомахать рукой четыре в разы путь.
Обе стороны могут активно отключать соединение. После отключения соединения «ресурсы» на хосте будут освобождены.
Клиент намерен закрыть соединение, в это время он отправит сообщение TCP первая часть FIN Флаг установлен на 1 изсообщение, то есть FIN сообщение, а затем клиент вводит FIN_WAIT_1
состояние。
После того как Сервер получает сообщение, он отправляет клиенту сообщение. ACK Ответное сообщение, затем сервер вводит CLOSED_WAIT
состояние。
Клиент получает Сервериз ACK После ответа на сообщение введите FIN_WAIT_2
состояние。
Подождав, пока Сервер завершит обработку данных, также отправьте их клиенту. FIN сообщение, а затем сервер вводит LAST_ACK
состояние。
Клиент получает Сервериз FIN После сообщения ответьте одним ACK Ответьте на сообщение и введите TIME_WAIT
состояние。
Сервер получен ACK После ответа на сообщение вы вводите CLOSED
состояние, на данный момент Сервер завершил соединение.
Клиент существуетпрошел 2MSL
Через некоторое время он автоматически войдет CLOSED
состояние, на данный момент клиент также завершил подключение.
каждое направлениенужен один FIN и ACK,Поэтому его часто называют помахать рукой четыре раз, но вам нужно обратить внимание на изда и взять на себя инициативу закрыть соединениеиз. TIME_WAIT
состояние__。
существовать Linux может пройти netstat -napt
Представление команд TCP изсоединятьсостояние:
Согласно вышеизложенной теории, используйте packetdrill Создайте свою собственную среду. Блогер ниже только создал среду. рукопожатияипомахать рукой четыре процесс разиз, и нет промежуточных изданных процессов передачи:
0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
+0 `echo socket is listening!`
+0 < S 0:0(0) win 4000 <mss 100>
+0 > S. 0:0(0) ack 1 <...>
+.1 < . 1:1(0) ack 1 win 1000
+0 accept(3, ..., ...) = 4
+0 `echo connection established!`
+0 < F. 1:1(0) ack 1 win 1000
+0 > . 1:1(0) ack 2
+0.1 close(4)=0
+0 > F. 1:1(0) ack 2 <...>
+0.01 < . 2:2(0) ack 2 win 1000
+0 `echo connection closed!`
+0 `sleep 100`
На самом деле сетевая среда не так гладка.,Постоянно происходят различные непредвиденные ситуации.,В конце концов, реальность тощая;
Напримерсуществоватьвторое При рукопожатии Сервер отвечает из ACK сообщение потерялось, что делать? да клиент отправляет повторно SYN сообщениетакже Серверпереиздание ACK А что насчет сообщения? и различные другие вопросы;
Я знаю, что произойдет в будущем. Пожалуйста, двигайтесь вперед. [Сетевой протокол] Длинная статья с тысячами текстов для более глубокого понимания TCP;Повторение сцены,Освойте малоизвестноеиздеталь(Вниз);
TCP да основано на потоке из. На самом деле такого выражения нет. Здесь я просто поясню да. TCP Липкий Баотоу да, я все понимаю;
TCP На самом деле, что касается козла отпущения, несколько пакетов данных склеены и не могут быть разделены. Наши требования слишком сложны, что приводит к проблемам программиста, а не к протоколу TCP. В соглашении говорилось, что оно не желает брать на себя вину.
Если сервер хочет гарантировать, что он может каждый раз получать изданные пакеты переменной длины от клиента, как программист должен решить эту проблему? Ниже представлено несколько решений:
Приветствуем всех, кто вносит исправления и обсуждает их в области комментариев;
Нажмите здесь, чтобы просмотреть код сценария в статье...
стоятьсуществоватьгигантизглядя через плечо TCP, спасибо за ссылку: