通过 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 数据包仍然需要区分,因此有一些魔术字节值和替换可以做到这一点。维基百科页面的详细信息:

https://en.wikipedia.org/wiki/Serial_Line_Internet_Protocol