Сетевые интерфейсы
Сетевые интерфейсы создаются автоматически для каждого обнаруженного сетевого устройства при загрузке ядра ОС.
eth — сетевой интерфейс к карте Ethernet или картам WaveLan (Radio Ethernet).
Каждый интерфейс характеризуется определёнными параметрами, необходимыми для обеспечения его функционирования и для сетевого обмена данными по протоколу IP.
Параметры интерфейса
- DEVICE: Имя интерфейса.
- IPADDR: IP-адрес, соответствующий данному сетевому интерфейсу. Пакеты, отправленные по этому адресу, поступят на соответствующий интерфейс.
- NETMASK: Битовая маска, необходимая для вычисления маршрута передачи IP-пакета.
- BROADCAST: Адрес, используемый при широковещательной рассылке пакетов через интерфейс.
- Метрика: Условная характеристика интерфейса соответствующая уровню затрат при передаче информации через него. Используется при маршрутизации пакетов, для выбора оптимального маршрута.
- MTU: Maximum Transfer Unit. Максимальный размер блока данных обрабатываемого интерфейсом. Наибольшее значение MTU определяется типом интерфейса (например, для Ethernet MTU=1500), но может быть искусственно снижено.
- MAC-адрес: Аппаратный адрес сетевого устройства, соответствующего интерфейсу (для которых это имеет смысл).
Кроме этих параметров интерфейс характеризуется ещё:
- Флагами, которые определяют состояния устройства, например такие как: включен ли интерфейс (Up/Down), находится ли он в неразборчивом режиме (promiscuous/nonpromiscuous).
- Аппаратными характеристиками, такими как адрес памяти, номер IRQ, DMA, порт ввода/вывода.
- Статистической информацией, характеризующей различные аспекты работы интерфейса. Например, количество переданных/полученных байтов/пакетов, число переполнений, коллизий и др. с момента создания интерфейса.
Конфигурационные файлы и настройка IPv4
Debian/Ubuntu
Настройки сетевого интерфейса указываются в конфигурационном файле /etc/network/interfaces :
auto eth0 iface eth0 inet static address 123.123.123.123 netmask 255.255.255.0 gateway 123.123.123.0 dns-nameservers 141.8.194.254 141.8.197.254
Ubuntu 16.04 LTS
Директивы сетевого интерфейса записываются в файл /etc/network/interfaces . В отличие от Debian и Ubuntu более ранних версий, интерфейсы именуются с префиксом ens , например — ens3 :
auto ens3 iface ens3 inet static address 123.123.123.123 netmask 255.255.255.0 gateway 123.123.123.1 dns-nameservers 141.8.194.254 141.8.197.254
Ubuntu 18.04 LTS
В этой версии ОС сеть может задаваться не с помощью networking, а с помощью утилиты netplan.
Конфигурационный файл сетевого интерфейса расположен в каталоге: /etc/netplan/50-cloud-init.yaml . Описание интерфейса выглядит следующим образом:
network: version: 2 ethernets: ens3: addresses: - 185.185.68.210/22 gateway4: 185.185.68.1 nameservers: addresses: - 141.8.194.254 - 141.8.197.254
Для применения изменений необходимо выполнить команду netplan apply. Она проверяет конфигурационный файл на наличие ошибок, применяет изменения и автоматически перезагружает интерфейс.
Redhat/Fedora/CentOS
В Redhat, Fedora или CentOS директория, отвечающая за присвоение постоянных IP-адресов — это /etc/sysconfig/network-scripts . В данной директории необходимо создать файл, соответствующий вашему новому виртуальному интерфейсу. Например, на наших боксах подобный файл будет называться ifcfg-eth0:0 .
/etc/sysconfig/network-scripts — каталог, содержащий конфигурационные файлы интерфейсов и скрипты, выполняющие их инициализацию.
/etc/sysconfig/network-scripts/ifup — скрипт, который выполняет настройку и активацию интерфейса.
/etc/sysconfig/network-scripts/ifdown — скрипт, который выполняет деактивацию интерфейса.
/etc/sysconfig/network-scripts/ifcfg-* — конфигурационные файлы, описывающие интерфейсы системы.
/etc/init.d/network — скрипт, выполняющий настройку сетевых интерфейсов и маршрутизации при загрузке.
/etc/sysconfig/network — конфигурационный файл, содержащий имя хоста, IP-адрес основного шлюза и IP-адреса основного и вспомогательного DNS-серверов:
TYPE=Ethernet NAME=eth0 DEVICE=eth0 ONBOOT=yes DNS1=141.8.194.254 DNS2=141.8.197.254 NETMASK=255.255.255.0 BOOTPROTO=static IPADDR=123.123.123.123 GATEWAY=123.123.123.1
IPv6
Адрес можно добавить на тот же интерфейс, что и IPv4, новый создавать не нужно.
На нашей площадке используется универсальный шлюз fe80::1 .
CentOS
Для работы с IPv6 необходимо добавить следующие директивы в конфигурационный файл /etc/sysconfig/network :
NETWORKING_IPV6=yes IPV6_DEFAULTDEV=eth0 IPV6_DEFAULTGW=fe80::1
- NETWORKING_IPV6 — включаем поддержку IPV6.
- IPV6_DEFAULTDEV — интерфейс по умолчанию.
- IPV6_DEFAULTGW — gateway по умолчанию.
IP-адрес назначается в конфигурационном файле /etc/sysconfig/network-scripts/ifcfg-* :
IPV6INIT=yes IPV6ADDR=2a0a:2b40::4:1701/64
Debian/Ubuntu
IP-адрес добавляется на интерфейс в файле /etc/network/interfaces :
iface eth0 inet6 static address 2a0a:2b40::4:16d1 netmask 64 gateway fe80::1
Ubuntu 16.04 LTS
От других систем семейства отличается имя интерфейса, вместо eth0 – ens3.
iface ens3 inet6 static address 2a0a:2b40::4:16d1 netmask 64 gateway fe80::1
Ubuntu 18.04 LTS
В файл /etc/netplan/50-cloud-init.yaml нужно добавить:
addresses: - 2a0a:2b40:fa:a31::/64 gateway6: fe80::1
И применить изменения командой netplan apply.
Несколько IP-адресов
IPv4
Чтобы назначить дополнительные IPv4-адреса на тот же самый интерфейс, необходимо создать виртуальный интерфейс в виде имя_интерфейса:номер, например eth0:0 .
В остальном интерфейс настраивается аналогично физическому.
CentOS
$ cat /etc/sysconfig/network-scripts/ifcfg-eth1:0 DEVICE=eth1:0 ONBOOT=yes BOOTPROTO=static IPADDR=192.168.0.1 NETMASK=255.255.255.0
Debian/Ubuntu
$ cat /etc/network/interfaces source /etc/network/interfaces.d/* auto eth0 iface ens6 inet static address 192.168.0.1 netmask 255.255.255.0 auto eth0:0 iface ens6:0 inet static address 192.168.1.1 netmask 255.255.255.0
Ubuntu 16.04 LTS
Для данной ОС не требуется создавать виртуальный интерфейс, достаточно добавить второй IP-адрес на уже существующий, например:
$ cat /etc/network/interfaces source /etc/network/interfaces.d/* auto ens6 iface ens6 inet static address 192.168.0.1 netmask 255.255.255.0 iface ens6 inet static address 192.168.1.1
Ubuntu 18.04 LTS с netplan
В интерфейсе описываются необходимые адреса, роутинг происходит через директиву routes .
$cat /etc/netplan/50-cloud-init.yaml network: version: 2 ethernets: ens3: addresses: - 185.185.68.210/22 - 141.8.198.107/22 gateway4: 185.185.68.1 nameservers: addresses: - 141.8.194.254 - 141.8.197.254 routes: - to: 185.185.68.210/22 via: 185.185.68.1 - to: 141.8.198.107/22 via: 141.8.198.1
IPv6
Несколько IPv6-адресов можно назначать на один интерфейс без создания виртуального. При этом gateway указывается только один раз. Например:
CentOS
$ cat /etc/sysconfig/network-scripts/ifcfg-eth0 IPV6INIT=yes IPV6ADDR=2a0a:2b40::4:1701/64 IPV6ADDR_SECONDARIES="2a0a:2b40::4:1702/64 2a0a:2b40::4:1703/64"
Debian/Ubuntu
$ cat /etc/network/interfaces iface eth0 inet6 static address 2a0a:2b40::4:16d1 netmask 64 gateway 2a0a:2b40::1 iface eth0 inet6 static address 2a0a:2b40::4:16d2 netmask 64
Ubuntu 16.04 LTS
$ cat /etc/network/interfaces iface ens3 inet6 static address 2a0a:2b40::4:16d1 netmask 64 gateway 2a0a:2b40::1 iface ens3 inet6 static address 2a0a:2b40::4:16d2 netmask 64
Nameservers
Необходимые директивы для nameservers добавляются в конфигурационный файл. Указать можно столько DNS-серверов, сколько необходимо.
CentOS
DNS1=8.8.8.8 DNS2=8.8.4.4
Ubuntu/Debian
dns-nameservers 8.8.8.8 8.8.4.4
Настройка приватной сети
Обратите внимание вы не сможете использовать любые IP-адреса из диапазона приватных. IP-адрес для каждого бокса задаётся при подключении бокса в сеть. Узнать нужный адрес для приватной сети можно обратившись в службу поддержки.
Узнав нужный IP-адрес для приватной сети можно приступать к самой настройке.
Для создания приватной сети между боксами необходимо настроить новый интерфейс — он уже добавлен, увидеть его можно в выводе утилиты ip
$ ip a
У боксов без приватной сети только два интерфейса: lo и eth/ens . У боксов с приватной сетью есть ещё один интерфейс eth/ens , изначально он выключен. Чтобы его включить, надо:
Ubuntu 18.04 LTS и старше
Добавить в файл /etc/netplan/50-cloud-init.yaml :
ens6: addresses: - 10.0.0.1/8
Важно соблюдать количество пробелов как в остальном файле.
Debian
Добавить в файл /etc/network/interfaces.d/50-cloud-init :
auto eth1 iface eth1 inet static address 10.0.0.1 netmask 255.0.0.0
CentOS
Создать файл /etc/sysconfig/network-scripts/ifcfg-eth1 :
TYPE=Ethernet NAME=eth1 DEVICE=eth1 ONBOOT=yes NETMASK=255.0.0.0 BOOTPROTO=static IPADDR=10.0.0.1
Проверить работу приватной сети можно с помощью ssh, ping или любых других подходящих утилит:
ssh login@10.0.0.2 ping 10.0.0.2
Настройка mtu на интерфейсе
Параметр mtu нужно менять, если вы пользуетесь индивидуальной защитой от DDoS. В стандарте Ethernet TCP-пакеты разбиты на кадры объемом 1500 байт, но при передаче через GRE-тоннель маршрутизаторы дописывают к кадрам свои 24 байта. Принимающая система оказывается не готова к кадру размером 1524 байт, поэтому мы изменим параметр mtu на интерфейсе, уменьшив его до 1476 байт, чтобы принимающая система спокойно восприняла итоговый кадр в 1500 байт.
Ubuntu 18.04+
Дописываем mtu в конфигурационный файл /etc/netplan/50-cloud-init.yaml сразу после имени интерфейса, например:
ens3: mtu: 1476 addresses: - 185.185.68.210/22
Важно соблюдать количество пробелов как в остальном файле.
После чего перезагружаем сетевую службу командой netplan apply.
Debian
Редактируем файл /etc/network/interfaces, добавляя параметр вслед за описанием интерфейса:
auto ens3 iface ens3 inet static mtu 1476 address 123.123.123.123
Перезагружаем сеть командой systemctl restart networking.
CentOS
Вносим в файл /etc/sysconfig/network строку:
MTU=1476
И перезагружаем сетевую службу: systemctl restart network.
ifconfig
Команда ifconfig позволяет получать диагностическую информацию об интерфейсах системы и выполнять их настройку.
Формат вызова команды:
ifconfig interface options
Для получения информации, программа ifconfig может вызываться простым пользователем. Файл ifconfig находится в каталоге /sbin , чаще всего при вызове нужно указывать абсолютное путевое имя.
Без параметров программа выводит на экран информацию обо всех активных (находящих в состоянии up ) интерфейсах. Если указано имя интерфейса и отсутствуют опции, выводится информация только о нем.
Просмотр информации об интерфейсе eth0
$ ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:01:02:B4:61:10 inet addr:10.0.0.188 Bcast:10.255.255.255 Mask:255.0.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1347443 errors:0 dropped:0 overruns:0 frame:0 TX packets:865328 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:830641609 (792.1 Mb) TX bytes:72315353 (68.9 Mb) Interrupt:10 Base address:0xcc00
Формат вывода информации о интерфейсе программой ifconfig:
Характеристики канального уровня
Канальный уровень Link encap. Аппаратный MAC-адрес устройства HWaddr.
Характеристики сетевого уровня
IP-адрес интерфейса inet addr; широковещательный адрес интерфейса Bcast; маска подсети интерфейса Mask.
Флаги, метрика и MTU
Список установленных флагов интерфейса: включён UP; принимает широковещательные пакеты BROADCAST; принимает групповые пакеты MULTICAST. Среди списка установленных флагов может присутствовать слово PROMISC, означающее, что интерфейс работает в неразборчивом режиме. Установленный размер максимального блока, передаваемого через интерфейс MTU и метрика интерфейса Metric.
Информация о полученных пакетах RX
Число пакетов packets, ошибок errors, отброшенных пакетов dropped, переполнений overruns. Такое назначение полей соответствует только сетям Ethernet. В других сетях, смысл может отличаться.
Информация об отправленных пакетах
Число пакетов packets, ошибок errors, отброшенных пакетов dropped, переполнений overruns, потерь несущей carrier, коллизий collisions ; объем буфера передачи txqueuelen. Такое назначение полей соответствует только сетям Ethernet. В других сетях, смысл может отличаться.
Объем переданных данных
Количество байтов полученных RX bytes и отправленных TX bytes через интерфейс/
Аппаратные параметры
Номер линии IRQ Interrupt и адрес памяти Base address.
Назначение IP-адреса 10.0.0.1 первой Ethernet-карте
Назначение IP-адреса 10.0.0.1 первой Ethernet-карте выполняется командой:
$ ifconfig eth0 10.0.0.1
Включение интерфейса
Включение добавленного интерфейса выполняется командой:
$ ifconfig eth0 10.0.0.1 up
Маршрутизация (route)
route — утилита для настройки таблицы маршрутизации.
Просмотр таблицы маршрутизации
Вывод совпадает с выводом netstat -r :
$ route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface default 185.185.68.1 0.0.0.0 UG 0 0 0 eth0 185.185.68.0 * 255.255.252.0 U 0 0 0 eth0 $ netstat -r Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface default 185.185.68.1 0.0.0.0 UG 0 0 0 eth0 185.185.68.0 * 255.255.252.0 U 0 0 0 eth0
Добавление шлюза по умолчанию
$ route add default gw 192.168.0.1
Добавление маршрута в локальную сеть
$ route add -net 192.56.76.0 netmask 255.255.255.0 dev eth0
Добавление маршрута в удаленную сеть
$ route add -net 192.57.66.0 netmask 255.255.255.0 gw 192.168.0.2
Удаление маршрута
$ route del -net 192.57.66.0 netmask 255.255.255.0 gw 192.168.0.2
Утилита ip
Утилита ip совмещает в себе другие сетевые утилиты и позволяет производить те же самые операции, что и ifconfig, route и arp вместе взятые.
Подробную информацию об утилите можно получить с помощью help :
$ ip help Usage: ip [ OPTIONS ] OBJECT < COMMAND | help >ip [ -force ] -batch filename where OBJECT := < link | addr | addrlabel | route | rule | neigh | ntable | tunnel | tuntap | maddr | mroute | mrule | monitor | xfrm | netns | l2tp | tcp_metrics | token | netconf >OPTIONS := < -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] | -f[amily] < inet | inet6 | ipx | dnet | bridge | link >| -4 | -6 | -I | -D | -B | -0 | -l[oops] < maximum-addr-flush-attempts >| -o[neline] | -t[imestamp] | -b[atch] [filename] | -rc[vbuf] [size]>
Разберем вывод команды подробнее.
Блок «Usage» содержит синтаксис утилиты:
ip [ OPTIONS ] OBJECT < COMMAND | help >- общий синтаксис. ip [ -force ] -batch filename - синтаксис при работе со скриптами.
В блоке «OBJECT» указаны все доступные объекты:
OBJECT :=
Часто используемые объекты:
- address — сетевой адрес на устройстве
- link— физическое сетевое устройство
- monitor — мониторинг состояния устройств
- neigh — ARP
- route — управление маршрутизацией
- rule — правила маршрутизации
- tunnel — настройка туннелирования
«OPTIONS» содержит список доступных опций:
OPTIONS := < -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] | -f[amily] < inet | inet6 | ipx | dnet | bridge | link >| -4 | -6 | -I | -D | -B | -0 | -l[oops] < maximum-addr-flush-attempts >| -o[neline] | -t[imestamp] | -b[atch] [filename] | -rc[vbuf] [size]>
Часто используемые опции:
- -v — вывод информации об утилите и ее версии
- -s — включает вывод статистической информации
- -f — указывает протокол для работы. Если протокол не указан, берется на основе параметров команды. Принимает одно из значений:
- bridge — . Аналогично опции -B
- dnet —
- inet — . Аналогично опции -4
- inet6 — . Аналогично опции -6
- ipx —
- link — означает отсутствие протокола. Аналогично опции -0
Также при работе с утилитой ip используются различные команды и параметры.
Команды:
add, change, delete, flush, get, list, show, monitor, replace, restore, save, set, и update.
Если команда не указана, выполняется show .
Параметры:
- dev имя_устройства — сетевое устройство.
- up — включить.
- down — выключить.
- llarrr — MAC — адрес.
- initcwnd — размер окна перегрузки TCP при инициализации.
- window — размер окна TCP.
- cwnd — размер окна перегрузки TCP.
- type — тип.
- via — подключиться к роутеру.
- default — маршрут по умолчанию.
- blackhole — маршрут «черная дыра» — отбрасывать пакеты и не посылать ICMP сообщения о недоступности.
- prohibit — маршрут «запрета» — отбрасывать пакеты и возвращать ICMP сообщения о запрете доступа.
- unreachable — маршрут «недостижимый» — отбрасывать пакеты и посылать ICMP пакеты о недостижимости узла.
Не все команды и параметры доступны при работе с различными объектами. Подробную информацию также можно получить применив «help».
При выводе help для объекта address блок «Usage» содержит синтаксис различных комбинаций команд и параметров:
$ ip address help Usage: ip addr
IFADDR dev STRING [ LIFETIME ] [ CONFFLAG-LIST ] ip addr del IFADDR dev STRING [mngtmpaddr] ip addr [ dev STRING ] [ scope SCOPE-ID ] [ to PREFIX ] [ FLAG-LIST ] [ label PATTERN ] [up] ip addr IFADDR := PREFIX | ADDR peer PREFIX [ broadcast ADDR ] [ anycast ADDR ] [ label STRING ] [ scope SCOPE-ID ] SCOPE-ID := [ host | link | global | NUMBER ] FLAG-LIST := [ FLAG-LIST ] FLAG FLAG := [ permanent | dynamic | secondary | primary | tentative | deprecated | dadfailed | temporary | CONFFLAG-LIST ] CONFFLAG-LIST := [ CONFFLAG-LIST ] CONFFLAG CONFFLAG := [ home | nodad | mngtmpaddr | noprefixroute ] LIFETIME := [ valid_lft LFT ] [ preferred_lft LFT ] LFT := forever | SECONDS Примеры
Показать все соединения
Сокращенный вывод ifconfig без параметров:
$ ip link show 1: lo: mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth0: mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000 link/ether 52:54:00:72:40:d3 brd ff:ff:ff:ff:ff:ff 4: eth1: mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000 link/ether 52:54:00:58:e5:fc brd ff:ff:ff:ff:ff:ff
Отображение информации об интерфейсе eth0
$ ip link show eth0 2: eth0: mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000 link/ether 52:54:00:72:40:d3 brd ff:ff:ff:ff:ff:ff
Включение интерфейса eth1
$ ip link set eth1 up
Вывод всех интерфейсов и IP-адресов
$ ip address show 1: lo: mtu 65536 qdisc noqueue state UNKNOWN qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 52:54:00:72:40:d3 brd ff:ff:ff:ff:ff:ff inet 141.8.196.228/24 brd 141.8.196.255 scope global eth0 valid_lft forever preferred_lft forever inet6 2a0a:2b40::4:1703/64 scope global valid_lft forever preferred_lft forever inet6 2a0a:2b40::4:1702/64 scope global valid_lft forever preferred_lft forever inet6 2a0a:2b40::4:1701/64 scope global valid_lft forever preferred_lft forever inet6 fe80::5054:ff:fe72:40d3/64 scope link valid_lft forever preferred_lft forever 4: eth1: mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 52:54:00:58:e5:fc brd ff:ff:ff:ff:ff:ff inet 192.168.0.1/24 brd 192.168.0.255 scope global eth1 valid_lft forever preferred_lft forever inet6 fe80::5054:ff:fe58:e5fc/64 scope link valid_lft forever preferred_lft forever
Установка/удаление IP-адреса для интерфейса eth1
$ ip addr add 192.168.0.10/24 dev eth1
$ ip addr del 192.168.0.10/24 dev eth1
Отображение маршрута к указанной сети
$ ip route get 192.168.0.0/24
Отображение маршрута к указанной сети от указанного интерфейса
$ ip route get 192.168.0.0/24 from 141.8.196.228 broadcast 192.168.0.0 from 141.8.196.228 dev eth1 cache
Создание/удаление маршрута
$ ip route add 10.10.20.0/24 via 192.168.50.100
$ ip route delete 10.10.20.0/24
Создание маршрута по умолчанию
$ ip route add default via 192.168.50.100
Создание маршрута к указанной сети
$ ip route add 10.10.20.0/24 dev eth0
Как и для утилиты route, команды можно сокращать. Например, ip l тоже самое, что и ip link show .
Перезапуск сетевых сервисов
Чтобы применить изменения, внесенные в конфигурационный файл, необходимо перезапустить сервис.
Название самого сервиса будет отличаться в зависимости от выбранного дистрибутива, для Ubuntu/Debian это networking, для CentOS — network.
Debian/Ubuntu
service networking restart /etc/init.d/networking restart systemctl restart networking
CentOS
/etc/init.d/network restart systemctl restart network
Где обменять флаг нетворк
Вы используете устаревший браузер. Пожалуйста обновите свой браузер чтобы улучшить взаимодействие с сайтом.
+7 (812) 938-78-75
+7 (812) 322-65-68
- Доставка
- Оплата
- Преимущества и Гарантии
- Обмен / Возврат
- Вопрос — Ответ
Загрузка города.
+7 (812) 938-78-75
+7 (812) 322-65-68
Легендарный рок-магазин с тридцатилетней историей
- Главная
- Каталог
- Аксессуары
- Нашивки
- Нашивка Anti-Flag «Underground Network»


Нашивка Anti-Flag «Underground Network»
Последний товар в наличии!
Выбранный Вами товар закончился!
Бесплатная примерка
при выборе доставки курьером. Вы сможете проверить товар и сразу же его вернуть, если он не подошел по какой-либо причинеПротокол TCP: что нужно знать специалисту по анализу сетевого трафика!
По нашему опыту, когда дело доходит до низкоуровневого анализа TCP девять из десяти ИТ специалистов в компаниях среднего и крупного бизнеса чувствуют себя неуверенно. Не могут точно сказать, что такое ретрансмиссии, размер окна и т.д. Большинство материалов в интернете по этой теме больше походят на научные работы. В этой статье мы попытаемся донести с практической точки зрения, что же полезного прячет в себе протокол TCP для того, кто занимается анализом сетевого трафика.
В каких случаях нам нужен анализ TCP пакетов?
Как показывает практика, современные системы анализа сетевого трафика имеют большую базу протоколов и готовых шаблонов для программного обеспечения. Это позволяет без труда разбивать транзакции на логические части. К сожалению, далеко не для всех задач бизнеса удаётся найти готовые продукты и в каждой компании обязательно найдётся парочка «самописных» или кастомизированных приложений. Как же анализировать трафик от таких приложений?
База анализатора трафика не имеет информации, в каком бите содержится код реквеста, какой код соответствует респонсу и т.д. В таких ситуациях приходится прибегать к самым азам сетевой науки – TCP анализу. Давайте рассмотрим, что прячет внутри себя этот протокол.
По своей сути TCP является протоколом транспортного уровня. Он позволяет осуществить соединение одного сокета (IP-адрес + порт) хоста источника с сокетом хоста назначения. Заголовок IP будет содержать информацию, связанную с IP-адресами, а заголовок TCP — информацию о порте.
Заголовок TCP
Заголовки TCP перемещаются по сети для установления, поддержки и завершения TCP-соединений, а также передачи данных.

Рисунок 1. Заголовок TCP
В заголовке TCP содержаться следующие поля:
- Source port (16 бит): порт источника. Порт хоста, от которого исходит запрос.
- Destination port (16 бит): порт назначения. Порт хоста, куда направляется запрос.
- Sequence number, SYN (32 бита): порядковый номер. Позволяет контролировать порядок сообщений. Каждая конечная точка (как порт источника, так и порт назначения) будут поддерживать свой уникальный порядковый номер для отправляемых сообщений. При установлении соединения TCP (используется сообщение с установленным флагом SYN) в качестве изначального порядкового номера будет сгенерировано случайное число. Вернее, не совсем случайно сгенерировано, а будет содержать конкретное 32-битное число, то есть в пределах от 0 до 4294967295 (или 2 в 32-ой степени возможных вариантов), которое будет соответствовать времени, прошедшему после перегрузки системы отправителя (из расчета +1 за каждые прошедшие 4 микросекунды), а также увеличенное на 64000 каждый раз при установлении нового соединения. Так как сгенерированное число будет уникальным для периода времени почти в пять часов (если при этом никакие соединения не устанавливались), то такой подход к выбору порядкового номера позволяет избежать случайных коллизий при передаче данных, когда для нескольких пакетов из разных соединений будет совпадать порядковый номер. В дальнейшем, при отправке следующих пакетов, значение порядкового номера будет увеличиваться на +1 для всех пакетов с флагом SYN, пакетов с флагом FIN и для каждого байта отправленных данных. Это позволяет принимающей системе обрабатывать пакеты в правильной последовательности, как они были сформированы при отправлении, а не в том порядке, как они были получены.
- Acknowledgement number, ACK (32 бита): номер подтверждения. Когда сообщение содержит флаг ACK, то значение в номере подтверждения должно соответствовать следующему порядковому номеру (SYN), которое отправитель сообщения с флагом ACK ожидает получить от передающей системы. Таким образом, отправка одного номера подтверждения способна подтвердить получение всех байтов с информацией, полученных до этого. Более наглядно об использовании порядкового номера и номера подтверждения вы можете посмотреть на этом видео:
- Data offset (4 бита): длина заголовка, известная также как смещение данных. Содержит размер заголовка TCP, измеряемый в 32-битных сегментах. Минимальный размер заголовка TCP составляет пять 32-битных сегментов (всего 20 байт), а максимальный — пятнадцать 32-битных сегмента (или 60 байт).
- Reserved (3 бита): зарезервировано. Зарезервировано для будущего использования, пока просто забивается нулями. На данный момент осталось три незадействованных бита, в то время как еще три ранее зарезервированных бита уже используются как флаги.
- Flags, 9 бит (флаги или управляющие биты):
- NS (1 бит): одноразовая сумма (Nonce Sum). Используется для улучшения работы механизма явного уведомления о перегрузке (Explicit Congestion Notification, ECN).
- CWR (1 бит): окно перегрузки уменьшено (Congestion Window Reduced). Данный флаг устанавливается отправителем, чтобы показать, что TCP-фрагмент был получен с установленным полем ECE. Таким образом, это является подтверждением получения пакета данных с флажком ECE от хоста получателя и включением отправителем механизма уменьшения перегрузки (Congestion Control), позволяющим оптимизировать отправку пакетов с данными в перегруженных сетях, избежав серьезных задержек из-за отбрасывания пакетов.
- ECE (1 бит): ECN-Эхо (ECN-Echo). Выполняет двойственную роль, в зависимости от значения флага SYN. При установленном флаге SYN это указывает на то, что отправитель пакета поддерживает ECN. Если флаг SYN сброшен (SYN=0), а ECE установлен, то это означает, что пакет с установленным флагом CE (Congestion Experienced, Подтвержденная перегрузка) был получен в заголовке IP во время обычной передачи. Таким образом, это служит индикатором перегрузки сети (или предстоящей перегрузки) для TCP-отправителя.
- URG (1 бит). Устанавливается, если необходимо передать ссылку на поле указателя срочности (Urgent pointer).
- ACK (1 бит). Устанавливается, когда пакет содержит значение номера подтверждения в поле подтверждения. Все пакеты после стартового пакета SYN будут иметь установленный флаг ACK.
- PSH (1 бит). Делает этот пакет пакетом PUSH (проталкивания). При нормальном потоке передачи данных система получателя не будет подтверждать получение каждого пакета сразу же после его получения. Вместо этого система получателя в течении некоторого времени будет собирать и хранить полученные данные в буфере, пока не передаст их приложению пользователя. Пакет PUSH инструктирует систему получателя немедленно передать все полученные ранее данные из буфера в приложение пользователя и сразу же отправить сообщение с подтверждением.
- RST (1 бит): сброс данного соединения. Отправкой пакета RST одна из сторон сообщает о немедленном разрыве соединения. При этом соединение обрывается, а буфер очищается. Самые распространенные причины отправки пакета с установленным флагом RST — ответ на пакет, полученный для закрытого сокета; пользователь сам прервал соединение (например, закрыв браузер, не дожидаясь ответа); соединение не было нормально закрыто, но находится в неактивном состоянии некоторое время.
- SYN (1 бит). Начинает соединение и синхронизирует порядковые номера. Первый пакет, отправленный с каждой стороны, должен в обязательном порядке иметь установленным этот флаг.
- FIN (1 бит). Одна из конечных точек отправляет пакет с установленным флагом FIN для другой конечной точки, чтобы сообщить, что все пакеты были отправлены, и соединение пора завершить.
Механизм передачи сообщений TCP
Перед тем, как данные могут быть переданы между двумя узлами, в TCP, в отличие от UDP, предусмотрена стадия установки соединения. Также, после того, как все данные были переданы, наступает стадия завершения соединения. Таким образом, осуществление каждого TCP-соединения можно условно разделить на три фазы:
- Инициализация соединения.
Установка соединения осуществляется с помощью, так называемого трехстороннего рукопожатия TCP. Инициатором соединения может выступать любая сторона. Однако чтобы упростить рассмотрения данного вопроса в рамках данной статьи, мы рассмотрим пример, когда клиент инициализирует соединение с сервером.

Рисунок 2. Трехстороннее рукопожатие TCP
(Пакет №1). Клиент отправляет пакет с установленным флагом SYN и случайным числом («R1»), включенным в поле порядкового номера (sequence number).
(Пакет №2). При получении пакета №1 сервер в ответ отправляет пакет с установленным флагом SYN, а также с установленным флагом ACK. Поле порядкового номера будет содержать новое случайное число («R2»), а поле номера подтверждения будет содержать значение порядкового номера клиента, увеличенного на единицу (то есть «R1 + 1»). Таким образом, он будет соответствовать следующему порядковому номеру, который сервер ожидает получить от клиента.
(Пакет №3). В ответ на пакет SYN от сервера (пакет №2) клиент отправляет пакет с установленным флагом ACK и полем номера подтверждения с числом «R2 + 1». По аналогии, это число будет соответствовать следующему порядковому номеру, который клиент ожидает получить от сервера.
- Загрузка данных.
После инициализации соединения полезная нагрузка будет перемещаться в обоих направлениях TCP-соединения. Все пакеты в обязательном порядке будут содержать установленный флаг ACK. Другие флаги, такие как, например, PSH или URG, могут быть, а могут и не быть установленными.
- Завершение соединения.
При нормальном завершении TCP-соединения в большинстве случаев инициализируется процедура, называемая двухсторонним рукопожатием, в ходе которой каждая сторона закрывает свой конец виртуального канала и освобождает все задействованные ресурсы. Обычно эта фаза начинается с того, что один из задействованных процессов приложения сигнализирует своему уровню TCP, что сеанс связи больше не нужен. Со стороны этого устройства отправляется сообщение с установленным флагом FIN (отметим, что этот пакет не обязательно должен быть пустым, он также может содержать полезную нагрузку), чтобы сообщить другому устройству о своем желании завершить открытое соединение. Затем получение этого сообщения подтверждается (сообщение от отвечающего устройства с установленным флагом ACK, говорящем о получении сообщения FIN). Когда отвечающее устройство готово, оно также отправляет сообщение с установленным флагом FIN, и, после получения в ответ подтверждающего получение сообщения с установленным флагом ACK или ожидания определенного периода времени, предусмотренного для получения ACK, сеанс полностью закрывается. Состояния, через которые проходят два соединенных устройства во время обычного завершения соединения, отличаются, потому что устройство, инициирующее завершение сеанса, ведет себя несколько иначе, чем устройство, которое получает запрос на завершение. В частности, TCP на устройстве, получающем начальный запрос на завершение, должен сразу информировать об этом процесс своего приложения и дождаться от него сигнала о том, что приложение готово к этой процедуре. Инициирующему устройству не нужно это делать, поскольку именно приложение и выступило инициатором. Более подробно завершении TCP-соединения смотрите здесь (http://www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm).

Рисунок 3. Завершение TCP-соединения
- Keep-alive или повторное использование соединений
На уровне TCP нет сообщений типа «keep-alive», и поэтому, даже если сеанс соединения в какой-то момент времени становится неактивным, он все равно будет продолжаться до тех пор, пока не будет отправлен следующий пакет.
Когда мы отправляем HTTP-запрос по сети, нам сразу нужно создать TCP-соединение. Однако в HTTP 1.0 возможность повторного использования соединения по умолчанию закрыта (если заголовок «keep-alive = close» дополнительно не включен в заголовок HTTP), то есть TCP-соединение автоматически закрывается после получения запроса и отправки ответа. Так как процесс создания TCP-соединения относительно затратный (он требует дополнительных затрат процессорных ресурсов и памяти, а также увеличивает сетевой обмен между сервером и клиентом, что особенно становится актуальным при создании защищенных соединений), то все это увеличивает количество лагов и повышает вероятность перегрузки сети. Поэтому для HTTP 1.1 было решено оставлять TCP-соединение открытым до тех пор, пока одна из сторон не решит прекратить его.
С другой стороны, если соединения не будут закрываться после того, как клиенты получат все необходимые им данные, задействованные ресурсы сервера для поддержания этих соединений не будут доступны другим клиентам. Поэтому HTTP-серверы, чтобы обеспечить больший контроль над потоком данных, используют временные интервалы (таймауты) для поддержки функциональности «keep-alive» для неактивных соединений (длящихся по умолчанию, в зависимости от архитектуры и конфигурации сервера, не более нескольких десятков секунд, а то и просто нескольких секунд), а также максимальное число отправляемых запросов «keep-alive», прежде чем сеанс без активного соединения будет остановлен. Более подробно о функциональности «keep-alive» вы можете узнать здесь (https://blog.stackpath.com/glossary/keep-alive/).
Вступайте в Telegram канал проекта NetworkGuru, чтобы не пропустить интересные статьи и вебинары.
Подписывайтесь на рассылку, делитесь статьями в соцсетях и задавайте вопросы в комментариях!

Вечный параноик, Антон Кочуков.
Поддержка
Зайдите на https://stat.jamer.net, введите свои логин и пароль, указанные в учетной карте абонента (приложение к Договору). Нажмите кнопку «Вход».
Я не могу подключиться к сети Интернет.
- Проверьте, работает ли локальная сеть. В «Панели управления» выберите значок «Сетевые подключения», проверте статус подключение по локальной сети. Если на нём стоит красный крестик, проверьте включен ли кабель в компьютер.
- В свойствах подключение по локальной сети проверить наличие и правильность настроек. Сетевой адрес должен быть получен автоматически (DHCP).
- Жмем Пуск, далее — Выполнить, там пишем ping jamer.net . Если в черном окне командной строки идут строки — не работает локальная сеть. Если сервер отвечает: Обмен пакетами с jamer.net [91.202.8.28] по 32 байт: Ответ от 91.202.8.28: число байт=32 время
Что такое реальный (маршрутизируемый) IP-адрес?
При включении VPN-соединения (подключение к Интернет), компьютеру выдается Реальный IP-адрес, через который он и будет взаимодействовать с сетью Интернет. Таким образом компьютер будет полностью виден по этому адресу из любой точки сети Интернет.
- Возможность создавать у себя игровые серверы, видимые в сети Интернет.
- Организовать на своем компьютере настоящий Web-сервер и опубликовать домашнюю страничку в сети Интернет.
- Возможность на прямую обмениваться файлами с другими пользователями сети Интернет.
Не забудте — Вам необходимо самостоятельно позаботится о защите вашего компьютера, любой входящий трафик, адресованный вашему IP-адресу будет доставлен до вашего компьютера, независимо является ли он запрошенным или паразитным.