前言
这篇博客主要对IP协议中一些基础知识点加以总结,并将书中一些晦涩难懂的部分去除了。IP地址协议是网络层中最重要的协议,IP地址协议可以对因特网上的所有设备进行唯一标识,也正因为有了IP协议,我们的计算机才能实现与全球任意一台设备进行通信。 同时这也是网络层存在的意义,我将对部分的内容分为两个部分加以总结:一、首先对IP协议部分的知识加以总结;二、对网络层其他的协议加以总结,包括ICMP、IGMP、ARP等协议。
这个概念很好理解,如果一个协议用a位(a个bit)表示,那么其地址空间就是2^a。我们要讲的IPv4地址协议(简称IP协议)使用32位表示一个地址,所以其地址空间是2^32(超过40亿)
在IP协议中,有三种记法表示一个IP地址:
基256:也叫点分十进制记法,也是最常用的记法,在每8个字节用点
隔开,共有4个十进制数
基16:一个16进制等于4位二进制数。而一个IP地址有32个二进制数,所以使用基16进制表示的时候有8个二进制数
基2:采用01串的方式表示
分类编址是最早出现的编址体系,在分类编址中一共分为五类:A、B、C、D、E。每一类占用地址空间的一部分。其中A类地址有2^31个地址,占50%,B类有2^30个地址,占25%,C类有2^29个地址,占12.5%,D类和E类各有2^28个地址,各占6.25%。那么如何辨别这5类地址呢?
如果是使用点分十进制记法,只要看左边第一个数,如果小于128,那么就是A类,如果小于192,那么就是B类,如果小于224,那么就是C类,如果小于240,那么就是D类,如果不在上面的范围,那么就是E类。
一个IP地址包含了网络号和主机号(网络号标识了设备处于哪个网络下,主机号标识了该网络下的哪台设备),对于上述A、B、C类地址,分别用前一个字节、两个字节、三个字节表示网络号,后面的字节表示主机号。D类和E类地址不划分网络号和主机号,因为D类用来多播、E类地址被设计为保留地址。这种编址方法也称为两级编址方法,如果某一类地址中使用了n位表示网络号,那么便有32-n位表示主机号。在A、B、C类地址中,n的值分别等于8、16、24。那么了解了这点后,我们可以根据任意一个IP地址得到至少三个信息:地址数
、首地址
、末地址
。
如果给定了n,那么
1)地址数N=2^32-n
2)首地址:保持最左边n位不变,并将右边32-n位置为0
3)末地址:保持最左边n位不变,并将右边32-n位置为1
例如对于IP地址73.22.17.25,其地址数N=2^32-8=2^24,首地址为73.0.0.0,末地址为73.255.255.255
通过IP地址,我们与另外一台计算机的通信需要到达其所在的网络,才找到该网络下的特定的主机。随着计算机设备的增多,32位的IP地址几乎被分配完毕,后来出现把一个网络划分为一个个子网络的思想,这样每个子网都有自己的网络地址(被划分的网络是拥有原来A类或者B类地址的网络)。那么问题来了,划分的子网的网络地址怎么表示呢?这里使用了子网掩码
来解决这个问题,子网掩码是左边n位全为1,右边32-n位为0的IP地址,那么把原IP地址与子网掩码进行与运算就可以得到子网地址
无分类编址使用可变长度的地址块,这些地址块不属于任何类,不过规定每个地址块中的地址数必须是2的乘方。要注意的是在无分类编址中,使用的仍然是两级编址,使用左边n位(也叫前缀长度
)标识网络,右边32-n位(也叫后缀长度
)标识主机号。前缀长度可以在1~32之间。同时,在无分类编址中会使用斜线记法
来表示IP地址,如230.8.24.56/12。
通过斜线记法表示的地址,我们可以得到该地址块表示的地址数、首地址和末地址。这点和分类编址是一样的。可以发现,当n分别等于8、16和24的时候刚好就是分类编址的情况,所以分类编址是无分类编址的一个特例。在无分类编址中,计算上述三个信息有一点点出入,看计算方法:
1)地址数N=2^32-n
2)首地址= (任意地址) and (子网掩码)
3)末地址= (任意地址) OR (NOT (子网掩码))
例如对于17.63.110.114/24,子网掩码为255.255.255.0。
地址数N=2^32-24=16,
地址: 17.63.110.114
子网掩码:255.255.255.0
首地址: 17.63.110.0
地址: 17.63.110.114
NOT 子网掩码: 0.0.0.255
末地址: 17.63.110.255
在无分类编址中,最常见的应用就是子网划分了。子网划分就是把ISP分配的一个地址块进一步划分为若干子网,每个子网还可以继续划分为子网的子网,没有任何限制。如果有一个地址块的地址数是N,前缀长度为n,要划分为s个子网,每个子网的前缀长度是n2,每个子网的可用地址数是N2。那么有如下计算公式:
n2 = n + log2(N/N2)
比如某组织的可用地址块为130.34.12.64/26,需要划分为4个子网,每个子网的地址数相同,则每个子网的信息可以如下求得:
1) 可用的地址数N=2^32-26=64
2) 首地址=130.34.12.64/26,末地址=130.34.12.127/26
3) 每个子网的地址数N2=64/4=16
4) n2 = 26 + log2(64/16) = 28
1)全0地址
即0.0.0.0/32,该地址被保留用于主机发送一个分组而又不知道自己地址的情况下
2)全1地址
即255.255.255.255/32,被设计为当前网络的受限广播地址,一个主机如果想把报文发给网络上的所有主机,就可以把这个地址作为目的地址
在这部分的内容中,将对IP报文的格式做一个详细的了解,同时为学习TCP传输层做铺垫。
有一点很重要,IP协议是不可靠的无连接数据报协议————一种尽最大努力交付的服务。就是说IP协议不保证数据的完整性和安全性,数据报有可能丢失、乱序、损坏或者延迟到达
网络层的分组称为数据报,,也可以简单理解为网络中传输的数据
下图是一个完整的IP数据报格式:
IP数据报由两部分组成:首部和数据。首部长度可以是20~60字节。下面对IP数据报中的各个字段加以说明:
版本(VER)
:这个4位版本定义了IP协议的版本,目前的版本是4(IPv4)
首部长度(HLEN)
:定义了IP数据报首部的长度,以4字节的字为单位计算,若为20字节,则值为5
服务类型(TOS)
:指明了如何处理数据报,了解即可
总长度
:定义了包括首部在内的数据报总长度
标识
:分片时有用
标志
:分片时有用
分片偏移
:分片时有用
生存时间(TTL)
:指明数据报的生存时间
协议
:定义了使用IP层服务的高层协议
源地址
:发送主机的IP地址
目的地址
:接收主机的IP地址
所谓IP分片就是把数据量过大的数据拆分成较小的数据报进行传输,这里涉及一个概念:MTU
(最大传输单元),这个字段的意思就是拆分后的数据报的长度不能超过这个值,对于以太网来说,这个字段的值是1500字节。
IP分片要修改IP数据报中的标志、分片偏移和总长度的值,其他的不变。注意:分片的只是数据报中的数据,首部并不会被分片
下面我们来看看分片的时候,上述三个字段(总长度需要根据分片的数据长度确定,再加上首部长度)发生了什么变化:
此字段虽然没有改变,每个分片要复制这个字段的值。这个字段与源主机的IP唯一确定一个数据报。当目的主机收到所有分片后,可以根据这个标识重装数据报,因为目的主机认为标识号相同的是属于同一个数据报的。
这是一个3位的字段,第1位保留不用,第2位称为不分片
位,就是说当其值是1的时候,不会对数据报进行分片。第3位是还有分片
位,就是说如果其值是1就说明这个分片后面还有分片,如果是0,则说明是最后一个分片或者第一个分片(因为当只有一个分片的时候,第一个也是最后一个)
这个字段表示的是分片在正个数据报中的相对位置,以8字节为单位。通过这个字段,目的主机可以根据分片偏移的值从第一个分片开始组装到最后一个分片,直至形成一个完整的IP数据报。那么目的主机是如何重装分片的呢?
1) 分片偏移为0的分片是第一个分片
2) 把第一个分片的长度除以8得到第二个分片的偏移值,于是目的主机从接收到的分片中寻找该分片偏移值的分片,组装第二个分片
3) 把第一个分片和第二个分片的长度除以8得到第三个分片的偏移值,于是目的主机从接收到的分片中找到该分片,这样就把前三个分片组装好了
4) 继续以上过程,直到最后的一个分片的还有分片
的值为0
选项字段主要用于网络测试与排错,前面提到IP数据报首部的长度是20字节~60字节。其中20字节是固定部分,剩余的字节数是选项部分多出来的。
选项部分的格式可分为:一个字节的类型字段、一个字节的长度字段以及可变长度的值的字段。其中选项的类型可以分为六种:无操作、选项结束、记录路由、严格的源路由、不严格的源路由、时间戳。前两种是单字节的,后四种是多字节的
绝大多数TCP/IP协议采用差错控制的方法称为校验和。校验和能够防止分组在传输期间出现损坏。下面说一下IP分组中的校验和:
首先把校验和字段置为0,然后把整个首部划分为16位的段,再将各段相加,把结果取反码插入到校验和字段中。要注意的是,IP分组中校验和只覆盖首部,不包括数据。这个字段了解即可