IP协议简介
IP协议真是一个复杂的协议。。想象一下它要直接控制数以亿计的各种网络设备,形成极其复杂的网络环境。详细介绍IP协议的方方面面并不是我们的重点,本篇只简要介绍IP协议的几个侧面。
一、IP报文格式
图1 IPv4与IPv6报文格式对比
- **源地址和目标地址:**IPv4和IPv6共有部分,这个必须得有,因为IP协议就是干这个的:将数据包从源IP发送到目标IP。
- **分片相关:**标识字段、标志字段、片偏移字段。稍后会看到IPv4的分片机制,用这3个字段保证IP分片后可以正确重组。但IPv6嫌在网络层(各路由器中)分片再重组太麻烦了,所以取消了分片机制。
- **生存时间:**之前介绍过,网络层数据包经过一定数量的路由器后如果还没到达目的地,就会被当前路由器丢弃,同时发送ICMP协议报文给源端,通知此消息。生存时间这个量的单位其实是跳数。
- **校验:**IPv4会对数据包进行网络层的校验(意味着每个路由器都要如此)。IPv6取消了网络层校验,因为链路层和传输层都有相应的校验机制,网络层其实做了重复的工作。
可以看到,IPv6比IPv4的首部短了很多,而且还取消了分片和校验机制。这就使得使用IPv6协议进行传输速度更快。
二、IP协议分片
讲TCP的基本性质时,提到了网络层的数据包最大运载单元(MTU)和传输层的最大报文单元(MSS)的关系:
图2 MTU与MSS的关系
IP层为什么要分片呢?
因为下层协议(传输层)向上层提供的单元运载能力有限(常用的以太网链路MTU为1500B),超过了下层协议的单元运载能力将导致包被丢弃,所以IP层需要确保不会出现超过链路最大运载能力的包。
IP层的分片十分简单粗暴:每个路由器测量加上IP头部的数据包长度超过MTU,则拆成多个片打出去。而当最后一跳路由器发现这些分片中的一个丢了,则抛弃所有分片,也不重传!如果没丢,则在路由器中重组这些分片。
之前也提到过,TCP会对数据长度超过MSS的部分自动分片,使得每一个TCP报文段的数据长度不大于MSS。这是为了避免触发IP层的分片机制。因为如果触发了IP分片,且当前丢失了一个IP片后,IPv4会丢掉所有其他的分片。。效率很低。而传输层的分片效率就不低了,丢了只会重传当前的分片(因为TCP会在内核中缓存其他正常收到的片)。
因此,IPv6才放弃了网络层分片的想法,既然上层协议不买账(TCP自己分片,UDP不建议传超过MSS的数据),而且在路由器中重组分片也会额外花费一些时间,那不如干脆取消了。
三、路由选择简介
IP协议最核心的部分应该就是路由选择算法了。同样也是最复杂精妙的部分,这里只简单介绍其大概的工作流程。
1.路由器结构
从物理上说路由器是由:若干输入端口、路由选择处理器、若干输出端口 构成的。
而从网络层的抽象上说,路由器本身维护着若干IP地址,每一个IP地址代表连接一个网络的接口。
每个路由器和主机维护一个路由表,即网络地址和下一跳地址的键值表。
2. 路由选择过程
-
第一跳,源主机 to 默认网关路由器(主机连上网络后自动分配默认网关): 当数据包还在主机这时,先查主机的路由表,主机路由表记录着默认网关的几个对内接口IP。如果匹配上了,就说明此包发向局域网,通过默认网关路由内网接口转发即可;如果匹配不上,则发给默认网关路由器IP。 -
中间跳:路由器to路由器: 发往外网的数据包中间可能会经历若干路由器,每个路由器都通过子网掩码判断目标IP所处的网络地址。然后对网络地址查找路由表匹配到下一跳地址,将其发出。 -
最后一跳:目标端局域网路由器 to 目标主机: 经过若干中间跳,现在已经到了目标主机的内网路由器了!目标路由器也有若干内网接口,所以还是会匹配与目标IP相符的内网接口IP,先把数据包发送到此内网接口上。最后,再由此内网接口经过链路层交换机转发到目标主机。 另外,链路层交换机和网络层交换机(路由器)可不一样,链路层交换机存在于两个路由器之间的输入输出接口中间,也存在于路由器输出接口到目标主机之间。负责提供设备到设备间的传送服务,在链路层中会具体介绍这种设备。 结合下面的图更能看清这个过程的大概: 图3 路由选择过程
|