TLDR;
- TCP - орієнтований на потік, вимагає з'єднання, надійний, повільний
- UDP - орієнтований на повідомлення, без зв’язку, ненадійного, швидкого
Перш ніж розпочати, пам’ятайте, що всі недоліки чогось є продовженням його переваг . Є лише правильний інструмент для роботи, немає панацеї. TCP / UDP співіснують десятиліттями і не просто так.
TCP
Він був розроблений як надзвичайно надійний, і він робить свою роботу дуже добре. Це так складно, бо виконує важке завдання: довести надійний транспорт через ненадійний протокол IP.
Оскільки вся складна логіка TCP інкапсульована в мережевий стек, ви не можете робити багато трудомістких, схильних до помилок матеріалів низького рівня на рівні додатків.
Коли ви надсилаєте дані через TCP, ви записуєте потік байтів у сокет у відправника, де він розбивається на пакети, передається вниз по стеку і надсилається по дроту. На стороні приймача пакети знову збираються у безперервний потік байтів.
Збереження цієї приємної абстракції має вартістю у плані складності та продуктивності. Якщо 1-й пакет з потоку байтів втрачено, приймач затримає обробку наступних пакетів, навіть тих, що вже надійшли.
Крім того, щоб бути надійними, TCP реалізує це:
- TCP вимагає встановленого з'єднання, для якого потрібні 3 об'їзних ("сумнозвісні" тристоронні рукостискання).
- TCP має функцію під назвою "повільний старт", коли вона поступово збільшує швидкість передачі після встановлення з'єднання, щоб дозволити одержувачеві йти в ногу з даними.
- Кожен надісланий пакет повинен бути підтверджений, інакше відправник перестане надсилати більше даних
- І на, і на, і на ...
Все це посилюється у повільних ненадійних бездротових мережах, тоді як TCP був розроблений для провідних мереж, де затримки передбачувані, а втрата пакетів не така поширена. Крім того, як і багато людей, про які вже говорилося, TCP для деяких речей просто не працює (DHCP). Однак, де це доречно, TCP все ще робить свою роботу виключно добре.
Використовуючи аналогію пошти, сеанс TCP подібний до того, щоб розповісти історію своєму секретареві, який розбиває її на пошту та надсилає видавцеві поштову послугу. З іншого боку інший секретар збирає пошту в один фрагмент тексту. Деякі листи втрачаються, деякі пошкоджуються, тому для надійної доставки потрібна дуже складна процедура, і ваша історія на 10 сторінок може зайняти багато часу, щоб дістатися до вашого видавця.
UDP
UDP, з іншого боку, орієнтований на повідомлення, тому приймач записує повідомлення (пакет) у сокет, а потім передається на приймач таким, яким він є, без розбиття / складання.
Порівняно з TCP, його специфікація дуже проста. По суті, все, що він робить для вас, - це додавання контрольної суми до пакету, щоб приймач міг виявити її пошкодження. Все інше має бути реалізовано вами, розробником програмного забезпечення. Тепер прочитайте об'ємну специфікацію TCP і спробуйте подумати про повторну реалізацію деяких її частин.
Деякі люди пішли цим шляхом і отримали дуже пристойні результати, до того, що HTTP / 3 використовує QUIC - протокол, заснований на UDP. Однак це більше виняток. Поширені програми UDP - це аудіо / відео для потокової та конференц-програми, такі як Skype, Zoom або Google Hangout, де втрата пакетів не настільки важлива порівняно із затримкою, запровадженою TCP.