conspects.iliay.ar

1 Историческая справка

Если узел A хочет поговорить с узлом B, в промежуточных узлах буквально соединялся физически провод (линк), это называется канальной коммутацией.

Будем разбивать данные на кусочки, предавать следующему узлу вместе с информацией куда надо доставить — пакетная коммутация. Есть некоторые проблемы:

2 База

Интернет — мнго независимых сетей, которые общаются друг с другом.

Виды линков:

  1. Витая пара
  2. Коаксиальные провода (как кабельное тв)
  3. Оптический кабель (пластик/стекло)
  4. Радио (WiFi, 4g, спутники)

Две задачи:

Аналогия: Маршрутищация — построить путь из одного города в другой, форвардинга — для каждого промежуточного города, по какой дороге из него выехать

Congestion controls — решение проблемы забития очереди, когда входной канал шире чем выходной. Когда очередь заканчивается, пакеты теряются. Хочется знать с какой скороситью отправлять, чтобы очередей не возникало

Протоколы:

Типичные слои:

OSI model:

L7
Application
L6
Presentation
L5
Session
L4
Transport
L3
Network
L2
Link
L1
Physical

3 L3 IP

IP Network: Зафиксируем префикс сети. Пример:

Address 87.250.250.0
Netmask 255.255.254.0
Wildcard 0.0.1.255
Network 87.250.250.0/23
Hostmin 87.250.250.1
Hostman 87.250.251.254
Broadcast 87.250.251.255

Для сети /31 можно использовать оба адреса, не смотря на то что они broadcast и нулевой.

Маршрутизация. Пример:

192.168.99.0/24 dev wlan0
0.0.0.0/0 via 192.168.99.1  

192.168.99.17 в первое правило

Если нужно отправит по адресу, отправляем по наиболее совпадающему правилу. Пример:

10.0.0.0/8 via 192.168.1.1
10.0.0.0/9 via 192.168.1.4
10.1.0.0/16 via 192.168.1.2
10.1.2.0/24 via 192.169.1.3  

Как получить IP: IANA выдает IP адреса.

3.1 Специальные IP адреса

Приватные адресы для локальной сети

Link local (Значат что не настроено):

Broadcast:

Multicast:

Version 4 либо 6
IHL длина заголовка
Next Header Что дальше: TCP, UDP, расширение, ..
Total/Payload length Размер после/вместе с заголовком

Минимальный размер

Flags (More Fragments), Fragment offset — фрагментация пакета. Если получатель не поддреживает фрагменты, то это проблема клиента. Решение — уменьшить размер пакета. Можно поставить флаг, чтобы промежуточные узлы не фрагментировали пакет

NB: Jumbograms — переписать размер пакета, гораздо большим числом

3.2 Nat

Как ходить в интернет с локальным адресом.

3.3 ICMP

Поверх протокола IP.

4 L2

Ethernet, WiFi.

Broadcast MAC Address: ff:ff:ff:ff:ff:ff

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

Хотим узнавать по IP адресу MAC адрес. Отправляем ARP запрос на MAC broadcast: Who has 1.2.3.4? Если такое устройство есть, оно отправляет нам свой MAC.

NB: arp -n — получить локальную таблицу MAC адресов

Для IPv6 NDP (Neighbor Discrovery Protocol). Работает поверх IP.

4.1 DHCP

Спросить у сети, какой адрес можно взять, кто роутер, какие DNS. Работает поверх UDP. Отправляем с адреса 0.0.0.0 на 255.255.255.255. Роутер выдает адрес и сразу шлет на него пакет.

5 L4 TCP, UDP

5.1 UDP

s = socket()
bind(s, 53)
sockaddr{IP, port}
send_to(s, data, dst)
recvfrom(s, *data, *src)

Порты 1-1024 обычный пользователь занять не может

Хотим отправить много данных, которые не влезают в один UPD пакет
TFTP. Работает поверх UDP:

Если клиент примет два одинаковых пакетах, получится так, что все следующие части будут удвоены. Эта проблема была решена.

5.2 TCP

Server:

s = socket()
bind(s, 80)
s2 = accept(s)
read(s2)
write(s2)

Client:

s = socket()
connect(s, addr)
write(s)
read(s)

Если отправим больщой файл, не дожидаясь подтверждения, будет плохо. Поэтому есть Congestion Window — сколько байт, которые были отправлены, еще не были подтверждены получателем. Как выбирать окно: экспоненциально увеличивая размер, выясняем максимальный без потерь.

Не хотим слать ACK на каждый пакет. Будем ACK’ать сразу кусок данных, дожидаясь еще по таймауту.

