IP报文结构
在剥掉帧的头部和尾部之前,网络设备需要根据帧头中Type字段确定下一步将帧发送到哪个上层协议进行处理。当以太网帧中的Type字段值为0x0800,表示该帧的网络层协议为IP协议。
如下图所示,一个IPv4数据报文由首部和数据两部分组成。首部的前一部分是固定长度,共20个字节,是所有IPv4数据报必须具有的。在首部的固定部分的后面是一些可选字段,其长度可变。
各字段含义如下图所示:
字段 |
长度 |
含义 |
Version |
4比特 |
IP协议的版本号,分为IPv4和IPv6协议。 |
Header |
4比特 |
IPv4的首部长度。 |
DS |
8比特 |
用来获得更好的服务。只有在使用区分服务时,这个字段才起作用。 |
Total |
16比特 |
指首部和数据之和的长度。 |
Identification |
16比特 |
IPv4软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。 |
Flags |
3比特 |
目前只有两位有意义。最低位为1表示后面“还有分片”的数据报,为0表示这已经是最后一个数据片;中间一位为1表示“不能分片”,为0才允许分片。 |
Fragment |
13比特 |
指出较长的分组在分片后,该片在原分组中的相对位置。 |
Time |
8比特 |
表示数据报在网络中的寿命,功能是“跳数限制”。 |
Protocol |
8比特 |
指出此数据报携带的数据是使用何种协议。 |
Header |
16比特 |
数据报每经过一个设备,设备都要重新计算一下首部检验和,若首部未发生变化,则此结果必为0,于是就保留这个数据报。这个字段只检验数据报的首部,但不包括数据部分。 |
Source IP |
32比特 |
报文发送方的IPv4地址。 |
DestinationIP |
32比特 |
报文接收方的IPv4地址。 |
IP |
0~40字节(长度可变) |
用来支持排错、测量以及安全等措施。在必要的时候插入值为0的填充字节。 |
IP编址
IPv4地址为32比特的二进制数,通常用点分十进制表示。IP地址用来标识网络中的设备,具有IP地址的设备可以在同一网段内或跨网段通信。IP地址包括两部分,第一部分是网络号,表示IP地址所属的网段,第二部分是主机号,用来唯一标识本网段上的某台网络设备。
每个网段上都有两个特殊地址不能分配给主机或网络设备。
网段的网络地址,IP地址的主机位为全0,表示一个网段。
网段中的广播地址,IP地址的主机位为全1。目的地址为广播地址的报文会被该网段中的所有网络设备接收。
除网络地址和广播地址以外的其他IP地址都可以作为网络设备的IP地址。
以下图为例,IP地址的前三个字节表示网络号,最后一个字节表示该网络上网络设备可用的地址范围。将二进制格式的IP地址转换为十进制格式时,需要把二进制中每一位1所代表的值加在一起,得出IP地址的十进制值。
IP地址分类
IPv4地址被划分为A、B、C、D、E五类,各类IP地址可以通过第一个字节中的比特位进行区分,且每类地址的网络号包含不同的字节数。具体划分情况如下图所示:
A类,B类和C类地址为可分配IP地址,每类地址支持的网络数和主机数不同。
D类地址为组播地址。主机收到以D类地址为目的地址的报文后,如果该主机是此组播组成员,就会接收并处理该报文。
E类地址是保留地址
现在,世界上所有终端系统和网络设备需要的IP地址总数已经超过了32位IPv4地址所能支持的最大地址数。为节省IPv4地址,A、B、C类地址段中都预留了特定范围的地址作为私网地址:
10.0.0.0~10.255.255.255
172.16.0.0~172.31.255.255
192.168.0.0~192.168.255.255
默认情况下,网络中的主机无法使用私网地址与公网通信;当需要与公网通信时,私网地址必须转换成公网地址。
IP地址中还有其他一些特殊IP地址:
127.0.0.0~127.255.255.255 为环回地址,用于诊断网络是否正常。
0.0.0.0 表示任何网络
255.255.255.255 为广播地址
子网掩码
子网掩码用于区分网络部分和主机部分。子网掩码与IP地址的表示方法相同,子网掩码中的1表示网络位,0表示主机位。
通过子网掩码可以判断主机所属的网段、网段上的广播地址以及网段上的主机数(网段中的主机数为2ⁿ,n为主机位的个数)。
如下图所示,主机地址为192.168.1.7,子网掩码为24位。从中我们可以判断该主机位于192.168.1.0/24网段。将IP地址中的主机位全部置为1,并转换为十进制数,即可得到该网段的广播地址192.168.1.255。本例中n=8,2⁸=256,减去本网段的网络地址和广播地址,可知该网段支持254个有效主机地址。
IP地址通信
源主机向其他目的主机发送报文之前,需要检查目的IP地址和源IP地址是否属于同一个网段。
如果属于同一网段,则报文将被下发到底层协议进行以太网封装处理。
如果属于不同网段,则主机需要获取下一跳路由器的IP地址,然后将报文下发到底层协议处理。