今天在处理问题的时候,抓了一个包,发现里面的IP层很奇怪,有两层。但是wireshark完美解析了这个包。这让我很疑惑,为什么一个包会有两个IPv4地址呢?
按道理来说IP包后面就是数据段了,两个IP包不会有问题吗?但是隐约又觉得是ok的,因为隐约记得IP层可以指定下一个头的协议,但是是不是能指定两个IP呢?这让我很疑惑。于是我重新查了一下IP的头定义。
Protocol字段
IP报文头中有一个字段是Protocol字段,用来指定IP的数据里面具体是什么协议。这里比较常见的是TCP的(值为6),以及UDP的(值为17)。然而,实际上,标准协议是支持下一层数据写IP的,只要把值填为4即可。看上图,第一层IP协议头的协议值就是4,代表协议为IPIP,第二层IP头的协议值才是6。当然这里有一个很蛋疼的问题,就是为啥IP的载荷具体用什么协议,居然是IP层指定的,居然不是IP的载荷自行决定的,大概是因为早年TCP/IP实际是一个协议层导致的吧。感觉属于早年的技术债务了。其他还有TCP和UDP的头部校验和计算等,都有分层不清晰的问题。
IP Tunnel
这种报文组装方式又叫IPv4-in-IPv4,属于IP tunnel技术。更加常见的还有IPv4-in-IPv6或者IPv6-inIPv4,这种技术用于帮助IPv6的节点在一个IPv4的网络中传输数据。在这种报文中,实际的目标IP地址为最后一层的IP,在我抓到的这个例子中,就是154这个地址,下面的地址是隧道地址,并不是实际接收的地址。