Что представляет собой модель TCP/IP и каковы её ключевые протоколы

Ответ

TCP/IP — это стековая модель передачи данных, которая является основой современного интернета. Она описывает, как данные должны быть отформатированы, адресованы, переданы и получены. Модель состоит из четырех уровней, но чаще всего обсуждаются два ключевых протокола с разных уровней:

  • IP (Internet Protocol) — протокол сетевого уровня. Его основная задача — адресация и маршрутизация пакетов данных. Он присваивает каждому устройству в сети уникальный IP-адрес (например, 192.168.1.1) и определяет путь доставки пакетов до цели, но не гарантирует их доставку.

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

Проще говоря, IP — это как почтовая служба, которая знает адрес и доставляет письмо, а TCP — это как заказное письмо с уведомлением, которое гарантирует, что получатель его точно получит в целости и сохранности.

Пример работы с сокетами в Python

Этот код демонстрирует базовое клиент-серверное взаимодействие по TCP/IP.

# server.py - Сервер, который ждет подключения и отправляет сообщение
import socket

# Создаем TCP-сокет
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    # Привязываем сокет к адресу 'localhost' и порту 12345
    s.bind(('localhost', 12345))
    # Начинаем прослушивать входящие подключения
    s.listen()
    print("Сервер запущен и ожидает подключения...")

    # Принимаем входящее подключение
    conn, addr = s.accept()
    with conn:
        print(f"Подключен клиент: {addr}")
        conn.sendall(b'Hello from TCP server!')
# client.py - Клиент, который подключается к серверу и получает сообщение
import socket

# Создаем TCP-сокет
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    # Подключаемся к серверу
    s.connect(('localhost', 12345))
    # Получаем данные (до 1024 байт)
    data = s.recv(1024)

print(f"Получено от сервера: {data.decode('utf-8')}")