首页 > 代码库 > 计算机网络 -- 网络层

计算机网络 -- 网络层

因特网的设计思路:

网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数据服务;网络在发送分组时不需要先建立连接。网络层不提供服务质量的承诺,交付不可靠。

虚电路与数据报:

虚电路:逻辑上的连接,分组都沿着这条逻辑链接按照存储方式进行传送,而不是建立了一条真正的连接;电路交换的电话通信是先建立一条真正的连接。

技术分享
技术分享

IP协议

与ip协议相关:

技术分享

技术分享

网络互联的中间设备:

处在不同层次的中间设备有不同的名字,功能也有差异。
1、物理层 —》转发器
2、数据链路层 —》网桥或桥接器
3、网络层 —》路由器
4、网络层以上 —》 网关

IP地址的分类:

IP地址就是给因特网的每个主机的每一个借口分配一个全世界范围是唯一的32位的表示符。IP地址由因特网名字与号码指派公司ICANN进行分配。
技术分享

技术分享

技术分享

IP地址与Mac地址:

IP地址放在数据报的首部,而硬件地址则放在MAC帧的首部。网络层和网络层以上使用的是IP地址,而数据链路层及以下使用的是硬件地址。
IP数据包被包含在MAC帧中,因此数据链路层是看不见数据包的IP地址。

IP的通信方式使得异构的网络能够互相通信且避免了非常复杂的硬件地址转化工作。

IP数据报:

技术分享

  1. 版本:占4位,指IP协议的版本。通信双方使用的 IP协议版本必须一致。日前广泛使用的 IP协议版本号为 4 (即 IPv4)。
  2. 首部长度:占 4 位,可表示的最大十进制数值是 15。请注意, 这个字段所表示数的单位是32位字 ( 1 个32位字长是4 字节),
    因此,当 IP 的首部长度为 1111 时 (即十进制的 15), 首部长度就达到 60字节。当 IP
    分组的首部长度不是4字节的整数倍时, 必须利用最后的填充字段加以填充。 因此数据部分永远在 4字节的整数倍开始, 这样在实现
    IP协议时较为方便。 首部长度限制为 60字节的缺点是有时可能不够用。 这样做的目的是希望用户尽量减少开销。 最常用的首部长度就是 20
    字节 (即首部长度为 0101), 这时不使用任何选项。
  3. 服务:占 8 位,用来获得更好的服务。 这个字段在旧标准中叫做服务类型,但实际上一直没有被使用过。
    1998年IETF把这个字段改名为区分服务 DS (DifferentiatedServices)。
    只有在使用区分服务时,这个字段才起作用。
  4. 总长度:总长度指首都及数据之和的长度,单位为字节。 因为总长度字段为 16位,所以数据报的最大长度为 216-1=65 535字节。
    在IP层下面的每一种数据链路层都有自己的帧格式,其中包括帧格式中的数据字段的最大长度,即最大传送单元 MTU (Maximum
    Transfer Unit)。当一个数据报封装成链路层的帧时,此数据报的总长度
    (即首部加上数据部分)一定不能超过下面的数据链路层的MTU值。
  5. 标识 (Identification):占 16位。 IP软件在存储器中维持一个计数器,每产生一个数据报, 计数器就加
    1,并将此值赋给标识字段。但这个“标识”并不是序号, 因为 IP是无连接的服务,数据报不存在按序接收的问题。 当数据报由于长度超过网络的
    MTU 而必须分片时, 这个标识字段的值就被复制到所有的数据报的标识字段中。 相同的标识字段的值使分片后的各数据报片最后能正确地重装成为
    原来的数据报。
  6. 标志 (Flag):占3 位,但目前只有2位有意义。 标志字段中的最低位记为 MF (More Fragment)。
    MF=1即表示后面“还有分片”的数据报。MF=0表示这已是若干数据报片 中的最后一个。 标志字段中间的一位记为 DF(Don’t
    Fragment), 意思是“不能分片”。只有当 DF=0时才允许分片。
  7. 片偏移:占 13位。较长的分组在分片后, 某片在原分组中的相对位置。也就是说,相对用户数据字段的起点, 该片从何处开始。片偏移以
    8个字节为偏移单位。 这就是说,每个分片的长度一定是 8字节 (64位)的整数倍。
  8. 生存时间:占 8位,生存时间字段常用的英文缩写是 TTL (Time To Live),其表明数据报在网络中的寿命。
    由发出数据报的源点设置这个字段。 其目的是防止无法交付的数据报无限制地在因特网中兜围子, 因而白白消耗网络资源。最初的设计是以秒作为
    TTL的单位。 每经过一个路由器时,就把TTL减去数据报在路由器消耗掉的一段时间。 若数据报在路由器消耗的时间小于 1
    秒,就把TTL值减 1。 当 TTL值为 0时,就丢弃这个数据报。
  9. 协议:占 8 位,协议字段指出此数据报携带的数据是使用何种协议,以便使目的主机的IP层知道应将数据部分上交给哪个处理过程。
  10. 首部检验和:占 16位。这个字段只检验数据报的首部, 但不包括数据部分。这是因为数据报每经过一个路由器,都要重新计算一下首都检验和
    (一些字段,如生存时间、标志、片偏移等都可能发生变化)。不检验数据部分可减少计算的工作量。
  11. 源地址:占32位。
  12. 目的地址:占 32位。

