TCP/IP协议之所以最终打败对手,傲视群雄,一个不得不提的协议就是DHCP。
如果没有DHCP,TCP/IP协议在初始化过程中,需要用户提供IP地址、网络掩码、默认网关、DNS服务器,以此来完成各个协议模块的初始化工作,对于广大用户来说,这绝对是一种很糟糕的体验,那个掩码是啥?
而有了DHCP,TCP/IP协议在初始化时,会自动调用DHCP模块,DHCP通过广播的方式去发现(Discover)DHCP服务器,如果本广播域没有服务器,通常会在网关上配置一个DHCP Relay + DHCP 服务器IP,一句话,肯定可以找到一个可以分配IP(Offer)的服务器。
通过四次消息交互,最后电脑获得了所有上网的的IP参数,IP地址、网络掩码、默认网关、DNS服务器,TCP/IP所有模块完成初始化,比如IP模块、DNS模块。用户无需任何配置即可上网,这是TCP/IP对用户友好的一面。
但一般企业网、家庭网络,DHCP服务器分配给电脑的都是私有IP,诸如 10/8、172.16/12、192.168/16,这些私有IP在企业网内部还可以混混,但不能到Internet上去浪。
这就好比国人持有身份证(私有IP)只能国内旅游,但要出国必须使用护照,护照(公网IP)是国际通用的身份标识。
所以必须在企业网与Internet的边界网关(海关),做私有IP与公网IP的转换(NAT),由于公网IP可能只有一个或几个,需要使用NAT网关的端口号来识别一个个用户session,如果这个地方看不懂,可以参考数据库的组合键。https://www.zhihu.com/question/66553828/answer/244123563
需要指出的是,NAT的存在使得网络变的更复杂,使得一些多通道应用(比如FTP)、应用层嵌入私有IP的协议(比如SIP)无法正常工作,需要引起足够的重视。
这些我的电子书都有,甚至更详细,
https://www.zhihu.com/publications/book/119554662
为何要舍近求远…
DHCP是用来分配IP地址的。
NAT是用来转换IP地址的。
NAT的类型很多,但很多时候,NAT就是为了让N台手机/电脑/平板能共享同一个公网IP来上网,如果你用过Linux,可以试试iptables的MASQUERADE、SNAT,实现的就是这个效果。
你把电脑/手机/平板插上网线/连上WiFi,操作系统的DHCP客户端就会开始工作,尝试联系网络里的DHCP服务器,然后从那里“租”一个IP地址。
DHCP服务器维护了一个地址池,它只会从这个池子里分配地址,一个MAC对应一个地址,如果不用了就放回池子,这样就可以避免搞出重复的IP地址——当然,你也可以给电脑/手机/平板直接填一个IP,这样就可能重复了,DHCP服务器管不着你,但你这样用也可能碰到冲突、动不动断网。
然后,很多时候,我们手里的设备从DHCP服务器那里拿到的是私有IP,192.168.X.X这种。
(直接拿到公网IP的也有,有些地方的ChinaNet就有机会拿到)
但是,私有IP在互联网上是不用的。如果你把IP包头的“目标地址”字段填入私有地址,再把这个数据包发到互联网上,一般过不了几跳就会被丢弃,因为没人在用这种地址。
然后,家用路由器/NAT网关等设备就开始发挥作用了。
比如你用手机打开知乎首页,数据包从手机发出去时,经过家里的路由器,它就把数据包头部的源IP改成自己在用的公网IP,这样数据包就可以正常发到目的地了。
在互联网上的路由器,和知乎的服务器看来,就像是你的家用路由器在进行访问知乎的动作。
等对方回复时,家用路由器再把数据包头的目标IP改成对应的私有IP,然后这个回复包就可以正确发到你的手机上。
其实只改IP头还不够,很多时候TCP/UDP/ICMP的头部也需要改——总之,路由器要建立一个对应关系(NAT表),就像A单位(路由器拿到的公网IP)的张三(手机拿到的私有IP)给某时尚杂志(网站服务器的公网IP)写信,对方回信了,路由器可不能搞混,要把回信给张三才对,给了李四就搞笑了。维护“对应规则”的方法也有很多,具体来说有Cone NAT、Symmetry NAT等很多种。
PS:可想而知,这也造成外网不能主动访问内网的设备,所以P2P应用,比如迅雷/电驴/XX影音之类的,就要开始嚷嚷端口映射、UPnP之类的了。UPnP也很简单,就是应用跟路由器商量一下,自动建立端口映射,不用你手动打开浏览器192.168.1.1、输入管理密码、添加端口映射那么麻烦。对于P2P应用来说,还有UDP打洞等技术来克服NAT带来的阻碍。
PPS:这样一来,内网就不会暴露在外了,获得安全性加成,可以让你躲过445端口的WannaCry勒索蠕虫病毒(然而,内网有猪队友的话,还是会团灭的,嘿嘿)……
NAT除了像上面的例子那样,在“内网的设备连出去”时修改源IP/源端口,还可以在“外网的主机连进来”的时候,修改目标IP/目标端口,比如路由器的端口映射功能,相当于iptables的DNAT,就可以把目标端口改掉(其实连进来/连出去的时候都能用,具体看你想干啥……)。
网上的资料似乎也很多了,比如这个:
NAT的特殊处理 - 目录 - 技术甜甜圈 - 华三通信
推荐看一看。
目录
NAT和DHCP的区别是什么,先看这样一个例子
我们在国内正常生活,工作,出差,需要有一个身份证。
但是如果出国旅游,在国外,我们需要有一个护照。
护照是怎么来的呢,带着咱们的身份证,去公安局出入境管理中心,那里会给每个身份证办一个对应的护照。
在网络中也类似,咱们如果不去外网,只在内网活动,那么只需要dhcp就够了,不需要nat。
dhcp可以自动给各个主机分配ip地址,但是分配的是私网ip地址,私网ip地址顾名思义,只能在企业内网(或者校园内网,网吧内网)使用。
如果想访问互联网,也就是常说的去外网,而私网ip是不能去互联网的。需要一个网络边界设备(比如路由器、防火墙),把私网ip转成公网ip,然后才能去访问外网。
相当于咱们在国内用身份证就行,去国外,就得到出入境管理中心,办好护照,持护照出国。
那怎么看一个地址是私网ip还是公网ip呢?
私网ip地址有固定的范围
192.168开头的所有地址,也就是192.168.0.0/16
10开头的所有地址,也就是10.0.0.0/8
172.16开头的所有地址到172.31开头的所有地址,也就是172.16.0.0/12
其他的地址,都是公网地址(224开头,及大于224开头的地址除外)。
最后可以在咱们自己电脑上查看一下
如图dhcp分配来的是私网地址,有这个地址实现内网通信就够了
但是访问互联网的时候,边界设备就会使用nat技术,也就是网络地址转换技术,将这个私网地址转换为公网地址。
在百度上搜索ip,可以看到电脑访问互联网时转换成的公网ip
除了同属TCP/IP协议簇
这俩玩意就没有共同处
全是区别
DHCP 就是我要联网我去跟路由器要个 IP。要来的不一定是内网 IP,看路由器怎么配的。
SNAT 主要是用来解决外面的路由器不认识里面的 IP(不知道怎么路由)的问题的。如果你给终端分了外面全程有路由的 IP(比如公网 IP)那就没什么必要做 SNAT 了(也不是不能做)。