ICMP 端口不可达是差错报文中的一种,它的类型(type)是 3,代码(code)也是 3.
1. 差错报文首部格式
图1 差错报文首部
2. 实验
- 打开我们之前写的 ICMP 报文接收程序
程序托管在 gitos 上:http://git.oschina.net/ivan_allen/unp
如果你已经 clone 过这个代码了,请使用 git pull
更新一下。本节程序所使用的程序路径是 unp/program/icmp/basic
.
$ sudo ./icmp
- 打开 tftp 程序
图2 使用 tftp 程序向主机 mars 端口 9999 发送请求,准备下载 temp 文件
tftp 程序使用的协议是 UDP,这里使用了面向连接的 UPD 程序。实际上,mars 主机并没有在 9999 端口有任何服务。因此这个请求会失败。
图3 icmp 报文接收程序接收到了差错报文,type=3, code=3
根据差错报文的规则, icmp 报文携带的原始 ip 数据报里的前 8 字节,应该是 UDP 数据报前 8 字节的内容,看红色框框部分,这是 UDP 数据报的目的端口号,0x270f,也就是 10 进制 9999.
3. 总结
- 掌握差错报文格式