IP网际协议
IP是TCP/IP协议族中最为核心的协议,它提供无连接的不可靠的连接。所有的 TCP、UDP、ICMP及IGMP数据都以I P数据报格式传输。本文IP指IPv4。
IP协议头
每个IP数据报包含两部分,一个头和一个正文,正文部分也称之为有效净荷。
IP协议头是一个20字节的定长部分和一个可选的变长部分。
- 版本:4bit,version。表示协议版本,在这里被设为4(0100)。
- IHL:4bit,header length。首部长度,用于指明首部有多长(定长部分+选项)。
- 区分服务:8bit,differentiated services field。如今已经发生了改变,前六位表示服务类别,后两位表示拥塞通知信息。
- 总长度:16bit,total length。表示 一个IP数据报总共可以携带2^16的字节的数据,包括首部。
- 标识:16bit,identification。用于让目标主机确定新到达的数据报是哪一个数据包的分段。
- 标志:3bit,flags。
- reserved bit:待定
- don’t fragment:是否允许路由器分割数据包
- more fragment:是否是最后一个段
- 分段偏移量:13bit,fragment offset。表示该段在当前数据报中的位置。
- 生存期:8bit,time to live。表示该数据报还能被路由器转发几次。
- 协议:8bit,protocol。表示携带的载荷用的协议是什么。TCP为0x06,UDP为0x11,ICMP为0x01,IGMP为0x02。
- 头校验和:8bit,header checksum。校验和,用于检测是否有数据错误。
- 源地址:32bit,source address。发送这个数据报的地址,是一个IP v4地址。
- 目的地址:32bit,destination address。接受这个数据包的地址,也是一个IP v4地址。
- 选项:option。语序后续版本协议包含一些原设计中没有的东西,如今很少有人使用。有一些尝试性的选项如下:
- 安全性:表明数据报的安全级别
- 严格源路由:给出数据报遵循的完整路径
- 松散源路由:给出一些不能错过的路由器
- 记录路由:要求每个路由器加上自己的IP地址
- 时间戳:要求每个路由器加上自己的IP地址和时间戳
IP地址
IP地址是32位。需要注意的是,IP地址并不指向一台主机,它是指向一个网络接口。如果一台主句在多个网络上,它就会有多个网络接口,也就是有多个IP地址。因此路由器有多个IP地址。
层次化的地址
每个IP地址有高位的可变长网络和低位的主机两部分组成 。
同一网络上的所有主机,其地址的网络值是相同的。因此,**一个网络对应一块连续的IP地址空间,这块地址空间就称为地址的前缀(prefix)。**前缀的书写给出了块的最低IP地址和块的大小。按照惯例,网络地址的书写格式是前缀IP地址后赶一个斜线,斜线后是网络部分的位长度。
因为前缀长度仅从IP地址无法推断出来,路由协议必须把前缀携带给路由器。直接用长度描述的格式书写时称为子网掩码(subnet mask),例如/8。将子网掩码与IP地址进行AND操作便可以提取出该IP地址的网络部分。
优点
- 路由器仅仅根据地址的网络部分即可转发数据包,极大程度上减小了路由表的大小。
缺点
- 一个主机的IP地址取决于它位于网络上的位置。以太网地址可用于世界上的任何地方,但每个IP地址属于一个特定的网络,路由器只能传递注定要到该网络上某个地址的数据包。
- 层次结构浪费了地址,除非精心管理地址空间。
子网
在内部将一个网络块分成几个部分供多个内部网络使用,但对外部世界仍然像单个网络一样。这就是所谓的子网划分(subnetting),分割一个大型网络得到的一系列结果网络(比如以太网〉称为子网(subnet)。
在网络外面,子网的划分是不可见的,因此分配一个新的子网不需要联系ICANN或者改变任何外部数据库。
CIDR
把多个小前缀的地址块合并成一个大前缀的地址块,这个合并过程称为路由聚合(route aggregation),由此产生的较大前缀地址块有时称为超网(supernet),以便有别于地址块的分割。
同样一个 IP 地址,一台路由器把它当作/22的一部分对待(该地址块包含 210个地址),而另一台路由器把它当作一个更大的/20一部分对待(其中包含 212个地址)。这是因为每个路由器有相应的前缀信息。这个设计和子网划分协同工作,统称为无类域间路由(CIDR, Classless Inter-Domain Routing)。
更为扭曲的是前缀允许重叠。规则是数据包按最具体路由的方向发送,即具有最少IP地址的最长匹配前缀(longest matching prefix )。一个总的前缀指示把整个地址块的流量发到超网:一个更具体的前缀用来指示该大前缀的一部分流量发往更具体的子网。
具体操作
- 当一个数据包到达时,路由器扫描路由表以便确定目的地是否在前缀的地址块内。
- 有可能多个具有不同前缀的表项得到匹配,在这种情况下,使用具有最长前缀的表项。因此,如果有一个匹配/20掩码的表项,同时还有一个匹配/24掩码的表项,则使用/24表项来查询数据包的出境线路。
分类
IP地址被分为物类地址(分类寻址,classful addressing):
- A类地址:允许128个网络,每个网络1600万台主机
- B类地址:允许16384个网络,每个网络65536台主机
- C类地址:允许200万个网络(比如 LAN),每个网络多达256台主机 (不过有些地址是特殊的)
- D类地址:组播地址。数据包直接发送给多台主机。
- E类地址:保留地址,以备将来使用。
缺点
-
会浪费数百万的地址。
-
对于大多数组织,具有1600万个地址的A类网络太大,而具有256个地址的C类网络又太小。
为了解决这些问题,引入了子网。同时为了解决路由表过大,又引入了CIDR来控制全局路由表的大小。
特殊的IP地址
以下为一些特殊的IP地址:
NAT
NAT(Network Address Translation,网络地址转换)用于解决地址短缺问题。
NAT盒子(NAT box)用于对数据包中私有地址和合法IP地址的转换。
NAT穿越(NAT traversal)用来从外部网络访问客户网络中的主机。
基本思想
- ISP为每个家庭或每个公司分配一个IP地址(或者,最多分配少量的IP地址),用这个IP地址来传输Internet流量。
- 在客户网络内部,每台计算机有唯一的IP地址,该地址主要用来路由内部流量。
- 当一个数据包需要离开客户网络,发向其他ISP时,它必须把唯一的内部IP地址转换成那个共享的公共IP地址。这种地址转换使用了IP地址的三个范围,这些地址己经被声明为私有化。任何网络可以在内部随意地使用这些地址。仅有的规则是不允许包含这些地址的数据包出现在Internet上。