网络层在运输层的下方,但在理解的重要性上来讲,个人认为比运输层重要的多,生活中遇到网络层的场景远比运输层多。实际上计算机网络自顶向下这本书也将网络层称为协议栈中最有挑战性的部分。


概述

如果要简单的描述网络层,有这么几个地方是绕不过的:

  • 网络层可以提供多种服务,我们遇到最常见的因特网是一种尽力而为的服务,即不提供任何服务,有其他的网络可以提供特定的服务的
  • 网络层的核心功能是转发路由选择
  • 网络层的核心组件应该是路由器
  • 网络层有两种模式:数据报模式虚电路模式

虚电路网络和数据报网络

虚电路网络是提供连接服务的网络层,数据报网络是不提供连接服务的网络层。几个重要概念:

  • 一种网络层要么属于虚电路,要么属于数据报
  • 虚电路的连接服务是主机到主机的,运输层的TCP是进程到进程的
  • 运输层是在端系统实现的,但网络层除了端系统,还和网络核心路由器有关

一个很自然的问题:为什么网络层要根据提不提供连接服务划分为虚电路网络和数据报网络,这个问题对于网络层为何如此重要?

个人认为原因仅仅是因为网络层提供的服务与网络层是否连接的关系非常重要。即是由服务决定的。

虚电路网络

在自顶向下这本书里,只描述了虚电路的传输过程,对虚电路的建立没有进行介绍。所以这里也略过这个部分。

数据报网络

在数据报网络中,每当一个端系统要发送分组,它就为该分组加上目的端系统的地址,然后将该分组推进网络中。

路由器有个转发表,为了减少表项的数目,采用和编址对应的最长前缀匹配规则。

数据报网络中的转发表是通过路由选择算法进行修改的,通常每1-5分钟左右更新一次转发表。(一个问题:这种更新是全局同步的还是局部性的?)

由于转发表的不确定性,所以导致了分组的路径不确定性和无序性。

路由器工作原理

路由器的组成部分:

  • 输入端口
  • 输出端口
  • 交换结构
  • 路由选择处理器

路由器的转发功能由输入端口,输出端口和交换结构共同实现,且因为速度上的保证,总是由硬件实现。

输入端口

几个注意点:

  • 虽然转发表是由路由选择处理器生成的,但每个输入端口都有都有这个转发表的一份影子副本,以加快速度和避免集中式处理
  • 查找并转发这个功能是在这里实现的,非交换结构或路由选择处理器

交换结构

没什么好介绍的,就是一个转发部件而已,有三种结构

  • 内存式
  • 总线式
  • 纵横式

输出端口

没啥好介绍的,就是输出端口

何时出现排队

暂时不介绍,不影响整体理解。

因特网的编址和转发

因特网的三个组件:

  • IP协议
  • 路由选择部分
  • 报告数据报差错和对某些网络层信息请求进行响应的设施

数据报格式

暂略。

特别注意的是分片。

IP数据报分片

由于路径中不同的链路可能使用不同的链路层协议,故产生了分片,由于该措施,IPV4协议可造成Ddos攻击,但是IPV6取消了分片措施,故使其不大容易受到攻击。

IPV4编址

几个重要的概念:

  • 子网掩码:数字或用点十进制表示
  • 子网:虽然书上有一个定义,但是用那个定义理解路由器与路由器之间的子网并不可行,感觉本质上是和路由选择相关的,所以放到后面再进行讨论。

因特网的地址分配策略被称为无类别域间路由选择(CIDR),而在CIDR之前,IP的网络部分被规定为8,16,24这个三个长度,即A,B,C类网络,这种策略称为分类编址

跟随着子网的问题,还有一个很重要的问题,**交换机和路由器的本质区别是什么?

提前查看一下第五章链路层交换机的作用,可知交换机和路由器有这么两个明显的区别:

  • 路由器在网络层工作,交换机在链路层工作
  • 路由器根据IP地址转发,而交换机根据MAC地址转发

总结:从这里开始,用抽象的方法已经有点难以理解整个框架了,可能还是要硬着头皮先学习完后面再会过来理解。

DHCP协议

动态主机配置协议,可以自动分配IP地址.可以分为以下四步:

  • 客户端广播DHCP发送:此处源地址为0.0.0.0,目的地址为255.255.255.255,
  • DHCP服务器提供:DHCP服务器提供IP和租用等信息,目的地址仍未255.255.255.255
  • 客户端发送请求:此处源地址为0.0.0.0,目的地址为255.255.255.255,但包含请求的IP
  • DHCP ACK:DHCP响应请求,目的地址仍未255.255.255.255

