V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
zhyf2901
V2EX  ›  Linux

提问:最近学习网络层协议,一直不理解不同子网的机器如何通信,请大佬指教

  •  1
     
  •   zhyf2901 · 232 天前 · 5492 次点击
    这是一个创建于 232 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问题:子网 A 的机器如果向子网 B 机器发送数据

    网络结构

    • 路由器 A (广域网 ip:116.153.22.1 )

      • 机器 1 (内网 ip:192.168.1.2 ) 内网网关( 192.168.1.1 )
      • 机器 2 (内网 ip:192.168.1.3 )内网网关( 192.168.1.1 )
    • 路由器 B (广域网 ip:116.153.22.2 )

      • 路由器 C (内网 ip\网关:192.168.1.2 ) 内网网关( 192.168.1.1 )
        • 机器 3 (内网 ip:192.168.0.100 )内网网关( 192.168.0.1 )
        • 机器 4 (内网 ip:192.168.0.101 )内网网关( 192.168.0.1 )
      • 路由器 D (内网 ip\网关:192.168.1.3 )内网网关( 192.168.1.1 )
        • 机器 N

    如果机器 1 和机器 3 首次通信,流程是什么样的。。

    我理解的流程:

    1. 机器 1:构造 ip 报文, 源 ip:192.168.1.2 目标 ip:116.153.22.1
    2. 机器 1:arp 协议,寻找目标 ip 的 mac 地址,找到路由器 B mac
    3. 机器 1:构造数据包 发送到路由器 A ,
      • 源 mac:机器 1
      • 目标 mac:路由器 B
      • 源 ip:192.168.1.2
      • 目标 ip:116.153.22.1
    4. 路由器 A: 到这里就理解不了了,已知的数据包内容完全定位不到 机器 3 ,甚至定位不到路由器 C

    已阅读资料: https://cloud.tencent.com/developer/article/1173761 https://blog.csdn.net/qq_42911741/article/details/132514748

    64 条回复    2024-03-29 11:59:50 +08:00
    twl007
        1
    twl007  
       232 天前 via iPhone
    有路由表 一级一级找下去 直到最后发给路由器 B 然后由 B 发送给 C

    实际更复杂 建议先去了解一下各种路由交换协议 对路由器之间怎么交换信息先有个了结

    问题不是怎么找到 C 而是路由器之间如何交换信息来知道 C 在哪里
    defunct9
        2
    defunct9  
       232 天前
    说来话长。放弃
    luoyide2010
        3
    luoyide2010  
       232 天前
    跨网段通信主要靠路由,能不能找到路由器 C ,就得看双方路由表有没有到达目的地的路由

    流程大概是这样的(有点久没接触,不一定全对):

    机器 1 发现是跨网段的,而且自己路由表没用到机器 3 的路由,就会获取网关 MAC 地址,构建数据包发给路由器 A ,让路由器 A 处理这个数据包(如果有机器 3 有到目的地的路由,就发给路由表中的 下一跳地址,让下一跳处理)

    数据包到达路由器 A ,路由器查找自己的路由表,如果路由器有相关网段的路由,就发给该路由的下一跳,没有则发给默认网关处理。

    循环上面步骤,找到目标就能通信,找不到就没法通信
    SWALLOWW
        4
    SWALLOWW  
       232 天前
    我也不熟,但是路由起和路由器之间会通过 bgp 或者 ospf 之类的协议构建路由表,然后 A 就知道 B 了,B 自己再发给内部的路由
    wy315700
        5
    wy315700  
       232 天前   ❤️ 2
    机器 1 和 3 因为处在两个不相连的私网里,所以无法直接通讯,需要机器 3 在路由器 B 上面做一个端口映射。

    连接过程是
    1. 机器 1:构造 ip 报文, 源 ip:192.168.1.2 目标 ip:116.153.22.2
    2. 机器 1 在路由表里没有发现这个包的路由,于是把包发给网关 192.168.1.1 。也就是路由器 1
    3. 路由器 1 寻找路由表,经过广域网把包发给路由器 B 。
    4. 路由器 B 寻找端口映射表,发现这个包要转发给机器 3 ,但是机器 3 和路由器 B 不在一个网段内,于是寻找路由表发现 192.168.0.100 的下一级节点是路由器 C ,于是把包交给路由器 C 。
    5. 路由器 C 经过 arp 协议,寻找 机器 3 的 mac 地址,把包发给机器 3.
    zhangsanfeng2012
        6
    zhangsanfeng2012  
       232 天前
    实际上机器 1 和机器 3 是不能直接通信的
    dog82
        7
    dog82  
       232 天前
    我的网络知识极度匮乏,我只知道局域网内不要 ip ,直接在数据链路层通信就行;跨网段就得配 IP 走网络层了
    EchoWhale
        8
    EchoWhale  
       232 天前
    机器 3 和机器 1 在不同的广域网下.
    如果能直接通信的话, 就不用费那么大劲要公网 ip 了
    me1onsoda
        9
    me1onsoda  
       232 天前
    还有端口,你数据包里没提到。定位到机器 3 是路由器 B 的工作,内部有一种端口和 mac 地址的映射表,比如机器 3 暴露 8080 端口,路由器 B 就记录 23333:机器 3 的 mac 地址,端口 8080 。机器 1 的目的端口就是 23333 ,路由器 B 收到 23333 端口数据就转给机器 3 的 8080 端口
    EchoWhale
        10
    EchoWhale  
       232 天前
    你第一步就错了吧.
    1. 机器 1(192.168.1.2)构造 ip 报文, 目标地址应该是机器 3(192.168.0.100)
    2. 机器 1 的网关发现目标是个保留地址, 丢掉
    luzemin
        11
    luzemin  
       232 天前   ❤️ 2
    正好之前写过这么一篇很切题的 https://www.cnblogs.com/talentzemin/p/17616090.html
    可以看看
    f6x
        12
    f6x  
       232 天前   ❤️ 1
    吾有一神物可解君愁, 名曰:traceroute
    qingcheng
        13
    qingcheng  
       232 天前
    首先提问的结构部门不明确,机器 1 和路由器 C 有着相同的内网 IP 和网关(机器 2 和路由器 D 同理)

    那么对结构有以下猜测:
    路由器 A 与路由器 B 的局域网 IP 地址、网关地址相同,通过广域网互相访问,不能通过内网直接访问

    基于上述的猜测,仅当机器 1 和机器 3 之间进行了 NAT 穿透或路由器配置了转发规则的情况下可以通讯:

    1. 机器 1 和 机器 3 通过穿透在路由器上打开映射端口
    2. 机器 1 请求访问 路由器 B (广域网 ip:116.153.22.2 )对应的端口,不在本地转发表内,丢给默认网关路由器 A
    3. 路由器 A 把数据法送给它的默认网关(广域网不应该是局域网)
    4. 路由器 B 收到广域网网关发送的数据,根据转发规则和端口号将数据转发给机器 3
    zhyf2901
        14
    zhyf2901  
    OP
       232 天前
    @me1onsoda
    @wy315700
    网络层数据包有端口的话,我感觉稍稍好理解一些了, 但引申出几个问题
    1 、ip 层或网络层有端口的概念吗,貌似看网上各种资料都说端口是 tcp 层的概念
    2 、如果要在路由器映射到子网机器的端口, 那端口数量是不是有限的, 如果子网机器多,或者是机器本身开放端口比较多,65535 个端口会不会不够用
    me1onsoda
        15
    me1onsoda  
       232 天前
    @EchoWhale #10 目的地址是个内网 ip ,你觉得路由器该怎么做转发
    EchoWhale
        16
    EchoWhale  
       232 天前
    @me1onsoda 我觉得路由器应该丢掉这个包.
    sentinelK
        17
    sentinelK  
       232 天前
    “如果机器 1 和机器 3 首次通信,流程是什么样的。。”

    答:在既有网络结构,且不借助其他手段的前提下(设置转发,或者中转服务等),不能通信。

    你可以把内网地址,理解成你的“门牌号”。外网地址,理解为小区地址。
    机器 1 只知道机器 3 住在 1001 ,他是不可能找到机器 3 的。

    所以:
    要么需要在路由器 B 、C 进行转发设置。同时改变机器 1 的请求位置。
    要么做一个转发服务,机器 1 和 3 都面向 server 通信。
    xzysaber
        18
    xzysaber  
       232 天前
    少了一些流程吧。
    并且"机器 1:arp 协议,寻找目标 ip 的 mac 地址,找到路由器 B mac",这里应该是找到路由器 A 的 MAC 。
    MozzieW
        19
    MozzieW  
       232 天前
    你的理解是对的,少的那部分不会是因为那个属于额外的知识:内网穿透、端口转发
    1. 192.168 段是内网(局域网),你已经知道机器 1 构造的时候要用广域网 IP 了。第一步的 目标 IP 应该是 116.153.22.2 (路由器 B ),应该是写错了?
    2. 路由器 B 收到的是来自路由器 A 的请求,它并不知道 机器 1.假设我们请求的端口是 8080 ,路由器 B 也不会处理这个请求,因为它上面没有提供这个端口的服务。
    3. 目的是机器 3 收到,那么这个信息要给路由器 B 知道。所以需要在路由器 B 上配置端口转发,这样路由器 B 能把来自 8080 端口请求转发给 机器 3. 这个逻辑要不要在路由器 C 上配置呢?我理解还有看路由器 B 和路由器 C 之间的配置(超纲了,我不会)
    4. 对路由器 B 而言,它一直和路由器 A 交流;路由器 A 也只和路由器 B 交流。至于机器 1 和机器 3 ,是路由器内部根据不同端口做了转发。
    hxysnail
        20
    hxysnail  
       232 天前
    主机和路由的工作流程都一样:

    1. 从 IP 包中取出目的地址,然后查询路由表,看下一跳的地址 N 是什么?
    2. 接下来,通过数据链路层,把 IP 包发给下一跳 N ,步骤如下:
    - 执行 ARP 协议,查询下一跳 N 的 mac 地址;
    - 封装数据链路层帧,将 IP 包发给下一跳,目的 mac 地址是上一步通过 ARP 协议查询到的。

    具体可以参考这篇文章: https://fasionchan.com/network/ip/routing/
    zhyf2901
        21
    zhyf2901  
    OP
       232 天前
    @MozzieW 是写错了,目标 ip 是 116.153.22.2
    wy315700
        22
    wy315700  
       232 天前   ❤️ 2
    @zhyf2901
    ip 层或网络层没有端口
    端口是 tcp 或者 UDP 上面的

    你的路由器 AB 和路由器 C 其实是不同的东西。
    路由器 AB 其实是网关。链接了你内网和外网并且进行了地址转换。
    路由器 C 其实应该叫做三层交换机。

    65535 个端口会不会不够用

    现在都是对称 nat ,够用了。
    gefranks
        23
    gefranks  
       232 天前
    如果我没理解错的话, 这个网络 A, B 里面都有 192.168.1.x 这个子网, 从机器 3 的包在回 1 的时候在 C 都会有问题, overlap 了.
    以前 cisco press 有本书, ip addressing fundamentals 对 ipv4 这块讲的不错.
    Cisco Packet Tracer 可以模拟.
    proxytoworld
        24
    proxytoworld  
       232 天前
    如果发送的数据包不是自己的 IP ,会根据路由表查询,在自己路由表里面没有,则会发给默认路由,数据包到了路由器,路由器会查询自己的路由表,这个路由表根据各种算法来的。
    Tumblr
        25
    Tumblr  
       232 天前
    推荐 YouTube 的一个频道: https://www.youtube.com/@PowerCertAnimatedVideos

    OP 提出的这个例子中,既涉及到了路由,也涉及到了地址转换,还是个相对比较复杂的场景,建议先从同一局域网下不同 subnet 的开始分析。
    Cu635
        26
    Cu635  
       232 天前
    重修本科的网络基础课程吧。
    royking930911
        27
    royking930911  
       232 天前
    Cisco Packet Tracer 模拟器跟一下就知道了
    楼主这个拓扑图跟广域网没啥关系 机器 1 和 3 通信根本不会走到广域网上去
    可以这么理解 路由 CD 相当于挂在路由 A 下面
    机器 3 4 N 向机器 1 2 发数据这个很简单,直接数据包往网关地址丢就行了 路由器拆包以后发送到对应端口 因为下层网络是知道上层网络的出口地址的 就是内网网关
    关键是机器 1 2 向 3 4 N 发数据
    由于路由器 A 并不知道 192.168.0.0 这个子网的路径 需要在路由器 A 设置路由表 将 192.168.0.0 的数据丢到 192.168.1.2 这个地址
    shilyx
        28
    shilyx  
       232 天前
    1 访问 3
    情况 1 ,3 在自己的外网网关做端口映射
    情况 2 ,3 在自己的外网网关那做 DNAT
    情况 3 ,3 和 1 进行 udp 打洞
    情况 4 、1 和 3 经 1 或 3 的外网或第三方加入一个 vpn
    lcy630409
        29
    lcy630409  
       232 天前
    就和邮局的系统一样,网络寻址 通俗讲很简单的
    而且你的理解有问题,要分层次理解,不要放一起混淆
    而且路由器 C 和 D 有问题,路由器 C 和 D 的 ip 应该是 B 网段的,才能联通,CD 的网关应该是 B

    你说的这段网络层( ip 层)的流程就是:
    机器 1 根据自身路由表 找 116.153.22.2 因为没有该路由 所以走默认路由(路由器 192.168.1.1 )
    路由器 A 收到你的消息之后会在根据自身路由表找寻 116.153.22.2 ,没有的话 还是走默认路由 也就是运营商,一路找过去,一直抵达路由 B ,至此完成网络层的链接

    在传输层来讲
    在路由器 A 收到机器 1 的数据(访问 116.153.22.2:80 )的时候 路由器会记录机器 1 的发出端口(比如 6666 ),再根据自己的安全等级( nat 类型)来选择一个端口(比如 nat 为 full 那么出发端口同样是 6666 )发到 116.153.22.2 ,这就是 nat 映射表( 192.168.1.2:6666->116.153.22.1:6666 ),此时数据经过网络层的方法达到路由器 B
    路由器 B 解析数据 发现有 nat 数据,就根据自身的映射表查找访问端口 6666 是否有记录,没有就找默认转发( DMZ ),DMZ 也没有就断开链接,有记录的话就转发到相应的 ip 上去,这个相应的 ip 如果还是路由类型 继续上述步骤,如果是最终终端 就根据自身端口是否打开来接不接数据
    lcy630409
        30
    lcy630409  
       232 天前
    再通俗一点 打个例子,ems 快递
    什么 ARP 这些 接口层 你可以理解为现实中 你和本地邮局之间的物理路径,就是区你最近的邮局的路
    ip 网络层 可以理解为你的地址 门牌号,能让本地邮局的快递员找到你
    UDP TCP 传输层 可以理解为信封 信封上写着地址和包裹着内部数据 , 在快递员把信封给你的时候 你知道要给谁(收件人是你家谁)
    http dns 这类 应用层 就是内部数据,最终收件人拿到信封 拆开后 看了信件内容 才能知道对方发了个啥 再根据自身的功能回啥信
    kalinzhang
        31
    kalinzhang  
       232 天前
    之前上网络课程有一个 lab 就是做的路由,如果想动手的话推荐一个小软件 https://mininet.org/;可以本机搭一个虚拟网络,跑几个现成的小 server 然后 traceroute 看一看
    evill
        32
    evill  
       232 天前
    可以看看 calico 的 IPIP ,讲解的很清晰
    cybort
        33
    cybort  
       232 天前 via Android
    我理解楼主不是要问不同网段的机器怎么通信,而是没有公网 ip 的机器怎么通信。其实本来是不可以的,因为有了 NAT 把局域网上的机器视作公网出入口的机器的一个应用,才能相互通信,但这都属于是补丁,你自己做个私有协议也可以实现。
    ben666
        34
    ben666  
       232 天前
    1. 同一个子网内的主机可以通过 ARP 寻址,直接通讯
    2. 跨子网,需要先把报文发给网关(可以是路由器、交换机等网络设备),网关再转出去

    抓包分析一下有助于理解,如果能读 C 代码,可以直接看看这部分协议栈代码
    dperf 测试仪的协议栈比较简洁,可以看看 ARP 、ICMP 、UDP 是怎么实现的
    https://github.com/baidu/dperf
    shoco
        35
    shoco  
       232 天前
    上课没好好听
    goodryb
        36
    goodryb  
       232 天前
    简单看了下,你是 2 层、3 层混在一起,你都提到子网,那就好好看 3 层路由转发的逻辑,跟 mac 、arp 没啥关系

    本机有路由表、 路由器也有路由表,都是按照路由表来转发的
    zhaoxiaofeng
        37
    zhaoxiaofeng  
       232 天前
    基础有点差,可以先搜下二三层转发,把流程弄清
    EvanQu
        39
    EvanQu  
       232 天前
    https://sspai.com/post/64634
    可以看下 一共 7 篇
    小白也能看懂的网络基础 由浅到深
    zchyit
        40
    zchyit  
       232 天前
    1 、机器 1 在 TCP/IP 层判断与机器 3 不在同一子网,于是将数据包转发给默认网关(即路由器 A ,机器 1 通过 ARP 获取默认网关的 MAC ,并填充到报文中,此时源目 IP 分别是 192.168.1.2 和 116.153.22.2 )。
    2 、默认网关(路由器 A )收到报文,发现目的 MAC 是自己,于是收下,转交 TCP/IP 层处理。默认网关(路由器 A )发现目的 IP 在不同子网,同样转发给自己的默认网关 116.153.22.X ,并做 NAT 地址转换(此时源目 IP 分别是 116.153.22.1 和 116.153.22.2 ),接下来过程在 ISP 内部,我们快进到路由器 B 的上一跳。
    3 、此时报文到达路由器 B ,需要根据 IP 和端口做 NAT 地址转换(此时源目 IP 分别是 116.153.22.1 和 192.168.0.100 ),转发到机器 3 (这里只考虑这是一次正常的回包,如果机器 1 是首次通信,还涉及内网穿透知识,背景不详,不作展开)。

    依稀记得是这样的,可能有一些细节没提到。
    nekoneko
        41
    nekoneko  
       232 天前
    这俩没法通信, 通信的前提是一方是在广域网上内被找到的.
    所以需要内网穿透
    wanguorui123
        43
    wanguorui123  
       232 天前
    先得学习 NAT 协议,然后了解下 TCP 打洞原理
    IDAEngine
        44
    IDAEngine  
       232 天前
    网关都不一样,不能通信,除非搭建 VPN 让机器在同一个子网,比如用 ZeroTier/LogMeIn/TailScale 这些
    zeroDev
        45
    zeroDev  
       232 天前
    @zhyf2901 #14
    https://127.0.0.1:1080
    应用协议://ip 层(地址和 ip )
    地址是路由器管得
    dode
        47
    dode  
       232 天前
    每一台网络设备都会查看数据包是不是发给本网络下的对端设备,不是的话数据包就会发送给这个设备的默认路由

    每一个网关路由设备会保存当前网络和其它网络 TCP&UDB 会话列表,记录网络连接状态
    tool2d
        48
    tool2d  
       232 天前
    你这情况比较特殊,需要自己手动构造路由表,估计要上软路由。

    普通路由器都会限制 WAN 主动传入流量,甚至会主动 DROP WAN 端口的向内流量。一般都是 LAN 向外传,你需求是刚好相反的。

    需要外网主动向内网发起访问。
    FaiChou
        49
    FaiChou  
       232 天前
    不良林这视频讲的挺详细的, 属于保存下来隔段时间就刷一遍的网络通讯:

    shermie
        50
    shermie  
       232 天前
    我曾经和你有一模一样的疑问,也想过那岂不是一个局域网下最多只能有 65535 个端口映射,后面看了一些书似懂非懂的,但是核心就是 ip:port 做路由映射,看那个日本人写的《网络是怎么样连接的》这本书,比较容易理解
    leconio
        51
    leconio  
       232 天前 via iPhone
    [路由器是如何路由的?(上集)-哔哩哔哩] https://b23.tv/qhvbWWQ
    之前看过一个视频,讲的挺好的
    Shinglee
        52
    Shinglee  
       232 天前
    上面的推荐的不良林视频,建议你先看看。感觉你的整个思路都有问题。
    feaul
        53
    feaul  
       232 天前
    @wy315700 说的不错,因为在不同的私网里,并且私网路由无法在公网上传播,
    首先先把 3 的端口映射出来。在 B 上做 C 的映射,在 C 上做 3 的映射,这样就是 1 直接访问 B 了,
    1 ,机器 1 源 ip:192.168.1.2 目标 ip:116.153.22.2 发现是跨网段的,直接转发给网关
    2 ,路由器 A 做源 NAT 把源地址更换 源 ip:116.153.22.1 目标 ip:116.153.22.2
    3 ,路由器 B 查找映射表 做目的 NAT 把目的地址更换 源 ip:116.153.22.1 目标 ip:192.168.1.2
    4. 路由器 C 查找映射表 做目的 NAT 把目的地址更换 源 ip:116.153.22.1 目标 ip:192.168.0.100
    cdlnls
        54
    cdlnls  
       232 天前
    1. 一个很常见的误区,家用”路由器“它不是书里面提到的”路由“器,它就是一个 ”NAT 设备“+”二层交换机“的二合一设备。

    2. 真正的路由器 它只负责转发数据包,即“路由”。进过它的包进去是啥,出去还是啥。

    3. 虚假的路由器(家用路由器/光猫),它看上去在“路由”,实际上背地里在做 NAT 地址转换。

    两个不能混在一起谈。
    Songxwn
        55
    Songxwn  
       232 天前
    不同子网的机器,是扔给网关的,二层 MAC 地址是网关的。
    feaul
        56
    feaul  
       232 天前
    @zhyf2901 对是的,做的映射的数量是有限制的,实际的需求中不会做怎么多的映射,如果非要映射怎么多,可以配置多个公网地址。
    julyclyde
        57
    julyclyde  
       232 天前
    首先要理解:
    冲突域、数据链路层 访问控制子层
    广播域、网络层
    这两组关系
    smallfount
        58
    smallfount  
       232 天前
    你不能理解是因为你一上来就错了啊。。。
    机器本身也会带路由表。。。
    你的目标在本地带的明细路由不存在的情况下。。
    机器的路由表会把你的包丢去默认路由指向的 IP, 也就是网卡的网关地址。
    这时候 MAC 就不在有太大的作用了。。。数据包进到网关 IP 后就会根据路由设备的路由表转发流量
    如果有 NAT 就映射地址。。没 NAT 就直接根据目标出去。
    公网地址大部分都是默认路由出去了就。。
    zhyf2901
        59
    zhyf2901  
    OP
       232 天前
    多谢大家,给了很多思路和学习资料,暂时看不完,感觉要补的课有点多,我去回炉重造一下。
    jonathan11
        61
    jonathan11  
       232 天前 via Android
    首先两个路由器直接是有 NAT 的,可以把内网地址跟外网地址进行映射,ping 的时候是 icmp 协议,没有端口,但是有个字段会代替端口的作用。
    这里的一跟三是没办法 ping 通的,因为他们都在 NAT 之下,但是三可以通过 Nat 将自身端口映射到路由器 B ,达成一通过映射表达成访问三的端口(这里的一访问的是路由器 B 的 IP 地址)
    如果不考虑 NAT ,路由器上面应该是有所有的路由,一发的包,目的 IP 是三,但是目的 MAC 会是路由器,因为跨网段会先通过网关查找路由表,然后在路由器 A 拆包发现 ip 地址不是自己,往路由器 B 发送。路由器 B 发现直连有同网段路由表,通过 arp 表,将目的 mac 换成三的 mac ,三收到后发现 ip 也是自己的,就开始准备回复,过程同理。
    keepMyselfClam
        62
    keepMyselfClam  
       232 天前
    首先呢你这里的配置缺少了一个关键信息,那就是每个网段子网掩码的长度。下面我们补充一个设定,就是 192.168.X.X 下面的子网掩码长度是 24 位的。
    第二呢,路由器 a 和路由器 d 的这个网段是重复了。后面我们直接忽略路由器 d 和它下面的这个网段。
    第三是,路由器 b 的这个设定的,一般来说一个路由器有多个接口,分别接到不同的网段。正确的描述应该是路由器 b 它有三个接口,一个接到广域网。所谓路由器 C 应该看做路由器 B 的另一个接口。
    -
    然后你需要知道每个机器自己的 IP,子网掩码长度和他的这个网关这三者之间的关系。
    以 192.168.1.2 发包给 192.168.0.100 为例.
    每个主机在往外发包的时候会根据自己的 IP 和子网掩码长度判断目标 IP 和自己 IP 是不是在同一个子网内。
    如果在一个子网内,那么我要向外广播 arp 消息,询问目标 IP 的 mac 地址是多少,拿到目标 mac 地址之后填入包的二层地址。目标的 IP 填入三层地址,然后发包。
    如果不在一个子网内,那么我要向外广播 ARP 消息询问网关的 mac 是多少。拿到网关的 MAC 之后填入包的二层地址。目标的 IP 填入三层地址,然后发包。在同一个子网内是由交换机负责转发数据包的。交换机只看二层的 mac 地址,它就会把这个包送到网关处。
    网关路由器拿到了这个包之后,首先他检查 mac 是自己的,说明是它收的包,然后检查目标 IP 不是自己的,那他要把这个包转发出去。
    网关路由器在转发包的时候需要有路由表,路由表即可以是静态配置,也可以由动态的路由协议去发现。这里网关会根据路由表发现我应该把这个包发给路由器 B 。
    然后同样的他会用 arp 协议获取路由器 B 的 mac 地址。然后把路由器的 mac 地址填到二层的地址上,三层及上面的保持不变。
    路由器 b 从广域网接口收到这个包之后,它会发现目标 IP 在自己的一个接口下面。这个时候他会发 arp 请求目标主机 IP 所对应的 mac 地址。收到 mac 地址后,把二层的 mac 换成目标主机的 mac 。送过去。
    目标主机这样就会收到这个包了,此时他收到的 mac 地址是自己的,IP 地址是自己的。
    xumng123
        63
    xumng123  
       231 天前 via iPhone
    子网之间走路由
    snoBall
        64
    snoBall  
       231 天前 via Android
    我想机器 1 和 3 应该是无法互相发现的,因为两个用的都是保留的局域网地址,机器 1 如果构造目的地址为 192.168.0.100 的包,在送到路由器 A 的时候路由器发现其连接的网络中没有 192.168.0.x/24 ,不会把包向公网发送,就把包丢弃通知机器 1 目标不可达。所以如果机器 1,3 之间想要通信要么拥有公网 ip ,要么使用 nat 技术,毕竟通信需要做到先发现再通信。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2503 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 15:50 · PVG 23:50 · LAX 07:50 · JFK 10:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.