Выполнение стека TCP/IP

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

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

Ответ 1

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

Для этого я предлагаю использовать 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. Кроме того, вы не видите все аспекты, связанные с очередью, concurrency, распределение ресурсов ОС ea. Полная картина должна включать все эти аспекты, которые можно увидеть только в сетевом симуляторе.

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

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

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

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

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

Ответ 7

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

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

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

Ответ 8

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