Исходный код вики TCP
Версия 1.12 от Alexandr Fokin на 2022/07/09 17:24
Скрыть последних авторов
author | version | line-number | content |
---|---|---|---|
![]() |
1.10 | 1 | **Transmission Control Protocol** |
2 | |||
3 | ---- | ||
4 | |||
![]() |
1.6 | 5 | **Основные моменты:** |
![]() |
1.1 | 6 | |
![]() |
1.12 | 7 | |(% style="width:215px" %)**Понятие**|(% style="width:1307px" %)**Описание** |
8 | |(% style="width:215px" %) |(% style="width:1307px" %)((( | ||
![]() |
1.1 | 9 | Основывается на протоколе IP для передачи и маршрутизации. |
![]() |
1.4 | 10 | TCP сегмент заворачивается в IP пакет. |
![]() |
1.1 | 11 | ))) |
![]() |
1.12 | 12 | |(% style="width:215px" %)Сегмент|(% style="width:1307px" %)Блок единичного пакета/сообщения. |
![]() |
1.4 | 13 | Сегмент содержит данные и заголовок необходимой для работы информацией. |
![]() |
1.12 | 14 | |(% style="width:215px" %)Клиент и Сервер|(% style="width:1307px" %)TCP сервер слушает определенный сокет (привязка к IpAddress + Port). |
![]() |
1.1 | 15 | TCP клиент подключается к серверу, устанавливается соединение. |
![]() |
1.12 | 16 | |(% style="width:215px" %)Логическое соединение|(% style="width:1307px" %)((( |
![]() |
1.1 | 17 | Между 2 сторонами устанавливается логическое соединение, в рамках которого идет передача данных. |
18 | |||
![]() |
1.4 | 19 | При этом соединение само по себе не имеет механизмов для определения разрыва сети, падения приложения одной из сторон или падения хоста. В некоторых случаях имеет смысл реализации пульса для отслеживания состояния соединения. |
![]() |
1.2 | 20 | |
![]() |
1.4 | 21 | Взаимодействие |
22 | |||
![]() |
1.2 | 23 | 1. Установка соединения |
24 | 1. Обмен данными. | ||
25 | 1. Закрытие соединения. | ||
![]() |
1.1 | 26 | ))) |
![]() |
1.12 | 27 | |(% style="width:215px" %)Потоковая (stream) передача|(% style="width:1307px" %)((( |
![]() |
1.6 | 28 | Данные раскладываются в tcp сегменты, но стороны оперирует интерфейсами в виде потока байт. |
![]() |
1.1 | 29 | |
30 | Необходима реализация механизмов для определения границ сообщения в передаваемых данных | ||
31 | ( | ||
32 | |||
33 | * либо все сообщения имеют фиксированную длину, | ||
34 | * либо у сообщений есть заголовок фиксированной длины, в котором указана длина блока данных | ||
35 | |||
36 | ) | ||
37 | ))) | ||
![]() |
1.12 | 38 | |(% style="width:215px" %)Гарантия доставки сегментов.|(% style="width:1307px" %)((( |
![]() |
1.3 | 39 | При отправке данных (сегментов) каждая сторона фиксирует статус отправки и ожидает подтверждения. Если подтверждение не происходит в течении определенного времени, то один или группа сегментов (зависит от реализации) посылается повторно. |
40 | |||
![]() |
1.8 | 41 | Возможно ситуация, когда сегмент подтверждения может быть утерян (или же еще не успел прийти), и сегмент будет выслан повторно, но такое поведение не приведет к повреждению передаваемых данных. |
![]() |
1.7 | 42 | |
![]() |
1.3 | 43 | Отметим, что возможна ситуация, когда сегменты достигли клиента, отправитель получил подтверждение, но приложение или хост упали, не выполнив окончательную обработку данных из этих сегментов. |
44 | ))) | ||
![]() |
1.12 | 45 | |(% style="width:215px" %)Гарантия порядка получения |
46 | (за счет нумерации данных)|(% style="width:1307px" %)((( | ||
![]() |
1.9 | 47 | В заголовок сегмента записывается порядковый номер первого байта данных, который используется принимающей стороной для восстановления последовательности сегментов (т.к. они могут быть получены не в том порядке, в котором было отправлены). |
![]() |
1.3 | 48 | |
49 | Также важно, что одно логическое сообщение приложение может быть разбито на несколько TCP сегментов, которые физически дойдет до получателя не в том порядке, в котором были отправлены, но их порядок будет восстановлен на стороне получателя при передаче в поток чтения. | ||
50 | ))) | ||
![]() |
1.12 | 51 | |(% style="width:215px" %)Гарантия целостности данных |
52 | (за счет контрольной суммы)|(% style="width:1307px" %)Перед отправкой в заголовок сегмента включается блок с контрольной суммой данных. При получении сегмента, контрольная сумма сверяется для проверки изменения содержимого сегмента. | ||
53 | |(% style="width:215px" %)Окно приема|(% style="width:1307px" %)Можно представить в виде некоторого буфера двигающегося вдоль данных по мере их приема. | ||
![]() |
1.5 | 54 | Если сегмент не попадает в окно приема, то он отбрасывается. |
55 | Если сегмент приходит повторно (данный сегмент уже получен), то он отбрасывается. | ||
![]() |
1.3 | 56 | Если сегмент попадает в окно приема, но не является следующим по порядку, то он буферизуется, до того момента, как будут получены расположенные по порядку перед ним сегменты (и будет выведен в поток чтения после них). |
![]() |
1.12 | 57 | |(% style="width:215px" %)Окно передачи|(% style="width:1307px" %)Можно представить в виде некоторого буфера двигающегося вдоль данных по мере их передачи. |
![]() |
1.3 | 58 | Определяет, какие сегменты можно отправить в текущий момент времени. |
59 | Также в рамках него контролируются статус сегментов (было ли получено подтверждение о получении). | ||
![]() |
1.1 | 60 | |
61 | ---- | ||
62 | |||
63 |