IP-网际协议

前言

在前面学习了数据链路层相关的知识点,接着学习IP网际协议相关知识。

网际协议

IPTCP/IP协议族中最核心的协议,所有TCPUDPICMPIGMP数据都以IP数据报格式传输。IP是不可靠的,任何要求可靠性的服务必须由上层提供;IP是无连接的,其不维护任何关于后续数据报的状态信息,每个数据报的处理相互独立,数据报可以不按发送顺序接收。

IP首部

IP数据报格式如下图所示,普通的IP首部长20个字节,除非含有选项字段。

  • 目前版本号是4,即0100
  • 首部长度指首部占32 bit字的数目,由于只有4 bit表示,因此最多表示60 (15 * 32 / 8)个字节。
  • 服务类型字段包括3 bit优先权子字段(现已被忽略),4 bitTOS子字段(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可以从TCPUDPICMPIGMP接收数据报(即在本地生成的数据报)进行发送,或者从一个网络接口接收数据报(待转发的数据报)并进行发送。

  • 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地址后,可以确定其为ABC类地址,就可知道网络号和子网号之间的分界线(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表示所有比特位全为1netidsubnetidhostid分别表示不全为0或全为1的对应字段;子网号栏为空表示该地址没有进行子网划分。

命令

ifconfig

通过ifconfig命令可获取IP地址、广播地址、子网掩码等信息。

netstat

通过ifconfig命令可获取系统的接口信息(每个接口的MTU、输入分组数、输入错误、输出分组数、输出错误、冲突以及当前的输出队列长度)。

总结

本章详细讲解了IP的格式及介绍了各个字段含义,主机中的路由表在路由选择时非常重要,并且按照优先级查找表项,在传输过程中目的IP地址保持不变,而链路层地址每一站都会改变(指向下一站路由的链路层地址),同时一般都会进行子网划分,通过子网掩码可以获取网络号位数和主机位数。