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

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

  •  1
     
  •   zhyf2901 · 2024-03-28 09:15:42 +08:00 · 5952 次点击
    这是一个创建于 369 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问题:子网 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  
       2024-03-28 09:21:41 +08:00 via iPhone
    有路由表 一级一级找下去 直到最后发给路由器 B 然后由 B 发送给 C

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

    问题不是怎么找到 C 而是路由器之间如何交换信息来知道 C 在哪里
    defunct9
        2
    defunct9  
       2024-03-28 09:23:43 +08:00
    说来话长。放弃
    luoyide2010
        3
    luoyide2010  
       2024-03-28 09:25:32 +08:00
    跨网段通信主要靠路由,能不能找到路由器 C ,就得看双方路由表有没有到达目的地的路由

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

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

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

    循环上面步骤,找到目标就能通信,找不到就没法通信
    SWALLOWW
        4
    SWALLOWW  
       2024-03-28 09:26:02 +08:00
    我也不熟,但是路由起和路由器之间会通过 bgp 或者 ospf 之类的协议构建路由表,然后 A 就知道 B 了,B 自己再发给内部的路由
    wy315700
        5
    wy315700  
       2024-03-28 09:27:10 +08:00   ❤️ 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  
       2024-03-28 09:30:09 +08:00
    实际上机器 1 和机器 3 是不能直接通信的
    dog82
        7
    dog82  
       2024-03-28 09:30:38 +08:00
    我的网络知识极度匮乏,我只知道局域网内不要 ip ,直接在数据链路层通信就行;跨网段就得配 IP 走网络层了
    EchoWhale
        8
    EchoWhale  
       2024-03-28 09:31:46 +08:00
    机器 3 和机器 1 在不同的广域网下.
    如果能直接通信的话, 就不用费那么大劲要公网 ip 了
    me1onsoda
        9
    me1onsoda  
       2024-03-28 09:36:40 +08:00
    还有端口,你数据包里没提到。定位到机器 3 是路由器 B 的工作,内部有一种端口和 mac 地址的映射表,比如机器 3 暴露 8080 端口,路由器 B 就记录 23333:机器 3 的 mac 地址,端口 8080 。机器 1 的目的端口就是 23333 ,路由器 B 收到 23333 端口数据就转给机器 3 的 8080 端口
    EchoWhale
        10
    EchoWhale  
       2024-03-28 09:39:37 +08:00
    你第一步就错了吧.
    1. 机器 1(192.168.1.2)构造 ip 报文, 目标地址应该是机器 3(192.168.0.100)
    2. 机器 1 的网关发现目标是个保留地址, 丢掉
    luzemin
        11
    luzemin  
       2024-03-28 09:40:14 +08:00   ❤️ 2
    正好之前写过这么一篇很切题的 https://www.cnblogs.com/talentzemin/p/17616090.html
    可以看看
    f6x
        12
    f6x  
       2024-03-28 09:42:25 +08:00   ❤️ 1
    吾有一神物可解君愁, 名曰:traceroute
    qingcheng
        13
    qingcheng  
       2024-03-28 09:46:26 +08:00
    首先提问的结构部门不明确,机器 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
       2024-03-28 09:46:41 +08:00
    @me1onsoda
    @wy315700
    网络层数据包有端口的话,我感觉稍稍好理解一些了, 但引申出几个问题
    1 、ip 层或网络层有端口的概念吗,貌似看网上各种资料都说端口是 tcp 层的概念
    2 、如果要在路由器映射到子网机器的端口, 那端口数量是不是有限的, 如果子网机器多,或者是机器本身开放端口比较多,65535 个端口会不会不够用
    me1onsoda
        15
    me1onsoda  
       2024-03-28 09:48:11 +08:00
    @EchoWhale #10 目的地址是个内网 ip ,你觉得路由器该怎么做转发
    EchoWhale
        16
    EchoWhale  
       2024-03-28 09:49:34 +08:00
    @me1onsoda 我觉得路由器应该丢掉这个包.
    sentinelK
        17
    sentinelK  
       2024-03-28 09:50:18 +08:00
    “如果机器 1 和机器 3 首次通信,流程是什么样的。。”

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

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

    所以:
    要么需要在路由器 B 、C 进行转发设置。同时改变机器 1 的请求位置。
    要么做一个转发服务,机器 1 和 3 都面向 server 通信。
    xzysaber
        18
    xzysaber  
       2024-03-28 09:55:09 +08:00
    少了一些流程吧。
    并且"机器 1:arp 协议,寻找目标 ip 的 mac 地址,找到路由器 B mac",这里应该是找到路由器 A 的 MAC 。
    MozzieW
        19
    MozzieW  
       2024-03-28 09:55:41 +08:00
    你的理解是对的,少的那部分不会是因为那个属于额外的知识:内网穿透、端口转发
    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  
       2024-03-28 09:55:45 +08:00
    主机和路由的工作流程都一样:

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

    具体可以参考这篇文章: https://fasionchan.com/network/ip/routing/
    zhyf2901
        21
    zhyf2901  
    OP
       2024-03-28 10:02:19 +08:00
    @MozzieW 是写错了,目标 ip 是 116.153.22.2
    wy315700
        22
    wy315700  
       2024-03-28 10:09:28 +08:00   ❤️ 2
    @zhyf2901
    ip 层或网络层没有端口
    端口是 tcp 或者 UDP 上面的

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

    65535 个端口会不会不够用

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

    OP 提出的这个例子中,既涉及到了路由,也涉及到了地址转换,还是个相对比较复杂的场景,建议先从同一局域网下不同 subnet 的开始分析。
    Cu635
        26
    Cu635  
       2024-03-28 10:33:49 +08:00
    重修本科的网络基础课程吧。
    royking930911
        27
    royking930911  
       2024-03-28 10:51:48 +08:00
    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  
       2024-03-28 10:52:58 +08:00
    1 访问 3
    情况 1 ,3 在自己的外网网关做端口映射
    情况 2 ,3 在自己的外网网关那做 DNAT
    情况 3 ,3 和 1 进行 udp 打洞
    情况 4 、1 和 3 经 1 或 3 的外网或第三方加入一个 vpn
    lcy630409
        29
    lcy630409  
       2024-03-28 11:14:50 +08:00
    就和邮局的系统一样,网络寻址 通俗讲很简单的
    而且你的理解有问题,要分层次理解,不要放一起混淆
    而且路由器 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  
       2024-03-28 11:22:00 +08:00
    再通俗一点 打个例子,ems 快递
    什么 ARP 这些 接口层 你可以理解为现实中 你和本地邮局之间的物理路径,就是区你最近的邮局的路
    ip 网络层 可以理解为你的地址 门牌号,能让本地邮局的快递员找到你
    UDP TCP 传输层 可以理解为信封 信封上写着地址和包裹着内部数据 , 在快递员把信封给你的时候 你知道要给谁(收件人是你家谁)
    http dns 这类 应用层 就是内部数据,最终收件人拿到信封 拆开后 看了信件内容 才能知道对方发了个啥 再根据自身的功能回啥信
    kalinzhang
        31
    kalinzhang  
       2024-03-28 11:25:29 +08:00
    之前上网络课程有一个 lab 就是做的路由,如果想动手的话推荐一个小软件 https://mininet.org/;可以本机搭一个虚拟网络,跑几个现成的小 server 然后 traceroute 看一看
    evill
        32
    evill  
       2024-03-28 11:39:59 +08:00
    可以看看 calico 的 IPIP ,讲解的很清晰
    cybort
        33
    cybort  
       2024-03-28 12:56:17 +08:00 via Android
    我理解楼主不是要问不同网段的机器怎么通信,而是没有公网 ip 的机器怎么通信。其实本来是不可以的,因为有了 NAT 把局域网上的机器视作公网出入口的机器的一个应用,才能相互通信,但这都属于是补丁,你自己做个私有协议也可以实现。
    ben666
        34
    ben666  
       2024-03-28 13:04:57 +08:00
    1. 同一个子网内的主机可以通过 ARP 寻址,直接通讯
    2. 跨子网,需要先把报文发给网关(可以是路由器、交换机等网络设备),网关再转出去

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

    本机有路由表、 路由器也有路由表,都是按照路由表来转发的
    zhaoxiaofeng
        37
    zhaoxiaofeng  
       2024-03-28 14:05:24 +08:00
    基础有点差,可以先搜下二三层转发,把流程弄清
    EvanQu
        39
    EvanQu  
       2024-03-28 14:17:46 +08:00
    https://sspai.com/post/64634
    可以看下 一共 7 篇
    小白也能看懂的网络基础 由浅到深
    zchyit
        40
    zchyit  
       2024-03-28 14:20:59 +08:00
    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  
       2024-03-28 14:24:12 +08:00
    这俩没法通信, 通信的前提是一方是在广域网上内被找到的.
    所以需要内网穿透
    sketcherly
        42
    sketcherly  
       2024-03-28 14:25:33 +08:00
    wanguorui123
        43
    wanguorui123  
       2024-03-28 14:35:46 +08:00
    先得学习 NAT 协议,然后了解下 TCP 打洞原理
    IDAEngine
        44
    IDAEngine  
       2024-03-28 14:39:48 +08:00
    网关都不一样,不能通信,除非搭建 VPN 让机器在同一个子网,比如用 ZeroTier/LogMeIn/TailScale 这些
    zeroDev
        45
    zeroDev  
       2024-03-28 14:50:43 +08:00
    @zhyf2901 #14
    https://127.0.0.1:1080
    应用协议://ip 层(地址和 ip )
    地址是路由器管得
    nekoneko
        46
    nekoneko  
       2024-03-28 14:51:34 +08:00
    dode
        47
    dode  
       2024-03-28 15:07:48 +08:00
    每一台网络设备都会查看数据包是不是发给本网络下的对端设备,不是的话数据包就会发送给这个设备的默认路由

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

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

    需要外网主动向内网发起访问。
    FaiChou
        49
    FaiChou  
       2024-03-28 15:25:16 +08:00
    不良林这视频讲的挺详细的, 属于保存下来隔段时间就刷一遍的网络通讯:

    shermie
        50
    shermie  
       2024-03-28 15:36:59 +08:00
    我曾经和你有一模一样的疑问,也想过那岂不是一个局域网下最多只能有 65535 个端口映射,后面看了一些书似懂非懂的,但是核心就是 ip:port 做路由映射,看那个日本人写的《网络是怎么样连接的》这本书,比较容易理解
    leconio
        51
    leconio  
       2024-03-28 16:16:05 +08:00 via iPhone
    [路由器是如何路由的?(上集)-哔哩哔哩] https://b23.tv/qhvbWWQ
    之前看过一个视频,讲的挺好的
    Shinglee
        52
    Shinglee  
       2024-03-28 16:19:52 +08:00
    上面的推荐的不良林视频,建议你先看看。感觉你的整个思路都有问题。
    feaul
        53
    feaul  
       2024-03-28 16:46:16 +08:00
    @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  
       2024-03-28 16:51:01 +08:00
    1. 一个很常见的误区,家用”路由器“它不是书里面提到的”路由“器,它就是一个 ”NAT 设备“+”二层交换机“的二合一设备。

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

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

    两个不能混在一起谈。
    Songxwn
        55
    Songxwn  
       2024-03-28 16:54:26 +08:00
    不同子网的机器,是扔给网关的,二层 MAC 地址是网关的。
    feaul
        56
    feaul  
       2024-03-28 17:05:10 +08:00
    @zhyf2901 对是的,做的映射的数量是有限制的,实际的需求中不会做怎么多的映射,如果非要映射怎么多,可以配置多个公网地址。
    julyclyde
        57
    julyclyde  
       2024-03-28 21:09:13 +08:00
    首先要理解:
    冲突域、数据链路层 访问控制子层
    广播域、网络层
    这两组关系
    smallfount
        58
    smallfount  
       2024-03-28 21:42:05 +08:00
    你不能理解是因为你一上来就错了啊。。。
    机器本身也会带路由表。。。
    你的目标在本地带的明细路由不存在的情况下。。
    机器的路由表会把你的包丢去默认路由指向的 IP, 也就是网卡的网关地址。
    这时候 MAC 就不在有太大的作用了。。。数据包进到网关 IP 后就会根据路由设备的路由表转发流量
    如果有 NAT 就映射地址。。没 NAT 就直接根据目标出去。
    公网地址大部分都是默认路由出去了就。。
    zhyf2901
        59
    zhyf2901  
    OP
       2024-03-28 21:44:02 +08:00
    多谢大家,给了很多思路和学习资料,暂时看不完,感觉要补的课有点多,我去回炉重造一下。
    crab
        60
    crab  
       2024-03-28 22:01:31 +08:00
    jonathan11
        61
    jonathan11  
       2024-03-28 22:28:39 +08:00 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  
       2024-03-28 23:30:12 +08:00
    首先呢你这里的配置缺少了一个关键信息,那就是每个网段子网掩码的长度。下面我们补充一个设定,就是 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  
       2024-03-29 08:44:50 +08:00 via iPhone
    子网之间走路由
    snoBall
        64
    snoBall  
       2024-03-29 11:59:50 +08:00 via Android
    我想机器 1 和 3 应该是无法互相发现的,因为两个用的都是保留的局域网地址,机器 1 如果构造目的地址为 192.168.0.100 的包,在送到路由器 A 的时候路由器发现其连接的网络中没有 192.168.0.x/24 ,不会把包向公网发送,就把包丢弃通知机器 1 目标不可达。所以如果机器 1,3 之间想要通信要么拥有公网 ip ,要么使用 nat 技术,毕竟通信需要做到先发现再通信。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3466 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 00:42 · PVG 08:42 · LAX 17:42 · JFK 20:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.