# Сетевые уровни, модель ОСИ

Сеть содержит физические провода или радиоволны, устройства соединения, такие как коммутаторы, логические протоколы, такие как TCP/IP, пользовательские веб-страницы и электронные письма и многое другое. В каком-то смысле все это перемешано в единое целое, но на самом деле для удобства и простоты они разделены на несколько логических уровней. Каждый слой решает вполне конкретную задачу и обычно взаимодействует только со слоями, расположенными непосредственно над и под ним.

Системные администраторы часто используют словосочетания "сетевой" или "прикладной" уровни в совершенно другом смысле. Ваше сложное веб-приложение может иметь уровень базы данных, уровень хранилища и уровень веб-сервера. Это совершенно правильное использование слова "слой" и вполне уместное в вашем контексте, но имейте в виду, что сетевые специалисты имеют в виду нечто совершенно иное.

Уровни имеют решающее значение для поиска и устранения неисправностей. Когда слой ломается, он захватывает с собой все вышележащие слои. Для диагностики проблемы в сети необходимо сначала определить самый нижний слой, на котором возникла проблема. Когда вы устраните проблему на нижнем уровне, остальные уровни сети должны восстановиться - если, конечно, у вас нет нескольких одновременных проблем. Сказать "веб-сайт не работает" - это примерно то же самое, что позвонить управляющему небоскребом и сказать: "Я не могу дозвониться в пентхаус". Если горит второй этаж, то время, потраченное на устранение неполадок в замках пентхауса, будет потрачено впустую.

Уровни позволяют более точно выразить суть проблемы. На заявку о проблеме, в которой говорится: "Мой сервер упал", можно получить ответ: "Ну да, лежит". Обе стороны правы, но делу это никак не помогает. Заявка на устранение неисправности, в которой говорится: "Вот диагностический вывод, показывающий проблему третьего уровня, но второй уровень работает нормально", получит гораздо лучший ответ.

Многоуровневую модель сети часто называют сетевым стеком или стеком TCP/IP.

## Уровни

В учебниках часто рассказывается о семиуровневой модели Open Systems Interconnect (OSI), но это скорее академическая, чем реальная модель. TCP/IP гораздо лучше подходит для современных сетей, но ей не хватает некоторых деталей модели OSI. Мы представим TCP/IP в несколько измененной форме, поскольку полезно рассматривать физическую среду отдельно от протокола передачи данных поверх него. 

Для понимания современной сети, подключенной к Интернету, необходимо всего пять уровней: физический, канальный, сетевой, транспортный и прикладной. Сетевые уровни часто обозначаются часто обозначают номерами.

Далее в каждой секции приводятся релевантные ссылки на уроки мини-курса Ben Eater для углубления в тему.

### 1 Физический

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

Большинство серверов подключаются к сети с помощью кабеля Ethernet, обычно по кабелю cat5 или cat6, но иногда и по оптическому волокну. Даже если сервер использует протокол, отличный от Ethernet, например Asynchronous Transfer Mode (ATM), Token Ring, FDDI или другой, он, скорее всего, использует кабель cat5, cat6 или оптическое волокно. Очень и очень старайтесь избегать подключения серверов к локальной сети по беспроводной сети. Беспроводные сети сильно подвержены ошибкам и помехам на канальном уровне и могут быть подвержены явлениям, не зависящими от вас и даже не осознаваемыми вами.

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

