网络层主要做两方面事情:
1.地址管理:制定一系列规则,通过地址描述出网络上的一个设备的位置
2.路由选择:网络环境复杂,从一个节点到另一个节点之间有很多条路径,这就需要通过路由选择来筛选/规划出更合适的路径进行传输。
所以我们接下来讲解到IP协议,也是从这两方面进行展开
一.IP协议报文格式
4位版本:指定协议的版本。如果这里的数据是4,就表示此协议版本是IPv4;如果是6就表示IPv6
4位首部长度:与TCP的一样,IP的报头也是变长的,因为下面的选项可有可无,可以是一个也可以是多个。4个比特位表示的范围是0~15,每个比特位的单位是4字节,所以首部长度最长是15*4=60个字节(也就是选项拉满),最短是20个字节(也就是没有选项)。
8位服务类型:这个字段能够让IP协议切换形态。其实只有4位是有效的(因为前面的三位已经弃用,后面的一位是保留位)这四位叫做TOS字段(Type Of Service),其中分别对应最小延迟,最大吞吐量,最高可靠性,最小成本。这四者是相互冲突的,只能让其中的一个为1.
16为总长度:描述了一个IP数据报最长是多长。16位可以表示2^16-1字节,相当于是64kb。这样看,IP协议好像是存在64kb限制,但实际上,IP协议是支持拆包组包功能的(而不同于UDP,UDP的拆包组包不是自带的,必须自己在代码中实现)
16位标识,3位标志,13位片偏移,这三个属性就是在支持拆包组包。假设一个打包要拆成若干个小包,那么这若干个小包的16位标识就是相同的数值;组抱歉要知道数据的发送顺序,这13位片偏移就是描述了当前每个小数据包(分片)的相对位置,片偏移越小就说明数据越靠前;3位标志位只有两位是有用的,一位表示是否允许拆包,一位表示是否是最后一个包(这就类似于单链表的结束标志,1表示后面还有包,0表示后面没有包了),最后还有一个保留位
注意,若哪天被问到如何基于UDP实现拆包组包,就可以模仿上面的进行回答
8位生存时间:描述了该IP数据包在网络上还能存活多久。生存时间即Time To Live,所以也叫做TTL,它的单位是次数。在IP数据包构造出来时,TTL就会被设置成一个初始值(32,64,128……),包在转发过程中,每经过一个交换机或路由器,TTL的值就hi减一。若包已经把TTL耗尽了还没有顺利到达对方,就会被丢掉
这个机制是很有用的,可以给网络兜底:假如一个包的目的IP是一个不存在的IP,这包就不可能到达目的地,所以TTL就起作用了
8位协议:描述了数据报的载荷部分是TCP还是UDP数据包,也就是传输层是什么协议
16位首部检验和:它只校验IP首部,而不校验IP载荷,因为IP载荷就是TCP/UDP数据包,它们自身就携带校验和
32位源IP,32位目的IP:这是IP协议中最重要的部分
二.地址管理
现在我们一般都是用IPv4进行IP地址的管理
IPv4是一个32个比特位的整数,能够表示大约42亿9千万个地址。但是现在,这个数字好像是不够了。互联网发展到今天,能上网的设备已经非常多了,早超过了这个数字,甚至出现了物联网,向冰箱,电视,汽车等都有IP地址,所以IPv4显然不够用了
1.如何解决IPv4数量不够的问题
方案一:动态分配IP
上网的设备就分配,不上网的设备就不分配。
这个方案明显治标不治本,它仅仅是提高了IP地址的利用率,但是并没有增加IP地址的数量。
不过,这个方案任然是被普遍使用
方案二:NAT技术(网络地址转换)
这个技术的关键就是让一个IP地址代表一大批设备。是用于在本地网络中使用私有地址,在连接互联网时转而使用全局 IP 地址的技术。NAT实际上是为解决IPv4地址短缺而开发的技术。
公网和私网:
首先来了解一下公网和私网:IP可以分为Public IP 和 Private IP,出现这种规划的原因在于IPv4所能表示的IP太少而电脑太多以至于不够用,然而只有Public IP才能直接连接上网络,所以对于那些公司,学校,政府机构等场所,就可以集中使用私有的IP进行管理,而大家可以共用一个IP去连接上公网,这样,就省下了许多宝贵的Public IP。
我们用命令行输入ipconfig,查到的IP和从百度上查到的IP不一样:
在ipconfig查到的是192开头的,而在百度上查到一个外网IP(其实就是本机的公网IP)。所以其实在命令行查到的是你的私网IP(或者叫内网IP),此类地址仅在局域网中使用,不能联通外网;而在百度上查到的IP是上网的共有地址,也许并不是你的主机所在位置,而是电信联通等网络运营商分配给你的地址,用于连接互联网。
内网IP:也就是局域网IP,它是以10.或172.16~172.31或192.168开头的
外网IP:也是广域网IP,除内网IP之外。
在同一个局域网内部,内网IP不能重复,在不同的局域网,可以用相同的内网IP。但外网IP始终不可以重复。
当前情况下,通常都是一个小区/公司/学校构成一个大的局域网(这个网中有成千上万台设备),这样的局域网就使用一个外网IP即可。
NAT机制具体是怎样工作的?
比如左边的想要访问右边,左边有一个内网IP10.1.1.1,首先经过运营商路由器(它也是一个NAT设备),就能对源IP进行替换,将源IP替换成外网IP202.168.2.2(也就是它所在局域网被分配到的一个共同IP),然后传输到主机B;当主机B返回响应时,到了NAT设备后,就会将目的IP202.168.2.2替换成10.1.1.1(为什么能够替换呢?因为在NAT内部有一张转换表,记录了映射关系:里面记录着刚才是10.1.1.1的主机向172.20.7.3发送了请求,现在响应报文回来了,就要把IP替换回去)。
所以此时,运营商路由器就相当于是一个中转站。
问题:如果有多台设备都向主机B发起请求,那怎么进行转换?——NAPT
这时 ,端口号就有作用了。客户端这边的端口号是系统随机分配的,一般来说,分配到端口号是不同的,所以当服务器返回响应时,NAT设备就可以通过端口号来将行营返回给对应的客户端。所以端口号不仅可以区分同一个主机上的不同进程,也可以区分同一个局域网内部的不同主机!!
这就是NAT技术的改进:NAPT
问题:假设两台主机恰好被分配到了相同的端口号,又该怎么处理?
这时,在将请求转发给服务器之前,NAT设备会主动将相同发端口号替换成不同端口号,并在记录表中做好记录。
在整个流程当中,最关键的有以下几点:
- 网络被分为私网和公网两个部分,NAT网关设置在私网到公网的路由出口位置,双向流量必须都要经过NAT网关
- 网络访问只能先由私网侧发起,公网无法主动访问私网主机
- NAT 路由器在两个访问方向上完成两次地址的转换或翻译,出方向做源信息替换,入方向做目的信息替换;
- NAT 路由器的存在对通信双方是保持透明的;
- NAT 路由器为了实现双向翻译的功能,需要维护一张关联表,把会话的信息保存下来。
NAT技术的缺陷
它只能用于内网访问外网,但是外网访问不了内网。所以之前写到UDP回显程序,只有部署到云服务器上才能被不同主机访问。其实这时缺陷也是优势,因为黑客无法入侵,更好的保护了电脑安全。
其次,NAT没有增加IP个数。
方案三:最终解:IPv6
IPv6时使用16个字节来表示地址,这就从IPv4的4个字节扩大了,范围从2^32扩大到了2^128,是IPv4的2^96倍,简直就是一个天文数字,达到可以给地球上的每一粒沙子分配一个IP地址。
但是IPv6的普及程度很低,关键是应为IPv6与IPv4不兼容。所以要想使用IPv6就得更换设备,这是很大的一笔开销,但是花了这钱后,用户也看不到实际效果,因为它不会使得网速变快,仅仅是为了解决ip地址不够用的问题。
不过欣慰的是,我们中国是IPv6普及程度最高的国家。
2.IP地址中的网段划分
我们将IP地址划分成两个部分:网络号(标识一个局域网)+主机号(区分不同的主机)。
假设现在有一个局域网,里面有三台主机,并且通过路由器1和外部相连。其中,主机1的IP为192.168.0.1,主机2的IP为192.168.0.2,主机三为192.168.0.3,路由器1为192.168.0.10;那么这个局域网的网络号就是192.168.0,其中,.1 .2 .3 .10都是主机号。
然后又有一个与之相邻的局域网,里面也有三台主机,并且通过路由器2和外部相连。其中,主机1的IP为192.168.2.1,主机2的IP为192.168.2.2,主机三为192.168.2.3,路由器1为192.168.2.10;那么这个局域网的网络号就是192.168.2,其中,.1 .2 .3 .10都是主机号。
这两个局域网之间就通过一个路由器相连,两个相邻的局域网的网络号不能相同。
子网掩码
一个IP地址,哪一部分是网络号,不一定,子网掩码就是用来确定网络号的。
他也是32为整数,左侧都必须是1,右侧都是0,不会有01交替出现的情况。其中为一的位对应的IP位就是网络号,为0的位对应的IP位就是主机号。
例如:子网掩码255.255.255.0,写成二进制就是前面三个字节都是1,后面一字节都是0,所以对应到IP上就是说这个IP的前面三个字节表示网络号,后面一个字节表示主机号。
比如我这个,就表示192.168.43是网络号,而.208就是主机号
3.特殊IP
1.若IP主机号全部是0:说明当前IP表示网络号,代表一个局域网了
2.若主机号全为1:表示当前IP是一个广播地址(UDP天然支持广播,就可以给这个地址发送UDP数据报;但是TCP无法给这个地址发送)
3.若以127开头,表示环回IP。常用的就是127.0.0.1,不过127.0.0.1~127.255.255.254都可以,只要别用127.0.0.0和127.255.255.255即可。使用这个IP就可以给自己的主机发送数据。这是因为操作系统提供了一个特殊的网卡“虚拟网卡”,关联到了这个IP上。使用环回IP来测试程序,就可以排除网络不通畅的影响
三.路由选择
路由选择是描述IP协议数据报具体怎么走:就是A发送到B的过程中,走哪条路。
在现实生活中,我们只要输入目的地就能得到精确路线,这是应为导航是全局性的,它能够看到地球的全貌。然而对于网络,每个路由器只能够知道自己和哪个路由器相连,无法知道网络的全貌,所以IP数据报在发送时是“探索式”“启发式”的过程,很难给出最优解。
这可以举个例子:比如我在大连开发区,我要到大连海事大学,期间不使用导航。出门后,我问A大连海事大学怎么走,A说不知道,但是她知道大连海事大学在甘井子区,所以她让我先坐地铁二号线,在地铁上问问别人。上了二号线,我问B,他说他也不知道,但是他知道从哪里下车,所以我就在那里下来车。下车后,我又问了C,因为此时已经和接近大学了,所以C知道了准确路线并告诉了我。
这就是“探索式”“启发式”的过程。在路上逐渐有人给我指出了接近的方向。
一个网络层数据报,每到一个路由器,就会问路!每个路由器内部又有一个路由表这样的数据结构。根据数据报中的目的IP查表,查到了就按路转发,没查到,表中有一个默认选项(下一条地址),就按它走。