通过 SLIP 接收的数据包和从以太网接收的数据包之间的格式有区别吗?
Is there a difference in format between a packet received via SLIP and one from an Ethernet?
当通过 SLIP ping 一个 uip 设备时,我在 uart 中得到一个数据包,看起来像:
uip_buf[0] 0x45
uip_buf[1] 0x0
uip_buf[2] 0x0
uip_buf[3] 0x3c
uip_buf[4] 0x1
uip_buf[5] 0x20
uip_buf[6] 0x0
uip_buf[7] 0x0
uip_buf[8] 0x80
uip_buf[9] 1
uip_buf[10] 0xb5
uip_buf[11] 0x51
uip_buf[12] 0xc0
uip_buf[13] 0xa8
uip_buf[14] 0x1
uip_buf[15] 0x1
uip_buf[16] 0xc0
uip_buf[17] 0xa8
从代码来看,这个以太网 header 应该由目标地址、源地址和类型组成。然而,为了处理数据包,类型必须是 0x0008,但显然它是 0xa8c0(uip_buf [13:12] 或 uip_buf [17:16]。因此比较总是失败:
if(BUF->type == HTONS(UIP_ETHTYPE_IP)) // 0xa8c0 != 0x0008
进行比较的行来自以太网实现...通过 SLIP 传输时类型字段是否可能不同?
是的,有区别。 SLIP 没有以太网头,因为串行线路没有总线架构:相反,恰好有两个端点,所以每一端都知道它在和谁通话。
IP 数据包仍然需要区分,因此有一些魔术字节值和替换可以做到这一点。维基百科页面的详细信息:
当通过 SLIP ping 一个 uip 设备时,我在 uart 中得到一个数据包,看起来像:
uip_buf[0] 0x45
uip_buf[1] 0x0
uip_buf[2] 0x0
uip_buf[3] 0x3c
uip_buf[4] 0x1
uip_buf[5] 0x20
uip_buf[6] 0x0
uip_buf[7] 0x0
uip_buf[8] 0x80
uip_buf[9] 1
uip_buf[10] 0xb5
uip_buf[11] 0x51
uip_buf[12] 0xc0
uip_buf[13] 0xa8
uip_buf[14] 0x1
uip_buf[15] 0x1
uip_buf[16] 0xc0
uip_buf[17] 0xa8
从代码来看,这个以太网 header 应该由目标地址、源地址和类型组成。然而,为了处理数据包,类型必须是 0x0008,但显然它是 0xa8c0(uip_buf [13:12] 或 uip_buf [17:16]。因此比较总是失败:
if(BUF->type == HTONS(UIP_ETHTYPE_IP)) // 0xa8c0 != 0x0008
进行比较的行来自以太网实现...通过 SLIP 传输时类型字段是否可能不同?
是的,有区别。 SLIP 没有以太网头,因为串行线路没有总线架构:相反,恰好有两个端点,所以每一端都知道它在和谁通话。
IP 数据包仍然需要区分,因此有一些魔术字节值和替换可以做到这一点。维基百科页面的详细信息: