IPv4数据报格式
IPv4数据报格式如下图所示
其中,有如下的关键字段需要特别注意:
版本(号):
版本字段共4比特,规定了数据报的IP协议版本。通过查看版本号吗,路由器能确定如何解释IP数据报的剩余部分。不同的IP版本使用不同的数据报格式。
首部长度:
因为一个IPv4数据报可包含一些可变数量的选项(这些选项包括在IPv4数据报首部中。)
故需要这4比特来确定IP数据报中载荷实际开始的地方(也就是数据开始的地方,从第几个自己开
始是数据)。大多数的IP数据报中不包含选项,故一般的IP数据报具有20字节的首部。
服务类型:
服务类型(TOS)比特包含在IPv4首部中,以便使不同的IP数据报能够相互区别开来(TCP/UDP)。
数据报长度:
这是IP数据报的总长度(首部加上数据),以字节计算。该字段长为16比特,故IP数据报的最大理论长度为65535(2的16次方-1)。
然而,数据报很少有超过1500字节的。
标识、标志、片偏移:
这三个字段与IP分片有,但是IPv6不允许分片。
寿命(TTL):
该字段用来确定一个数据报在网络中存在的时间,每当一个路由器处理一次该数据报,TLL就减
一,当TTL等于0时,数据报就会被丢弃。
协议:
该字段通常仅当一个IP数据报到达目的地的时候才会有用,该字段指示了IP数据报的数据部分应当
交给哪一个运输层协议。
例如,值为96交给TCP,值为17交给UDP。
首部检验和:
首部检验和用于帮助路由器检测收到的IP数据报中的比特错误。
源和目的IP地址:
当某源生成一个数据报时,它在源IP字段中插入它的IP地址,在目的IP地址字段中插入最终目的地
的地址。
选项:
选项字段允许IP首部被扩展。
数据(有效载荷):
传输的数据。
IPv4数据报分片
数据报分片的由来
在后面,我们将会知道链路层协议承载的网路层分组的长度是不一样的,我们把一个链路层帧能承
载的最大数据量叫作最大传送单元(MTU)。
因此,我们需要对IP数据报进行合理的切片,以便数据报在任何链路层上都能被运输。
数据报切片的具体过程
现在我们假设,一个端系统接收到了很多个小的切片。
端系统该怎么将这些切片合理的分组并且拼接到一起呢?
IP数据报的标识字段,用来确定那些数据报切片是同一个原始数据报的。
发送主机发送的每一个数据报都会有一个标识,标识是依次加1的。
当某路由器需要对一个数据报切片时,形成的每一个小的数据报都具有相同的源地址和目的地址,
并且具有相同的一个标识,因此标识相同的小数据报就是一个源数据报的。
IP数据报的标志字段,用来确定某个小的数据报切片是某个源数据报切片后生成众多小小数据报的
最后一个。
例如某个数据报被分成了N片,则前面的N-1片的标志比特都是1,而最后一个片的标志比特是0,
用来表示该片是最后一片。
IP数据报的片偏移字段,用来确定某个数据报切成的片中,有没有一些片丢失。
IPv4编址
主机与路由器连入网络的方法
一台主机通常只有一条链路连接到网络,当主机中的IP想发送一个数据报时,它就在该链路上发
送。
主机与物理链路之间的边界叫作:“接口”(interface)
一台路由器有多条链路,因此路由器有多个接口,路由器与它的任意一条链路之间的边界也叫作接口。
IP要求每台主机和路由器接口拥有自己的IP地址。
因此,从技术上讲,一个IP地址与一个接口相关联,而不是与包括该接口的主机或路由器相关联。
IPv4的具体编址原理
每个IP地址长度为4字节,因此共有2的三十二次方个可能的ip地址(40亿个)。
这些地址通常按所谓“点分十进制记法”书写。
即地址中的每个字节用它的十进制形式书写,各字节间以句点隔开。
例如:IP地址:193.32.216.9,
其中,193是该地址的第一个8比特的十进制等价数,32是该地址的第二个8比特的十进制等价数。
因此,193.32.216.9的二进制记法是:
“11000001 00100000 11011000 00001001”
在全球因特网的每台主机和路由器上的每个接口,都必须有一个全球唯一的IP地址(NAT后的接口
除外)。
而一个接口的地址的一部分,需要由其连接的子网来确定。
下面是一个IP编址与接口的例子:
在上图中,这七台主机通过一个路由器进行互联,该路由器有三个接口(223.1.1.4、223.1.2.9、
223.1.3.27)。
其中,最左边的三台主机,它们的IP地址是“223.1.1.xxx”开头的地址。
因此包括最左边的三个主机和一个223.1.1.4的路由器接口通过一个并不包含路由器的网络互联起
来。
(在此情况下,该网络可能是由一个以太网LAN互联或者一个无线接入点互联)
用IP的术语来说,互联这三个主机接口和一个路由器接口的网络形成一个子网(subnet)。(在某
些地方,子网也被称为IP网络或直接称为网络。)
IP编址为这个子网分配一个地址223.1.1.0./24。
其中的/24记法,有时称为:“子网掩码”(networkmask),指示32比特中的最左侧24比特定义了
子网地址。
因此子网223.1.1.0/24由三个主机接口和一个路由器接口组成,任何其他要连到223.1.1.0/24网络的
主机都要求其地址具有223.1.1.xxx的形式。
下图是另外两个子网
下面我们更为深入的讨论子网掩码:
对上图而言,我们有几个子网呢?
首先,是三个路由器和主机之间的子网(223.1.1.0/24、223.1.2.0/24、223.1.1.3.0/24)
此外,还有三个路由器和路由器之间的子网:
(223.1.7.0/24、223.1.8.0/24、223.1.9.0/24)
因此,我们有了一个更为精确地系统中的子网定义:
“分开主机和路由器的每个端口,产生几个隔离的网路岛,使用接口端连接这些隔离的网络的端
点。这些隔离的网络中的每一个都叫做一个子网”。
因特网的地址分配策略被称为无类别域间路由选择(CIDR)。
CIDR将子网寻址的概念一般化了。当使用子网寻址时,32比特的IP地址被划分为两部分,并且也
具有点分十进制形式a.b.c.d/x,其中x指示了地址的第一部分中的比特数。
形式为a.b.c.d/x的地址的x最高比特构成了IP地址的网络部分,并且经常被称为该地址的前缀
(prefix)(或网络前缀)。
一个组织通常被分配一块连续的地址,即具有相同前缀的一段地址。
此外,还有一种特殊类型的IP地址,即IP广播地址:255.255.255.255。
当一台主机发送一个目的地址为255.255.255.255的数据报时,该报文会交付给同一个网络中的所
有主机。
路由器也会有选择地向邻近的子网转发报文。(虽然通常不这样做。)
路由聚合、地址聚合、路由摘要
这是一个ISP将8个组织连接到因特网的例子,它也很好地说明了仔细分配CIDR 化的地址有利于路
由选择的道理。
如下图,假设该ISP (我们称之为Fly- By-Night-ISP) 向外界通告,它应该发送所有地址的前20比特
是200. 23. 16. 0/20类型的数据报。
外界的其他部分不需要知道在地址块200. 23. 16. 0/20内实际上还存在8个其他组织,其中每个组
织有自己的子网°这种使用单个网络前缀通告多个网络的能力通常称为
地址聚合(address aggregation )
也称为路由聚合(route aggregation )
或者路由摘要(routesummarization)