2

Я особенно заинтересован в прослушивании сокетов TCP, но было бы неплохо получить все и любые сокеты (struct sock, как определено в Kernel's include/net/sock.h) для сокета.

Например, этот вывод ss показывает сокет TCP, связанный с 8080.

tcp    LISTEN     20     128                    *:8080                  *:*      uid:500 ino:32355 sk:ffff8801b11ca880
      rto:1000 mss:536 cwnd:10

Я предполагаю, что sk:*** является адресом структуры (struct sock) для этого сокета. Я не нашел никаких инструментов, которые могли бы извлечь структуру sk и напечатать ее поля. Могу ли я использовать что-то, чтобы попасть в (это ядро или процесс?) памяти, и интерпретировать данные в ffff8801b11ca880 как (struct sock)?

2 ответа2

3

Адрес находится в пространстве ядра, потому что установлены старшие 16 бит (FFFF). Чтобы продолжить, вам нужны GDB и символы отладки для вашего работающего ядра. Я использую CentOS, поэтому у меня работает следующее:

# yum install gdb
# yum install --enablerepo=base-debuginfo kernel-debuginfo
# gdb /usr/lib/debug/lib/modules/`uname -r`/vmlinux /proc/kcore

После этого вы можете использовать GDB как с процессом пользовательского пространства, за исключением того, что это ядро:

(gdb) explore (struct sock *)0xffff8801b11ca880
0

Это зависит именно от того, что вам нужно.

Большая часть информации, содержащейся в struct sock (не в сокете struct), полезна только для отладки. Дамп таблицы сокетов TCP содержится в /proc/net/tcp, а также для UDP, IGMP, raw, arp, UNIX-домена. Это простая таблица ascii, содержание которой кратко суммируется заголовками в строке 1 этого вывода:

 more /proc/net/tcp
 sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode                                                     
 0: 00000000:228B 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 15159 1 ffff8801a1ee2300 100 0 0 10 0                     
 1: 00000000:CC4B 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 13835 1 ffff8801a1ee0700 100 0 0 10 0    

и чуть более подробно описан на странице man proc(5) следующим образом:

/ Proc / нетто / ТСР

Содержит дамп таблицы сокетов TCP. Большая часть информации не используется кроме отладки. Значение "sl" - это хэш-слот ядра для сокета, "local_address" - пара локальных адресов и номеров портов. "Rem_address" - это пара удаленных адресов и номеров портов (если они подключены). "St" - это внутренний статус сокета. "Tx_queue" и "rx_queue" являются исходящей и входящей очередью данных с точки зрения использования памяти ядра. Поля "tr", «tm-> when» и "rexmits" содержат внутреннюю информацию о состоянии сокета ядра и полезны только для отладки. Поле "uid" содержит эффективный UID создателя сокета.

Эта информация читается и более удобно отображается такими командами, как lsof -i или netstat -4.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .