前言
在前面学习了数据链路层相关的知识点,接着学习
IP
网际协议相关知识。
网际协议
IP
是TCP/IP
协议族中最核心的协议,所有TCP
、UDP
、ICMP
、IGMP
数据都以IP数据报
格式传输。IP
是不可靠的,任何要求可靠性的服务必须由上层提供;IP
是无连接的,其不维护任何关于后续数据报的状态信息,每个数据报的处理相互独立,数据报可以不按发送顺序接收。
IP首部
IP
数据报格式如下图所示,普通的IP
首部长20
个字节,除非含有选项字段。
- 目前版本号是4,即
0100
。 - 首部长度指首部占
32 bit
字的数目,由于只有4 bit
表示,因此最多表示60 (15 * 32 / 8)
个字节。 - 服务类型字段包括
3 bit
优先权子字段(现已被忽略),4 bit
的TOS
子字段(4 bit
分别代表最小时延
、最大吞吐量
、最高可靠性
、最小费用
),和1 bit
未用位但必须置为0
。 - 总长度字段指整个
IP数据报
的长度,单位为字节
;利用首部长度字段和总长度字段,可知道IP数据报
中数据内容的起始位置和长度;整个IP数据报
最长可达65535 字节
。 - 标识字段唯一标识主机发送的每一份数据报,通常每发送一份报文其值就加1。
- 标志字段使用
1 bit
表示更多的片,除最后一片外,其他每个组成数据报的片都要把该比特置为1
。 - 片偏移字段指该片偏移原始数据报开始处的位置,当数据报被分片后,每个片的总长度值都要改为该片的长度值。
TTL
生存时间字段设置了数据报可以经过的最多路由器数,指定了数据报的生存时间,每经过一个路由器,其值减1
,当为0
时,数据报将被丢弃。- 首部检验和字段是根据
IP
首部计算的检验和码,其不对后面的数据进行计算。若首部在传输过程中没有发生任何差错,那么接收方计算的结果应该全为1
,若不全为1
,则IP
会丢弃数据报,由上层去发现丢失的数据报进行重传。 - 每一份
IP
数据报都包含源IP地址
和目的IP地址
。 - 选项字段为可变长度,可定义
安全和处理限制
、记录路径
、时间戳
、宽松的源站选路
、严格的源站选路
等。
IP路由选择
若目的主机和源主机直接相连或共享在一个网络上,那么
IP
数据报就直接送到目的主机上,否则,主机把数据报发往默认的路由器上,由路由器转发该数据报。一般来说,IP
可以从TCP
、UDP
、ICMP
、IGMP
接收数据报(即在本地生成的数据报)进行发送,或者从一个网络接口接收数据报(待转发的数据报)并进行发送。
- IP层在内存表中有一张路由表,当接收到数据报并进行转发时,都要搜索一次该表,当数据报来自某网络接口时,
IP
首先检查目的IP
地址是否为本地IP
地址之一或者IP
广播地址。若是,数据报就被送到由IP
首部协议字段所指定的协议模块进行处理;若不是,则分两种情况处理- 如果
IP
层被设置为路由器的功能,那么就对数据报进行转发。 - 数据报被丢弃。
- 如果
- 路由表中的每一项包含如下信息:
- 目的
IP
地址。可以是完整的主机地址,也可以是网络地址,由该表目中的标志字段指定,主机地址中一个有非0
主机号来指定某具体主机;而网络地址中的主机号为0
,表示该网络中所有主机。 - 下一站(下一跳)路由器的
IP
地址或有直接连接的网络IP
地址。下一站路由指直接相连网络上的路由器,通过它可以转发数据报,其不是最终目的地,但其可把传递给它的数据报转发到最终目的地。 - 标志(
2 bit
)。其中一个标志指明目的IP
地址是网络地址还是主机地址,另一个标志指明下一个路由器是否为真正的下一站路由器,还是一个直接相连的接口。 - 为数据报的传输指定一个网络接口。
- 目的
IP
路由选择完成功能如下:- 搜索路由表,寻找能与目的
IP
地址完全匹配的表目(网络号和主机号)。若找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口。 - 搜索路由表,寻找能与目的网络号相匹配的表目。若找到,则把报文发送给该表目指定的下一站路由器或直接相连的网络接口。
- 搜索路由表,寻找标为
默认
的表目。若找到,则把报文发送给该表目指定的下一站路由器。
- 搜索路由表,寻找能与目的
若上述步骤均未成功,那么该数据报就不能被传送,若不能传送的数据报来自本机,则会向应用程序返回一个
主机不可达
或网络不可达
的错误,完全匹配的搜索优先于网络号搜索和默认搜索,并且在传输过程中,链路层的目的地址始终指向下一站的链路层地址(使用ARP
获取),而目的IP
则始终都不会变化。
子网寻址
现在所有主机都要求支持子网编码,不再把
IP
地址由单纯一个网络号
和一个主机号
组成,而是把主机号
再分成一个子网号
和一个主机号
。如有一个B类
网络地址(140.252),在剩下的16 bit
中,8 bit
用于子网号,8 bit
用于主机号,这样就允许254
个子网和254
台主机。当然也可采用其他方法进行划分,如子网号占10
个字节,主机号占6
个字节。
值得注意的是,子网划分对于所有子网以外的
Internet
路由器是透明的,而对于子网内部的路由器是不透明的。
子网掩码
除
IP
地址外,主机还需要知道有多少比特用于子网号以及多少比特用于主机号,这是在引导过程中通过子网掩码确定的,掩码是32 bit
的值,其中值为1
的比特留给网络号和子网号
,为0
的留给主机号。如对于B
类地址,可设置子网掩码为0xffffff00 = 255.255.255.0
(8
位子网号和8
位主机号)、0xffffffc0 = 255.255.255.192.0
(10
位子网号和6
位主机号)。
- 当给定
IP
地址和子网掩码
后,就可以确定如下信息- 本子网上的主机。
- 本网络中其他子网中的主机。
- 其他网络上的主机。
知道本机
IP
地址后,可以确定其为A
、B
、C
类地址,就可知道网络号和子网号之间的分界线(8/16/24);而根据子网掩码就知道子网号和主机号之间的分界线(子网掩码全1长度)。
假定主机地址为
140.252.1.1
(B
类地址),子网掩码为255.255.255.0
(8 bit
为子网号,8 bit
为主机号),若目的IP
地址为140.252.4.5
,则网络号相同,但子网号不同;若目的IP
地址为140.252.1.22
,则网络号相同,子网号也相同,但是主机号不同;若目的IP
地址为192.43.235.6
,那么网络号不相同,则无需进行下一步比较。
特殊IP地址
经过子网划分后,存在
7
个特殊的IP
地址。0
表示所有的比特位全为0;-1
表示所有比特位全为1
;netid
、subnetid
、hostid
分别表示不全为0
或全为1
的对应字段;子网号栏为空表示该地址没有进行子网划分。
命令
ifconfig
通过
ifconfig
命令可获取IP
地址、广播地址、子网掩码等信息。
netstat
通过
ifconfig
命令可获取系统的接口信息(每个接口的MTU
、输入分组数、输入错误、输出分组数、输出错误、冲突以及当前的输出队列长度)。
总结
本章详细讲解了
IP
的格式及介绍了各个字段含义,主机中的路由表在路由选择时非常重要,并且按照优先级查找表项,在传输过程中目的IP
地址保持不变,而链路层地址每一站都会改变(指向下一站路由的链路层地址),同时一般都会进行子网划分,通过子网掩码可以获取网络号位数和主机位数。