拓扑图:
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020122601384832.jpeg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1JvYjIwODMxNQ==,size_16,color_FFFFFF,t_70)
前提:二层交换机转发数据时不改变帧头中任何字段的数据。
正常情况下,在主机0上构造一个普通的UDP用户数据报报文给主机1,报文中的UDP首部中的目的端口字段填写一个不可能使用的端口号,则主机1在收到此报文后发现本主机上没有进程监听这个目的端口,就会向源发送主机发送一个ICMP目的端口不可达报文。
可如果精心构造的报文的二层帧头中的目的MAC地址字段内容为全F,其他内容与正常情况下完全相同,则主机1就不会回复ICMP目的端口不可达报文。
此时就有了一个疑问,正常理解的概念是,协议每读取完一层数据后,就会把本层的首部和尾部(如果有的话)完全剥离,只把对于本层来说的数据部分根据刚才读取出来的类型字段、协议号、端口号等递交给下一层相应的协议或应用来做进一步的处理。那么在这种理解下,应用层的UDP协议已经发现目的端口不可达之后,则此时数据中的二层帧头应该已经被剥离,还怎么判断出帧头首部中的目的MAC地址字段中的内容为全F进而决定不发送ICMP目的端口不可达报文呢???
其实所谓的首部和尾部剥离之后再递交到下一层协议只是为了方便教学和辅助理解的一种衍生说法。实际开发中所谓的递交到下一层并剥离首部和尾部只是将指针进行移位,而数据本身从来没有任何变化,也就是说所有数据信息都还有保留。所以即便已经到了UDP来读取数据,依旧可以倒回到二层帧头中读取目的MAC地址字段中的内容来决定是否需要回复ICMP目的端口不可达报文。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)