后来多年的实践证明,先驱者们的选择多么正确
(1)网络层简单使得网络中的路由器可以做得比较简单,价格低廉,因而易于拓展,便于大规模发展
(2)运行方式灵活,能够适应多种应用
两个主机通信的时候,需要经过若干个路由器转发信息。
转发的信息实际就两大类:一是传送的数据(数据层面),二是路由信息(控制层面)
IP是TCP/IP体系中最重要的两个协议之一
与IP协议配套使用的还有
地址解析协议ARP
网际控制报文协议ICMP
网际组管理协议 IGMP
如下图所示
我们会发现ICMP,IGMP协议在IP的上方,是因为这两个协议经常需要调用IP协议
而ARP协议在IP的下方,是因为IP协议需要经常调用ARP协议
在讨论网际协议IP前,必须先了解什么是虚拟互联网络
我们知道网络是要将全世界五花八门的计算机互联在一起,这就需要解决很多问题,最首要的一个就是异构,差异性
比如:不同的寻址方案,不同的组大分组长度,比如不同的差错控制方案等等一大堆。
那么该怎么办呢?
先驱者们提出在网络层,通过IP协议来进行统一,就是不管你其他层的协议是什么,我的网络层大家都用IP协议,这样仿佛在网络层看起来是一个统一的网络,也就叫做我们的虚拟互联网络。
所以大家可以感受到IP协议的重要性了吧!!!之前我们讲的一些协议可能通用性并没有那么强,但IP是互联网每一个用户都得遵守的boss rules
一个在互联网上的设备必须有IP地址才能与其他设备进行通信,接下来我们来了解IP地址
整个因特网看成是一个单一的,抽象的网络
IP地址就是给每一个连接在因特网上的主机分配一个在全世界范围是唯一的32位的标识符
IP地址由网络号和主机号组成,又叫做两级IP——网络号+主机号
? 网络号表示着主机所连接到的网络,主机号表示该主机(对路由器的话是路由器)
最开始的时候采用固定分类的IP地址,即网络号的位数是固定的(8位A类,16位B类和24位C类)
如何区分不同类别的地址呢?通过网络号的前缀,如下图
对于A类地址,是网络号为8位的
? 总地址空间 2 31 2^{31} 231个 接近43亿
? 网络号个数:由于A类地址网络号有7位,所以A类地址可以分配的网络号个数 2 7 ? 2 = 126 个 2^7-2=126个 27?2=126个,这里为什么要减去2呢,因为0000 000的网络号有特殊含义代表“本网络”,0111 1111的网络号代表环回测试
? 主机号个数: 2 24 ? 2 2^{24}-2 224?2 为什么这里还要减2呢,因为全0是本网络,全1是所有的广播
对于B类地址,是网络号为16位的
? 总地址空间 2 30 2^{30} 230个
? 网络号个数: 2 14 2^{14} 214
? 主机号个数: 2 16 ? 2 2^{16}-2 216?2
对于C类地址,是网络号为24位的
? 总地址空间 2 29 2^{29} 229个
? 网络号个数: 2 21 2^{21} 221
? 主机号个数: 2 8 ? 2 2^{8}-2 28?2
以上A,B,C类都是单播地址,而D类地址是多播地址
这样的好处是简单,看前缀就知道什么类型的地址了
缺点是:使用不灵活的问题
于是采用更为灵活的CIDR
上一个网络号位数是由类别决定的,每一个类别网络号位数是固定的,而CIDR的网络号位数是由掩码决定的,是可变的
之前的网络号在CIDR里更名为网络前缀
网络前缀可以通过斜线+数字表示,如/20
比如IP 128.14.32.7/20 我们可以知道 网络前缀20位,那么主机号30-20=12位!
人为可以看斜线数字,计算机怎么知道有多少位网络前缀呢?
通过子网掩码
如上述IP 128.14.32.7/20,有20个并列的1,12个并列的0组成掩码
其中1的个数代表网络号个数,0的个数代表主机号个数
我们将IP地址和子网掩码按位与,可以得到网络地址
有三个比较特殊的地址块
1 前缀n=32,用于主机路由
2 前缀n=31,用于点对点路由
3 前缀n=0,且所有主机号为0,用于默认路由
这些用途后面讲到
路由聚合——用较大的CIDR块替代较小的CIDR块,减少查找转发表的时间
MAC地址是物理地址,硬件实现,在数据链路层,MAC帧首部
IP地址是逻辑地址,软件实现,在网络层,IP数据报首部
假设从A1,到B1,途径R1,R2两个路由器
IP数据报都不变,即IP首地址和源地址都是A1,B1
但MAC帧的首地址尾地址会发生变化,一开始A1,R1,然后R1,R2……
特殊IP地址
点分十进制记法
IP编址可以解决世界各地网络硬件地址差异大,转换工作复杂的问题
网络地址转换过程
? 离开专用网的时候,替换源地址,将内部地址替换为全球地址
? 进入专用网的时候,替换目的地址,将全球地址替换为内部地址
现在有一个问题,就是我们已经知道IP了,那么计算机怎么知道对应的MAC地址呢
这就涉及到地址解析协议ARP
已经知道了一个机器(主机或路由器)的IP地址,如何找出其响应的硬件地址
地址解析协议ARP就是用来解决这个问题的
方法:每一个主机都设有一个ARP高速缓存(ARP cache,作用存放最近获得的IP地址绑定的MAC地址,减少ARP广播数量)这里面存有所在局域网上的各个主机和路由器IP地址到硬件地址的映射表
<IP address; MAC address; TTL> TTL:地址映射有效时间
我们可以查看自己的电脑的ARP高速缓存,命令
arp -a|more
先在ARP高速缓存中查看有无主机B的IP地址
? 如果有,就可查出对应的硬件地址,再将此硬件地址写入MAC帧,然后通过局域网将该硬件地址写入MAC帧,然后通过局域网发往硬件地址
? 如果没有,ARP进程在本局域网上广播发送一个ARP请求分组,收到ARP响应分组后,将得到的IP地址到硬件地址的映射写入ARP高速缓存
? 不在同一个局域网的话,则交给一个路由器
? 解析是自动进行的
首部和数据部组成,首部是固定长度,共20字节,是所有IP数据报必须拥有的
首部的固定部分的后面是一些可选字段,其长度是可以变的
固定字段的常见内容如下
版本,首部长度,区分服务,总长度,标识,标志
显示本机路由表 route print -4
IP层后转发分组都只找网络前缀了(这样就可以找到目的网络)因为直接如果找到主机号的地步,会需要大量的内容,主机数目实在太大了,查找过程就会非常缓慢……
所以就找前缀相同,看看是不是本网络如果不是的话则通过端口转发。如果有多个匹配的前缀,那么则选取最长的前缀
核心算法(默认前缀按长到短排序)
1 从数据报首部提取目的主机的IP地址D,得出目的网络的地址N
2 若网络N与此路由器直接相连,则把数据报直接交付目的主机D,否则是间接交付。执行3
3 若路由表中有目的地址为D的特定主机路由,则把数据报传送给路由表中下一跳的路由器,否则执行4
4 若路由表中有目的网络地址N的路由,则把数据报传送给路由表中下一跳的路由器,否则执行4
5 若路由表中有一个默认路由,则把数据报传送给路由表中指明的默认路由器,否则执行6
6 报告转发分组出错
特殊的路由
? 主机路由和默认路由
而为了加快查找表的查找过程,又可以使用二叉线索查找转发表
为了更有效地转发IP数据报并且提高交付机会,使用ICMP协议
使用ICMP后,就可以运行主机或者路由器报告差错情况和提供有关异常情况的报告
提高IP数据报的交付成功机会,允许主机或路由器报告差错情况和提供有关异常情况的报告,但是不是高层协议,ICMP报文是装到IP数据报的数据部分中的
是IP层协议
ICMP报文的前四个字节是统一的格式,共有3个字段,即类型、代码、检验和
ICMP的应用举例
Ping
traceroute
在如下情况发送ICMP报文
? 终点不可达
? 源点抑制
? 时间超过
? 参数问题
? 改变路由(重定向)
ICMP报文的
用ping命令测两个主机的连通性,其中ping是应用层直接使用网络层ICMP的一个例子
另一个例子是LInux的traceroute ,Windows下是tracert,可以知道到目的主机所经过路由器的IP地址