NAT和IP路由经验谈

    在工作中经常接触到网络两个端点client和server之间进行udp通讯,但是在维护过程中,总是出现跨NAT Server端主动通知的报文无法传递给client的错误,源于好多人对于网络知识的匮乏和理解非常浅。但如果刨根问底的话,其实自己在研究生阶段,也有类似的一个疑问:为什么局域网内的机器能够与因特网上的机器进行通讯,数据是怎么双向传递的。对于此问题,还通过一塌糊涂咨询网友,回答就是NAT,地址映射。。。。。

    IP网络提供了IP数据报文的路由功能。先从最简单的场景说起,假定所有的机器均具有IP地址。在最简单的情况下,如果两台机器在同一网段内,则它们可以直接通过IP到MAC的地址解析,发送报文到对端机器;而对端机器回复IP报文,过程上没有差异。

    但在更复杂的网络情况下,IP数据报文的传递,则必须进行路由,更甚者必须出现路由+网关(去面对异质网络类型,在链路层是不同的,不能够直接传递)。

    对于复杂情况的理解,如果你要想简单理解这一路上发生的事情,就必须认清楚IP路由的最终阶段:必须为同一网段内,IP数据报文的直接投送。就是上面所讲的最简单的场景!所以,我们可以看到,IP网络是怎么由简单走向非常复杂的,呵呵!有兴趣的可以研究路由算法。

     可以看到,在更复杂的网络结构下,负责最终投送阶段的机器IP地址不一定是IP报文的源地址。在长程的IP数据传递过程中,通常不是这样的,中间过程我们都可以称为“路由”,这也是IP网络的基本功能。只有首尾两端才能称之为投递,可以类比在过去的纸质邮件的收发过程。

     由于在IPV4的网络下,IP地址只有32位,地址随着因特网的蓬勃发展是不足的。IPV6的应运而生,就是想解决这个问题。IPV6直接提高到128位地址,崩溃地近乎疯狂,地址空间大到能够为地球上每一粒沙子分配30个IP地址。同时,还有企业或组织要建立自己的内部基于IP的网络,以便于电子化生产或办公等,但却不一定全部要公开到因特网,所以,这些组织会选择自己网络内仅有一个机器(最简单场景)具有因特网地址,而其他向访问因特网服务的机器都可以通过这台机器通向因特网。这种组网方式一方面减少了对于因特网IP地址的需求量,另外也减少了自己费用。IP地址因为是稀缺资源,应该是比较贵的:) 

     在内部IP网通讯时,可以利用到IP所提供的能力和功能,而不用知晓因特网的存在。在内部IP网与因特网通讯时,就出现了前面我自己所提到的那个问题。在这个过程中,在关口机器一方面具有内部网络的IP地址,另外一方面具有因特网地址。在两个网络之间都具有通讯能力,特别地“关口”机器两个地址所面对的网络是不一样的。而不是那种一个网卡上有两个地址,可以简单理解为两块网卡以利于接到不同的IP网络上。

   因为因特网组成的IP网,根据前面的推演是可以任何IP之间通讯(这里的任何IP是限制的,企业网占用的IP地址,在因特网规划时,就被排除在外了)。内部IP网络,由于也是IP网,所以,其内部IP之间也可以直接通讯的。关口”机器同时具有因特网地址和内部IP网络地址,就将两个给粘结起来了。至于怎么粘结,说简单一点,就是一个映射关系。

    这个映射关系的存在,因特网通讯其上层为tcp和upd,具有ip地址和port端口号的概念,在映射的时间因为“关口”机器可能要面临很多相同port的请求,所以,你发出去的报文在经过映射后,从关口出去时,不一定就是当时你发出去,有可能遭到修改;但是,当时数据返回时,根据当初的映射关系,“关口”机器再投递给内网机器相应的IP和PORT上,保持这个过程的几乎透明。这就是NAT。这个过程中是几乎完全透明的,但是也有细节差异。在当时研究生的时间,为理解这里面的奥秘,研究BT源码的时间,当时就奇怪为什么代码中就仅仅是一个connect,而没有处理的很复杂。其实想明白之后,就是应该那么简单的,呵呵。也可以看到当时自己也是对网络理解的非常浅陋的

  在存在NAT机制的情况下,PORT地址一般只能根据实际IP报文中填写PORT地址回复报文;如果一味地根据约定或者配置文件中的PORT值进行通讯,无异于刻舟求剑,不知变化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值