IP层转发分组流程

1) 从数据报的首部提取目的主机的 IP 地址 D, 得出目的网络地址为 N。

(2) 若网络 N 与此路由器直接相连。则把数据报直接交付目的主机 D。否则是间接交付,运行(3)。

(3) 若路由表中有目的地址为 D 的特定主机路由。则把数据报传送给路由表中所指明的下一跳路由器。否则,运行(4)。

(4) 若路由表中有到达网络 N 的路由,则把数据报传送给路由表指明的下一跳路由器。否则,运行(5)。

(5) 若路由表中有一个默认路由。则把数据报传送给路由表中所指明的默认路由器;否则,运行(6)。

(6) 报告转发分组出错。

arp、rarp解析协议

ARP(Address Resolution Protocol)地址解析协议

  1. 每一个主机都有一个ARP高速缓存(ARP cache),当主机A欲向本局域网上的主机B发送一个IP数据报时,先在其ARP高速缓存中查看有无主机B的IP地址。如有,就将对应硬件地址写入MAC帧。
  2. 也有可能ARP cache中查不到主机B的IP地址。这可能是主机B才入网,也可能是主机A刚刚加电,其高速缓存还是空的。在这种情况下,主机A就自动运行ARP:
    ~ARP进程在本局域网上广播发送一个ARP请求分组,上面有主机B的IP地址。
    ~在本局域网上的所有主机上运行的ARP进程都收到此ARP请求分组。
    ~主机B在ARP请求分组中见到自己的IP地址,就向主机A发送一个ARP响应分组,上面写入自己的硬件地址。
    ~主机A收到主机B的ARP响应分组后,就在ARP高速缓存中写入主机B的IP地址到硬件地址的映射。

arp -a 查询系统中的arp缓存。
arp把保存在高速缓存中的每一个映射地址项目都设置生存时间,凡事超过生存时间的项目就从高速缓冲中删除。
arp解决的是一个局域网内的主机或者是路由器的IP地址和硬件地址之间的映射问题。如果两个主机不在同一个局域网内,就无法解析硬件地址。

arp的使用情况:
1、发送方是主机,发送到本网络的主机。arp找目的地址的硬件地址。
2、发送方是主机,发送到外网的主机。arp找本网络的一个路由器的硬件地址,将工作交付给路由器。
3、发送方是路由器,发送到本网络的主机。arp找到目的主机的硬件地址。
4、发送方式路由器,发送到外网的主机。arp找本网络的路由器的硬件地址,将工作交付给路由器。

RARP逆地址解析协议

功能和ARP协议相对,其将局域网中某个主机的物理地址转换为IP地址。

  1. 给主机发送一个本地的RARP广播,在此广播包中,声明自己的MAC地址并且请求任何收到此请求的RARP服务器分配一个IP地址;
  2. 本地网段上的RARP服务器收到此请求后,检查其RARP列表,查找该MAC地址对应的IP地址;
  3. 如果存在,RARP服务器就给源主机发送一个响应数据包并将此IP地址提供给对方主机使用;
  4. 如果不存在,RARP服务器对此不做任何的响应;
  5. 源主机收到从RARP服务器的响应信息,就利用得到的IP地址进行通讯;如果一直没有收到RARP服务器的响应信息,表示初始化失败。

