在计算机网络领域,网络层应该向运输层提供怎样的服务(“面向链接”仍是“无链接”)曾引发了长期的争论。算法
一种观点认为,应该让计算机网络模仿电信网络,使用面向链接的通讯方式。
通讯以前先创建虚电路(Virtual Circuit),以保证双方通讯所需的一切网络资源。 (这里的虚网络表示这只是一条逻辑上的链接,分组都沿着这条逻辑链接按照存储转发方式传送,而并非真正创建了一条物理链接;与之相对的,电路交换的电话通讯是先创建一条真正的链接具体可参见概述部分介绍segmentfault
另外一种观点认为,应该让网络层向上只提供简单灵活的、无链接的、尽最大努力交付的数据报服务。
采用这种设计思路,则网络的造价大大下降,运行方式灵活,可以适应多种应用。且每一个分组独立选择路由进行转发。缓存
网际协议 IP 是 TCP/IP 体系中两个最主要的协议之一。
与 IP 协议配套使用的还有三个协议:网络
所谓虚拟互连网络也就是逻辑互连网络,它的意思就是互连起来的各类物理网络的异构性原本是客观存在的,可是咱们利用 IP 协议就可使这些性能各异的网络从用户看起来好像是一个统一的网络。数据结构
若是在这种覆盖全球的 IP 网的 上层使用 TCP 协议,那么就是如今的 互联网 (Internet)。
IP 地址就是给每一个链接在互联网上的主机(或路由器)分配一个在全世界范围是惟一的 32 位的标识符。less
IP 地址 ::= { <网络号>, <主机号>}性能
通常表示IP地址采用 点分十进制记法,将每一个 八位二进制数(1 byte)转换为 十进制数。
其中 D类地址为 多播地址;
E类地址保留为从此使用。
通常不可用的特殊IP地址测试
网络号 | 主机号 | 做为源地址 | 做为目的地址 | 表明含义 |
---|---|---|---|---|
0 | 0 | 能够 | 不可 | 在本网络上的本主机 |
0 | host-id | 能够 | 不可 | 在本网络上的某台主机 host-id |
全 1 | 全 1 | 不可 | 能够 | 只在本网络上进行广播(各路由器均不转发) |
net-id | 全 1 | 不可 | 能够 | 对 net-id 上的全部主机进行广播 |
127 | 非全 0 或全 1 的任何数 | 能够 | 能够 | 用做本地软件环回测试之用 |
一、IP地址其实是标志一个主机(或路由器)和一条链路的接口。ui
二、用转发器或网桥链接起来的若干个局域网仍为一个网络,所以这些局域网都具备一样的网络号。spa
三、全部分配到网络号的网络,不管是范围很小的局域网,仍是可能覆盖很大地理范围的广域网,都是平等的。
路由转发过程当中,路由器仅根据目的站的IP地址进行路由选择,IP数据报首部的内容不变;
而MAC帧每通过一个路由,都将首部的目的地址和源地址更新为下一个路由(主机)硬件地址和这个路由(主机)硬件地址。
IP层屏蔽了传输中的细节。
每个主机都设有一个 ARP 高速缓存 (ARP cache),里面有所在的局域网上的各主机和路由器的 IP 地址到硬件地址的映射表。
< IP address;MAC address;TTL >
(TTL:地址映射有效时间)
当主机 A 欲向本局域网上的某个主机 B 发送 IP 数据报时,就先在其 ARP 高速缓存中查看有无主机 B 的 IP 地址。
ARP 是解决 同一个局域网上的主机或路由器的 IP 地址和硬件地址的映射问题。
若是所要找的主机和源主机不在同一个局域网上,那么就要 经过 ARP 找到一个位于本局域网上的某个路由器的硬件地址,而后把分组发送给这个路由器,让这个路由器把分组转发给下一个网络。剩下的工做就由下一个网络来作。
首部 前部分(20字节)是固定长度,是全部IP数据报共有的;
后面是一些可选字段,其 长度可变。
在路由表中,对每一条路由,最主要的是(目的网络地址,下一跳地址)
根据目的网络地址就能肯定下一跳路由器,这样作的结果是:
- IP 数据报最终必定能够找到目的主机所在目的网络上的路由器(可能要经过屡次的间接交付)。
- 只有到达最后一个路由器时,才试图向目的主机进行直接交付。
虽然互联网全部的分组转发都是基于目的主机所在的网络,但在大多数状况下都容许有这样的特例,即为特定的目的主机指明一个路由。
路由器还可采用默认路由以减小路由表所占用的空间和搜索路由表所用的时间。
若是一个主机链接在一个小网络上,而这个网络只用一个路由器和互联网链接,那么在这种状况下使用默认路由是很是合适的。
“下一跳”是在下层实现的
当路由器收到待转发的数据报,不是将下一跳路由器的 IP 地址填入 IP 数据报,而是送交下层的网络接口软件。
网络接口软件使用 ARP 负责将 下一跳路由器的 IP 地址转换成硬件地址,并将此 硬件地址放在链路层的 MAC 帧的首部,而后根据这个硬件地址找到下一跳路由器。
从 1985 年起在 IP 地址中又增长了一个“子网号字段”(Subnet-ID),使两级的 IP 地址变成为三级的 IP 地址。
这种作法叫作划分子网 (subnetting) 。
子网掩码 (subnet mask)用于找出 IP 地址中的子网部分。
子网掩码长度为32位(IP地址的长度):
路由器在和相邻路由器交换路由信息时,必须把本身所在网络(或子网)的子网掩码告诉相邻路由器。
路由器的路由表中的每个项目,除了要给出目的网络地址外,还必须同时给出该网络的子网掩码。
(目的网络地址,子网掩码,下一跳地址)
划分子网状况下的分组转发
(1) 从收到的分组的首部提取 目的 IP 地址 D。
(2) 先用(本网络内部) 各网络的子网掩码和 D 逐位相“与”,看是否和相应的网络地址匹配。 若匹配,则将分组直接交付。不然就是间接交付,执行 (3)。
(3) 若路由表中有目的地址为 D 的特定主机路由,则将分组传送给指明的下一跳路由器;不然,执行 (4)。
(4) 对 路由表中的每一行,将 子网掩码和 D 逐位相“与”。若结果与该行的目的网络地址匹配,则将分组传送给该行指明的下一跳路由器;不然,执行 (5)。
(5) 若路由表中有一个默认路由,则将分组传送给路由表中所指明的默认路由器;不然,执行 (6)。
(6) 报告转发分组出错。
CIDR使用各类长度的“网络前缀”(network-prefix)来代替分类地址中的网络号和子网号。
IP 地址从三级编址(使用子网掩码)又回到了两级编址。
IP地址 ::= {<网络前缀>, <主机号>}
CIDR 使用“斜线记法”(slash notation)即在 IP 地址面加上一个斜线“/”,而后写上网络前缀所占的位数(这个数值对应于三级编址中子网掩码中 1 的个数)。例如: 220.78.168.0/24。
CIDR 把网络前缀都相同的连续的 IP 地址组成“CIDR 地址块”。
一个 CIDR 地址块能够表示不少地址,这种地址的聚合常称为路由聚合,它使得路由表中的一个项目能够表示不少个(例如上千个)原来传统分类地址的路由。
能够更加有效地分配 IPv4 的地址空间,可根据客户的须要分配适当大小的 CIDR 地址块。
使用 CIDR 时,路由表中的每一个项目由“网络前缀”和“下一跳地址”组成。在查找路由表时可能会获得不止一个匹配结果。
应当从匹配结果中选择具备最长网络前缀的路由:最长前缀匹配 (longest-prefix matching)。
为了进行更加有效的查找,一般是将无分类编址的路由表存放在一种层次的数据结构中,而后自上而下地按层次进行查找。这里最经常使用的就是二叉线索 (binary trie)。IP 地址中从左到右的比特值决定了从根结点逐层向下层延伸的路径,而二叉线索中的各个路径就表明路由表中存放的各个地址。