网络地址转换

NAT协议.并没有什么难以理解的地方.值得注意的是NAT的几个反对意见:

  • 端口号用于主机编址而非进程
  • 路由器此时不仅仅工作在网络层
  • 违反了端到端原则

另一个难以理解的地方是NAT会妨碍P2P的应用程序?

在P2P应用程序中,任何参与对等方A应当能够对任何其他参与对等方B发起一条TCP连接.

该问题的实质在于如果对等方B在一个NAT后面,它不能充当服务器并接受TCP连接(例如校园网是无法搭建http服务器的,而阿里云就可以).

为什么呢?分析NAT协议可以知道,NAT转换表是由WAN端指向LAN端的,这种不可逆向的关系不能保证路由器的特定端口被转换为NAT内的主机的某个特定端口.即NAT协议有一种"单向性".png

UPnP

UPnP是一种允许主机发现并配置邻近NAT的协议.

UPnP协议要求主机和路由器都是UPnP兼容的.

UPnP为P2P应用程序提供了有效且健壮的NAT穿越解决方案.

根据书上简略的描述,UPnP允许NAT后的主机得知NAT转换表中自己的所对应的值,这样在某种程度上消除了NAT协议的单向性.

因特网控制报文协议

该协议不似IP协议和路由选择算法那般著名,但也是因特网网络层的三个组件之一,简称ICMP协议.

ICPM被主机和路由器用来彼此沟通网络层的信息,注意这个主机和路由器应该不仅仅是主机和路由器之间.

ICMP通常被认为是IP的一部分,但从体系结构来看它是位于IP智商的,因为ICMP是承载在IP分组上的(考虑到其功能,这个不难理解).

ping程序发送一个ICMP类型8编码0的报文到指定主机,目的主机发回一个类型0编码0的ICMP回显回答.ping服务器并非一个进程?

Tracetoute程序(windows下是tracert)也是用ICMP报文实现的.

IPv6

IP安全性

IPsec与IPv4和IPv6兼容,且是一种端到端的面向连接的协议.

且IPsec会话是一种地毯式的,即不是一个端口到一个端口而已,其余的性质类似SSL了.

路由选择算法

路由选择问题可归结为从源路由器到目的路由器的路由选择问题.

路由选择算法的目的看似显然:给定一组路由器以及连接路由器的链路,路由选择算法要找到一条从源路由器到目的路由器的"好"路径.但实践中却不仅仅如此,还要关心例如策略之类的问题,例如属于组织Y的路由器不应转发任何来源于组织Z的分组.

"好"的路径的意义的确定也不像想象中的那么简单,这里建模直接以权值代表其费用.

确定好这些之后,则路由选择算法就是一个最短路径问题,算法有两种:

  • 全局式路由选择算法.实践中1,具有全局状态信息的算法常被称为链路状态算法(LS算法)
  • 分散式路由选择算法.每个节点知道与其直接相连的链路的费用知识即可开始工作.习惯称为距离向量算法(DV算法).

第二种分类方式可已根据动态性或静态性进行分类:

  • 静态路由选择算法,人工干预,路由变化十分缓慢
  • 动态路由选择算法,易于对网络的变化做出反应,但也更容易受诸如负载敏感,路由振荡之类问题的影响.

第三种分类方式可以根据它是负载敏感的还是负载迟钝的进行划分

  • 负载敏感算法,链路费用动态的变化反映出底层链路的拥塞水平.路由选择算法趋向于避开拥塞链路.以前算法是这类,容易遇到很多难题.
  • 负载迟钝算法,路由算法不考虑拥塞水平.目前的算法大多都是负载迟钝的.

链路状态路由选择算法

第一步,由链路状态广播算法让每个结点知道整个网络的状态.

第二步,每个结点都运行类似Dijkstra算法来获取对其他节点的最短路径.该算法复杂度为O(n^2).

这样看来,这种算法还挺简单的.

可能出现的问题:

假如链路费用与链路负载相关,那么会出现振荡现象

解决方案:

  • 强制链路费用不依赖于所承载的流量,但实际上并不可接受
  • 确保并非所有路由器同时运行LS算法.自同步

距离向量路由选择算法

Distance Vector算法是一种迭代的,异步的和分布式的算法.可自我终止.


我很好奇