Как клинту сообщить серверу, что пакет потерялся:

Как увеличивать окно:

Флаг ECE (congestion echo) в TCP от клиента означает, что произошел затык на пути к клиенту. Клиент узнает по флагу ECN (congestion notice) в IP пакете.

Затые может произойти у клиента в железе. В ответе серверу можем попросить его ограничить его окно, в том числе поставить 0.

Проверяем что клиент не спуфит адреса. Все ок, если сервер выполняет меньше работы чем клиент. Можем выдавать SYN Cookie, чтобы следующее подключение происходило сразу.

Когда соединение закрывается, обе стороны, грубо говоря, должны послать FIN.

Фаг PUSH, говорит сразу отдать пакеты из буфера приложению.

6 Routing

6.1 RIP (Routing Information Protocol)

Получаем информацию от соседей, выбираем наиболее короткий путь. Когда шлем сообщения:

В чем проблема: Циклы после исчезновения конечного узла: Если получили информацию об узле, не сообщаем обратно эту информацию. Так же, при исчезновении узла, можем сообщить, что расстояние до него 16 (максимально возможное)

6.2 OSPF (Open Shortest Path First)

Каждый узел по таймеру шлет информацию соседям, так, что у каждого узла есть полная карта сети. Каждый узел строит кратчайший путь.

Проблема: Если появляется/рвется линк, у разных узлов получаются разные карты сети.

6.3 IS-IS (Intermediate System to Intermediate System)

В отличие от OSPF, который работает над UDP, IS-IS работает по чему-то типа IP.

6.4 BGP (Border Gateway Protocol)

Номера AS берем у IANA, AS обычно принадлежат крупным организациям. У каждой AS есть список префиксов, которые доступны в этой AS. Автономные системы связаны. Спрашиваем у соседей путь к префиксу, запоминаем пути. Грубо говоря, выбираем самый короткий маршрут.

6.5 Internet

Маленький провайдер идет к большому. Платит деньги за то, чтобы большой провайдер доставлял пакеты в интернет и возвращал ответы. Большой провайдер знает про много префиксов, рассказывает о путях до этих префиксов. Платим много денег за то, чтобы большой провайдер доставлял трафик до, например, гугла. Поэтому ниш провайдер может установить соединение с гуглом напрямую.

Есть другой вариант. Существуют организации IX (Internet Exchange). У нее есть сови AS. И мы и гугл расскажут ей свои префиксы. Здесь платим только за порт, а не за трафик. IE может доставить трафик только до тех, кто к ней подключен, в отлии от большого провайдера, который может доставить трафик куда угодно.

Как большие провайдеры жто делают: Сушествует немного Tier 1 провайдеров, к которым подключены все. Большие провайдеры платят им. Tier 1 провайдеры тоже соединены между собой. Они никому не платят за трафик.

7 DNS

label \(\le\) 63 (между точками)
name \(\le\) 254
[a-zA-Z0-9-]

Что позволяет зранить DNS:

NS — за эту хону отвечает другой сервер

Reverse DNS — узнать по IP домен. Для таких доменов есть зона .arpa.

DNS работает по:

EDNS(0) (OPT флаг):

DNSSEC:

8 L7 HTTP

GET /hello.txt HTTP/1.1
Host: example.com


URI: scheme:[//[user[:password]@]host[:port]]path[?query][#fragment]

8.1 Методы

8.2 Коды ответов

200 OK
204 No Content
301 Moved Permanently Навсего переместился, можно закэшировать
302 Found Временно перемещен
304 Not Modified Уже есть в кэше
307 Temporary Redirect
400 Bad Request
401 Unathorized
403 Forbidden
404 Not Found
413 Payload Too large
414 URI Too Long
500 Internal Server Error
502 Bad gateway Сервисы от которых сервер хочет получить ответ недоступны

8.3 Заголовки

8.4 HTTP/2

HTTP/3: QUIC вместо TCP

8.5 TLS

Сначала проверяет что оба клиента на самом деле те, кто они есть.

Perfect Forward Secrecy: Если сервер взломают и получат прошлые сессии, то нельзя будет их расшифровать. Используется что-то вроде одноразовых ключей.

8.6 CA

Certificate Authority. Просим CA подписать пару: наш публичный ключ и домен. У клиента есть список ключей всех CA, он может убедится в подлиннсти публичного ключа сервиса.

CA может подписывать ключи для промежуточных CA.

Протокол: Клиент передает:

Сервер передает:

(E)SNI

8.7 HTTPS

HSTS: Можно сказать, что к нашему серверу нельзя подключаться не по HTTPS.
HKPK: Говорим клиентам, какие сертификаты могут испольщоваться