1 Историческая справка
Если узел A хочет поговорить с узлом B, в промежуточных узлах буквально соединялся физически провод (линк), это называется канальной коммутацией.
Будем разбивать данные на кусочки, предавать следующему узлу вместе с информацией куда надо доставить — пакетная коммутация. Есть некоторые проблемы:
- У узла может забится буфер
- Пакеты могу призордит в другом порядке
- Пакет может заблудиться
2 База
Интернет — мнго независимых сетей, которые общаются друг с другом.
Виды линков:
- Витая пара
- Коаксиальные провода (как кабельное тв)
- Оптический кабель (пластик/стекло)
- Радио (WiFi, 4g, спутники)
Две задачи:
- Форвардинг (пересылка)
Кому дальше пересылать - Маршрутизация
Строить таблицы для форвардинга
Аналогия: Маршрутищация — построить путь из одного города в другой, форвардинга — для каждого промежуточного города, по какой дороге из него выехать
Congestion controls — решение проблемы забития очереди, когда входной канал шире чем выходной. Когда очередь заканчивается, пакеты теряются. Хочется знать с какой скороситью отправлять, чтобы очередей не возникало
Протоколы:
- RFC: Request for Comments Сначала появляется драфт, на него не стоит опираться
- IETF: Internet Engineering Task Force
- ISO: International Organization for Standartiozation Стандарты, Например ISO 8601 (формат даты)
Типичные слои:
- Applicaiton: HTTP, IMAP, DNS
- Transport: TCP, UDP
- Network: IP, кастомные внутри железок
Марщрутиация пакетов от отправителя к получателю - Link: Ethernet, WiFi, PPP (DSL, Dial-Up)
Передача данных между соседними узлами - Physical
OSI model:
- L7
- Application
- L6
- Presentation
- L5
- Session
- L4
- Transport
- L3
- Network
- L2
- Link
- L1
- Physical
3 L3 IP
- IPv4
32 bits
Пример:87.250.250.242
- IPv6
128 bits
Примеры:2a02:06b8:0000:0000:0000:0000:0002:0242
2a02:6b8::2:242
::ffff:87.250.250.242
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
- 10.1.3.0 во второе правило
- 10.10.10.10 во второе
- 10.200.1.1 в первое
Как получить IP: IANA выдает IP адреса.
3.1 Специальные IP адреса
- Loopback
127.0.0.0/8
::1/128
0.0.0.0/8
(::/128
)
Приватные адресы для локальной сети
192.168.0.0/16
172.16.0.0/12
10.0.0.0/8
100.64.0.0/10
fd00::/8
Должны быть видаfd:<56 случайных бит>::/64
Link local (Значат что не настроено):
169.254.0.0/16
fe80::/10
Broadcast:
87.250.250.0/23
82.250.251.255
— Directed broadcast (работает только в локальной сети)
255.255.255.255/32
— Local network broadcast (работает только в локальной сети)
Multicast:
224.0.0.0/4
224.0.0.1
— подписка на адрес в этой сети
ff00::/8
Version | 4 либо 6 |
IHL | длина заголовка |
Next Header | Что дальше: TCP, UDP, расширение, .. |
Total/Payload length | Размер после/вместе с заголовком |
Минимальный размер
- IPv4
768
байт - IPv6
1506
байт
Flags (More Fragments), Fragment offset — фрагментация пакета. Если получатель не поддреживает фрагменты, то это проблема клиента. Решение — уменьшить размер пакета. Можно поставить флаг, чтобы промежуточные узлы не фрагментировали пакет
NB: Jumbograms — переписать размер пакета, гораздо большим числом
3.2 Nat
Как ходить в интернет с локальным адресом.
3.3 ICMP
Поверх протокола IP.
- Echo request
- Echo reply
- Destination unreachable
- Destination host unreachable - не дошел
- Destionation port unreachable - дошел до конечной точки, но не смог отдать на уровень выше
- Destination network unreachable - не дошел
- Fragmentation required - пакет слишком большой
- Time Exceeded
Traceroute— Все промежуточные узлы должны отправить обратно пакет
4 L2
Ethernet, WiFi.
Broadcast MAC Address: ff:ff:ff:ff:ff:ff
Как передаются эти сообщения. Компьютеры подключены к коробочке. Коробочки бывают разные:
- Хаб (L1)
- Коммутатор (свитч) L2
Запоминает MAC адрес для каждого порта, то есть получатель должен отправить что-то, чтобы его запомнили. Есть некоторые проблемы с циклами - Маршрутизатор L3
Хотим узнавать по IP адресу MAC адрес. Отправляем ARP запрос на MAC
broadcast: Who has 1.2.3.4
? Если такое устройство есть, оно отправляет
нам свой MAC.
NB: arp -n
— получить локальную таблицу MAC адресов
Для IPv6 NDP (Neighbor Discrovery Protocol). Работает поверх IP.
- Address resolution
- Router discovery
- Redirection
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’ать сразу кусок данных, дожидаясь еще по таймауту.
Как клинту сообщить серверу, что пакет потерялся:
- Fast Retransmit
Если какой-то пакет посередине потерялся, то отправялем ACK x, где x — последний пакет, до которого получено все по порядку. - Selective Acknowledgments
Как увеличивать окно:
AIMD (исторический алгоритм):
ok: cwnd += 1 not ok: cwnd /= 2
BIC
Увеличиваем по параболеCUBIC
Увеличиваем по кубической параболеBBR
Отступить не когда уже потеряли пакет, а когда подходим к этому моменту. BBR 1 забивал CUBIC, BBR 2 решил эту проблему, но в сети остаются старые протоколы.
Флаг ECE (congestion echo) в TCP от клиента означает, что произошел затык на пути к клиенту. Клиент узнает по флагу ECN (congestion notice) в IP пакете.
Затые может произойти у клиента в железе. В ответе серверу можем попросить его ограничить его окно, в том числе поставить 0.
Проверяем что клиент не спуфит адреса. Все ок, если сервер выполняет меньше работы чем клиент. Можем выдавать SYN Cookie, чтобы следующее подключение происходило сразу.
Когда соединение закрывается, обе стороны, грубо говоря, должны послать FIN.
Фаг PUSH, говорит сразу отдать пакеты из буфера приложению.
6 Routing
- Static routing
- Link state
Строим карту сети, владея информацией о всей сети, строим маршруты - Distance vector
Принимаем информацию от соседей, принимают решения локально - Software-defined network
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)
- eBGP, Autonomous System (AS)
- iBGP
- TCP port
179
Номера AS берем у IANA, AS обычно принадлежат крупным организациям. У каждой AS есть список префиксов, которые доступны в этой AS. Автономные системы связаны. Спрашиваем у соседей путь к префиксу, запоминаем пути. Грубо говоря, выбираем самый короткий маршрут.
- Не принимаем пути, которые содержат нашу AS
- У AS есть доп информация (16 битная чиселка). Соседи сами договариваются что оно значит.
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:
A
— IPv4 адресAAAA
— IPv6 адресCNAME
— алиас для другого имениTXT
— произвольный текстMX
— почтовый сервер
NS
— за эту хону отвечает другой сервер
Reverse DNS — узнать по IP домен. Для таких доменов есть зона .arpa
.
DNS работает по:
UDP
на порту53
(ограничено 512 байт)TCP
на порту53
- DNS over TLS
- DNS over HTTPS
EDNS(0) (OPT флаг):
- Можно больше 512 байт по UDP
- EDNS — если спрашиваем через рекурсивные DNS, то они прокидывают IP того кто спрашивает
DNSSEC:
- RRSIG – подпись
- DNSSEC — публичный ключ
- DS — делигирование DNSSEC другой зоне
- NSEC/NSEC3 — Домен не существует
8 L7 HTTP
GET /hello.txt HTTP/1.1
Host: example.com
URI: scheme:[//[user[:password]@]host[:port]]path[?query][#fragment]
8.1 Методы
GET
(идемпотентный)HEAD
— только загловки (идемпотентный)POST
PUT
DELETE
TRACE
OPTIONS
CONNECT
PATCH
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 Заголовки
Connection: Keep-Alive
— не закрывать TCP соединениеAccept-Encoding: gzip, deflated
— как можно сжать данныеRefresh: 5; url=https://example.com
— через время отправит на другую страницуIf-Modified-Since: <date>
— отдать, если файл менялся с этого времениLast-Modified: <date>
— когда последний аз менялсяRange: bytes 1234-1345
— попросить файл не целиком, а определенный фрагмент
8.4 HTTP/2
- SPDY
Google внедрил в свои продукты - Multiplexing
Позволяет получать несколько файлов в одном соединении - Server push
Когда клиент просит страничку, сервер отдает еще и нужные файлы - Only encrypted transport
HTTP/3: QUIC вместо TCP
8.5 TLS
Сначала проверяет что оба клиента на самом деле те, кто они есть.
- 1.2
RSA или Диффи-Хелман - 1.3
Диффи-Хэлман
Perfect Forward Secrecy: Если сервер взломают и получат прошлые сессии, то нельзя будет их расшифровать. Используется что-то вроде одноразовых ключей.
8.6 CA
Certificate Authority. Просим CA подписать пару: наш публичный ключ и домен. У клиента есть список ключей всех CA, он может убедится в подлиннсти публичного ключа сервиса.
CA может подписывать ключи для промежуточных CA.
Протокол: Клиент передает:
- Список поддерживаемых шифров
- рандом
- Расширения
Сервер передает:
- Выбранный шифр
- рандом
- Расширения
(E)SNI
8.7 HTTPS
HSTS: Можно сказать, что к нашему серверу нельзя подключаться не по HTTPS.
HKPK: Говорим клиентам, какие сертификаты могут испольщоваться