[Sending digital information over a wire | Networking tutorial (1 of 13)](https://www.youtube.com/watch?v=XaGXPObx2Gs&list=PLowKtXNTBypH19whXTVoG3oKSuOcw_XeW&index=1)  
[Intro to fiber optics and RF encoding | Networking tutorial (2 of 13)](https://www.youtube.com/watch?v=lUo45NqPyq8&list=PLowKtXNTBypH19whXTVoG3oKSuOcw_XeW&index=2)  
[Clock synchronization and Manchester coding | Networking tutorial (3 of 13)](https://www.youtube.com/watch?v=8BhjXqw9MqI&list=PLowKtXNTBypH19whXTVoG3oKSuOcw_XeW&index=3)  
[Analyzing actual Ethernet encoding | Networking tutorial (4 of 13)](https://www.youtube.com/watch?v=i8CmibhvZ0c&list=PLowKtXNTBypH19whXTVoG3oKSuOcw_XeW&index=4)

### 2 Канальный

Канальный уровень преобразует верхние уровни сети в сигналы, передаваемые по проводам. В большинстве сред в качестве уровня передачи данных используется Ethernet. Один блок данных, передаваемых по каналу связи, называется кадром.

Если вы используете протокол IPv4, то на канальном уровне используются адреса Media Access Control (MAC) и протокол разрешения адресов (ARP). В IPv6 используются MAC-адреса и протокол Neighbor Discovery (ND). Если у вас возникли проблемы с обменом данными с локальной сетью, обратитесь к этим главам и проверьте наличие проблем с ARP или ND.

[The importance of framing | Networking tutorial (5 of 13)](https://www.youtube.com/watch?v=xrVN9jKjIKQ&list=PLowKtXNTBypH19whXTVoG3oKSuOcw_XeW&index=5)  
[Frame formats | Networking tutorial (6 of 13)](https://www.youtube.com/watch?v=1XrRT0CmzYw&list=PLowKtXNTBypH19whXTVoG3oKSuOcw_XeW&index=6)  
[Lower layers of the OSI model | Networking tutorial (7 of 13)](https://www.youtube.com/watch?v=MGAaTqFct_I&list=PLowKtXNTBypH19whXTVoG3oKSuOcw_XeW&index=7)  

### 3 Сетевой

Не является ли все это сетью? Да, но сетевой уровень отражает возможность соединения между хостами. Именно здесь система отвечает на вопросы типа "Как мне добраться до другого хоста? Могу ли я попасть на другой хост?". Сетевой уровень обеспечивает согласованный интерфейс для сетевых программ, чтобы они могли использовать сеть на любом физическом и канальном уровнях. Отдельный фрагмент сетевых данных называется пакетом.

В Интернете используется протокол Internet Protocol, или IP. Это IP в TCP/IP. Во всех версиях IP каждому узлу присваивается один или несколько уникальных IP-адресов, чтобы любой другой узел в сети мог его найти. Трансляция сетевых адресов (NAT) изменяет правило "уникального адреса", но где-то в вашей сети или в сети вашего провайдера у вас есть глобально уникальный IP-адрес.

Мы рассмотрим подробно далее только версию 4.

[The Internet Protocol | Networking tutorial (8 of 13)](https://www.youtube.com/watch?v=rPoalUa4m8E&list=PLowKtXNTBypH19whXTVoG3oKSuOcw_XeW&index=8)  
[ARP: Mapping between IP and Ethernet | Networking tutorial (9 of 13)](https://www.youtube.com/watch?v=aamG4-tH_m8&list=PLowKtXNTBypH19whXTVoG3oKSuOcw_XeW&index=9)
[Looking at ARP and ping packets | Networking tutorial (10 of 13)](https://www.youtube.com/watch?v=xNbdeyEI-nE&list=PLowKtXNTBypH19whXTVoG3oKSuOcw_XeW&index=10)  
[Hop-by-hop routing | Networking tutorial (11 of 13)](https://www.youtube.com/watch?v=VWJ8GmYnjTs&list=PLowKtXNTBypH19whXTVoG3oKSuOcw_XeW&index=11)  


### 4 Транспортный

Данные, о которых вы заботитесь, передаются на транспортном уровне. Нижние уровни стека существуют для поддержки транспортного уровня. Фрагмент данных транспортного уровня - это сегмент. Три наиболее распространенных протокола транспортного уровня - это протокол управляющих сообщений Интернета (ICMP), протокол управления передачей (TCP) и протокол пользовательских датаграмм (UDP).

ICMP обрабатывает низкоуровневые сообщения о соединениях между хостами. Каждый хост, реализующий IP, должен также поддерживать ICMP. Хотя запросы ping являются наиболее известным типом ICMP-трафика, многие основные функции Интернета полагаются на ICMP. Если сообщение уровня datalink (кадр) слишком велико, жалоба передается по протоколу ICMP. С помощью ICMP хосты отвечают на запросы ping и сообщают трафику, что нужно идти в другую сторону. Одностороннее блокирование всех ICMP - хороший способ сломать приложения.1 Большую часть времени ICMP работает
В большинстве случаев ICMP работает в фоновом режиме.

UDP и TCP обеспечивают передачу прикладных данных между узлами. Они настолько распространены, что набор протоколов Интернета обычно называют TCP/IP. (UDP/TCP/IP слишком громоздки.) UDP, или User Datagram Protocol, предоставляет минимальные услуги, необходимые для передачи данных по сети. Хотя люди шутят, что U в UDP означает "ненадежный", он предназначен для приложений, где надежность обеспечивается приложением, а не сетью. Протокол TCP, или Transmission Control Protocol, включает в себя проверку ошибок, управление перегрузками и повторную передачу потерянных данных, но ему не хватает гибкости и простоты UDP.

[TCP: Transmission control protocol | Networking tutorial (12 of 13)](https://www.youtube.com/watch?v=4IMc3CaMhyY&list=PLowKtXNTBypH19whXTVoG3oKSuOcw_XeW&index=12)  
[TCP connection walkthrough | Networking tutorial (13 of 13)](https://www.youtube.com/watch?v=F27PLin3TV0&list=PLowKtXNTBypH19whXTVoG3oKSuOcw_XeW&index=13)


### 5 Прикладной (сессионный, представления, приложения)

В заголовке перечислены их названия согласно теоретической модели ОСИ. Сессионный уровень отвечает за открытие, использование и закрытие соединений транспортного уровня. Уровень представления отвечает за обмен данными между приложениями. На уровне приложения работает протокол передачи данных приложения. На практике всё зависит от поставщика приложения, который может реализовать чёткое разделение ответственности по слоям или смешать всё воедино.

Примерами протоколов высших слоёв являются: `HTTP`, `SMTP`, `LDAP`.

[DNS: Why was Facebook down for five hours?](https://www.youtube.com/watch?v=-wMU8vmfaYo&list=PLowKtXNTBypH19whXTVoG3oKSuOcw_XeW&index=14)


# Работа сети на примере

В данном примере отследим путь ICMP пакета по сети из точки A в точку B с топологией сети изображённой ниже. Рёбра этого графа - провода, а узлы - компьютеры или роутеры. Это также пример автономной системы, например автономная система провайдера. Автономная система - группа сетей, находящихся под административным или политическим контролем одного юридического лица.
```
68:56:35:8e:2c:2d                                                                                      04:f1:3e:6c:86:ad
192.168.9.2/24                                                                                           192.168.20.2/24
               │                10.0.13.2┌───┐                                                        │    ┌───┐
      ┌───┐    │                   ┌─────┤   │                                                        ├────┤ B │
      │ A ├────┤                   │     └───┘                                                        │    └───┘
      └───┘    │                   │     Уфа                                                          │
               │                   │                                                                  │    ┌───┐
      ┌───┐    │68:56:35:8e:5b:74  │10.0.13.1                                                         ├────┤   │
      │   ├────┤  192.168.9.1/24 ┌─┴─┐     10.0.15.2┌───┐                10.0.21.2┌───┐               │    └───┘
      └───┘    ├─────────────────┤   ├──────────────┤   ├─────────────────────────┤   ├───────────────┤
               │                 └───┘10.0.15.1     └─┬─┘10.0.21.1                └─┬─┘192.168.20.1/24│    ┌───┐
      ┌───┐    │                Самара                │                             │                 ├────┤   │
      │   ├────┤                                      │  10.0.16.2 ┌───┐    10.0.8.2│                 │    └───┘
      └───┘    │                                      └────────────┤   ├────────────┘                 │
               │                                      10.0.16.1    └───┘10.0.8.1                      │    ┌───┐
               │                                    Москва        Рыбинск         Питер               |────┤   │
               |                                                                                      |    └───┘
      Ethernet сеть 1 (4 хоста)                                                             Ethernet network 2 (5 хостов)
```

Как мы можем отправить информацию от хоста A хосту B? Рассмотрим что произойдёт при запуске команды ping.

### Ethernet

При настройке сетевой карты в системе заполняются 3 параметра: ip адрес хоста, ip адрес шлюза, маска сети. Маска сети - общие первые N бит адреса для хостов сети. Когда пакет посылается хосту B хост A видит, что первые N бит этого адреса отличаются от первых N бит его адреса из локальной сети, и отправляет ethernet пакет c ip пакетом внутри шлюзу. Шлюз - это узел, подключенный к нескольким сетям. 

Кадр Ethernet начинается со специальной последовательности Preamble/SFD, которая позволяет принимающей стороне однозначно определить с какого бита в канале связи начинается пакет. 

Затем следует MAC адрес назначения. В случае если адрес назначения неизвестен, кадр может быть адресован всем устройствам в локальной сети по адресу ffffffffffff.

Пример заголовка Ethernet кадра для широковещательного запроса - поле Destination Address заполняется единицами.
```
| Preamble/SFD | Destination Address | Source Address | Ether Type        | Payload | Frame check sequence |
|--------------|---------------------|----------------|-------------------|---------|----------------------|
| 1010....1011 |  ffffffffffff       |  6856358e2c2d  | 0806 (ARP packet) |         |                      |
```

Чтобы отправить ethernet пакет шлюзу, нужно знать его MAC адрес. Для поиска устройства в локальной сети с заданным IP адресом используется ARP (address resolution protocol) протокол. В сети может быть два типа ARP пакетов: широковещательный запрос с просьбой ответить на вопрос "У кого назначен 192.168.9.1?".

Пример заголовка ARP сообщения (помещается в Payload Ethernet кадра) для установки соответствия между Ethernet адресом и IP адресом
```
| HW Address Type | Protocol Addr Type | HW Address Length | Protocol Addr Len | OP Code                            | 
|-----------------|--------------------|-------------------|-------------------|------------------------------------| 
| 1 (Ethernet)    | 0800 (IP)          | 6 (для Ethernet)  | 4 (для IP)        | 1 (2 для ответа)                   |     


| Hadrware Address of Sender | Protocol Address of Sender | Hardware Address of Target | Protocol Address of Target |
|----------------------------|----------------------------|----------------------------|----------------------------|
| 6856358e2c2d               | 192.168.9.2                | 000000000000               | 192.168.9.1                |
```
При запросе поле "Hardware Address of Target" заполняется нулями, а в ARP ответе хост A получит "68:56:35:8e:5b:74". Получив ответ, хост A с этого момента может отправлять ip пакеты шлюзу для его дальнейшей маршрутизации. 

Источники:
- https://datatracker.ietf.org/doc/html/rfc894
- https://www.youtube.com/watch?v=aamG4-tH_m8&list=PLowKtXNTBypH19whXTVoG3oKSuOcw_XeW&index=9

### IP

Хорошо, мы понимаем пакет найдёт путь по локальной Ethernet сети до роутера. Как ему достичь другой Ethernet сети на другом конце интернета?

Для начала подготовим ICMP пакет к отправке. Для этого заполним следующие поля.

ICMP Header (Protocol code = 1)
```
0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Type      |     Code      |          Checksum             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       unused / Pointer / Gateway Internet Address             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      Internet Header + 64 bits of Original Data Datagram      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
```

ICMP пакет будет вложен в IP пакет, который будет вложен в Ethernet пакет. Однако это не значит, что размер IP пакета должен быть меньше Ethernet пакета. В случае превышения MTU (размера Ethernet пакета), IP пакет будет фрагментирован на несколько Ethernet пакетов.

IP заголовок
```
0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version|  IHL  |Type of Service|          Total Length         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         Identification        |Flags|      Fragment Offset    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Time to Live |    Protocol   |         Header Checksum       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Source Address                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Destination Address                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Options                    |    Padding    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
```

Пример заголовка Ethernet кадра для передачи IP пакета.
```
| Preamble/SFD | Destination Address | Source Address | Ether Type        | Payload | Frame check sequence |
|--------------|---------------------|----------------|-------------------|---------|----------------------|
|              |  ffffffffffff       |  6856358e2c2d  | 0800 (IP packet)  |         |                      |
```

Задача сетевого уровня обеспечить маршрутизацию пакета от компьютера одной локальной сети до компьютера другой не зависимо от технологий, используемых в локальных сетях. Для этого компьютерам назначается глобальный IP адрес. Количество хостов в IPv4 2^32. Количество хостов в IPv6 2^128. Чтобы эффективно маршрутизировать пакеты между сетями адресное пространство в начале был разделено на блоки разного разметра, называемые классами. Это означало, что первые N бит характеризовали сеть, а оставшиеся хост в сети. Однако фиксированное разделение приводило к неэффективному расходованию адресов, поэтому вскоре вышел стандарт бесклассовой адресации CIDR, который позволял владельцам уже имеющим большие блоки адресов делить их самостоятельно на подсети с помощью маски подсети, которая состояля из единиц в первых N битах.

Чтобы проложить маршрут роутеры между двумя локальными сетями обмениваются информацией, наподобие того как обнаруживают другу друга компьютеры в локальной сети. После обмена информацией о сетях (ip адреса портов роутера с масками подсетей) каждый роутер формирует таблицу маршрутизации. Протоколы маршрутизации внутри автономных систем:
- RIP,
- OSPF,
- EIGRP.

Существует также возможность внести маршрут в данную таблицу вручную.

Таблица говорит, о том какие сети существуют за каждым подключенным портом. Так что, пакет попавший на роутер Самара на порт 1 слева согласно таблице отправляется на порт 2 справа. Аналогичное действие происходит на каждом роутере в цепи Самара-Москва-Питер, пока пакет не попадёт в целевую локальную Ethernet сеть 192.168.20.0. Hop-by-hop маршрутизация фундаметальная характеристика сетевого слоя и IP протокола. 

Глобальная сеть Интернет объединяет множество автономных систем. Специфика масштаба маршрутизации между АС требует использования другого оборудования и других протоколов маршрутизации между автономными системами. В данный момент используется в основном BGP.

ICMP используется не только для проверки доступности хостов командой `ping`. Это все возможные типы сообщений и их коды:
- Destination Unreachable Message (3)
- Source Quench Message (4)
- Redirect Message (5)
- Echo or Echo Reply Message (8)
- Time Exceeded Message (11)
- Parameter Problem Message (12)
- Timestamp or Timestamp Reply Message (14)
- Information Request/Information Reply Message (15/16)

Источники:
- IP RFC https://www.ietf.org/rfc/rfc792.txt
- ICMP RFC https://www.ietf.org/rfc/rfc792.txt
- https://www.youtube.com/watch?v=VWJ8GmYnjTs&list=PLowKtXNTBypH19whXTVoG3oKSuOcw_XeW&index=11

# Передача данных приложений по сети

Иерархия протоколов
```
       +------+ +-----+ +-----+       +-----+                    
       |Telnet| | FTP | |Voice|  ...  |     |  Application Level 
       +------+ +-----+ +-----+       +-----+                    
             |   |         |             |                       
            +-----+     +-----+       +-----+                    
            | TCP |     | RTP |  ...  |     |  Host Level        
            +-----+     +-----+       +-----+                    
               |           |             |                       
            +-------------------------------+                    
            |    Internet Protocol & ICMP   |  Gateway Level     
            +-------------------------------+                    
                           |                                     
              +---------------------------+                      
              |   Local Network Protocol  |    Network Level     
              +---------------------------+                      

                         Protocol Relationships
```

Для передачи пользовательских нужно подняться на один уровень выше, на транспортный уровень, до протоколов TCP и UDP.

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

Протокол UDP является протоколом без гарантии доставки. Используется при доставке аудио и видео данных, так как отдельные потерянные пакеты не сильно влияют на опыт использования, а отстуствие инициализации соединения и контроля за доставкой приводит к меньшим задержкам.

## UDP

Протокол User Datagram Protocol (UDP) определен для обеспечения дейтаграммного режима передачи данных с коммутацией пакетов в наборе взаимосвязанных компьютерных сетей. Протокол предполагает, что в качестве базового протокола используется протокол Internet Protocol (IP).

Этот протокол предоставляет прикладным программам процедуру отправки сообщений другим программам с минимальным использованием протокольного механизма.  Протокол ориентирован на транзакции, поэтому доставка и защита от дублирования не гарантируются. Приложения, требующие упорядоченной надежной доставки потоков данных, должны использовать протокол управления передачей (TCP).

UDP header 
```
  0      7 8     15 16    23 24    31 
  +--------+--------+--------+--------+
  |          source address           |
  +--------+--------+--------+--------+
  |        destination address        |
  +--------+--------+--------+--------+
  |  zero  |protocol|   UDP length    |
  +--------+--------+--------+--------+     

  0      7 8     15 16    23 24    31  
  +--------+--------+--------+--------+ 
  |     Source      |   Destination   | 
  |      Port       |      Port       | 
  +--------+--------+--------+--------+ 
  |                 |                 | 
  |     Length      |    Checksum     | 
  +--------+--------+--------+--------+ 
  |                                     
  |          data octets ...            
  +---------------- ...                 
```                                    

Второй псевдозаголовок концептуально является префиксом к заголовку UDP и содержит адрес источника, адрес назначения, протокол и длину UDP. Эта информация обеспечивает защиту от ошибочной маршрутизации дейтаграмм. Эта процедура контрольной суммы аналогична той, что используется в TCP.

Источники:
- UDP RFC https://www.ietf.org/rfc/rfc768.txt

## TCP

Приведём подробнее формат заголовка TCP пакета.

TCP header (ethernet protocol code = 6)
```
0                   1                   2                   3   
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Source Port          |       Destination Port        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Sequence Number                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Acknowledgment Number                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Data |           |U|A|P|R|S|F|                               |
| Offset| Reserved  |R|C|S|S|Y|I|            Window             |
|       |           |G|K|H|T|N|N|                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Checksum            |         Urgent Pointer        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Options                    |    Padding    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                             data                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
```

Поддержание TCP-соединения требует запоминания нескольких переменных. Эти переменные хранятся в записи соединения, называемой блоком управления передачей или TCB.

Диаграмма установки соединения
```
                              +---------+ ---------\      active OPEN  
                              |  CLOSED |            \    -----------  
                              +---------+<---------\   \   create TCB  
                                |     ^              \   \  snd SYN    
                   passive OPEN |     |   CLOSE        \   \           
                   ------------ |     | ----------       \   \         
                    create TCB  |     | delete TCB         \   \       
                                V     |                      \   \     
                              +---------+            CLOSE    |    \   
                              |  LISTEN |          ---------- |     |  
                              +---------+          delete TCB |     |  
                   rcv SYN      |     |     SEND              |     |  
                  -----------   |     |    -------            |     V  
 +---------+      snd SYN,ACK  /       \   snd SYN          +---------+
 |         |<-----------------           ------------------>|         |
 |   SYN   |                    rcv SYN                     |   SYN   |
 |   RCVD  |<-----------------------------------------------|   SENT  |
 |         |                    snd ACK                     |         |
 |         |------------------           -------------------|         |
 +---------+   rcv ACK of SYN  \       /  rcv SYN,ACK       +---------+
   |           --------------   |     |   -----------                  
   |                  x         |     |     snd ACK                    
   |                            V     V                                
   |  CLOSE                   +---------+                              
   | -------                  |  ESTAB  |                              
   | snd FIN                  +---------+                              
   |                   CLOSE    |     |    rcv FIN                     
   V                  -------   |     |    -------                     
 +---------+          snd FIN  /       \   snd ACK          +---------+
 |  FIN    |<-----------------           ------------------>|  CLOSE  |
 | WAIT-1  |------------------                              |   WAIT  |
 +---------+          rcv FIN  \                            +---------+
   | rcv ACK of FIN   -------   |                            CLOSE  |  
   | --------------   snd ACK   |                           ------- |  
   V        x                   V                           snd FIN V  
 +---------+                  +---------+                   +---------+
 |FINWAIT-2|                  | CLOSING |                   | LAST-ACK|
 +---------+                  +---------+                   +---------+
   |                rcv ACK of FIN |                 rcv ACK of FIN |  
   |  rcv FIN       -------------- |    Timeout=2MSL -------------- |  
   |  -------              x       V    ------------        x       V  
    \ snd ACK                 +---------+delete TCB         +---------+
     ------------------------>|TIME WAIT|------------------>| CLOSED  |
                              +---------+                   +---------+
```

Временная диаграмма установки соединения, передачи данных и закрытия соединения
```
   Клиент                Сервер
   192.168.9.2:1234      192.168.20.2:80

          │    SYN seq=0      │
          ├──────────────────►│
          │                   │
          │  SYN,ACK=1  seq=0 │   УСТАНОВКА
          │◄──────────────────┤   СОЕДИНЕНИЯ
          │                   │
          │  ACK=1  seq=1     │
          ├──────────────────►│
          │                   │
          │───────────────────┼───────────────
          │                   │
          │ пакет с данными   │
          │ длиной 22 байта   │
          │ seq=1             │   ПЕРЕДАЧА
          │◄──────────────────┤   ДАННЫХ
          │                   │
          │ ACK=1 seq=23      │
          ├──────────────────►│
          │                   │
          │───────────────────┼────────────────
          │                   │
          │  FIN,ACK=1 seq=23 │
          │◄──────────────────┤
          │                   │
          │  ACK=24 seq=1     │
          ├──────────────────►│   ЗАКРЫТИЕ
          │                   │   СОЕДИНЕНИЯ
          │  FIN,ACK=24 seq=1 │
          │──────────────────►│
          │                   │
          │  ACK=2 seq=24     │
          │◄──────────────────┤
          │                   │
          │                   │
          v                   v
```

Попробуйте получить похожий лог для любого TCP соединения у себя на хосте с помощью утилит `tcpdump` или `wireshark`.

Источники:
- TCP RFC https://www.ietf.org/rfc/rfc793.txt
- https://www.youtube.com/watch?v=4IMc3CaMhyY&list=PLowKtXNTBypH19whXTVoG3oKSuOcw_XeW&index=12


# DHCP

Кто назначает IP адреса на сетевые порты? 

Администратор может назначить их вручную или автоматически с помощью DHCP.

DHCP предназначен для предоставления DHCP-клиентам параметров конфигурации, определенных в RFC «Требования к хосту». После получения параметров через DHCP клиент DHCP должен иметь возможность обмениваться пакетами с любым другим хостом в Интернете.

DHCP состоит из двух компонентов: протокола для доставки специфичных для хоста параметров конфигурации от DHCP-сервера к хосту и механизма выделения сетевых адресов хостам.

Временная диаграмма автоматического получения IP адреса.
```
    Server          Client          Server
(not selected)                    (selected)

        v               v               v
        |               |               |
        |     Begins initialization     |
        |               |               |
        | _____________/|\____________  |
        |/DHCPDISCOVER  | DHCPDISCOVER \|
        |               |               |
    Determines          |          Determines
    configuration       |         configuration
        |               |               |
        |\              |  ____________/|
        | \________     | /DHCPOFFER    |
        | DHCPOFFER\    |/              |
        |           \   |               |
        |       Collects replies        |
        |              \|               |
        |     Selects configuration     |
        |               |               |
        | _____________/|\____________  |
        |/ DHCPREQUEST  |  DHCPREQUEST\ |
        |               |               |
        |               |     Commits configuration
        |               |               |
        |               | _____________/|
        |               |/ DHCPACK      |
        |               |               |
        |    Initialization complete    |
        |               |               |
        .               .               .
        .               .               .
        |               |               |
        |      Graceful shutdown        |
        |               |               |
        |               |\ ____________ |
        |               | DHCPRELEASE  \|
        |               |               |
        |               |        Discards lease
        |               |               |
        v               v               v
```

Источники:
- https://www.rfc-editor.org/rfc/rfc2131

# DNS

Основная функция DNS хранить связь между IP адресом и человеко-читаемым именем. DNS система - это распределённая база данных.

Хост может участвовать в системе доменных имен несколькими способами: в зависимости от того, запускает ли хост программы, извлекающие информацию из доменной системы, серверы имен, отвечающие на запросы других хосты или различные комбинации обеих функций. 

Схема работы DNS с точки зрения клиентского хоста:
```
                Локальный хост                 |  Хосты сети
                                               |
+---------+               +----------+         |  +--------+
|         | user queries  |          |queries  |  |        |
|  User   |-------------->|          |---------|->|Foreign |
| Program |               | Resolver |         |  |  Name  |
|         |<--------------|          |<--------|--| Server |
|         | user responses|          |responses|  |        |
+---------+               +----------+         |  +--------+
                            |     A            |
            cache additions |     | references |
                            V     |            |
                            +----------+       |
                            |  cache   |       |
                            +----------+       |
```

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

Схема работы сервера имён:
```
             Локальный хост                    |  Хосты сети
                                               |
  +---------+                                  |
 /         /|                                  |
+---------+ |             +----------+         |  +--------+
|         | |             |          |responses|  |        |
|         | |             |   Name   |---------|->|Foreign |
|  Master |-------------->|  Server  |         |  |Resolver|
|  files  | |             |          |<--------|--|        |
|         |/              |          | queries |  +--------+
+---------+               +----------+         |
                            A     |maintenance |  +--------+
                            |     +------------|->|        |
                            |      queries     |  |Foreign |
                            |                  |  |  Name  |
                            +------------------|--| Server |
                         maintenance responses |  +--------+
```

Таблица 1. Типы записей сервера имён
|TYPE|            value | meaning|
|---|---|----|
|A               |1 |a host address|
|NS              |2 |an authoritative name server|
|MD              |3 |a mail destination (Obsolete - use MX)|
|MF              |4 |a mail forwarder (Obsolete - use MX)|
|CNAME           |5 |the canonical name for an alias|
|SOA             |6 |marks the start of a zone of authority|
|MB              |7 |a mailbox domain name (EXPERIMENTAL)|
|MG              |8 |a mail group member (EXPERIMENTAL)|
|MR              |9 |a mail rename domain name (EXPERIMENTAL)|
|NULL            |10| a null RR (EXPERIMENTAL)|
|WKS             |11| a well known service description|
|PTR             |12| a domain name pointer|
|HINFO           |13| host information|
|MINFO           |14| mailbox or mail list information|
|MX              |15| mail exchange|
|TXT             |16| text strings|

Проект, в котором можно поэкспериментировать с DNS https://messwithdns.net/.

Источники:
- https://datatracker.ietf.org/doc/html/rfc1035
- https://www.youtube.com/watch?v=-wMU8vmfaYo&list=PLowKtXNTBypH19whXTVoG3oKSuOcw_XeW&index=14

# Troubleshooting

Таблица 1. Утилиты для отладки проблем с сетью
| Уровень | Название утилит |
|---------|-----------------|
| 1 Физический | лампочка порта, ip/ipconfig/ifconfig, замена кабеля |
| 2 Канальный | arp, ND, tcpdump, arpping |
| 3 Сетевой | ip, traceroute, ping, netstat, nmap, ss, SmokePing, iperf, ipcalc |
| 4 Транспортный | netstat, ss, telnet, ifstat |
| 5 Прикладной (сессионный, представления, приложения) | telnet, nmap, curl, wget, postman |



Источники:
- Michael Lucas. Networking for System Administrator
- https://www.youtube.com/playlist?list=PLowKtXNTBypH19whXTVoG3oKSuOcw_XeW 
- https://www.brendangregg.com/linuxperf.html 