Как извлечь полезную информацию / данные из кадра rnet II? - PullRequest
0 голосов
/ 02 мая 2020

Я пытаюсь реализовать протокол UDP в пользовательском пространстве, используя golang. Я дошел до того, что смог получить необработанные пакеты rnet II.

Мой код выглядит примерно так:


type EthernetFrame struct {
    SrcAddress  []byte
    DestAddress []byte
    EtherType   []byte
    Payload     []byte
    CRC         []byte
}

func ReadEthernetPackets(ethernetSocket int) EthernetFrame {
    dataBytes := make([]byte, 1518)
    syscall.Read(ethernetSocket, dataBytes)
    return EthernetFrame {
        SrcAddress:  dataBytes[0:6],
        DestAddress: dataBytes[6:12],
        EtherType:   dataBytes[12:14],
        Payload:     dataBytes[14:1515],
        CRC:         dataBytes[1515:1518],
    }
}

Я видел здесь (https://commons.wikimedia.org/wiki/File: Ethernet_Type_II_Frame_format.svg ), что это rnet II кадр может быть длиной от 64 до 1518 байт, но поскольку в заголовке нет поля, которое бы говорило о длине полезной нагрузки, я просто предположил, что все кадры будут иметь длину 1518, и в этом случае теоретически мой код должен работать , Но так как кадры в основном прибывают с различной длиной, мое предположение не выполняется. Как мне проанализировать полученные байты и получить только полезную нагрузку? Какую длину dataBytes оставить?

1 Ответ

0 голосов
/ 02 мая 2020

Каждый пакет inte rnet существует из следующих уровней:

  1. L2 - канал передачи данных (например, адреса Ma c, ethertype, VLAN, ...)
  2. L3 - Сеть (например, IPv4 / IPv6 / ...)
  3. L4 - Транспорт (например, UDP / TCP / ...)
  4. L5 - Полезная нагрузка Некоторые разделяют L5 на три разных уровня (L5 , L6 и L7, которые являются Сессией, Представлением и Приложением соответственно). Более подробную информацию можно найти в wiki OSI Moudel !

Для L2, поскольку вы ожидаете IPv4 (не IPv6, верно?):

EthernetFrame {
  Dest Mac Addr,  # Len is 6 B
  Src Mac Addr,   # Len is 6 B
  EtherType,      # Len is 2 B - This value will be 0x0800
}

Если это IPv4, затем EtherType==0x0800 Если EtherType==0x8100, то это VLAN, затем после этого ожидайте прочитать еще 2 B для данных VLAN PCP / DEI / VID - подробнее о VLAN ! Таким образом, ваш пакет будет выглядеть так:

EthernetFrame {
  Dest Mac Addr,  # Len is 6 B - Some Dest Mac
  Src Mac Addr,   # Len is 6 B - Some Src  Mac
  EtherType,      # Len is 2 B - 0x8100 - VLAN
  VlanData,       # Len is 2 B - VLAN Data - DEI / PCP / VID
  EtherType       # Len is 2 B - Again, need to parse...
}

Теперь, если второй EtherType==0x0800, то следующий уровень (L3 - сеть) - IPv4. Подробнее о ethertype

L3 - сетевой уровень - из вики https://en.wikipedia.org/wiki/IPv4? Поскольку этот IPv4, то длина L3 фиксирована до 5 B (40 бит), если только IHL> 5.

Version               - 4 b
IHL                   - 4 b
DSCP                  - 6 b
ECN                   - 2 b
Total Len             - 16 b - Include header + data
Identification        - 16 b
Flags                 - 3 b
Fragment offset       - 13 b
TTL (Time to Live)    - 8 b
Protocol              - 8 b (for next Layer parse, in your case will be UDP with 0x11)
Header Checksum       - 16 b
Src IP Addr           - 32 b
Dest IP Addr          - 32 b

Выше пакета описывают пакет IPv4 в случае IHL<=4. В противном случае, добавьте опции tail к пакету относительно len IHL.

На этом этапе вы знаете общее len, и что Layer-4 является UDP. Проверьте вики https://en.wikipedia.org/wiki/User_Datagram_Protocol? L4 выглядит так - Для UDP (TCP отличается, другие протоколы разные ..):

Source prot   - 2 B
Dest port     - 2 B
Length        - 2 B
Checksum      - 2 B

Подводя итог - нужно:

  1. Начать с L2, понять, что такое ethertype и на его основе для анализа L3
  2. На L3 необходимо узнать всю общую длину len и тип протокола L4 (например, UDP или TCP).
  3. На L4 необходимо узнать len (вы также знаете это из L3 !!!).
  4. Разбор полезной нагрузки !!

Если нет VLAN или любого другого типа ether кроме IPv4 и IHL <= 4, то полезная нагрузка начинается с <code>14 + 20 + 8

  • 14 B для L2
  • 20 B для L3
  • 8 B для L4

Удачи !

...