• WireShark告诉你ping百度时都发生了什么


    备注:  测试机器为Mac

    重点展示本机发出icmp的过程(dns-->arp-->icmp)

    本机默认网关

    ->route -n get e -n get default
    route to: default
    destination: default
    mask: default
    gateway: 192.168.0.1
    interface: en0
    flags: <UP,GATEWAY,DONE,STATIC,PRCLONING>
    recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire
    0 0 0 0 0 0 1500 0
     
     
     
     
    清除arp缓存以后,ping www.baidu.com

    ->arp -d -a;arp -d -a;arp -a;ping www.baidu.com
    192.168.0.1 (192.168.0.1) deleted            ##arp -d -a 返回结果,没有缓存不返还任何信息
    PING www.a.shifen.com (119.75.213.61): 56 data bytes
    64 bytes from 119.75.213.61: icmp_seq=0 ttl=56 time=5.947 ms
    64 bytes from 119.75.213.61: icmp_seq=1 ttl=56 time=6.376 ms
    ^C
    --- www.a.shifen.com ping statistics ---
    2 packets transmitted, 2 packets received, 0.0% packet loss
    round-trip min/avg/max/stddev = 5.947/6.162/6.376/0.214 ms
     
     
    wireshark抓包

    流程:
    通过dns服务拿到IP--->IP不跟自己在一个网段,通过需要路由转发--->通过路由信息得到网关IP(192.168.0.1)------>arp广播获得网关MAC(c8:xx:xx:xx:xx:c8)---传递Icmp包
     
    这里之所以arp广播在dns前面,是因为我的机器有其它的进程的通信用到了arp广播,因为arp广播后会有记录,所以DNS后直接从缓存中拿到了网关MAC. 此时就可以把MAC封装到帧中作为destination地址,在3层的时候加上src ip和destination ip...
     
     
     
    测试过程的优化

    下图是我优化过的抓包结果,在抓包过程中做了一个循环,用来清除arp缓存,循环和代码输出结果如下:
    ->while [ 1 ]
    > do
    >echo =======delete
    > arp -d -a
    > done
     
    ...
    ...
    =======delete
    =======delete
    192.168.0.1 (192.168.0.1) deleted
    =======delete
    =======delete
    =======delete
    ...
    ...
    ...
     
    这样就会出现下图中的结果,我们看到DNS只执行了一次.
    由于我们一直在清除ARP所以发送ICMP之前会出现若干次的ARP广播.
     
     
     
    总结

    1. ping我们可以认为是通过发送icmp包来探测主机状态.
    2. ping程序需要发送icmp协议,该协议位于IP协议之上,所以我们要知道源IP和目的IP并封装到IP报文中,这时用到了DNS解析结果: 119.75.216.20
    3. IP报文到达二层之后,需要封装源主机和"目的主机"(下一跳地址,并不是2中提到的目的地址)的MAC地址,成为帧.
    4. 通过物理链路传输
    5. 经过多个路由的转发到达119.75.216.20,转发过程中重新封装帧.

     
  • 相关阅读:
    RabbitMQ + topic发送消息+python
    maven下载依赖jar包失败处理方法--下载jar包到本地并安装到maven仓库中
    Jmeter--thrift接口压测
    将jar文件加到maven的local repository中
    在Mac机器上给ITerm2配置lrzsz,便捷的传输文件到远程服务器上
    linux iptables 开启和关闭服务端口号
    centos 安装PGSQL
    pgsql 常用的命令
    web压力测试工具
    centos安装 mysql
  • 原文地址:https://www.cnblogs.com/diaosir/p/7163895.html
Copyright © 2020-2023  润新知