目录
英特网的网络层有三个主要组件。第一个是IP协议,第二个是路由选择部分,它决定数据报从源到目的地所流经的路径。最后一个是报告数据报中差错和对某些网络层信息请求进行响应的设施,即英特网控制报文协议(ICMP)。
1、IP
(1)Ipv4数据报格式:
版本:
这个4位字段定义了IP协议的版本,目前主流的版本是4。
首部长度:
这个4位字段定义了数据报首部的长度,以4字节的字为单位。当首部没有选项时,首部长度位20字节;当这个字段值位最大值F时,首部长度最大为60字节。
服务类型:
使不同类型的IP数据报能相互区别开来,如低延时,高吞吐量等等。
总长度:
这个16位字段定义了数据报总长度,其以字节为单位。故IPv4数据报总长度上限值位65536字节。
标识(identification):
这个16位字段标志了从源主机发出的一个数据报,这样就确定了数据报的唯一性。这样使得数据报被分片(数据报比链路层帧大的时候就会执行分片)后,在到达终点时终点能根据标识号将同一个数据报的分片重新组装成一个数据报。
标志(flag):
最后一个片为0,其余为1。这可以让目的主机确信它已收到了最后一个片
分片偏移:
这个13位字段表示的是分片在整个数据报中的相对位置。这是数据在原始数据报中的偏移量,以8字节位单位。
注:分片本身还可能进行分片,这种情况下,分片偏移值永远是相对于原始数据报的。
生存时间:
这个8位字段用来控制数据报所经过的最大跳数(路由器),每经过一个路由器,这个字段数值都减1,减1后变位0时,路由器就丢弃这个数据报。
协议:
这个8位字段定义了使用IPv4服务的高层协议,如TCP,UDP,ICMP,IGMP,OSPF等的数据都将被封装到IP数据报中。这个字段指明数据报必须交付给哪个最终目的协议。
检验和:
检验IP数据报首部。
(2)DHCP
因特网的地址分配策略被称为无类别域间路由选择(Classless Interdomain Routing,CIDR)。如一个子网地址为223.1.1.0/24,其中/24记法称为子网掩码。子网最主要的作用即是隔离。
那么如何获得一个IP呢?通常使用的是动态主机配置协议(Dynamic Host Configuration,DHCP),它允许主机自动获取一个IP地址。大致的方法就是当主机加入时,DHCP服务器从其当前可用的地址池中分配一个任意的地址给它;当一台主机离开时,其地址被收回这个池中。具体步骤如下:
- DHCP服务器发现。新主机广播发送一个DHCP发送报文。
- DHCP服务提供。DHCP服务器广播发送一个DHCP提供报文,包含发现报文的事务ID,向客户推荐的IP地址,网络掩码以及IP地址租用期。
- DHCP请求。新主机向选中的服务器提供用一个DHCP请求报文响应。
- DHCP ACK。服务器用DHCP ACK报文响应。
(3)网络地址转换NAT(Network Address Translation)
NAT路由器对外界的行为就如同一个具有单一IP地址的单一设备,所有离开家庭路由器和进入家庭的报文都有一个IP地址。那么,如果从广域网到NAT路由器的所有数据报都有相同的目的IP地址,那么该路由器如何知道它应该将某个分组转发给哪个内部主机呢?使用一张NAT转换表,即将LAN端IP和端口号映射为一个WAN端的一个端口号。
但是NAT存在一个问题,就是NAT转换表只能记录从内网向外网发送数据报的IP和端口号,这就导致只能由内向外请求连接,而无法从外部向内请求连接,故妨碍了P2P程序。目前许多P2P程序利用连接反转来实现NAT穿越,就是有一个服务器A,对等方B,C,D,其中A和B,C,D都连接,而B,C进行P2P连接,这时D可以通过A建立与B的一条TCP连接。
目前还有一种UPnP协议越来越多地用于NAT穿越,使用UPnP,在主机上运行的应用程序能够为某些请求的公共端口号请求一个NAT映射,该映射位于其(专用IP地址:专用端口号)和(公共IP地址:公共端口号)之间。
2、因特网控制报文协议(ICMP)
ICMP被主机和路由器用来彼此沟通网络层的信息。ICMP报文有一个类型字段和一个编码字段。众所周知的ping程序就是发送一个ICMP类型8编码0的报文到指定主机。
3、路由选择算法
(1)链路状态(Link State,LS)路由选择算法
使用的Dijkstra算法,步骤如下:
- 当前结点到相邻结点的费用 + 到当前节点的费用
- 比较最小路径表中到这些结点的费用与新算出来的费用,若更小,更新之
- 找表中费用最小的且不在结点子集中的结点,加入结点子集,并更新为当前结点。
- 找完了则结束,没找完就循环①。
在所有迭代中需要搜寻的结点总数为n(n + 1)/2,复杂度为O(N^2)。
(2)距离向量(Distance-Vector,DV)算法
每个结点x维护下列路由选择信息:
- 对于每个邻居v,从x到直接相连邻居v的费用c(x,v)
- 结点x的距离向量,包含x到N中所有目的地y的费用估计值
- 它的每个邻居的距离向量
在该算法中,每个结点不时地向它的每个邻居发送它的距离向量副本。当结点x从它的任何一个邻居v接收到一个新距离向量,它保存v的距离向量,然后使用Bellman-Ford方程更新它自己的距离向量:
D_x(y)=min_v{c(x,v) + D_v(y)} 对N中的每个结点v。其中D_x(y)指x到y的费用。
这种算法存在一个问题,即当某个链路的费用变得很大时,表单会循环更新很多很多次。解决办法就是增加毒性逆转:如果z通过y路由选择到目的地x,则z将通告y,它(z)到x的距离时无穷大的。
(3)因特网中的路由选择
整个网络的路由太多,路由选择算法很难收敛,故引入了自治系统(Autonomous System,AS)和自治系统内部路由选择协议。
- 自治系统内部的路由选择:RIP(路由选择信息协议,Routing Information Protocol)
RIP是一种距离向量算法,使用跳数作为其费用测度,即每条链路费用为1,一条路径的最大费用限制为15,邻居每30s交换一次信息,180s没有交换即认为该邻居不可达。
- 自治系统内部的路由选择:OSPF(开放最短路优先,Open Shortest Path First)
OSPF核心就是一个使用洪泛链路状态信息的链路状态协议和一个Dijkstra最低费用路径算法。
- 自治系统间的路由选择:BGP(边界网关协议,Broder Gateway Protocol)
主要工作:
- 从相邻AS处获得子网可达性信息
- 向本AS内部的所有路由器传播这些可达性信息
- 基于可达性信息和AS策略,决定到达子网的好路由
(4)广播和多播路由
网络层提供以下两种服务:
广播路由选择:从一个源结点到网络中的所有其他结点交付分组。
多播路由选择:从单个源结点向其他网络结点的一个子集发送分组的副本。
参考文章:《计算机网络自顶向下方法》