Шагая через стек TCP / IP - PullRequest
       34

Шагая через стек TCP / IP

36 голосов
/ 27 декабря 2011

Я работал инженером QA для проприетарной встроенной операционной системы. Они создали свой собственный стек ATN , и его использование с помощью отладчика стало для меня самым откровенным опытом работы с сетью. Наблюдать за каждым слоем стека, составляющим свою часть пакета, было удивительно. Тогда, наконец, возможность увидеть встроенный пакет в сети приобрела большее значение.

Как педагог, я хотел бы поделиться этим опытом с другими. Кто-нибудь знает прямой метод перехода через стек TCP / IP? В идеале я хотел бы что-то более простое, чем отладка ядра * BSD или Linux, хотя, если это единственный вариант, некоторые советы и рекомендации для этого процесса были бы хорошими. Стек ссылок, написанный на C / C ++, который можно запускать в пользовательском режиме с помощью Visual Studio или Eclipse, был бы идеальным.

Ответы [ 8 ]

15 голосов
/ 05 января 2012

Все зависит от того, на чем вы хотите сосредоточиться. Из вашего вопроса, что вас больше всего интересует, так это поток данных по различным уровням (поток из пространства пользователя -> напряжение на кабеле).

Для этого я предлагаю вам использовать http://www.csse.uwa.edu.au/cnet/,, который является полноценным симулятором сети. Позволяет проходить все уровни стека.

Реальные системы всегда будут иметь четкое различие между Layer3, Layer2 и Layer1 (встроенное ПО для проверки Ethernet и CRC на чипе, аппаратный MAC). Вам будет сложно войти в ОС, а некоторые детали реализации будут запутанными и запутанными для студентов. Для Linux вам придется объяснить инфраструктуру ядра, чтобы понять структуру стека TCP / IP.

Если вас интересует только часть TCP / IP, я рекомендую использовать встроенный стек TCP / IP, например http://www.sics.se/~adam/lwip/. Вы можете включить это в простую пользовательскую программу и полностью создать пакет TCP / IP.

Обратите внимание, что существует множество аспектов сетевого взаимодействия, которые вы не можете решить при переходе через стек TCP / IP. Между ними все еще есть микросхема MAC, которая регулирует доступ к среде, коллизии и т. Д. Ниже имеется микросхема PHY, которая преобразует все в электрические / оптические сигналы, и даже существует протокол, который управляет связью между MAC и PHY. Кроме того, вы не видите все аспекты, связанные с очередями, параллелизмом, распределением ресурсов ОС и т. Д. Полная картина должна включать все эти аспекты, которые можно увидеть только в симуляторе сети.

13 голосов
/ 03 января 2012

Я бы запустил Minix на виртуальной машине и отладил это. Это идеально подходит для этого.

Minix - это полноценная ОС со стеком TCP / IP, поэтому у вас есть необходимый код. Однако, в отличие от Linux / BSD, его корни и цель разработки - быть обучающим инструментом, поэтому он избегает определенного уровня сложности в пользу ясности. Фактически, именно эту ОС Линус Торвальдс начал взламывать, когда начинал с Linux: -)

Вы можете запустить minix на виртуальной машине, такой как VirtualBox или VMware, и отладить ее. На сайте есть инструкция: http://www.minix3.org/

11 голосов
/ 29 декабря 2011

Я лично изучил стек TCP / IP, используя DOS и SoftICE (ой, я понял, что я старый человек).Использование DOS на виртуальной машине и отладка с помощью драйвера TCP / IP будет намного проще, поскольку ваша цель - узнать, как работает TCP / IP.Современная ОС много оптимизирует сетевой ввод-вывод, и отладка через нее непроста.

http://www.crynwr.com/ имеет множество драйверов пакетов с открытым исходным кодом.Отладка с исходным кодом должна быть немного проще.

7 голосов
/ 04 января 2012

Это не совсем то, что вы ищете, но я надеюсь, что это поможет

1995 - Иллюстрированный TCP / IP, Том 2: Реализация (с Гари Р. Райтом) - ISBN 0-201-63354-X

Просто пройдитесь по коду рядом.Почти шагая через опыт.Мистер Стивен также объясняет ключевые переменные.Просто потрясающе.Примечание: Код, возможно, изменился с тех пор, как книга, но все еще потрясающий.

6 голосов
/ 30 декабря 2011

Вероятно Проект lwIP - это то, что вы ищете, потому что он может быть запущен без операционной системы .

Что касается отладки ядра Linux, существует не очень простой, но хорошо известный способ сделать это. Используйте KGDB . Установите отладочную версию ядра Linux на виртуальную машину или на отдельную коробку. И удаленно подключить GDB к этой машине. Возможно, вы хотели бы использовать какой-нибудь внешний интерфейс GDB вместо текстового интерфейса. Если вам нужно больше подробностей об отладке ядра от более компетентных людей, просто добавьте к вопросу тег «linux».

3 голосов
/ 05 января 2012

Я на самом деле однажды написал небольшое подмножество стека TCP / IP в 8051 , это был очень поучительный опыт.

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

Мое мнение здесь может быть предвзятым, но я думаю, что делать это на встроенной платформе - лучший способ. То, что вы пытаетесь сделать, - это очень низкий уровень, и ПК просто усложнит задачу. Встроенный чип не имеет операционной системы, чтобы встать на вашем пути. Кроме того, очень приятно видеть простой ответ 8051 на запросы ping и вызовы telnet.

Их ключ - начинать с малого, не пытайтесь создать полный стек TCP / IP одновременно. Сначала напишите код для обработки MAC, затем IP, Ping, UDP и, наконец, TCP.

Я не думаю, что изучение существующей реализации - это хорошая идея. Реализации TCP / IP обычно наполнены кодом, не связанным с вашей целью.

1 голос
/ 19 января 2012

Я работаю в индустрии TCP / IP.В BSD и его вариантах функция tcp_input () является идеальной отправной точкой для изучения внутренних особенностей TCP.Установка точки останова для этой функции и переход через нее в действующей системе может дать много просветления.Если это сложно, вы можете просто просмотреть источник, чтобы получить общее представление о нем:

http://fxr.watson.org/fxr/source/netinet/tcp_input.c

Потребуется время, по крайней мере, много недель, чтобы понять общую картину,Довольно волнующий.: -)

0 голосов
/ 01 ноября 2013

Вы можете запустить стек IP NetBSD в пользовательском пространстве в Linux или другой ОС, используя gdb или что-либо еще, см. http://www.netbsd.org/docs/rump/ и https://github.com/anttikantee/buildrump.sh, а затем, например, передать его на устройство настройки / прослушивания, чтобы вы могли посмотри что на проводе.

...