地址和⽬的地址理解_⽹络⼯程师(14):IP地址易容术
接下来要优化的,依然和IP有关!
IP:“为什么受伤的还是我!!”
别担⼼,不给你好好整整容,你不知道⾃⼰有多美!
IP协议使⽤IP地址来标识⽹络中的节点,分为IPv4和IPv6。虽然⼀直在推⾏IPv6,但⽬前主流还是IPv4。
IPv4使⽤32位⼆进制,分为A、B、C类(D类和E类有特殊⽤途,不⽤于标识⽹络中的节点),共计⼤约37亿多个可⽤单播地址。听上去很多,但是Internet发展太快了,早在2011年,IANA就宣布IPv4地址耗尽。
等等,既然2011年IPv4地址就没了,那怎么直到现在,⼤家都还在⾼⾼兴兴地⽤着IPv4地址呢?
这要归功于NAT(Network Address Translation,⽹络地址转换)。
其实,在IPv4地址中,有⼀些特殊的地址范围:
A类地址中,10.0.0.0~10.255.255.255;
李菲儿安宰贤
B类地址中,172.16.0.0~172.31.255.255;
x战警一共几部
黄毅清父亲C类地址中,192.168.0.0~192.168.255.255。
这些地址,我们称之为“私有地址”。
描写立冬的好词好句什么是私有地址?就是说,这些地址不会在Internet公⽹上出现,任何⼈都可以随便使⽤,不⽤花钱!
随便使⽤?那不会冲突吗?
并不会,因为这些地址只限于你所在的局域⽹内部使⽤,如家庭、企业、学校等,公⽹上并没有这些地址。就好像你在⼀个局域⽹⽤
10.1.1.1,我在另⼀个局域⽹也使⽤10.1.1.1,只要保证各⾃局域⽹内不冲突就⾏。
关于谷雨的古诗可是,如果我们两⼈要通信呢?地址不是冲突了吗?
不不,私有地址只在局域⽹内部使⽤,如果要访问外⽹,需要NAT给你发的数据包整个容!
⼀般情况下,局域⽹接⼊公⽹的出⼝设备上都会配置NAT功能。家庭中常见的“⽆线路由器”,其实本质上不过是⼀台“⽆线NAT”⽽已!
如果NAT设备发现有私有数据包要去公⽹,会给它整个容:把⾥⾯IP封装中的私有地址换成公⽹地址,做好记录,再发出去;数据包回来时,再把地址换回来,发回你的电脑
企业、学校的公⽹地址可以花钱向运营商购买固定地址,便于注册域名,向外提供⽹络服务;家庭上⽹⼀般由运营商动态分配。
图中电脑的IP地址是私有地址192.168.1.10,出⼝NAT设备接⼊Internet的公⽹地址是12.34.56.78,假
设公⽹上有⼀台地址为
98.76.54.32的www服务器,内⽹电脑通过浏览器访问它。
电脑产⽣http报⽂,向下交给传输层TCP协议。TCP封装时,源端⼝在49152~65535间随机选择⼀个,如60128,⽬的端⼝为80。
TCP封装后,交给⽹络层IP协议,IP封装源地址为内⽹电脑的私⽹地址192.168.1.10,⽬的地址为公⽹服务器的地址98.76.54.32,协议号为6。
链路层的封装和前⾯⽂章所述⼀样,这⾥我们省略。这个报⽂发到NAT设备后,NAT设备将源地址修改为12.34.56.78,做好记录“内⽹地址192.168.1.10映射到外⽹地址12.34.56.78”,然后将报⽂发到公⽹。
公⽹根据报⽂中的⽬的地址98.76.54.32,将报⽂准确送达服务器。
服务器返回的信息,数据是这样封装的:
源和⽬的端⼝号、IP地址互换位置,公⽹会根据⽬的地址12.34.56.78,把报⽂送达NAT设备。NAT根据记录“内⽹地址192.168.1.10映射到外⽹地址12.34.56.78”,把⽬的地址12.34.56.78换回192.168.1.10,然后根据内⽹地址192.168.1.10把报⽂送达电脑。
但这样的转换⽅式并不妥当,因为⼀个内⽹地址需要对应转换为⼀个外⽹地址,内⽹电脑数量多就会消耗⼤量外⽹地址,并没有起到节省地址的作⽤。
因此,我们所使⽤的NAT,叫做NAPT(Network Address Port Translation,⽹络地址端⼝转换)。
NAT只转换IP封装中的IP地址,⽽NAPT则把传输层的端⼝号和IP地址⼀起转换,可以实现⼀个公⽹地址的复⽤。
假设内⽹有两台电脑,地址分别为192.168.1.10和192.168.1.20,NAT设备地址和服务器地址和上例相同。假设两台电脑同时访问外⽹服务器,电脑A发出的报⽂封装是:
沈泰女朋友
电脑B发出的报⽂封装是:
两个数据报⽂到达NAT设备后,NAT设备做个记录:
然后,NAT把电脑A的报⽂修改为:
⽽电脑B的报⽂也被NAT修改为:
可以看到,NAT把两台内⽹电脑发出去的报⽂转换后,仅传输层的源端⼝号不同,IP的封装完全相同。这样⼀来,就可以实现同⼀个公⽹地址被不同内⽹电脑重复使⽤,只需通过端⼝号区别开就可以。外⽹返回的数据报⽂回到NAT设备后,NAT根据之前记录的信息再转换回内⽹地址和内⽹端⼝号,即可把报⽂送达不同的内⽹电脑。
⼩Q:对于没有传输层的报⽂,如ICMP,⽆法进⾏端⼝号转换,NAT会怎么处理呢?
欢迎⼤家留⾔讨论。