划分子网和构造超网

划分子网:

两级IP不够灵活,85年起添加了子网号字段,两级IP变成三级IP地址。划分子网也叫做子王寻址或子网路由选择。

注意:
1、划分子网属于单位内部的事情,本单位以外的网络看不见,这个单位对外仍然表现为一个网络。
2、划分子网,属于从主机号借位,主机号位数相对减少。

理解的例子:

一家集团公司有12家子公司,每家子公司又有4个部门。上级给出一个172.16.0.0/16的网段,让给每家子公司以及子公司的部门分配网段。

思路:既然有12家子公司,那么就要划分12个子网段,但是每家子公司又有4个部门,因此又要在每家子公司所属的网段中划分4个子网分配给各部门。

步骤:
A. 先划分各子公司的所属网段。
有12家子公司,那么就有2的n次方≥12,n的最小值=4。因此,网络位需要向主机位借4位。那么就可以从172.16.0.0/16这个大网段中划出2的4次方=16个子网。
详细过程:

先将172.16.0.0/16用二进制表示
10101100.00010000.00000000.00000000/16
借4位后(可划分出16个子网):
1)   10101100.00010000.00000000.00000000/20【172.16.0.0/20】
2)   10101100.00010000.00010000.00000000/20【172.16.16.0/20】
3)   10101100.00010000.00100000.00000000/20【172.16.32.0/20】
4)   10101100.00010000.00110000.00000000/20【172.16.48.0/20】
5)   10101100.00010000.01000000.00000000/20【172.16.64.0/20】
6)   10101100.00010000.01010000.00000000/20【172.16.80.0/20】
7)   10101100.00010000.01100000.00000000/20【172.16.96.0/20】
8)   10101100.00010000.01110000.00000000/20【172.16.112.0/20】
9)   10101100.00010000.10000000.00000000/20【172.16.128.0/20】
10) 10101100.00010000.10010000.00000000/20【172.16.144.0/20】
11) 10101100.00010000.10100000.00000000/20【172.16.160.0/20】
12) 10101100.00010000.10110000.00000000/20【172.16.176.0/20】
13) 10101100.00010000.11000000.00000000/20【172.16.192.0/20】
14) 10101100.00010000.11010000.00000000/20【172.16.208.0/20】
15) 10101100.00010000.11100000.00000000/20【172.16.224.0/20】
16) 10101100.00010000.11110000.00000000/20【172.16.240.0/20】
我们从这16个子网中选择12个即可,就将前12个分给下面的各子公司。每个子公司最多容纳主机数目为2的12次方-2=4094。

B. 再划分子公司各部门的所属网段 
以甲公司获得172.16.0.0/20为例,其他子公司的部门网段划分同甲公司。
有4个部门,那么就有2的n次方≥4,n的最小值=2。因此,网络位需要向主机位借2位。那么就可以从172.16.0.0/20这个网段中再划出2的2次方=4个子网,正符合要求。
详细过程:
先将172.16.0.0/20用二进制表示
10101100.00010000.00000000.00000000/20
借2位后(可划分出4个子网):
① 10101100.00010000.00000000.00000000/22【172.16.0.0/22】
② 10101100.00010000.00000100.00000000/22【172.16.4.0/22】
③ 10101100.00010000.00001000.00000000/22【172.16.8.0/22】
④ 10101100.00010000.00001100.00000000/22【172.16.12.0/22】
将这4个网段分给甲公司的4个部门即可。每个部门最多容纳主机数目为2的10次方-2=1024。

由于外部不可知内部的划分情况,外部数据报传送到单位路由后,单位路由借助子网掩码进行区分:
子网掩码:32位,子网掩码中的1对应于IP地址原来的网络号和子网号,子网掩码中的0对应于主机号。
将子网掩码和收到的数据报的IP地址逐个“与”运算,得到子网的网络地址。从而路由器进行数据报的子网转发。
技术分享

技术分享

CIDR构造超网:

CIDR的主要特点:
1、消除了传统的A B C类地址以及划分子网的概念,因而更加有效的分配ipv4的地址空间。使用“斜线记法”或者称为CIDR记法,在IP地址的后面加上/,表示网络前缀所占的位数。
2、CIDR把网络前缀相同的连续IP地址组成一个CIDR地址块。只要知道地址块中的人和一个地址,就可以知道这个地址块的起始地址和最大地址,以及地址块中的地址数。
3、CIDR使用32位的地址掩码。(在三级地址中的叫做子网掩码,在CIDR二级地址中叫做地址掩码,虽然表示一样但是意义表一样。)

