Исходный код вики TCP
Редактировал(а) Alexandr Fokin 2022/12/12 12:13
Скрыть последних авторов
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.23 | 9 | Основывается на протоколе [[IP>>Сети.Протоколы.IP.WebHome]] для передачи и маршрутизации. |
![]() |
1.4 | 10 | TCP сегмент заворачивается в IP пакет. |
![]() |
1.1 | 11 | ))) |
![]() |
1.19 | 12 | |(% style="width:215px" %)TCP сегмент|(% style="width:1307px" %)Блок единичного пакета/сообщения. |
![]() |
1.4 | 13 | Сегмент содержит данные и заголовок необходимой для работы информацией. |
![]() |
1.24 | 14 | |(% style="width:215px" %)Maximum segment size (MSS)|(% style="width:1307px" %)Параметр, обозначающий размер полезной нагрузки. |
![]() |
1.25 | 15 | Основывается на значении MTU, вычитая значение размера IP заголовка и TCP заголовка. |
![]() |
1.12 | 16 | |(% style="width:215px" %)Клиент и Сервер|(% style="width:1307px" %)TCP сервер слушает определенный сокет (привязка к IpAddress + Port). |
![]() |
1.1 | 17 | TCP клиент подключается к серверу, устанавливается соединение. |
![]() |
1.12 | 18 | |(% style="width:215px" %)Логическое соединение|(% style="width:1307px" %)((( |
![]() |
1.20 | 19 | Между 2 сторонами устанавливается логическое соединение, в рамках которого идет передача данных. Соединение является дюплексным. |
![]() |
1.1 | 20 | |
![]() |
1.18 | 21 | При этом соединение само по себе не имеет механизмов для определения разрыва сети, падения приложения одной из сторон или падения хоста (другая сторона вполне может еще некоторое время предпринимать попытки выполнить отправку или получение данных, в некоторых случаях (в момент падения приложения, после перезагрузки хоста) разрыв сессии может быть обнаружен). В некоторых случаях имеет смысл реализации пульса для отслеживания состояния соединения. |
![]() |
1.2 | 22 | |
![]() |
1.4 | 23 | Взаимодействие |
24 | |||
![]() |
1.2 | 25 | 1. Установка соединения |
26 | 1. Обмен данными. | ||
27 | 1. Закрытие соединения. | ||
![]() |
1.1 | 28 | ))) |
![]() |
1.12 | 29 | |(% style="width:215px" %)Потоковая (stream) передача|(% style="width:1307px" %)((( |
![]() |
1.6 | 30 | Данные раскладываются в tcp сегменты, но стороны оперирует интерфейсами в виде потока байт. |
![]() |
1.1 | 31 | |
32 | Необходима реализация механизмов для определения границ сообщения в передаваемых данных | ||
33 | ( | ||
34 | |||
![]() |
1.13 | 35 | * либо все сообщения имеют фиксированную длину |
![]() |
1.1 | 36 | * либо у сообщений есть заголовок фиксированной длины, в котором указана длина блока данных |
![]() |
1.13 | 37 | * либо в конце каждого сообщения есть некая последовательность, обозначающая о его завершении |
![]() |
1.1 | 38 | |
39 | ) | ||
40 | ))) | ||
![]() |
1.12 | 41 | |(% style="width:215px" %)Гарантия доставки сегментов.|(% style="width:1307px" %)((( |
![]() |
1.3 | 42 | При отправке данных (сегментов) каждая сторона фиксирует статус отправки и ожидает подтверждения. Если подтверждение не происходит в течении определенного времени, то один или группа сегментов (зависит от реализации) посылается повторно. |
43 | |||
![]() |
1.8 | 44 | Возможно ситуация, когда сегмент подтверждения может быть утерян (или же еще не успел прийти), и сегмент будет выслан повторно, но такое поведение не приведет к повреждению передаваемых данных. |
![]() |
1.7 | 45 | |
![]() |
1.21 | 46 | ---- |
47 | |||
![]() |
1.3 | 48 | Отметим, что возможна ситуация, когда сегменты достигли клиента, отправитель получил подтверждение, но приложение или хост упали, не выполнив окончательную обработку данных из этих сегментов. |
![]() |
1.21 | 49 | |
50 | При отправке данных через сокет, возврат управления из функции отправки не означает, что данные были доставлены или даже отправлены. Данные все еще могут находиться в буфере и ожидать отправки (например ожидать заполнения блока). Задержка возврата управления может быть вызвана переполнением буфера отправки. | ||
![]() |
1.3 | 51 | ))) |
![]() |
1.12 | 52 | |(% style="width:215px" %)Гарантия порядка получения |
53 | (за счет нумерации данных)|(% style="width:1307px" %)((( | ||
![]() |
1.9 | 54 | В заголовок сегмента записывается порядковый номер первого байта данных, который используется принимающей стороной для восстановления последовательности сегментов (т.к. они могут быть получены не в том порядке, в котором было отправлены). |
![]() |
1.3 | 55 | |
56 | Также важно, что одно логическое сообщение приложение может быть разбито на несколько TCP сегментов, которые физически дойдет до получателя не в том порядке, в котором были отправлены, но их порядок будет восстановлен на стороне получателя при передаче в поток чтения. | ||
57 | ))) | ||
![]() |
1.12 | 58 | |(% style="width:215px" %)Гарантия целостности данных |
59 | (за счет контрольной суммы)|(% style="width:1307px" %)Перед отправкой в заголовок сегмента включается блок с контрольной суммой данных. При получении сегмента, контрольная сумма сверяется для проверки изменения содержимого сегмента. | ||
60 | |(% style="width:215px" %)Окно приема|(% style="width:1307px" %)Можно представить в виде некоторого буфера двигающегося вдоль данных по мере их приема. | ||
![]() |
1.22 | 61 | Обозначает ограничение буфера памяти приемника. |
![]() |
1.5 | 62 | Если сегмент не попадает в окно приема, то он отбрасывается. |
63 | Если сегмент приходит повторно (данный сегмент уже получен), то он отбрасывается. | ||
![]() |
1.3 | 64 | Если сегмент попадает в окно приема, но не является следующим по порядку, то он буферизуется, до того момента, как будут получены расположенные по порядку перед ним сегменты (и будет выведен в поток чтения после них). |
![]() |
1.12 | 65 | |(% style="width:215px" %)Окно передачи|(% style="width:1307px" %)Можно представить в виде некоторого буфера двигающегося вдоль данных по мере их передачи. |
![]() |
1.3 | 66 | Определяет, какие сегменты можно отправить в текущий момент времени. |
67 | Также в рамках него контролируются статус сегментов (было ли получено подтверждение о получении). | ||
![]() |
2.1 | 68 | |(% style="width:215px" %) |(% style="width:1307px" %) |
69 | |(% style="width:215px" %)Окно перегрузки|(% style="width:1307px" %) | ||
70 | |(% style="width:215px" %)Алгоритм Нейгла|(% style="width:1307px" %) | ||
![]() |
1.1 | 71 | |
72 | ---- | ||
73 | |||
![]() |
2.2 | 74 | ==== Внутренние ссылки: ==== |
75 | |||
76 | ====== Дочерние страницы: ====== | ||
77 | |||
78 | {{children/}} | ||
79 | |||
80 | ====== Обратные ссылки: ====== | ||
81 | |||
82 | {{velocity}} | ||
83 | #set ($links = $doc.getBacklinks()) | ||
84 | #if ($links.size() > 0) | ||
85 | #foreach ($docname in $links) | ||
86 | #set ($rdoc = $xwiki.getDocument($docname).getTranslatedDocument()) | ||
87 | * [[$escapetool.xml($rdoc.fullName)]] | ||
88 | #end | ||
89 | #else | ||
90 | No back links for this page! | ||
91 | #end | ||
92 | {{/velocity}} | ||
93 | |||
94 | ---- | ||
95 |