Урок 21: TCP-сокеты — сервер и клиент
TCP (Transmission Control Protocol) — это основа любой надёжной сетевой коммуникации. Когда вы открываете браузер, запускаете Git fetch или соединяете два процесса NCCL для распределённого обучения — в большинстве случаев за кулисами работает TCP. На этом уроке мы научимся писать TCP-сервер и TCP-кл
Представьте TCP-сервер как ресторан. Сначала вы выбираете номер столика (bind к порту), затем открываете дверь и объявляете «мы открыты» (listen), потом садитесь и ждёте, пока войдёт клиент (accept). Клиент приходит (connect), садится, делает заказ (send) и получает заказ обратно (recv). TCP гарантирует, что каждое блюдо придёт в правильном порядке и ничего не потеряется — как официант, который проверяет, что каждая тарелка дошла, прежде чем подать следующую.
- сокет (socket)
- Конечная точка сетевой коммуникации. В коде представлена как file descriptor (целое число), в который можно писать и из которого можно читать точно так же, как из файла.
- привязка (bind)
- Назначение сокету IP-адреса и порта. syscall bind() сообщает ядру: «этот сокет будет принимать соединения, приходящие на порт X».
- прослушивание (listen)
- Перевод сокета в пассивный режим, в котором он готов принимать входящие соединения. Параметр backlog задаёт, сколько ожидающих соединений ядро может держать в очереди.
- приём соединения (accept)
- Извлечение следующего соединения из очереди ожидания. Возвращает новый выделенный file descriptor только для этого клиента. Исходный сокет продолжает слушать новых клиентов.
- SO_REUSEADDR
- Опция сокета, позволяющая повторно привязать порт сразу после закрытия сервера, не дожидаясь истечения TIME_WAIT. Необходима при разработке, чтобы не получать 'Address already in use' при каждом перезапуске.