注意:在某些书本上写道CIDR不使用子网,代表的意思是CIDR并没有在32位地址中指明若干位作为子网字段,但是CIDR地址块仍然可以划分子网,特点是子网的网络前缀比整个组织的网络前缀要长。

例题:

技术分享
技术分享

ICMP(Internet Control Message Protocol)

网际控制报文协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。

应用场景为ping和traceroute
ping :测试两个主机的连通性。使用了icmp的回送请求与回答报文。

ping命令: 
ping [参数] [主机名或IP地址]    

命令参数:   
-d 使用SocketSO_DEBUG功能。
-f  极限检测。大量且快速地送网络封包给一台机器,看它的回应。
-n 只输出数值。
-q 不显示任何传送封包的信息,只显示最后的结果。
-r 忽略普通的Routing Table,直接将数据包送到远端主机上。通常是查看本机的网络接口是否有问题。
-R 记录路由过程。
-v 详细显示指令的执行过程。 
-c 数目:在发送指定数目的包后停止。
-i 秒数:设定间隔几秒送一个网络封包给一台机器,预设值是一秒送一次。
-I 网络界面:使用指定的网络界面送出数据包。
-l 前置载入:设置在送出要求信息之前,先行发出的数据包。
-p 范本样式:设置填满数据包的范本样式。
-s 字节数:指定发送的数据字节数,预设值是56,加上8字节的ICMP头,一共是64ICMP数据字节。
-t 存活数值:设置存活数值TTL的大小。

traceroute:跟踪一个分组从源点到终点的路径。
具体跟踪的做法是:

源向目的主机发送一连串的IP数据报,数据报中封装的是无法交付的UDP数据报。第一个数据报P1的生存时间TTL为1,当P1达到路径上的第一个路由器R1时,R1先收下他紧接着将TTL的值减1。此时TTL为0了于是R1丢弃P1,并向源主机发送一个ICMP时间超过差错报告报文。
源主机接着发送第二个数据报P2。并将TTL设为2。P2先到达路由器R1.R1收下P2后将P2的TTL减一后再转发给R2,此时R2收到P2,先收起来然后将TTL减一变为0于是丢弃P2,并向源主机发送一个ICMP时间超过差错报告报文。
这样一直继续下去。当最后一个报文正好到目的主机时。TTL为1,主机不转发数据报也不将TTL减1,但因数据报中存放的是UDP无法交付。因此发送一个ICMP终点不可达差错报告报文。

源主机就实现了自己的目的,这些路由器和最后一个终点不可达发送的ICMP正好给出了源主机想知道的路由信息。到达目的主机所经过的路由的IP地址以及达到其中每一个路由器的往返时间

traceroute命令:
traceroute[参数][主机]

命令参数:
-d 使用Socket层级的排错功能。
-f 设置第一个检测数据包的存活数值TTL的大小。
-F 设置勿离断位。
-g 设置来源路由网关,最多可设置8个。
-i 使用指定的网络界面送出数据包。
-I 使用ICMP回应取代UDP资料信息。
-m 设置检测数据包的最大存活数值TTL的大小。
-n 直接使用IP地址而非主机名称。
-p 设置UDP传输协议的通信端口。
-r 忽略普通的Routing Table,直接将数据包送到远端主机上。
-s 设置本地主机送出数据包的IP地址。
-t 设置检测数据包的TOS数值。
-v 详细显示指令的执行过程。
-w 设置等待远端主机回报的时间。
-x 开启或关闭数据包的正确性检验。

icmp和IP数据报的关系以及icmp的格式:
技术分享

icmp报文种类:

icmp主要有两种报文: icmp差错报文, icmp询问报文
技术分享

差错报文的的五种类型:

