网络层的各项配套协议:
网络层主要是通过IP协议将IP报进行数据投递,首先主机通过查找自身的路由表将信息投递给路由器,路由器会判断这个IP报是否可直达,如果不可以则通过内部的路由表投递给下一个路由器,直到某个路由器判断此报文在本网络中是可直达的,那么通过ARP
+链路层的协议直接投递。
IP划分
- A类,B类,C类地址的网络号在图中都是灰色的,分别为1,2,3个字节长度。分别在网络号的首字节从高位开始分别有0,10,110的类别号
- A,B,C类地址的主机号字段分别占用3,2,1个字节长度
- D类用于IP多播的地址
A类地址:0.0.0.0 - 127.255.255.255
B类地址:128.0.0.0 - 191.255.255.255
C类地址:192.0.1.0 - 223.255.255.255
常用三种类别
A类网络号有7位,但是有两个组合是不能作为地址的,网络号为127时(01111111)的地址(127.0.0.1)表示回环地址,网络号全0(0.0.0.0)表示的是本网络上的本主机。B和C类也有着同样的规律。
按照上述表格总结规律:
- 网络号为127时,主机号为全0或者1时为环回测试
- 网络号为全0时
- 主机号为全0,本网络上的主机
- 主机号正常,本网络上的某台主机
- 主机号为全1时
- 网络号为全1,本网络上进行广播
- 网络号正常,指定网络号上进行广播
私有地址:
无分类编址CIDR
解决痛点:
- B类地址空间快要全部分配完毕。
- 互联网主干网上路由表急速增长。
- IPv4地址空间最终全部耗尽。-----采用
IPv6
解决
其实早在 1987年,RFC 1009
就指明了在一个划分子网的网络中可同时使用几个不同的子网掩码。使用变长子网掩码 VLSM
(Variable Length Subnet Mask)可进一步提高IP地址资源的利用率。在 VLSM
的基础上又进一步研究出无分类编址方法,它的正式名字是无分类域间路由选择 CIDR
(Classless Inter-Domain Routing,CIDR
的读音是"sider")。
特点:
- 消除传统的ABC类空间地址和划分子网的概念,从划分子网的3层又回到了两层模型。
CIDR
还是用斜线记法:IP地址/网络前缀的位数 CIDR
将网络前缀相同的连续IP地址组成一个CIDR
地址块。
虽然说CIDR
是两层的结构但是还是可以使用子网的,从主机标识划分一些位成为子网标识就可以了。由于一个CIDR
地址中包括很多地址,所以在路由表中就可以利用CIDR
来查找目的网络,称之为地址聚合,可以让一个路由表示传统分类地址的很多个路由,使得互联网路由更快。
示例:
所以CIDR
可以很好的去划分网络,过去ABC的网络格式太过于僵硬容易浪费资源,而且在路由表中会有很多重复的路由信息,通过CIDR可以将部分路由信息进行聚合,相当于上述中IP报目的地址与上18位的字码掩码等于206.0.64.0的话直接全部走ISP
的路由,此时路由表中只有一个路由信息即:
目的网络 | 子网掩码 |
---|---|
206.0.64.0 | 255.255.192.0 |
如果使用传统的分类型网络,路由表中会有64个路由从目的地址:206.0.64.0~206.0.127.0。相当于快递到达所在地区后不是立马派送到家而是先放置在快递驿站,然后快递驿站再来派送。
但是在CIDR地址中常有一个IP地址可能匹配到多个路由信息,所以这个时候就需要通过最长子序列算法进行匹配。
划分子网
ARPANET设计的网络IP地址一开始的两层的:网络标识+主机标识,这样做有三个大的缺点:
- IP空间地址利用率低
- 每一个物理网络分配一个网络号会使得路由表过大
- 两级IP不够灵活
所以引入了子网的概念在两层的标识中间加上一层子网标识。
基本思路:
- 一个拥有多个物理网络的单位可以将所属的网络划分为多个子网。从外部看来看不出这个单位有多少个子网,因为子网的划分是这个网络内部的事情
- 划分子网其实就是借用IP地址主机位的若干位。
- 外部发来的数据,先是发送给该单位的互联网路由器,再根据报文中目的IP分析出网络号和子网,找到目的子网
子网掩码
当IP报文发到路由器上时,路由器并不清楚当前这个网络是不是划分了子网,所以需要通过子网掩码进行与运算得到网络地址
默认情况下的子网掩码就是IP分类中定义的网络号大小部分全是1的地址。当所在的网络区域中定义了子网则需要将路由器的子网掩码重新设置。
子网路由
使用子网划分后,路由表中需要包含以下几项:
- 目的网络地址
- 子网掩码(默认情况下是默认子网掩码)
- 下一跳地址
转发分组算法:
- 收到的IP数据报的目的地址位D
- 首先判断是否可以直接交付:先将与该路由直接连接的网络的子网掩码和D进行与操作
- 得到的网络号和某个直接相连的网络一致的话,通过
ARP
协议+链路层直接交付 - 进行间接交付,跳到3
- 得到的网络号和某个直接相连的网络一致的话,通过
- 若路由表中又目的地址位D的主机路由,则跳到该路由上
- 对路由表中每一行路由信息的子网掩码提取出来和D进行与操作,如果有一行路由信息的网络地址和结果一致则交付
- 交付给默认路由表指定的路由器
案例:
H1
向H2
发送分组,讨论R1
的路由过程
首先将128.30.33.138和子网掩码255.255.255.128进行与运算得出结果:128.30.33.128,此网络号和子网1的网络号128.30.33.0不符合,无法直接交付;于是主机128.30.33.13将分组交付给路由器R1,R1连接了两个网络,和上述一样将目的IP和子网掩码进行与操作得到网络号位:128.30.33.128,与子网2的网络地址一致,所以R1可以直接交付给目的主机。
私有IP块
ARP协议
ARP
(Address Resolution Protocol)协议是网络层和链路层交互的一个底层协议,主要目的是通过IP地址来找到MAC
地址,然后使用MAC
地址进行链路层的直接送达。
协议算法步骤:
-
ARP
进程在局域网发送一条ARP
广播,大概内容为:我的IP为xxxx,MAC
地址为xxx,我需要直到IP为xxx主机的MAC地址 -
主机接收到广播后,如果不符合本机的IP地址就将数据过滤调,如果确实是本机IP地址则会给发送方回复一个
ARP
单播,告知MAC
地址 -
主机接收到
ARP
回应后,将IP和MAC
地址关系存入到ARP
高速缓存中每条映射都有固定的过期时间,当到期后会重新进行
ARP
请求。
IPv4数据报
- 版本:指的是IP协议,4代表
IPv4
,6代表IPv6
协议 - 首部长度:最长为60字节,单位为4个字节;固定部分+可变部分
- 区分服务:预留一般不用
- 总长度:首部长度+数据部分长度,最大长度\(2^{16}-1=65535\)字节,(IP协议规定长度超过576字节的数据报文,需要判断一下是否超过MTU大小)
- 标识:数据报长度超过MTU进行分片时,相同的标识字段标识一个数据报
- 标志:占3位,只有中间和最低位有意义
- 最低位MF(More Fragment),当MF=1时表示后面还有分片。
- 中间位DF(Dont Fragment),不允许分片,当DF=0时才能分片。
- 片偏移:分片时,子片相对于原来数据报的偏移位置。
- 生存时间:常用名称位TTL,表示数据报还能投递的跳数,每转发一次路由数据报的TTL会被减一,当TTL等于0时就不再转发
- 协议:数据报携带的是何种协议:
- 首部校验和:首部数据进行哈希算法取特征值
- 源地址:发送方IP地址
- 目的地址:接受方IP地址
IP报文头中的可选字段用的比较少,在IPv6中已经将报文头全部做成固定的。
ICMP协议
ICMP
(Intenet Control Message Protocol)目的:更有效的转发IP数据报和提高交付的成功率。
ICMP
允许主机和路由器报告差错情况和有关的异常情况报告。
ICMP报文:
ps:ICMP
是封装在IP报文内部的,但ICMP
却不是高层协议。
类型
3
,差错报文报告:终点不可达。(主机或路由器遇到无法交付的数据会向源地址报告此错误)11
,超时:(TTL减少为0时)12
,参数问题:IP首部中有问题时就会抛弃此报文并向源主机报告5
,重定向:路由器将改变理由的报文发送给主机,下次主机就知道应该将报文发送给其他路由器。(主机一开始的路由表是空的,所以一般的数据报文都是直接发送给默认路由器,当默认路由器认为此报文应该直接发送给另外一个路由器B时,他就会发送一个重定向给主机。主机会在路由表中维护一个新的路由)8
或10
,回送(echo
)请求或者回答:向一个主机或者路由器发送请求,主机或路由器接受请求后必须给原机回送报文,用来探知是否可达13
或14
,时间戳请求或回答:在上述的命令上加上时间戳,可以进行时间同步或者时间测量.
PING
和Traceroute
都是利用了ICMP
协议:PING
使用先通过DNS
获取到请求的IP地址,然后通过时间戳请求来计算延迟和传输时间,Traceroute
是向目的发送一条无法交付的UDP数据包,第一个数据包的生存周期TTL
设置为1,达到第一个路由器会触发超时错误然后第二个报文将TTL加一,知道到达最终的主机或者路由器,所以最终就可以打印出一个路由跳转的路线。
IP多播
IP分发中分为单播,多播(又称之为组播)和广播
单播表示的是网络中1对1之间的信息传输。
多播表示一对多的数据传输,类似于老师一对多个学生讲课,在IP分类中IP前四位为1110的地址都是多播地址
广播表示将数据给所有主机,一般在子网,局域网中使用,通常为网络号+主机号(都为1)表示此网络下进行广播
多播的目的:解决互联网中一对多通信带来的网络风暴,如果一个服务器需要发送一条推送消息给1千万个用户那么他将发送一千万条消息在互联网上,如果用上组播只需要发送一条。
多播的标识符就是IP地址中的D类分类,也就是IP前四位为1110的地址也就是地址224.0.0.0到239.255.255.255;一个D类地址代表一个多播组,这样一共可以表示\(2^{28}\)个多播组,这是完全够用的。在多播组数据传输时,首部的协议字段为2,表面使用的是IGMP网际组管理协议。
局域网多播
按照规定以太网MAC
地址的高24位为00-00-5E,且以太网地址中的第一个字节第一位为1时代表多播地址,那么MAC
地址的范围就是:01-00-5E-00-00-00 到 01-00-5E-7F-FF-FF。由此可见IP地址和MAC地址是无法一一对应的,所以可能存在一个IP多播地址对应多个MAC地址的存在,这个时候就需要在IP层面通过软件进行数据过滤。
为什么不是MAC组播地址不是FF而是7F呢?
"有一个有趣的故事是关于为什么只有23位有价值的MAC地址空间分配给IP组播,回到20世纪 90年代初,Steve Deering 取得了一些关于IP组播研究工作的成果,因此,他希望IEEE配置16个连续不断的组织机构惟一性标识符(OUI)作为IP组播MAC地址使用.国为一个OUI 包含24位有价值的地址空间,16个连续不断的OUI 将提供全部28位有价值的MAC地址空间,并且允许一对—地把第3层IP组播地址映射到MAC地址.很遗憾,当时一个OU的价格是1000,Steve 的经理, Jon Postel,不愿意花16000 购买全部28位有价值MAC地址.相反, Jon 愿意在预算外花1000 购买一个OUI,并且拿出一半地址(23位)给 Steve 作IP组播研究之用."
IGMP协议
让连接在本地局域网上的多播路由器知道本局域网内是否有主机参保或者推出了某个多播组
协议步骤:
- 当主机加入新的多播组时,该主机向该多播组的地址发送一个IGMP报文,声明自己要成为该组的组员。本地多播路由器接受到IGMP报文后还要利用多播路由协议将组成员关系转发给其他多播路由器。
- 组成员的关系是动态的,路由器需要周期的去询问主机是否还加入之前的分组。
IPv6
- 版本:和IPv4一样,4代表IPv4,6代表IPv6
- 通信量类:区分不同的IPv4数据报类别和优先级。
- 流标号:对于互联网上特定的一系列数据报如视频和音频都是流文件,每个流报文都有个相同的流标号
- 有效载荷:数据报除首部以外数据的大小
- 跳数限制:就是IPv4的TTL
- 源地址:发出数据主机的IP地址
- 目的地址:接受数据主机的IP地址
和IPv4的对比:
- 取消首部长度,首部大小固定为40字节
- 取消服务类型,用优先级和流标号替代
- 取消可选字段,标识,标志和片偏移等字段,放入到载荷中的扩展首部中
- 取消协议字段,改用下一首部
- 取消首部校验和字段,加快路由速度