EMZETT.
Увійти

ACK

Коротко: Прапор підтвердження в TCP, що сигналізує, що пакет (або певний порядковий номер) успішно отримано.

Докладніше: Пакети ACK — основа надійності TCP: якщо очікуване підтвердження не надходить, відправник вважає пакет втраченим і надсилає його знову. Третій пакет триетапного рукостискання — чистий ACK, що завершує встановлення з’єднання.

Подробиці

Кумулятивне підтвердження замість квитанції на кожен пакет

Технічно ACK — не окремий пакет, а один біт-прапор у заголовку TCP, що надсилається разом із 32-бітним номером підтвердження. Цей номер повідомляє відправникові, який байт очікується наступним: не «пакет 5 прийшов», а «я отримав усе до байта 4000 включно, надішли мені байт 4001». Це дає змогу кумулятивні підтвердження: якщо до одержувача дійшли сегменти з байтами 1000–2000, 2000–3000 і 3000–4000, одного ACK з номером 4001 досить, щоб підтвердити всі три одразу. Це заощаджує значні накладні витрати на стабільних з’єднаннях, але є недолік: якщо посередині бракує сегмента (наприклад, втрачені байти 2000–3000), одержувач може підтвердити лише до останньої безперервної позиції (2001), навіть якщо пізніші сегменти вже надійшли. Сучасні реалізації TCP розв’язують це розширенням «Selective Acknowledgment» (SACK), що додатково повідомляє, які пізні блоки вже є, тож відправникові треба повторити лише справжню прогалину, а не всі решту даних.

Тайм-аут, швидка повторна передача та дубльовані ACK

Якщо очікуване підтвердження не надходить упродовж тайм-ауту повторної передачі (RTO), TCP вважає пакет втраченим і надсилає його знову; RTO динамічно підлаштовується під виміряний час кругового обходу (RTT), щоб система розумно реагувала і в швидких локальних мережах, і на лініях з високою затримкою (супутник, міжконтинентальні лінії), не повторюючи ні надто рано, ні надто пізно. Особливий випадок — «дубльовані ACK»: якщо сегмент надходить до одержувача поза чергою (наприклад, сегмента 3 бракує, але надходить сегмент 4), одержувач продовжує повторно підтверджувати останню безперервну позицію тим самим номером. Якщо відправник тричі поспіль отримує той самий номер підтвердження, він трактує це як сильний сигнал втрати конкретного пакета (а не загального перевантаження) і одразу починає повторну передачу (fast retransmit), не чекаючи повного тайм-ауту.

Роль у життєвому циклі з’єднання

У триетапному рукостисканні ACK з’являється двічі: раз разом із SYN-ACK у другому пакеті й раз як чистий ACK у третьому, який офіційно переводить з’єднання в стан «ESTABLISHED». Закриття з’єднання теж іде через ACK (у складі послідовності FIN/ACK). Майже в кожному TCP-сегменті після рукостискання прапор ACK встановлено й одночасно переносяться дані («piggybacking»).

Налагодження на практиці

У перехоплених пакетах (наприклад, у Wireshark) помітна велика кількість дубльованих ACK чи повторних передач — прямий сигнал втрат пакетів на маршруті, часто через перевантажені маршрутизатори, несправні кабелі чи нестабільний Wi-Fi. UDP поняття ACK не знає взагалі; кому потрібна надійність поверх UDP, має реалізувати власну, зазвичай легшу логіку підтверджень на рівні застосунку.

Див. також: SYN, SYN-ACK, Триетапне рукостискання