3 ==》终点不可达,路由或者株距不可交付数据报,向源点发送不可达报文。
4 ==》源点抑制,路由或者主机由于拥塞丢弃数据报,向源点发送源点抑制报文。
11 ==》超时,路由收到生存期为0的数据报,丢弃数据报,向源点发送超时报文。
12 ==》参数问题,路由或者主机的字段值不正确
5 == 》重定向,主机刚开始工作并不清楚最佳路由,一律将数据报传送到网络上的默认路由,默认路由知道每一个目的网络的最佳路由,如果发现主机发送的数据报发送的最佳路由不该经过默认路由器而是经过网络中的另一个路由,就用改变路由报文把这种情况发送给主机。

询问报文:

回送请求和回答报文:用于测试目的网络是否可达,以及相关的状态。
时间戳请求和回答报文:请求当前的时间和日期,用于时钟同步和测量时间。

路由选择:

静态路由选择策略——即非自适应路由选择,其特点是简单和开销较小,但不能及时适应网络状态的变化。
动态路由选择策略——即自适应路由选择,其特点是能较好地适应网络状态的变化,但实现起来较为复杂,开销也比较大。

技术分享

内部网关协议(IGP):

在一个自治系统内部使用的路由选择协议,也叫域内路由选择。

RIP路由信息协议:基于距离向量的路由选择

特点:简单,使用范围小
距离=跳数,每过一个路由器跳数加一,允许美条路径只能包含15个路由器,当跳数等于16就表示不可达。

特点:
1. RIP协议中的信息交换仅发生在相邻的两个路由器之间,不相邻的路由器不交换信息;
2. 路由器交换的信息是当前本路由器知道的全部信息,即自己的路由表【我到本AS中所有网络的最短距离+到每个网路的NextHop】;
3. 路由器按规定的时间间隔交换路由信息,比如每隔20秒,然后路由器根据收到的信息更新路由表;当网络拓扑发生变化时,路由器也会及时的告知相邻路由器;

OSPF开放最短路径优先(open shortest path first):

特点:

  1. 采用洪泛法(Flooding)向本AS系统内的所有路由器发送信息,首先通过所有直连输出接口向所有相邻的路由器发送信息,每一个相邻的路由器又将此信息发往其相邻的所有路由器(不再重复回传给信源路由器),这样最终整个AS中所有的路由器都得到了这个信息的一个副本。RIP协议只是向自己相邻的路由器发送信息;
  2. 发送的信息就是本路由器相邻的所有路由器的链路状态,但这只是路由器所知道的部分信息。所谓链路状态就是指【我的邻居路由器有哪些?我到各个邻居路由器的链路度量】,OSPF用这个度量表示费用、距离、时延和带宽等,而这些都由具体的网络管理人员来规定,因此OSPF相对于RIP的距离向量来说更为灵活。RIP则发送的是【到所有网络的距离以及下一跳】;
  3. 只有当链路状态发生变化时路由器才向所有路由器泛洪发送此消息,而不想RIP那样,不管有无变化都发送路由信息。

外部网关协议(EGP):

自治系统边界的路由协议也叫域间路由选择。
技术分享

在配置BGP时,每一个自治系统的管理员要选择至少一个路由器作为该自治系统的“BGP发言人”。一个BGP发言人与其他AS的BGP发言人要交换路由信息,就要先建立TCP连接,然后在此连接上交换BGP报文以建立BGP会话,利用BGP交换路由信息。

每个BGP发言人除了必须运行BGP协议外,还必须运行该自治系统所使用的内部网关协议,如OSPF或RIP。

BGP发言人构造出来的自治系统连通图是树状结构,不存在回路。

多播

技术分享

单播 ==》1:1
多播 ==》1:一部分机器
广播 ==》1:所有机器
组播 ==》1:一组机器
泛播 ==》1:拓扑结构中最接近的接收方

多播协议和IGMP协议配合多播的实现。IGMP网际组管理协议实现的功能是:
IGMP并不对多播成员的数量以及分布进行管理,而是告知连接在本地局域网上的多播路由器知道本局域网上是否有主机(进程服务)参加或者退出多播组。(单纯IGMP无法实现多播)


all

<script type="text/javascript"> $(function () { $(‘pre.prettyprint code‘).each(function () { var lines = $(this).text().split(‘\n‘).length; var $numbering = $(‘
    ‘).addClass(‘pre-numbering‘).hide(); $(this).addClass(‘has-numbering‘).parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($(‘
  • ‘).text(i)); }; $numbering.fadeIn(1700); }); }); </script>

    计算机网络 -- 网络层