Unix2019b/TCP/IP в Linux

Материал из iRunner Wiki

TCP в Linux

Поддержка TCP/IP стека в UNIX-подобных системах традиционно реализуется как модуль ядра системы что дает следующие преимущества:

  • Взаимодействие с конкретным сетевым интерфейсом инкапсулировано внутри ядра и приложения могут использовать универсальный API.
  • Несколько процессов могут использовать один и тот же сетевой интерфейс одновременно.
  • Большое количество утилит и метрик (netstat, etc.)
  • Испытанная временем реализация с открытым кодом

Работа в режиме ядра приводит к увеличению накладных расходов и ограничивает максимальную производительность сетевого стека. Это, а так же бурное развитие виртуализации, привело к созданию userspace реализаций TCP/IP стека, которые позволяют получить более высокую производительность (> 2000000 пакетов в секунду). Стоит учитывать, что они так же обладают рядом других недостатков:

  • Эксклюзивный доступ одного процесса к ресурсам сетевого интерфейса
  • Проприетарная реализация и/или отсутствие доступа к исход

Tcp linux.png

/proc/sys/net/ и /etc/sysctl.conf позволяют оптимизировать настройки TCP стека для того чтобы добиться максимальной производительности.

Дополнительные сслыки:

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 - специальный режим захвата, который позволяет перехватывать пакеты адресованые не только самому хосту, но и другим хостам в сети.

Дополнительные ссылки