
- •Лекція 6. Протоколи транспортного рівня: tcp, udp, стек протоколів tcp/ip. Управління tcp з’єднанням.
- •Сегменти
- •Нумерація байтів
- •Управління потоком
- •Протокол "ковзного вікна"
- •Вікно приймача
- •Ковзне вікно передавача
- •Синдром, створюваний передавачем
- •Алгоритм Нагла (Nagle's algorithm)
- •Синдром, створюваний приймачем
- •Спотворений сегмент
- •Втрата підтвердження
- •Таймеры tcp
- •Обчислення rtt
- •Обчислення rtt з урахуванням повторної передачі
- •Час наполегливості
- •Черговий таймер
Сегменти
На транспортному рівні TCP групує кілька байтів в пакет, званий сегментом. TCP додає заголовок до кожного сегмента (з метою контролю) і доставляє сегмент на IP-рівень для передачі. Сегмент інкапсулюється і передається в IP-дейтаграми. Сегменти можуть бути отримані випадковим чином, втрачені або спотворені і пошкоджені. Всі ці сегменти обробляються TCP і передаються процесу на стороні прийому, який не підозрює про ці дії. Рис. 5.3. показує, як сегменти з байтів переносяться в буфера.
Рис. 5.3. TCP сегменти
Зауважимо, що сегменти можуть відрізнятися розміром. Реально сегменти переносять сотні, якщо не тисячі байт. TCP пропонує повне дуплексне обслуговування, де дані можуть рухатися в обох напрямах одночасно. Кожен TCP тому має буфер прийому і передачі і посилає сегменти в обидва напрямки. TCP, на відміну від UDP, – протокол, орієнтований на з'єднання. Коли процес на стороні посилає і приймає дані від іншого процесу на стороні B, необхідно провести наступні дії:
1. TCP на стороні інформує TCP на стороні B і отримує підтвердження від сторони В. 2. TCP боку і сторони TCP B обмінюються даними в обох напрямках. 3. Після того як у обох процесів не залишається більше даних для передачі і буфери порожні, обидва TCP знищують буфери.
Зауважимо, що це не фізичне, а віртуальне з'єднання. TCP-сегмент інкапсулюється в IP-дейтаграму і може посилати дані в будь-якому порядку або втратити їх, або спотворити, або передати повторно. Кожна дейтаграма може використовувати різний шлях для досягнення пункту призначення. Фізичного з'єднання не відбувається. TCP створює середовище, орієнтовану на потік у кожному напрямку, в якій він бере відповідальність за доставку байтів в заданому порядку на іншу сторону.TCP – достовірний транспортний протокол. Він використовує механізм підтвердження для перевірки збереження і нормальності прибувають даних.
Нумерація байтів
Хоча програмне забезпечення TCP зберігає трасу передачі сегмента, який посланий чи отриманий, він не має поля, в якому зазначено значення номера сегмента. Замість цього є два поля – порядковий номер байта і номер байта підтвердження. Ці два поля посилаються на номер байта, а не на номер сегмента.
TCP нумерує всі байти даних, які передаються в з'єднанні. Нумерація залежить від кожного напрямку. Коли TCP отримує байти даних від процесу і накопичує їх у буферах передачі, він нумерує їх. Нумерація не обов'язково починається від 0 – вона починається з випадкового числа. TCP генерує випадковий номер між 0 і 2 ^ 32-1 для номера першого байта. Наприклад, якщо випадає випадковий номер 1057 і всього надсилається 6000 байт, байти нумеруються від 1057 до 7056. Після того як байти пронумеровані, TCP призначає порядковий номер для кожного сегмента, який надсилається. Порядковий номер для кожного сегмента – це номер першого байта, який переноситься в цьому сегменті.
Приклад 1
Уявімо собі, що TCP-з'єднання передає файл об'ємом 6000 байт. Перший байт пронумерований 10010. Яким буде порядковий номер для кожного сегмента, якщо дані посилаються на п'яти сегментах, в перших чотирьох сегментах переноситься 1000 байт, а в останньому – 2000 байт?
Розв’язання Нижченаведене показує порядкові номери всіх сегментів:
Номер
підтвердження
TCP забезпечує дуплексний зв'язок. Коли з'єднання встановлено, обидві сторони можуть передавати і приймати дані одночасно. Кожна сторона нумерує байти, зазвичай з різними початковими номерами. Порядковий номер у кожному напрямку показує перший байт, який переноситься в сегменті. Кожна сторона використовує номер підтвердження, щоб підтвердити отримані їй байти. Однак номер підтвердження визначає номер наступного байта, який кожна сторона очікує отримати. Крім того, номер підтвердження є інтегральним – це означає, що сторона прийняла номер останнього байта, що він отриманий коректно, додає до нього 1 і встановлює цю суму як номер підтвердження. Термін "інтегральна" тут означає, що якщо сторона використовує 5643 як номер підтвердження, вона отримала всі байти, починаючи з 5642 і нижче. Зауважимо, що це не означає, що сторона отримала 5642 байта, тому що перший байт може не мати початкового номера 0.