соктів. Таким чином, будь-який сокет може одночасно використовуватись у багатоьх з’єднаннях.
Співвіднесення портів та процесів здійснюється кожним хост-комп’ютером самостійно. Проте виявляється корисним зв’язувати часто використовувані процеси (такі як "logger" чи сервіс з розподіленням часу) з фіксованими документованими сокетами.
Робота зі з’єднаннями
Механізми управління потоком та забезпечення достовірності, описані вище, вимагають, щоб програми протокола TCP ініціалізували та підтримували певну інформацію про стан кожного потоку даних. Набір такої інформації, до складу якого входять сокети, номери черги, разміри вікон, має назву з’єднання. Кожне з’єднання унікальним чином ідентифікуєтся парою сокетів на двох кінцях.
Якщо два процеси бажають обмінюватись інформацією, відповідні програми протоколу TCP повинні спочатку встановити з’єднання (на кожному боці ініціалізувати інформацію про статус). По закінченню обміну інформацією з’єднання повинно бути розторгнуте чи закрите, щоб звільнити ресурсы для інших користувачів. Оскільки з’єднання повинні встановлюватися між ненадійними хост-комп’ютерами та через ненадійну комунікаційну систему Internet, то, щоб запобігти помилковій ініціалізації з’єднань, використовується механізм підтвердження зв’язку з хронометрованими номерами черги.
Приорітет та безпека
Користувачі протокола TCP можуть вимагати для своєго з’єднання приорітет та безпеку. Передбачені прийняті за замовчанням характеристики з’єднань, коли такі параметри не потрібні.
Склад та призначення полів заголовку
TCP-сегменти відправляються як IP-датаграми. Заголовок TCP, який йде за IP-заголовком, містить інформацію TCP-протоколу.
Source Port | Destionation Port
Sequence Number
Acknowlegement Number
Data
Offset | Reserved | URG | ACK | PSH | RST | SYN | FIN | Window
Checksum | Urgent Pointer
Options | Padding
Data
Мал. 1 Заголовок TCP-пакета
Source Port (16 біт). Порт відправника.
Destination Port (16 біт). Порт отримувача.
Acknowlegement Number (32 біта). Поле номера кадру підтвердженого отримання. Якщо пакет містить встановлений контрольний біт ACK, то це поле містить номер наступного пакета даних відправника, який очікує отримувач. При встановленому з’єднанні пакет підтвердження відправляється завжди.
Data Offset (4 біта). Поле величини зміщення даних. Воно містить кількість 32-бітних слів заголовку TCP-пакету. Це число визначає зміщення розташування даних у пакеті.
Reserved (6 біт). Резервне поле.
Прапори управління:
URG: Прапор терміновості
ACK: Прапор пакету, що містить підтвердження отримання
PSH: Прапор форсованої відправки
RST: Перевстановлення з’єднання
SYN: Синхронізація чисел послідовності
FIN: Прапор закінчення передачі з боку відправника
Window (16 біт). Це поле містить кількість байт даних, яку відправник даного сегменту може прийняти, відраховану від номеру байту, зазначеного в полі Acknowlegement Number.
Checksum (16 біт). Поле контрольної суми. Це поле містить 16 біт суми побітних додатків 16-бітних слів заголовку та даних. Якщо сегмент містить в заголовку та тексті непарну кількість октетів, що мають бути враховані в контольній сумі, останній октет буде доповнений нулями зправа с тим, щоби утворити для надання контрольній сумі 16-бітне слово. Октет, що виникає при такому виравнюванні, не передається разом з сегментом по мережі. Перед вирахуванням контрольної суми поле цієї суми заповнюється нулями.
Контрольна сума, окрім всього іншого, враховує 96 біт псевдозаголовку, який для внутрішнього використання ставиться перед TCP заголовком. Цей псевдозаголовок містить адресу відправника, адресу отримувача, протокол та довжину TCP сегменту. Такий підхід забезпечує захист протоколу TCP від сегментів, що помилились у маршруті .Цю інформацію обробляє Internet протокол. Вона передається крізь інтерфейс протокол TCP/локальна мережа у якості аргументів чи результатів запитів від протоколу TCP до протоколу IP.
Адреса відправника
Адреса отримувача
Нулі | PTCL | Довжина TCP
Довжина TCP сегменту - это довжина TCP заголовку та поля даних, виміряна в октетах. Це не є точним вказівником кількості октетів, що передаються по мережі, вона не враховує 12 октетів псевдозаголовку, проте розрахунок цього параметру всеж проводиться.
Urgent Pointer (16 біт). Поле вказівника термінових даних. Це поле містить значення лічильника пакетів, починаючи з якого йдуть пакети підвищеної терміновості. Це поле береться до уваги лише в сегментах з встаносленим флагом URG.
Options. Поле додаткових параметрів: може бути змінної довжини.
Padding. Заповнення: змінна довжина. Заповнення (нулями) TCP-заголовку використовується для вирівнювання його по 32-бітному слову.
Встановлення з’єднання та його відміна
Розглянемо схему створення TCP-з’єднання (Мал 2).
Мал.2
Припустимо, що хосту А необхідно створити TCP-з’єднання з хостом В. Тоді А посилає на В наступне повідомлення:
A -> B: SYN, ISSa
Це означає, що в повідомленні, яке передає А, встановлений біт SYN (synchronize sequence number), а у поле Sequence Number встановлено початкове 32-бітне значення ISSa (Initial Sequence Number).
В відповідає:
2. B -> A: SYN, ACK, ISSb, ACK(ISSa+1)
У відповідь на отриманий від А запит В відповідає повідомленням, в якому встановлений біт SYN та встановлений біт ACK; у поле Sequence Number хостом В встановлюється своє початкове значення лічильника - ISSb; поле Acknowledgment Number містить значення ISSa, отримане у першому пакеті від хоста А та збільшене на одиницю.
А, завершуючи “рукостискання” (handshake), надсилає:
3. A -> B: ACK, ISSa+1, ACK(ISSb+1)
У цьому пакеті встановлений біт ACK; поле Sequence Number містить ISSa + 1; поле Acknowledgment Number містить значення ISSb + 1. Відсиланням цього пакету на хост В закінчується трьохступеневий handshake та TCP-з’єднання між
хостами А та В вважається встановленим. Тепер хост А може посилати пакети з даними на хост В по щойно свтвореному віртуальному TCP-каналу:
4. A -> B: ACK, ISSa+1, ACK(ISSb+1); DATA
Щоб ідентифікувати окремі потоки даних, які підтримує протокол TCP, останній визначає ідентифікатори портів. Оскільки ідентифікатори портів обираються кожною програмою протокола TCP незалежно, то вони не будуть унікальними. Щоб забеспечити унікальність адрес для кожної програми протокола TCP, треба об’єднати ідентифікуючу цю програму Internet адресу та ідентифікатор порта. В результаті отримуємо сокет, який буде унікальний у всіх локальних мережах, об’єднаних у єдине