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

刚刚想到了一个问题,关于路由器和网络地址转换,百思不得其解。

  •  
  •   Chigogo · 2016-01-06 19:27:35 +08:00 · 2717 次点击
    这是一个创建于 3235 天前的主题,其中的信息可能已经有所发展或是发生改变。
    大多用户的上网方案:用路由器共享一个公网 IP 上网。(下有轻微排版,手机党横屏观看更加)

    为此,路由器对数据包的地址字段做如下处理:
          服务器地址        客户机地址
    原数据包  <目的 IP+端口号>  +  <内网 IP+端口号>    路由器将其映射到
    新数据包  <目的 IP+端口号>  +  <公网 IP+新的端口号> 然后把数据包发出去

    在接收反馈时再进行相反的映射。





    问题来了,当几十台(保守估计)电脑同时使用路由器,每台电脑有许多进程同时上网时,路由器一共才 65536 个端口号,怎么着也不够用啊。
    如果说,路由器端在硬件上扩充端口数,比如扩充到 655360 个,那么处理后的新数据包到达服务器后,其端口号也是非法的,超过上限。




    所以到底是如何解决的?(只学过教材上的计算机网络,水平太渣,望不吝赐教)
    22 条回复    2016-01-07 09:38:37 +08:00
    Chigogo
        1
    Chigogo  
    OP
       2016-01-06 20:06:39 +08:00
    。。。
    atc
        2
    atc  
       2016-01-06 20:15:30 +08:00 via Android
    够用的,路由器对外端口号不是一个内网主机独占,可以共用
    wy315700
        3
    wy315700  
       2016-01-06 20:16:54 +08:00
    对称 NAT
    ayouwei
        4
    ayouwei  
       2016-01-06 20:17:08 +08:00
    端口并不能扩展, 但是 IP 可以。

    如果并发连接数超过 65535 , 需要增加公网 IP 解决
    abcbit
        5
    abcbit  
       2016-01-06 20:21:51 +08:00
    你以為運營商 nat 怎麼解決的?就是 100.64.0.0/10 所用的技術
    一個 ip 只有 65535 個端口,不夠用只能擴展 ip 。但實際上家用 nat 下的端口佔用沒那麼誇張,一般情況足夠用
    ChangeTheWorld
        6
    ChangeTheWorld  
       2016-01-06 20:24:38 +08:00
    多公网 IP 负载均衡,数据包打上回流标记确保源 /目标地址 一致,运营商的 NAT 就是这么玩的
    yexm0
        7
    yexm0  
       2016-01-06 20:25:55 +08:00 via Android
    同好奇移动的大内网是怎么做到那么多用户共用那几个 ip 的。
    ayouwei
        8
    ayouwei  
       2016-01-06 20:35:35 +08:00   ❤️ 2
    @yexm0 因为绝大部分连接是短连接, ms 级别就可以完成数据传输, 连接关闭之后端口就可以分配给其它新连接使用; 在某一个时刻连接数达到端口数上限的概率就小了。 如果有 10 个 IP , 那么并发上限就是 65W , 正常用户行为很难同时搞出这么多连接

    需要保持长连接的场景较少
    jasontse
        9
    jasontse  
       2016-01-06 21:11:58 +08:00 via iPad
    192.168.1.2:52631 -> *:45296 -> 1.1.1.1:80
    192.168.1.3:78996 -> *:45296 -> 2.2.2.2:80

    端口是可以根据不同远程主机复用的,实在不够了就只能加出口 IP 负载均衡。
    jasontse
        10
    jasontse  
       2016-01-06 21:14:23 +08:00 via iPad
    另外路由器上 655360 个以太网端口也是有挑战的, MAC 地址表没这么大。
    msg7086
        11
    msg7086  
       2016-01-06 23:30:12 +08:00
    公网端口通过对方 IP 来映射,达到多个连接复用单个端口的效果。
    如果不复用的话需要增加出口 IP 来增加连接数。
    很多大企业的网络接入都会提供多个公网 IP 地址,实际上就有这个效果。
    rrfeng
        12
    rrfeng  
       2016-01-06 23:31:53 +08:00
    [如果说,路由器端在硬件上扩充端口数]
    你是在逗我= =
    ming2281
        13
    ming2281  
       2016-01-06 23:43:39 +08:00
    有多个进程没有关系,反正每台电脑分配一个私有网络地址(看这个 ip 池子有多大), 路由器最多到 ip 层, 只管转发 ip 报文就行, tcp 层的事情它管不着, 所以进程的事情与它无关(这是主机应当考虑的问题)

    有多台电脑没有关系,路由器所能连接电脑做了上限(这个连接数应当是进行过充分考虑的,不必担心)
    webjin
        14
    webjin  
       2016-01-07 06:47:59 +08:00 via Android
    @ming2281NAT 工作在几层?
    auser
        15
    auser  
       2016-01-07 08:41:35 +08:00 via Android
    生产系统上正在这么用
    SNAT 端口搭配目的 IP 和协议一起用
    这样的话 基本上不会存在不够用的问题
    mhycy
        16
    mhycy  
       2016-01-07 08:59:14 +08:00
    题主犯了个很常见的错误。

    网络上,一个通讯需要 4 个信息进行标记
    本地 IP:本地端口 <-> 对端 IP:对端端口

    很显然在本地 IP ,对端 IP ,对端端口不变的时候,可用链路=端口的可用数
    理论上对于一个对端服务器 IP 的一个端口, NAT 单 IP 同一时间的可用链路是 65535

    即便是 QQ 这也是大学城等级的使用量了
    Chigogo
        17
    Chigogo  
    OP
       2016-01-07 09:01:21 +08:00
    @ayouwei 你这个在理
    @abcbit 也许吧但是企业如果同开着 100 台电脑和 100 台手机,连接数还是相当可观的。弄不好就不够了呢?
    @ChangeTheWorld 在理
    @jasontse
    192.168.1.2:52631 -> *:45296 -> 1.1.1.1:80
    192.168.1.3:78996 -> *:45296 -> 2.2.2.2:80
    这么搞得起来?
    @jasontse 不会的,
    @rrfeng 我说的是运输层端口,不是交换机物理端口。好吧,按照你那么理解……
    @msg7086 多 IP 分流我能理解,但是“公网端口通过对方 IP 来映射”,不太好理解
    @ming2281 NONONONO ,路由器是用到运输层端口的
    @auser 稍微讲讲呗。我今天在想这个问题,我们公司可能就几十台电脑,但如果是大企业,好几层楼的,本地局域网用 B 类保留地址,那么还是必须解决这个问题的。书上习题总假设说企业会得到一个地址段,尼玛如今怎么可能好吗?就一个 IP 看来是很难做的。
    Chigogo
        18
    Chigogo  
    OP
       2016-01-07 09:03:14 +08:00
    @mhycy ??路由器处理大量计算机,每台计算机又有大量连接数,路由器一共才 65535 个连接数,你说怎么办吧。
    mhycy
        19
    mhycy  
       2016-01-07 09:04:41 +08:00
    @Chigogo
    把话看懂再回复
    Chigogo
        20
    Chigogo  
    OP
       2016-01-07 09:30:11 +08:00 via iPhone
    @mhycy 看懂就不回复了。看不懂才回复。
    jasontse
        21
    jasontse  
       2016-01-07 09:33:40 +08:00 via iPad
    @Chigogo
    五元组,源地址 / 源端口 / 协议 / 目标地址 / 目标端口,只要有一项不同它就是另一组。
    lyh3222
        22
    lyh3222  
       2016-01-07 09:38:37 +08:00
    然后, UDP 和 TCP 是分开的,所以可以看成是 65536*2 个端口号
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3633 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 04:33 · PVG 12:33 · LAX 20:33 · JFK 23:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.