IP地址与硬件地址的区别
从数据链路层我们知道以太网中的MAC帧传送是需要源主机地址和目标主机地址的,但是在数据链路层的该帧中的地址是指硬件地址,在传输层时TCP报文中包含首部和应用层数据,向下到了网络层,会将上层的数据报包装,在其数据报之前再加一个首部,该首部中放入IP地址,组成的新的报文称为IP数据报,再到下一层,再在IP数据报之前加首部,在尾部加上新的尾部,该首部中包含硬件地址,这个新的报文称为MAC帧。连接通信链路上的设备(主机或者路由器)在接收MAC帧时,其根据是实际的硬件地址。在数据链路层看不见IP地址。
实际上,ip地址是逻辑地址(因为IP地址是由软件来实现的),是提供给网络层及其以上层来使用的地址。
要进行通信,必须知道IP地址和硬件地址。由此就有了ARP和RARP协议。
IP地址
有A类,B类,C类和D类地址,A类地址的网络号占一个字节,主机号占三个字节。网络号即为最高的那个字节,网络地址就是主机号全为0,主机号全为1,表示该网络上的所有主机。以A类地址为例,如5.6.7.8,其中网络号就是5,主机号就是6.7.8对应的十进制数字,而网络地址就是5.0.0.0,5.255.255.255表示该网络中的所有主机。
RARP协议
RARP协议是指通过硬件地址来解析其IP地址。但是现在的DHCP协议已经包含了RARP协议的功能,所以逆地址解析协议这里就不多做介绍。
ARP协议
ARP协议是通过IP地址来解析其物理地址,也就是硬件地址。这时值得注意的是,因为路由器可能会连接两个网络,所以其可能有两个硬件地址。
由于IP地址和硬件地址格式的不同,比如IP地址是32位的,但是硬件地址是48位的,但是我们必须由网络层的IP地址找到其硬件地址以便加入到MAC帧首部,况且,网络上会出现新主机加进来或者撤走一些主机,更换网络适配器也会导致主机硬件地址发生改变,所以我们必须通过一种方式用IP地址来查找到其硬件地址。所以ARP协议解决的办法是在主机ARP高速缓存中存放有关本局域网上个主机或路由器的一个从IP地址到硬件地址的可动态更新的映射表。
当一个主机1要向本局域网中的主机2发送IP数据报时,就先在其ARP高速缓存中查找有无主机2的IP地址,如果有,就在ARP高速缓存表中查出其对应的硬件地址,再把这个硬件地址写入MAC帧中,然后通过局域网把该MAC帧发往此硬件地址。
当然如果没有找到,那么可能是主机2刚加进来,那么会有以下几步:
1.ARP进程在本局域网内广播发送一个ARP请求分组,请求内容大概是“我的IP地址是xxx,我的硬件地址是xxx,我想知道IP地址是XXX的主机的硬件地址。”
2.在本局域网上的所有主机上运行的ARP进程都收到了此ARP请求分组。
3.主机2在ARP请求分组中见到自己的IP地址,就向主机1发送ARP响应分组,并写入自己的硬件地址,其余主机都不理睬这个ARP请求分组。
4.主机1收到主机2的ARP响应分组之后,就在其ARP高速缓存中写入主机2的IP地址到硬件地址的映射。
注意:ARP请求分组是广播发送的,但ARP响应分组是普通的单播。
IP数据报的格式
一个IP数据报由首部和数据两部分组成,首部的前一部分是固定长度的20字节,这是所有IP数据报所必须具有的,在其首部的固定部分的后面是一些可选字段,其长度是可变的。
首部各字段意义:
1.版本:通信双方IP协议版本要一致,IPv4协议版本号是4。
2.首部长度:占4位,当为全1时,表示首部长度为最大值60字节。当首部长度不是4的整数倍时,最后必须进行填充。最常用的是首部长度为20字节。
3.区分服务:用来获得更好的服务,一般情况下不使用该字段。
4.总长度:指首部和数据之和的长度。单位为字节。
5.标识:占16位,IP软件在存储器中定义一个计数器,每产生一个数据报,计数器就加1,并将此值赋值给一个标识字段,这个标识字段并不是序号,因为ip是无连接的服务。数据报不存在按序接收的问题。
6.标志:占3位,但只有2位目前有意义。
7.片偏移
8.生存时间:防止兜圈子
9.协议:占8位,协议字段指出此数据报所携带的数据是使用何种协议,以便目的主机的IP层知道应用数据部分应该上交到哪一处理过程进行处理。
10.首部校验和:占16位,这个字段只检验数据报的首部,但不包含数据部分。数据报每经过一个路由器,路由器都要重新计算一下首部检验和。
11.源地址:占32位
12.目的地址:占32位
分组转发
在路由器中存在一张路由表,路由表中的项为:目的网络地址,下一跳地址,于是根据目的网络地址来确定下一跳路由器,这样做的结果是:
(1). IP数据报最终一定可以找到目的主机所在目的网络上的路由器(可能要通过多次的间接交付)。
(2).只有到达最后一个路由器时,才试图向目的主机进行直接交付。
但是在IP数据报的首部中没有地方可以用来指明下一跳路由器的IP地址。IP数据报的首部中保存的是源IP地址和目的IP地址,没有中间的经过的路由器的IP地址。而在MAC帧中首部的源和目的地址是可以变动的,那么待转发的数据报又怎么会找到下一跳的路由器呢?
当路由器收到一个待转发的数据报时,在路由表中找到下一跳的IP地址,然后并不把该IP地址写入到IP数据报中,而是送交给下层的网络接口软件,网络接口软件根据下一跳路由器的IP地址转换成硬件地址(使用ARP),并将此硬件地址放在链路层的MAC帧的首部,然后根据这个硬件地址去找到下一跳路由器,不断重复,直到找到目的地址主机。
划分子网
划分子网是从网络的主机号借用若干位作为子网号,当然主机号也就相应减少了同样的位数。所以IP地址就变成了<网络号><子网号><主机号>,凡是从其他网络上发送给本单位某个主机的IP数据报,仍然是根据IP数据报的目的网络号找到连接在本单位上网络上的路由器,但此路由器在收到IP数据报后,再按目的网络号和子网号找到目的子网,把IP数据报交付给目的主机。
子网络的网络地址为源网络号.子网号.0。
关于子网掩码的问题,是因为IP数据报中的目的IP地址并不会知道所要连接的网络是否进行了子网的划分,这时因为32位的IP地址本身以及数据报的首部都没有包含任何有关子网划分的信息,所以需要使用子网掩码。
子网掩码中的1对应于IP地址中的原来的网络号和子网号,而子网掩码中的0对应于现在的主机号。子网掩码和收到的数据报的目的地址逐位相“与”,得到了所要找的子网的网络地址。所以子网掩码的好处是无论网络有没有进行子网划分,只要把子网掩码和IP地址进行逐位相与的操作,就能立即得出网络地址来。
A类地址的默认子网掩码是255.0.0.0;B类地址的默认子网掩码是255.255.0.0;C类地址的默认子网掩码是255.255.255.0。即网络号为全1,主机号为全0。
可以根据要划分的子网数,来确定子网号的位数,之后子网号所在为逐步加1,就可以划分出不同的子网,但子网掩码只有一个,就是网络号加子网号所在位全为1,其余主机位全为0。每个子网段除去全0和全1之外均为可用地址。
当划分子网的情况下,分组转发的算法必须改变。使用子网划分之后,路由表必须包含一下三项内容:目的网络地址,子网掩码和下一跳地址。在分组转发时,必须先从头部中拿到目的IP地址,再将该IP地址和子网掩码相与,如果结果与网络地址一致,则进行直接交付,否则看是否有目的地址为该IP地址的特定主机路由,有则进行间接交付。
网际控制报文协议ICMP
该协议是为了更有效地转发IP数据报和提高交付成功的机会。它的报文实际上是作为IP数据报的数据部分嵌入的。ICMP报文的种类有两种,即ICMP差错报告报文以及ICMP询问报文。
报文类型有以下几种:
其中改变路由的意思是重定向,是路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器(可以通过更好的路由)。
常用的ICMP询问报文有两种:
回送请求和回答:ICMP回送请求报文是由主机或路由器向一个特定的目的主机发出的询问,收到此报文的主机必须给源主机或路由器发送ICMP回送回答报文,这种询问报文用来测试目的站是否可达以及了解其有关状态,如ping命令就使用了ICMP回送请求与回送回答报文。
时间戳请求和回答:ICMP时间戳请求报文是请某个主机或路由器回答当前的日期和时间,在ICMP时间戳回答报文中有一个32位的字段,其中写入整数代表从1999年1月1日起到当前时刻一共有多少秒。时间戳请求与回答可用来进行时钟同步和测量时间。
ICMP两个重要的应用就是ping命令和tracert(在Windows下,在UNIX中是traceroute),ping用来测试两个主机之间的连通性,而tracert来跟踪一个分组从源点到终点的路径。它从源主机向目的主机发送一连串的IP数据报,数据报中封装的是无法交付的UDP用户数据报。如下:
IP多播
IP多播是由一个源点发送到许多个终点,即一对多通信。因特网范围内的多播要靠路由器来实现,这些路由器需要增加一些识别多播数据报的软件,能够运行多播协议的路由器称为多播路由器,多播路由器也可以转发普通的单播IP数据报。在因特网上进行多播就叫做IP多播,IP多播所传送的分组需要使用多播IP地址。多播数据报不可能在其首部写入这么多主机的IP地址,所以在多播数据报的目的地址写入的是多播组的标识,然后让加入到这个多播组的主机IP地址与多播组的标识符关联起来。多播组的标识符就是IP地址中的D类地址。多播数据报和一般的IP数据报的区别就是它使用D类IP地址作为目的地址,并且首部中的协议字段值是2,表明使用IGMP协议。多播地址只能用于目的地址,而不能用于源地址。多多播数据报不产生ICMP差错报文。
相关协议
因特网的路由选择协议包括内部网关协议IGP(具体包含RIP和OSPF协议),外部网关协议EGP。
RIP协议是一种分布式的基于距离向量的路由选择协议。每经过一个路由器,跳数就加1,RIP认为它通过的路由数越少,距离就越短。RIP允许一条路径最多只能包含15个路由器,因此距离等于16表示不可达。所以RIP只适用于小型互联网。
OSPF是开放最短路径优先协议,使用迪杰斯特拉的最短路径算法,其最主要的特征就在于使用分布式的链路状态协议。不使用UDP而是直接使用IP数据报传送。