Что такое протокол TCP?

Ответ

TCP (Transmission Control Protocol) — это основной протокол транспортного уровня стека TCP/IP, обеспечивающий надёжную, упорядоченную и проверенную на ошибки доставку потока данных между приложениями, работающими на разных хостах.

Ключевые характеристики:

  • Установка соединения (Connection-oriented): Перед обменом данными происходит «трёхстороннее рукопожатие» (SYN → SYN-ACK → ACK).
  • Надёжность и контроль ошибок: Используются подтверждения (ACK), таймауты и повторная передача потерянных пакетов.
  • Упорядочивание: Каждому байту данных присваивается порядковый номер. Приёмник собирает пакеты в правильном порядке.
  • Контроль потока (Flow Control): Механизм «скользящего окна» предотвращает переполнение буфера приёмника.
  • Управление перегрузкой (Congestion Control): Алгоритмы динамически регулируют скорость отправки данных, чтобы не перегрузить сеть.
Сравнение с UDP: Характеристика TCP UDP
Надёжность Гарантированная Не гарантирована
Установка соединения Требуется (handshake) Не требуется
Скорость Ниже (из-за накладных расходов) Выше
Порядок доставки Гарантирован Не гарантирован
Использование Веб (HTTP), почта (SMTP), файлы (FTP) Видеостриминг, VoIP, DNS

Пример сокета на Python:

# Серверная сторона
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # SOCK_STREAM = TCP
server_socket.bind(('127.0.0.1', 65432))
server_socket.listen()
conn, addr = server_socket.accept()  # Ожидание подключения
with conn:
    data = conn.recv(1024)  # Получение данных
    conn.sendall(b'Reply')  # Отправка ответа

Ответ 18+ 🔞

Давай разберёмся, что это за зверь такой — TCP, а то звучит как какая-то партийная ячейка, блядь.

Ну вот представь: есть два компьютера, и им надо пообщаться. Можно, конечно, как дурачки, кричать друг другу в пустоту, как UDP делает — «На, лови!», а поймали или нет, похуй. А можно сделать по-взрослому, с гарантиями, как в хорошем ресторане: «Извините, ваш заказ принят, подтверждаем, готовим, везём, вот чек, всё доставили? Отлично». Это и есть TCP, ёпта.

Что он из себя представляет, этот красавчик?

  • Любит церемонии (Connection-oriented): Не начнёт трепаться, пока не поздоровается. Процесс называется «трёхстороннее рукопожатие» — один шлёт «Привет!» (SYN), второй отвечает «Привет-привет! Давай!» (SYN-ACK), первый завершает: «Ну окей, поехали!» (ACK). И только потом начинается передача данных. Не как в подъезде — «Эй, ты!» и сразу в ебло.
  • Надёжный, как швейцарские часы, блядь: Он не теряет твои пакеты. Отправил — ждёт подтверждения (ACK). Не пришло подтверждение — отправит ещё раз, сука. Таймауты, повторные передачи — весь этот цирк, чтобы ни один байтик не пропал. Забота, мать его.
  • Порядок блюдёт, как завхоз: Каждому кусочку данных присваивает номер. Если пакеты пришли вразнобой (а в сети они всегда так и пляшут), TCP на стороне получателя аккуратно их, блядь, как пазл, соберёт в правильной последовательности. Никакого «начало в конце, а середина в начале».
  • Контролирует поток, чтоб не обосраться (Flow Control): У получателя есть буфер — как тарелка. Если ты, отправитель, начнёшь слишком быстро в него швырять данные, он переполнится, и всё потечёт. TCP использует «скользящее окно» — это такой умный механизм, который говорит: «Эй, дружок, помедленнее, я тут уже по уши, приём!» И отправитель сбавляет обороты.
  • Борется с пробками, как гаишник в час пик (Congestion Control): Он чувствует, когда сеть забита. Не лезет напролом, а хитрожопо снижает скорость отправки, чтобы всем было хорошо, а потом потихоньку её наращивает. Коллективист, сука.

А чем он лучше своего брата-распиздяя, UDP? Смотри, табличка, всё наглядно, ебать:

Признак TCP (Ответственный семьянин) UDP (Анархист-похуист)
Надёжность Гарантирует. Будет ныть, пока не убедится, что всё дошло. Ничего не гарантирует. Отправил и забыл, как в прошлый четверг.
Соединение Обязательно за ручку поздоровается. Без церемоний. «Эй, жопа, лови!» и всё.
Скорость Помедленнее, потому что много возни с подтверждениями. Быстро, как угорелый, потому что похуй.
Порядок Соберёт всё по полочкам. Может прийти в любом порядке, а может и не прийти.
Где юзают Всё важное: сайты (HTTP), почта (SMTP), файлы (FTP). Всё, где скорость важнее целостности: стримы, звонки (VoIP), запросы к DNS.

И как это выглядит в коде, на питоне? Серверная часть, например. Создаёшь сокет, но указываешь SOCK_STREAM — это и есть наш TCP, блядь.

# Серверная сторона
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # SOCK_STREAM = TCP
server_socket.bind(('127.0.0.1', 65432))
server_socket.listen()
conn, addr = server_socket.accept()  # Сидит и ждёт, пока кто-то не постучится (handshake)
with conn:
    data = conn.recv(1024)  # Получил данные
    conn.sendall(b'Reply')  # И ответил. Всё чинно, благородно.

Вот и вся магия. Не UDP, где sendto() и молишься, а цивилизованный протокол для взрослых дядь. Хочешь надёжно — TCP. Хочешь быстро и «авось пронесёт» — UDP. Выбирай, но помни: за надёжность надо платить скоростью, ебанашка.