Какие типы сокетов (sockets) вы знаете?

Ответ

Сокет — это конечная точка для сетевого обмена данными. Основные типы различаются по протоколу и надежности:

  1. Потоковые сокеты (SOCK_STREAM). Используют протокол TCP. Гарантируют надежную, упорядоченную доставку данных с установкой соединения.

    import socket
    # Создание TCP-сокета
    tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    tcp_socket.connect(('example.com', 80))
    tcp_socket.send(b'GET / HTTP/1.1rnHost: example.comrnrn')
  2. Дейтаграммные сокеты (SOCK_DGRAM). Используют протокол UDP. Работают без установки соединения, быстрее, но не гарантируют доставку и порядок пакетов.

    # Создание UDP-сокета
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    udp_socket.sendto(b'Hello', ('example.com', 1234))
  3. Сырые сокеты (SOCK_RAW). Позволяют работать напрямую с сетевыми пакетами (например, для ICMP — ping), минуя транспортный уровень (TCP/UDP). Требуют повышенных привилегий.

По домену (адресации):

  • INET (AF_INET) — для IPv4.
  • INET6 (AF_INET6) — для IPv6.
  • UNIX (AF_UNIX) — для межпроцессного взаимодействия на одной машине (через файловую систему).

Ответ 18+ 🔞

А, ну вот, подъехали к сокетам, блядь. Слушай, это ж как двери в сетевой бордель, только вместо баб — данные летают. И двери эти, сука, разные бывают, как будто в сортире: одна — с гарантией, что твоё говно дойдёт до унитаза, а другая — так, на авось, в форточку выкинуть.

Вот смотри, первый тип, SOCK_STREAM, он же TCP. Это как заказное письмо с уведомлением, ёпта. Ты сначала рукопожатие устраиваешь, «здравствуйте-извините», а потом уже начинаешь свою простыню текста слать. И если где-то буква потеряется — её тебе назад пришлют, переспросят. Надёжно, блядь, но и тормознуто.

import socket
# Создание TCP-сокета
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_socket.connect(('example.com', 80))
tcp_socket.send(b'GET / HTTP/1.1rnHost: example.comrnrn')

Видишь? Церемонно всё. connect, потом send. Порядок.

А второй тип, SOCK_DGRAM, он же UDP — это полная его противоположность, хитрая жопа. Ты стоишь на балконе, видишь соседа в окне напротив и просто кричишь: «Вася, водки есть?!» И кидаешь записку. Долетит — не долетит, прочитает — не прочитает, ответит — не ответит — тебе похуй. Быстро, да. Но доверия — ебать ноль.

# Создание UDP-сокета
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_socket.sendto(b'Hello', ('example.com', 1234))

Всё, sendto и свободен. Никаких тебе рукопожатий, в рот меня чих-пых.

Ну и третий, SOCK_RAW — это уже для полных извращенцев, которые хотят ковыряться в потрохах пакетов своими руками. Хочешь свой ping написать или какую-нибудь сетевую хуйню отладить? Вот тебе сырой сокет, мудила, но будь готов, что система тебе скажет: «А ты кто такой, сука?» — и права админа потребует.

А ещё они, эти сокеты, по адресации различаются, блядь. Как квартиры:

  • AF_INET — старый добрый IPv4, типа «улица Ленина, дом 5, кв. 3».
  • AF_INET6 — новый, модный IPv6, адрес такой длинный, что им можно забор обнести: «2001:0db8:85a3:0000:0000:8a2e:0370:7334». Ебушки-воробушки.
  • AF_UNIX — это вообще для домашних разборок. Когда два процесса на одной машине друг другу по мозгам ездят, но через файлик, а не по сети. Быстро, приватно, своя атмосфера.

Вот и вся философия, блядь. Выбирай дверь, которая под задачу, а то так и будешь вхолостую данные в стенку пихать.