Распознавание транспортного уровня кадра Ethernet
Недавно я работал над поддержкой raw ethernet во встроенных системах. В основном для образовательных целей и ноу-хау. Используя некоторые данные, найденные в Google, я смог реализовать поддержку ARP и отдельную поддержку транспортного уровня UDP/TCP. К сожалению, у меня есть проблема с поддержкой их обоих (UDP/TCP) одновременно. По сути, я не могу распознать протокол входящего кадра, поэтому не могу решить, отправлять ли его обработчику UDP или TCP. Невозможно отправить его обоим без риска получения искаженных данных. Я ожидал какое-то битовое поле, обозначающее эту информацию, но не могу ее найти.
Я ищу эту информацию в течение нескольких дней, но не могу найти источник, вероятно, потому что я что-то неправильно понимаю.
Могу ли я попросить помощи у более опытных ИТ-специалистов, объяснив тему / подсказку, где искать? Я чувствую, что нахожусь в тупике.
Заранее спасибо.
1 ответ
TCP/UDP не должен быть непосредственно встроен в кадр Ethernet. Сегмент TCP должен находиться внутри IP-пакета с типом = 6, а IP-пакет должен находиться внутри фрейма Ethernet с EtherType= 0x800 (для IPv4):
Ethernet EtherType=0x800 (IPv4)
+----------------------------------+
| IP Type=6 (TCP) |
| +-------------------------+ |
| | | |
| | +---------------+ | |
| | | TCP | | |
| | | | | |
| | +---------------+ | |
| | | |
| +-------------------------+ |
| |
+----------------------------------+
Для UDP это то же самое, только тип IP - 17 вместо 6.