0
点赞
收藏
分享

微信扫一扫

ping数据包中的进程号



当同一台机器A上执行相同的两个ping命令, 例如 ping 114.114.114.114, 那么机器A的内核收到对方机器的响应之后,如何把响应结果向上投递给应用层的对应的ping进程呢?

【1】查看网络接口



ping数据包中的进程号_网络接口

只有一个对外的网络接口eth0, 接下来执行的ping命令, 会通过eth0接口进行收发数据


【2】开启抓包
sudo tcpdump

ping数据包中的进程号_网络接口_02

监听eth0接口上的icmp数据包



【3】执行ping命令

ping

ping数据包中的进程号_linux_03


ping命令的底层会发送icmp数据包



【4】查看ping命令的进程号



ping数据包中的进程号_网络_04

执行ping命令的进程号是156



【5】

执行ping命令之后, tcpdump会抓取到icmp网络包

ping数据包中的进程号_ide_05

红色框圈中的是IP+ICMP协议的数据包, 其中绿色部分是ICMP协议的包, 共计64字节, 如下图是ICMP协议包格式

ping数据包中的进程号_运维_06

在icmp协议中, 对于ping命令来说, Identifier中存储着ping命令的进程号. Identifier偏移起始位置4字节, 占2字节.



如下图, 是通过wireshark抓取到的icmp网络包, 与通过tcpdump抓取的网络包一样



ping数据包中的进程号_linux_07


如下图, 根据Identifier偏移起始位置4字节, 占2字节. 于是0800e0369c00…数据包中的9c00就是进程号, 这里又涉及到网络字节序问题, 实际的数值应该是009c, 转成十进制就是156, 即Identifier位置存储着进程号156



ping数据包中的进程号_linux_08


通过这样就可以区别出来, 同一台机器执行的两个ping命令进程, 内核收到ping的响应之后, 就可以知道该把接收到的网络包给哪个ping进程了. 这个Identifier类似TCP的端口号.




举报

相关推荐

0 条评论