IP协议
理解源IP地址和目的IP地址
网段划分
IP地址的数量限制
私有IP地址和公网IP地址
路由
NAT(网络地址转换)
编辑NAT IP转换过程
NAPT
MAC地址
理解源MAC地址和目的MAC地址
对比理解MAC地址和IP地址
只有一个MAC地址,可以传输数据嘛?
为什么有了MAC地址还要有IP地址?
IP协议
P地址是指互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),是IP Address的缩写。IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。目前还有些ip代理软件,但大部分都收费。
主机: 配有IP地址, 但是不进行路由控制的设备; 路由器: 即配有IP地址, 又能进行路由控制; 节点: 主机和路由器的统称
理解源IP地址和目的IP地址
每台计算机都有一个唯一的IP地址,如果一台主机上的数据要传输到另一台主机,那么对端主机的IP地址就应该作为该数据传输时的目的IP地址。但仅仅知道目的IP地址是不够的,当对端主机收到该数据后,对端主机还需要对该主机做出响应,因此对端主机也需要发送数据给该主机,此时对端主机就必须知道该主机的IP地址。因此一个传输的数据当中应该涵盖其源IP地址和目的IP地址,目的IP地址表明该数据传输的目的地,源IP地址作为对端主机响应时的目的IP地址。
在数据进行传输之前,会先自顶向下贯穿网络协议栈完成数据的封装,其中在网络层封装的IP报头当中就涵盖了源IP地址和目的IP地址。
网段划分
IP地址分为两个部分,网络号和主机号
1.网络号:保证相互连接的网段具有不同的标识
2.主机号:同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号
3.不同的子网其实就是把网络号相同的主机放在一起
4.如果在子网中新增一台主机,则这台主机的网络号和这个子网的网络号一致,但是这个主机号必须不能和子网中的其他主机重复。
通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的IP地址都不相同.
那么问题来了, 手动管理子网内的IP, 是一个相当麻烦的事情.
有一种技术叫做DHCP, 能够自动的给子网内新增主机节点分配IP地址, 避免了手动管理IP的不便。
一般的路由器都带有DHCP功能. 因此路由器也可以看做一个DHCP服务器
过去曾经提出一种划分网络号和主机号的方案, 把所有IP 地址分为五类, 如下图所示
随着Internet的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请B类网络地址, 导致B类地址很快就分配完了, 而A类却浪费了大量地址;
例如, 申请了一个B类地址, 理论上一个子网内能允许6万5千多个主机. A类地址的子网内的主机数更多.
然而实际网络架设中, 不会存在一个子网内有这么多的情况. 因此大量的IP地址都被浪费掉了.
针对这种情况提出了新的划分方案, 称为CIDR(Classless Interdomain Routing):。
- 引入一个额外的子网掩码来区分网络号和主机号
- 子网掩码也是一个32位的正整数,通常用一串0来结尾
- 将IP地址和子网掩码进行 “按位与” 操作, 得到的结果就是网络号;
- 网络号和主机号的划分与这个IP地址是A类、B类还是C类无关;
下面举个例子:
可见,IP地址与子网掩码做与运算可以得到网络号, 主机号从全0到全1就是子网的地址范围;
IP地址和子网掩码还有一种更简洁的表示方法,例如140.252.20.68/24,表示IP地址为140.252.20.68, 子网掩码的高24位是1,也就是255.255.255.0
- 将IP地址中的主机地址全部设为0, 就成为了网络号, 代表这个局域网;
- 将IP地址中的主机地址全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包;
- 127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1;
IP地址的数量限制
IP协议使用IP地址来标识网络中的节点,分为IPv4和IPv6。虽然一直在推行IPv6,但目前主流还是IPv4。
IPv4使用32位二进制,分为A、B、C类(D类和E类有特殊用途,不用于标识网络中的节点),共计大约37亿多个可用单播地址。听上去很多,但是Internet发展太快了,早在2011年,IANA就宣布IPv4地址耗尽。
等等,既然2011年IPv4地址就没了,那怎么直到现在,大家都还在高高兴兴地用着IPv4地址呢?
CIDR在一定程度上缓解了IP地址不够用的问题(提高了利用率, 减少了浪费, 但是IP地址的绝对上限并没有增加), 仍然不是很够用. 这时候有三种方式来解决:
1.动态分配IP地址:只给接入网络的设备分配IP地址,因此同一个MAC地址的设备,每次接入互联网中,得到的IP地址不一定是相同的
2.NAT技术(后面重点介绍)
3.IPv6: IPv6并不是IPv4的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6用16字节128位来表示一个IP地址; 但是目前IPv6还没有普及;
私有IP地址和公网IP地址
其实,在IPv4地址中,有一些特殊的地址范围:
A类地址中,10.0.0.0~10.255.255.255;
B类地址中,172.16.0.0~172.31.255.255;
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服务器,内网电脑通过浏览器访问它。
路由
本质就是在复杂的网络结构中,找出一条通往终点的路线;
路由的过程, 就是这样一跳一跳(Hop by Hop) “问路” 的过程. 所谓 “一跳” 就是数据链路层中的一个区间. 具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间.
IP数据包的传输过程也和问路一样
- 当IP数据包, 到达路由器时, 路由器会先查看目的IP;
- 路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器;
- 依次反复, 一直到达目标IP地址;
- 路由表可以使用route命令查看
- 如果目的IP命中了路由表, 就直接转发即可;
- 路由表中的最后一行,主要由下一跳地址和发送接口两部分组成,当目的地址与路由表中其它行都不匹配时,就按缺省路由条目规定的接口发送到下一跳地址
假设某主机上的网络接口配置和路由表如下:
- 这台主机有两个网络接口,一个网络接口连到192.168.10.0/24网络,另一个网络接口连到192.168.56.0/24网络;
- 路由表的 Destination 是目的网络地址, Genmask 是子网掩码, Gateway 是下一跳地址, Iface 是发送接口, Flags中 的 U 标志表示此条目有效(可以禁用某些 条目), G 标志表示此条目的下一跳地址是某个路由器的地址,没有 G 标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发;
NAT(网络地址转换)
IPv4协议中, IP地址数量不充足的问题;
NAT技术当前解决IP地址不够用的主要手段, 是路由器的一个重要功能;
- NAT能够将私有IP对外通信时转为全局IP. 也就是就是一种将私有IP和全局IP相互转化的技术方法:
- 很多学校, 家庭, 公司内部采用每个终端设置私有IP, 而在路由器或必要的服务器上设置全局IP;
- 全局IP要求唯一, 但是私有IP不需要; 在不同的局域网中出现相同的私有IP是完全不影响的;
- 一个路由器可以配置两个IP地址, 一个是WAN口IP, 一个是LAN口IP(子网IP).
- 路由器LAN口连接的主机, 都从属于当前这个路由器的子网中.
- 不同的路由器, 子网IP其实都是一样的(通常都是192.168.1.1). 子网内的主机IP地址不能重复. 但是子网之间的IP地址就可以重复了.
- 每一个家用路由器, 其实又作为运营商路由器的子网中的一个节点. 这样的运营商路由器可能会有很多级, 最外层的运营商路由器, WAN口IP就是一个公网IP了.
- 子网内的主机需要和外网进行通信时, 路由器将IP首部中的IP地址进行替换(替换成WAN口IP), 这样逐级替换, 最终数据包中的IP地址成为一个公网IP. 这种技术称为NAT(Network Address Translation,网络地址转换).
两个主机如何跨网络通信呢?
NAT IP转换过程
电脑产生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,网络地址端口转换)
NAPT
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根据之前记录的信息再转换回内网地址和内网端口号,即可把报文送达不同的内网电脑。
MAC地址
MAC地址(Media Access Control Address),直译为媒体访问控制地址,也称为局域网地址(LAN Address),以太网地址(Ethernet Address)或物理地址(Physical Address),它是一个用来确认网上设备位置的地址。在OSI模型中,第三层网络层负责IP地址,第二层数据链接层则负责MAC地址。MAC地址用于在网络中唯一标示一个网卡,一台设备若有一或多个网卡,则每个网卡都需要并会有一个唯一的MAC地址。
- MAC地址用来识别数据链路层中相连的节点;
- 长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19);
- 在网卡出厂时就确定了, 不能修改. mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些网卡支持用户配置mac地址).
理解源MAC地址和目的MAC地址
大部分数据的传输都是跨局域网的,数据在传输过程中会经过若干个路由器,最终才能到达对端主机。
源MAC地址和目的MAC地址是包含在链路层的报头当中的,而MAC地址实际只在当前局域网内有效,因此当数据跨网络到达另一个局域网时,其源MAC地址和目的MAC地址就需要发生变化,因此当数据达到路由器时,路由器会将该数据当中链路层的报头去掉,然后再重新封装一个报头,此时该数据的源MAC地址和目的MAC地址就发生了变化。
对比理解MAC地址和IP地址
- IP地址描述的是路途总体的 起点 和 终点;
- MAC地址描述的是路途上的每一个区间的起点和终点;
举例说明:唐僧西天取经:
别人会问唐僧从哪来,要到哪里去。唐僧都会回答道,贫僧是从东土大唐而来,要到西方拜佛求经。
这里的东土大唐就是:源IP
西方雷音寺就是:目的IP
有人问:和尚,你上一站从哪里来,下一站要到哪里去。唐僧回答:贫僧上一站从火焰山来,下一站要到女儿国去。
火焰山和女儿国就是:MAC地址,MAC地址,在途中,是一直改变的。
只有一个MAC地址,可以传输数据嘛?
是可以的。
但是要有前提:他们同处于一个局域网内。
像是在网吧打魔兽争霸,只要在一个局域网内,就不需要连接网络(指因特网),就可以打游戏。
为什么有了MAC地址还要有IP地址?
- 只拥有MAC地址的话,只有在同一网络区域内,才能进行数据传输,不能跨网络区域。
- 如果想跨网络区域进行数据传递,最现实的方法就是借助ISP提供的网络区域
- ISP能提供全球互联的网络——因特网,借助因特网可以传输数据给连接因特网上的机器。
有一个村落(局域网),它很封闭,与世隔绝,如同陶渊明讲的世外桃源。但是他的建筑非常美丽,几乎都是四合院,好几户人家居住在一个四合院里。(同一IP地址接入多个设备,每个设备都有一个MAC地址。)
人们总是相互串门,并借此交换物品(数据)。可是一天,伟大的天朝官员(ISP)发现了这里,看到这里的人居然还过着物物交换的生活,于是他决定为生活在这里的人修建公路(接入互联网),让其能够与外界的人能相互交流。
这里的人对外面的世界非常好奇,有一天,村庄的一个女人发现有镖局可以代购物品(数据),她看到琳琅满目的物品图片,她觉得她的生活仿佛打开了新的大门。于是她如有天助般完成了第一单,但是她不知道要填姓名和手机号(无MAC地址)。
几天过去,包裹(数据)到站点了,快递小哥一看,WTF,这是谁的,为什么只有收货地址(IP地址),没有个人信息(MAC地址),信息是不是出错了?他抱着试一试的心理,到了败家,emmm,那个女人所在的四合院(IP地址)。他拼命的敲门,有人给快递小哥开门。快递小哥兴奋地问他:“这是你买的东西吗?”,开门的人摇摇头。于是快递小哥见到一个人问一次是不是其的包裹,可是每个人都摇头。
快递小哥等的不耐烦了,正准备回头,那个买东西的女人出现了,询问快递小哥是不是东西到了。快递小哥郑重其事地对她说:“下次一定要写好你的个人信息(MAC地址),不然你只写一个地址(IP地址),我哪知道是谁的 ”。那个败家,emmm,那个女人就说知道了,下次肯定写上。