Unix2019b/TCP/IP в Linux
TCP в Linux
Поддержка TCP/IP стека в UNIX-подобных системах традиционно реализуется как модуль ядра системы что дает следующие преимущества:
- Взаимодействие с конкретным сетевым интерфейсом инкапсулировано внутри ядра и приложения могут использовать универсальный API.
- Несколько процессов могут использовать один и тот же сетевой интерфейс одновременно.
- Большое количество утилит и метрик (netstat, etc.)
- Испытанная временем реализация с открытым кодом
Работа в режиме ядра приводит к увеличению накладных расходов и ограничивает максимальную производительность сетевого стека. Это, а так же бурное развитие виртуализации, привело к созданию userspace реализаций TCP/IP стека, которые позволяют получить более высокую производительность (> 2000000 пакетов в секунду). Стоит учитывать, что они так же обладают рядом других недостатков:
- Эксклюзивный доступ одного процесса к ресурсам сетевого интерфейса
- Проприетарная реализация и/или отсутствие доступа к исход
/proc/sys/net/
и /etc/sysctl.conf
позволяют оптимизировать настройки TCP стека для того чтобы добиться максимальной производительности.
Дополнительные сслыки:
- Why we use the Linux kernel's TCP stack - блог Cloudflare, одного из самых крупных CDN провайдеров
- Исходный код ядра Linux
- Пример userspace реализации
tcpdump и Wireshark
tcpdump — утилита UNIX (есть клон для Windows), позволяющая перехватывать и анализировать сетевой трафик, проходящий через компьютер, на котором запущена данная программа.
tcpdump [options] [filter expression] # Вывести список сетевых устройств tcpdump -D # Сохранить пакеты проходящие через интерфейс en0 в capture.pcap tcpdump -i en0 -w capture.pcap # Выводить адреса и порты в числовом формате tcpdump -i lo0 -nn # Вывести TCP пакеты отправленые или полученные на порт 9999 tcpdump tcp and port 9999 # Cохранить пакеты проходящие через en0 в файлы не более 100 мб, с ротацией каждые 5 минут (300/60), сохранить не более 24 файлов tcpdump -i en0 -w /tmp/network-%H-%M.pcap -W 24 -G 300 -C 100 # Прочитать сохранненный дамп и вывести UDP пакеты tcpdump -r capture.pcap udp
Флаги TCP в tcpdump:
- [.] - ACK (Acknowledgment)
- [S] - SYN (Start Connection)
- [P] - PSH (Push Data)
- [F] - FIN (Finish Connection)
- [R] - RST (Reset Connection)
- [S.] - SYN-ACK (SynAcK Packet)
В случае если доступен графический интерфейс, более удобным инструментом для анализа будет Wireshark. У Wireshark немного отличается синтаксис фильтрации пакетов по сравнению с tcpdump (например tcp.port в Wireshark против port в tcpdump), но разница незначительна и Wireshark предоставляет намного больше возможностей - в него встроена поддержка огромного количества протоколов более высокого уровня, что значительно облегчает работу.
Так же стоит отметить что существует promiscuous mode - специальный режим захвата, который позволяет перехватывать пакеты адресованые не только самому хосту, но и другим хостам в сети.
Дополнительные ссылки
- Сравнительный анализ поведения браузеров при старте.
- Анализ HTTPS трафика с помощью Wireshark