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