一、网络层
在数据链路层以MAC帧和局域网为中心介绍,而在网络层就是讨论多个网络通过路由器互连成为一个互连网络的各种问题。其中主要要说网际协议IP是TCP/IP中两个最主要的协议之一,也是最重要的因特网标准协议之一。同时与IP协议配置套使用的还有几个协议:网地址解析协议ARP、逆地址解析协议RARP、网际控制报文协议ICMP、网际组管理协议IGMP等等。如下图画出了这四个协议和网际协议IP的关系。
在网络层,ARP和RARP画在最下面,因为IP经常要使用这两个协议。ICMP和IGMP画在这一层的上部,因为它们要使用IP协议。
另外网络层还有非常重要路由选择协议:内部网关协议RIP、OSPF,外部网关协议BGP等等。最后网络层还会牵扯到虚拟专用网VPN和网络地址转换NAT等等。后面一一说明。
二、ARP和RARP
在介绍IP协议之前,先说说IP协议经常需要用到的ARP(address resolve protocol)地址解析协议和RARP逆地址解析协议。
在实际应用中,当我们想给目标主机发送消息时,首先肯定得知道目标地址IP地址吧;但在实际网络的链路上传送数据帧时,最终还是必须使用该主机的硬件地址。但是怎么知道对方MAC地址呢?这就是ARP需要做的事,通过IP地址解析到对方的MAC地址。同时在每个主机上都设有一个ARP高速缓存,里面有本局域网上的各主机和路由器的IP地址对应硬件地址的列表,都是通过发送ARP报文解析到的。在windows主机上通过arp -a可以查看ARP缓存表,通过arp -d可以清除ARP缓存表(当然也有默认失效时间)。
当本局域网内的A主机要跟B主机通信时就会先从ARP缓存表中查找该IP对应的MAC地址,然后写入MAC帧。通过局域网把该MAC帧发往此硬件地址。如果ARP缓存中没有找到对方MAC,那么就会广播ARP报文以此来获取目标MAC地址。ARP广播原理就是如:A主机的IP地址为192.168.10.1,MAC地址为34-DF-3D-F3-DF-DF。那么就会发送一个ARP报文有自己的IP地址和MAC地址,B主机的IP地址和目标地址为FF-FF-FF-FF-FF-FF的广播地址,这样一个ARP报文给本局域网的所有主机,当B主机接收到之后发现目标IP地址就是自己本身那么它就会回应给A主机,这样A主机就会得到B的MAC地址并写入本机的ARP缓存中。局域网内的其它主机发现目标IP地址不是自己就会丢弃ARP报文。
RARP跟ARP相反是用于知道MAC地址解释出IP地址的。RARP在过去曾起到重要作用,但现在在DHCP协议中包含了RARP协议的功能。因此现在也没有人单独使用RARP协议了。
(交换机也正因为ARP协议才不用广播数据包,解决了数据安全问题。因为会先广播ARP报文然后得到对方MAC地址,然后交换机就可以根据MAC地址表一对一发送数据包了。而广播的ARP报文内没有数据。)
三、IP数据包格式
IP数据报的格式能够说明IP协议都具有什么功能,同时一个IP数据报由首部和数据两部分组成。首部的前一部分是固定长度,共20字节,是所有IP数据报必须具有的。在首部的固定部分的后面是一些可选字段,其长度是可变的。如下图IP数据报格式:
下面介绍各个字段的含义:
Version
版本字段:占4比特用来表明IP协议实现的版本号,当前一般为IPv4即0100。关于以后要使用的ipv6即版本号为6的IP协议。
Internet Header Length
IHL报头长度字段:占4比特要乘以头部占32比特的数字才是首部长度
Type of Service
TOS服务类型字段:占8比特。其中前3比特为优先权子字段(Precedence,现已被忽略)。第8比特保留未用。第4至第7比特分别代表延迟、吞吐量、可靠性和花费。当它们取值为1时分别代表要求最小时延、最大吞吐量、最高可靠性和最小费用。这4比特的服务类型中只能置其中1比特为1。可以全为0,若全为0则表示一般服务。服务类型字段声明了数据报被网络系统传输时可以被怎样处理。例如:TELNET协议可能要求有最小的延迟,FTP协议(数据)可能要求有最大吞吐量,SNMP协议可能要求有最高可靠性,NNTP(Network News Transfer Protocol,网络新闻传输协议)可能要求最小费用,而ICMP协议可能无特殊要求(4比特全为0)。实际上,大部分主机会忽略这个字段,但一些动态路由协议如OSPF(Open Shortest Path First Protocol)、IS-IS(Intermediate System to Intermediate System Protocol)可以根据这些字段的值进行路由决策
Total length
总长度字段:接收者用IP数据包总程度减去IP报头长度,就可以确定数据包数据有效载荷的大小;所以IP数据包的最大长度是65535.报头总长度必须是32位的倍数,即,报头长度可以被8整除。 当MTU=1000时候,可传输IP包的总长度为976+20=996,剩下4字节被分片到下一个IP包; 当MTU=1500时候,可传输IP包的总长度为1480+20=1500;
Identification(fragment ID)
标识符字段:占16比特。IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。。当数据报由于长度超过网络的MTU而必须分片时,这个标识的值用来唯一地标识主机发送的每一份数据报(当有数据包被分片时每一个被分片的数据包标示符都是相同的接收端就要靠标示符来组合一个完整的数据包)
Flags
标志位字段:占3bit标志一份数据报是否要求分段第1位不使用,第2位是DF位,当DF为1时,表示路由器不 允许分段处理,为0时,表示允许分段。第3位是MF位,当MF为1时,表示不是最后一个分段,为0时,表示是最后一个分段。
Bit 0: reserved, must be zero
Bit 1: (DF) 0 = May Fragment, 1 = Don’t Fragment.
Bit 2: (MF) 0 = Last Fragment, 1 = More Fragments.
Fragment Offset
段偏移字段:占13bit,用于指明分段起始点相对于报头起始点的偏移量,可以使接受者按照正确的顺序重组 数据包。长度13位,以8个八位组为单位。若MTU=1500时,一个大小为3000字节的数据经过该接口,会被分为3段传输,第一段报文总长度为1480+20,第二段为1480,第三段为40 那么第一段的分段偏移为0,第二段分段偏移为1480/8=185,第三段为185+185=370
Time-to-Live(TTL)
生存周期字段:占8比特。用来设置数据报最多可以经过的路由器数。由发送数据的源主机设置,通常为32、64、128等。每经过一个路由器,其值减1,直到0时该数据报被丢弃避免数据包循环
Protocol
协议字段:占8比特。指明IP层所封装的上层协议类型,指定了数据包中信息的类型如:
Header Checksum
头部校验和字段:占16比特。内容是根据IP头部计算得到的校验和码。计算方法是:对头部中每个16比特进行二进制反码求和。(和ICMP、IGMP、TCP、UDP不同,IP不对头部后的数据进行校验);标记数据在传输过程中是否发生错误的
Source IP Address
源IP地址字段:占32bit用来标明发送IP数据报文的源主机地址
Destination IP Address
目标IP地址字段:占32bit用来标明发送IP数据报文的目标主机地址
Options
可选项字段:被添加在IP报头中,包括源点产生的信息和其它路由器加入的信息;可选字段,主要用于测试,长度可变,如:
Loose Source Routing(松散源路由选择):可以指定数据包传递的路径;可以跨越中间多台路由器;
Strict Soutce Routing(严格源路由选择):可以指定数据包传递的路径;不同于loose的是,数据包必须严格按照路由转发,如果下一跳不在路由表中,将会产生错
Record Route(记录路由):记录数据包离开每台路由的出接口,区别于traceroute的是,record可以记录来 回的路径,而traceroute只可以记录但方向的;
Timestamp(时间戳):记录数据包到达设备的时间;
Verbose(详细内容):查看数据包传送的详细内容;一般用于查看延迟;
Padding(填充):通过在可选字段后面添加0来补足32位,为了确保报头长度是32的倍数
Data
数据:用来装载传输层的TCP/UDP数据段。
四、ICMP
ICMP网际控制报文协议工作在IP协议之上的,ICMP允许主机或路由器报告差错情况和提供有关一场情况的报告。ICMP是因特网的标准协议。也是IP层的协议。ICMP报文作为IP层数据报的数据,加上数据报的首部,组成IP数据报发送出去。ICMP报文格式如下图:
ICMP报文有两种,即ICMP差错报告报文和ICMP询问报文。ICMP报文的前4个字节是统一的格式,共有三个字段:即类型、代码和检验和。接着的4个字节的内容与ICMP的类型有关。最后面的数据字段,其长度取决与ICMP的类型。ICMP的常用报文类型如下:
ICMP的一个重要应用就是分组网间探测PING,用来测试两个主机之间的连通性。PING使用了ICMP回送请求与回送回答报文。PING是应用层直接使用网络层ICMP的一个例子。它没有通过传输层的TCP或UDP协议。如下图:
另一个非常有用的应用时traceroute(这是UNIX操作系统中名字),它用来跟踪一个分组从源点到终点的路径。在windows操作系统中这个命令是tracert。
五、路由器
在数据链路层我们知道局域网的概念,但是我们也知道不管是使用网桥还是交换机这些中间设备时,仅仅是把一个网络扩大了,而从网络层的角度看,这仍然是一个网络,一般并不称之为网络互连,也无法把全世界范围内数以百万计的网络都互连起来。因此就有了路由器的出现,通过路由器把不同或相同的局域网进行互连。路由器其实就是一台专用计算机,用来在互联网中进行路由选择。
通过路由器来连接不同交换网络(如两个交换机之间的网络),这样一来,当A和B两台交换机内部通信正常的情况下都连接到路由器上来。如下图:
(这个实验环境是由Cisco packet tracer软件搭建的,具体Cisco packet tracer怎么使用请自行查阅)
路由器由于可以隔离广播,所以A交换机内的主机发送广播到达路由器时路由器对于这个信号是不会广播到B交换机的;可是这样一来A和B两个网络就被隔离了也无法通信了,这样要路由器有什么意义呢?因此以这种平面化的物理MAC地址通信已经不足以应付这个问题了。于是后来又引入了一种地址称为逻辑地址IP来解决这个问题。就演变成了PC0主机和PC1主机通信(知道目标IP),先通过ARP协议通过IP地址解析到目的主机的MAC地址从而可以通信,同时PC0主机发送的ARP广播是不会通过路由器到达B交换机的。
在这种情况下,如果PC0要是想跟PC2通信的话,就需要路由器了。同时也要引入另外一个概念那就是网关地址。
比如A交换机下的PC0和PC1通信只需要设置IP地址和子网掩码即可(要在同一个网段内才能通信)。但是PC0需要跟PC2通信时就需要设置网关,由上图可以发现网关地址的设定就是路由器的接口地址并且在同一个网段内。此时PC0就可以跟PC2通信也就是不同网络之间的通信。其原理就是:PC0在封装网络层的时候会把目标IP地址和本地IP地址做比较,根据子网掩码可以判断目标IP是否与本地IP在同一个网段,如果不是,那么就会去找本地设置的网关IP地址。然后利用ARP协议可以找到网关的MAC地址。从而把这个数据报直接发送给网关设备,这里也就是路由器。当路由器收到这个数据报之后就会解封数据报到网络层部分查看目标IP地址,这里的目标地址就是PC0的IP地址192.168.20.10/24。路由器发现目标地址是192.168.20.0网段的,然后就会查找自己的路由表。
路由表是路由器的核心,它跟交换机的MAC地址表类似。路由器就是根据这个路由表才能为数据报选择路径。路由表内有本地所有接口IP地址的网络地址和路由地址,路由地址是什么呢?常见的路由分类有静态路由条目、默认路由条目、自动学习的路由条目(RIP,OSPF,BGP)。后面讲解
接着上面说,路由器查找路由表就会找到F0/1接口的网络地址,就会发现跟目标地址的网络地址相同,也就证明是同一个网段的(路由器的上是不允许出现同一个网络地址的)。如图路由器的路由表:
然后路由器就会重新封装数据报的的数据链路层,需要把源MAC地址改变为F0/1的接口地址,目标MAC地址改为目标IP的MAC地址。就会先查找自己的ARP缓存表发现没有PC2的IP地址对应的MAC地址。此时路由器就会发送ARP报文给F0/1通过B交换机广播到每一个目标主机,然后得到目标MAC地址。同时交换机也就学习源MAC和目标MAC,路由器得到目标MAC地址后直接封装好数据包发给交换机,交换机接收到数据报后拆封到数据链路层也需要得到目标MAC地址,然后查看自己的MAC地址表找到此MAC地址对应的端口号直接发送给PC2。B交换机的MAC地址表如下:
这是由于两台主机之间就隔了一个路由器,如果在两台主机之间有多个路由器的话,那么当第一个路由器接收到数据报后也知道了目标IP的网络地址后,路由器必须要根据路由表的路由规则设置给出一个明确的路径来转发数据报,不然就会报错。
(关于路由器的内容后面会详细介绍)