Как происходит взаимодействие в рамках сети
Что проверяют
Понимаете ли вы, что происходит между вызовом requests.get() и получением ответа, и можете ли пройти этот путь по уровням. Следом почти всегда идёт «чем TCP отличается от UDP» или «что будет, если сервер не отвечает».
Как отвечать
Удобнее всего рассказать путь одного HTTPS-запроса по стеку TCP/IP: прикладной, транспортный, межсетевой уровни и уровень сетевого доступа.
- адрес: имя хоста превращается в IP через DNS, в Python это делает
socket.getaddrinfo(). Конкретное приложение на сервере определяется портом; - TCP: соединение открывается тройным рукопожатием (SYN, SYN-ACK, ACK). TCP гарантирует порядок и доставку, но передаёт поток байтов, а не отдельные сообщения;
- UDP: без соединения и гарантий, зато без задержки на установку. На нём работают DNS и QUIC, а значит и HTTP/3;
- TLS: поверх TCP стороны договариваются о шифровании и проверяют сертификат. В TLS 1.3 рукопожатие занимает один круг туда и обратно;
- HTTP: запрос с методом, заголовками и телом, ответ с кодом статуса. HTTP/1.1 держит соединение открытым через keep-alive, HTTP/2 мультиплексирует много запросов в одном соединении.
Дальше привяжите к Python. socket даёт сырой уровень, requests это синхронный клиент, httpx умеет и sync, и async, а также HTTP/2, aiohttp работает асинхронно и как клиент, и как сервер. Для серии запросов берут requests.Session или httpx.Client: они держат пул соединений и не открывают TCP и TLS заново на каждый вызов.
Где спотыкаются
Думают, что recv(1024) вернёт сообщение целиком. TCP может отдать его частями или склеить два в одно, поэтому нужен свой формат кадров: длина в начале или разделитель. Для отправки берут sendall(), а не send().
Не ставят таймаут. У requests его нет по умолчанию, и зависший сервер навсегда блокирует поток.
Путают уровни: называют TCP/IP протоколом рядом с HTTP или говорят, что прикладной уровень OSI это интерфейс пользователя. На этом уровне живут протоколы приложений, HTTP, DNS, SMTP, а не кнопки.