V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
echoless
V2EX  ›  问与答

wireshark 网络分析: 从一道面试题开始说起 相关的疑问.

  •  
  •   echoless · 2023-02-09 19:10:28 +08:00 · 1087 次点击
    这是一个创建于 655 天前的主题,其中的信息可能已经有所发展或是发生改变。
    https://tianshuang.me/2017/03/%E4%BB%8E%E4%B8%80%E9%81%93%E9%9D%A2%E8%AF%95%E9%A2%98%E5%BC%80%E5%A7%8B%E8%AF%B4%E8%B5%B7/index.html



    原作者分析了 B 可以访问 A, 但没有分析 A 是否能访问 B. 链接的作者分析的貌似是 A 可以访问 B.

    但是我做了类似的设置, 发现 A ping B 是不行的, 但是 A 可以得到 B 的 mac address.

    我的疑问是, A 能访问 B 么, 为什么 A 有了 B 的 mac address 仍然 ping 不通. 多谢
    13 条回复    2023-02-10 20:25:39 +08:00
    iBugOne
        1
    iBugOne  
       2023-02-09 19:23:53 +08:00 via Android   ❤️ 1
    A 不能 ping 通 B 是因为收不到 B 给出的 echo-reply ,实际上 A 发出的 echo-request 是正常到达 B 的
    echoless
        2
    echoless  
    OP
       2023-02-09 19:31:16 +08:00
    @iBugOne 我 wireshark 抓包确实是这样的, 为什么 B 给出的 echo reply 到不了 A 呢?

    A 10.10.15.129, 网段 (0)1-254(255)
    B 10.10.15.3, 网段 (0)1-62(63)

    B 给出的 echo reply 以为 A 是一个子网的, 直接就发包了, 但实际上要通过 gateway 才行.

    这样理解好像是通了.
    ThirdFlame
        3
    ThirdFlame  
       2023-02-09 20:16:56 +08:00   ❤️ 1
    你说反了。 B 给出的 echo reply 以为 A 不在一个子网的,就把数据包(目的 IP 是 A ,目的 MAC 是网关)发给了网关( gateway )。
    网关( gateway )收了之后发现,说 B 你是不是傻了,你和 A 同一个网段,你自己发去。(当然也有的网关配置的可以提替转发)
    paradoxs
        4
    paradoxs  
       2023-02-09 20:25:37 +08:00   ❤️ 1
    B 给出的 echo reply 到不了 A 是因为 A 和 B 属于不同的网段:A 的网段为 10.10.15.129 (0)1-254(255),而 B 的网段为 10.10.15.3 (0)1-62(63)。
    两个网段之间的数据传输需要通过路由器,因此,A 和 B 之间的通信需要通过路由器进行转发才能实现。另外,A 的子网掩码 255.255.255.192 也决定了它和 B 不属于同一网段,因此 B 向 A 发送的 echo reply 也不会收到响应。
    echoless
        5
    echoless  
    OP
       2023-02-09 20:35:00 +08:00
    @ThirdFlame 我从 B 抓包看了一下, 大佬说的是正确的. 的确发给了 gateway, ip 是 A 的. 但是为什么 gateway 认为 B 和 A 同一个网段呢? 多谢!
    echoless
        6
    echoless  
    OP
       2023-02-09 20:40:46 +08:00
    @paradoxs A, B 属于不同的子网这个理解的, 问题在于, 是 B ping A 是通的, A ping B 是不通的.
    ysc3839
        7
    ysc3839  
       2023-02-09 21:45:15 +08:00 via Android   ❤️ 1
    @wuhaoecho
    “为什么 gateway 认为 B 和 A 同一个网段”
    要看 gateway 上面是怎么配置的
    echoless
        8
    echoless  
    OP
       2023-02-09 21:46:33 +08:00 via Android
    @ysc3839 我自己弄的两台电脑 gateway 就是路由器 默认配置
    ThirdFlame
        9
    ThirdFlame  
       2023-02-10 08:13:58 +08:00   ❤️ 1
    gateway 是根据自己的掩码判断的。 正确的网络配置中,同一个局域网络内所有设备(含网关)的掩码都是一致的,如果不一致就会出现所谓的单通故障。
    echoless
        10
    echoless  
    OP
       2023-02-10 10:08:22 +08:00
    @ThirdFlame 多谢大佬. 看了一下路由器是有子网掩码的(之前忽略了)

    从 web 登陆路由器看到的路由器的信息:

    防火墙 IP 地址:192.168.0.1
    子网掩码:255.255.255.0
    LAN 口 MAC 地址:2C-61-04-3C-0F-85
    DHCP 地址池范围:192.168.0.2~192.168.0.254

    这样以来算是明白了. 我之所以没弄明白, 是因为原作者和链接的博客, 都没有提路由是怎么设置的. 而这个也是 A 和 B 怎么通的关键.
    echoless
        11
    echoless  
    OP
       2023-02-10 10:20:25 +08:00
    @ThirdFlame 问题又来了, 我尝试复盘一下. 发现还是不通.

    原书解释 B ping A,

    >B 收到了 A 发出的 ARP 广播,这个广播查询的是 B 的 MAC 地址。这是因为在 A 看来,B 属于相同子网,同子网通信无需默认网关的参与,只要通过 ARP 获得对方 MAC 地址就行了。这个包也表明默认网关成功地把 B 发出的 ping 请求转发给 A 了,否则 A 不会无缘无故尝试和 B 通信。

    https://blog.csdn.net/weixin_34122548/article/details/90542241

    B ping A 的时候, 包为什么能从 B 到 A, 在 A 看来 B 事另一个子网的(超出了自己的网段), 但是对路由来讲,B 是同一个子网, 为什么给他转发了呢?
    ThirdFlame
        12
    ThirdFlame  
       2023-02-10 11:20:16 +08:00   ❤️ 1
    @wuhaoecho #11 你已经自己把自己搞乱了。

    预设条件 gateway 10.10.15.1/24 A 10.10.15.129/24 B 10.10.15.3/26
    你里面涉及到了三层通信和二层通信两层的东西。

    gateway 和 A 认为局域网掩码是 255.255.255.0(也就是 24 位掩码),那么即使他们不主动发起 ARP 请求,通过监听到 B 发出的 ARP 请求广播,也能够了解到 B 的 MAC 地址,从而直接通过二层向 B 发送数据。

    而 B 认为局域网掩码是 255.255.255.224(也就是 26 位掩码),认为 gateway 和他一个网段,而 A 不是。 那么二层通信是发送不给 A 的,只会通过三层通信,将数据包发送个 gateway ,请 gateway 转发。
    echoless
        13
    echoless  
    OP
       2023-02-10 20:25:39 +08:00
    @ThirdFlame 感觉你这个事说清楚了, 那个书主要讲 wireshark 了, 没有讲 gateway 自己的掩码 (也可能是作者默认是大家都懂的, 但是我不懂...)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3075 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 14:27 · PVG 22:27 · LAX 06:27 · JFK 09:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.