TCP/IP协议:IP网际协议

125 阅读7分钟

引言

IP是TCP/IP协议族中最核心的协议,所有TCP、UDP、ICMP及IGMP都使用IP数据报格式传输。IP时提供不可靠、无连接的服务,所谓不可靠是指IP层不保证数据包能成功发送到目标主机,它只管发送,如果发送不成功的话会通过ICMP向发送端报告错误原因。而无连接指的是IP并不维护数据报的连接状态,每个数据报的处理过程是互相独立的。

IP首部

一般IP数据报首部长度为20个字节,除非有选项字段会超过20个字节外。IP首部的数据格式如下图所示,最高位在左边,记为0 bit,最低位在右边,记为31 bit。在存储或发送数据时,会先处理高位数据,比传送4字节数据时,首先发送0-7bit,然后是8-15bit,接着是16-23bit,最后是24-31bit,这样的处理方式顺序叫大端字节序,而网络传输都要求以这种方式传输,因此也称作网络字节序

4位版本 4位长度 8位服务类型(TOS) 16位总长度(字节数)
16位标识 3位标志 13位片偏移
8位生存时间(TTL) 8位协议 16位首部检验和
32位源IP地址
32位目的IP地址
选项(如果有)
数据

版本: IP协议版本,目前协议版本为4,即IPv4;

首部长度: 指首部长度(包括任何选项)是4字节的倍数,这个数值占用4 bit,最大值为二进制1111即十进制15,因此首部长度最大可能为15*4=60字节。而一般IP首部长度为20个字节(不包含选项),因此这个数值一般为5;

服务类型TOS: 这个字段包含3 bit优先权子字段(现已被忽略),4 bit TOS子字段和1 bit未用位必须置为0。4 bit TOS字段分别代表:最小时延、最大吞吐量、最高可靠性和最小费用,4 bit 中只能有1 bit可置1,其余位为0。如果4 bit TOS都为0,则为一般服务。TCP/IP协议不支持TOS特性。

总长度: 指IP数据包的总长度,以字节为单位,包括首部长度和数据长度。该字段占用16 bit,数值最大可达65535,理论上一个IP数据报最长可达65535字节,但到了链路层一般会根据MTU对数据报进行切片,当数据报被分片时该字段也随之改变。

标识: 该字段唯一标识主机发送的每一份数据报。通常每发送一份报文,它的数值就会加1。

TTL: 生存时间字段设置了数据报可以经过的最多路由数,它指定了数据报的生存时间。TTL的初始值由源主机设置,一旦经过一个路由就会减1,当数值为0时数据报就会被丢弃,并发送ICMP给源主机报告数据不可达。

协议: 该字段可识别是哪个协议向IP传送数据,IP收到数据报时可根据协议进行分用,这个字段一般有TCP、UDP、ICMP和IGMP。

首部校验和: 根据IP首部计算的检验和码,它不对首部后面的数据进行计算。TCP、UDP、ICMP和IGMP在它们各自的首部中均含有同时覆盖首部和数据的检验和码。

源地址和目的地址: 每一个数据报都包含的32位源地址和目的地址。

选项: 任选项是数据报中的一个可变长的可选信息,这些选项很少被使用,并非所有主机和路由器都支持这些选项。

IP路由选择

从概念上说,IP路由选择是简单的,如果源IP和目的IP直接相连或在一个共享网络上,那么IP数据报就直接送到目的主机上。否则,主机就把数据报发到默认路由器上,由路由器转发数据报。在大部分的多用户系统中,主机都可以配置成为一个路由器,能够转发不是发送给自己的数据报,而如果不被设置成那样,它是不会转发的,收到非自己的数据报则会丢弃。

一般的路由选择机制中,IP会从TCP、UDP、ICMP、IGMP接收数据报进行发送或从另一个网络接口接收数据报并进行发送。IP层在内存中保存一份路由表,每次发送时会查找一次。从另一个网络接口接收数据报时,如果IP地址是本机时,则解析数据报中的协议字段,发送给对应的协议模块处理。否则,查找路由表,找到下一站路由的IP地址并发送。一般每个IP路由表目包含如下信息:

  • 目的IP地址,它既可以是完整的主机地址,也可以是网络地址,由该表目的另一个标志字段指定;
  • 下一站路由器IP地址,它是与主机直接相连的网络节点,通过该节点可以更接近目的IP地址;
  • 标志,其中一个标志指明目的IP地址是一个网络地址还是主机地址,另一个标志指明下一站路由器是否是真的下一站路由器还是一个直接相连的接口。

IP路由主要完成以下工作:

  1. 搜索路由表,寻找能与目的IP地址的主机号和网络号完全匹配的表目,如果找到则发送到该表目指定的下一站路由器或直接相连的网络接口;
  2. 搜索路由表,寻找能与目的IP地址网络号相匹配的表目,如果找到则发送到该表目指定的下一站路由器或直接相连的网络接口;
  3. 搜索默认路由,如果找到则发送到默认路由指定的下一站路由器或直接相连的网络接口;

如果以上步骤都没有成功,则数据报就不能被发送,如果数据报来自本机,则会发送一个"主机不可达"或"网络不可达"的ICMP报文给生成数据报的应用程序。

IP寻址

由于B类和C类地址可容纳的主机号都过于庞大,分别为2^16-2和2^8-2个主机,任何机构一般都不会用到这么庞大的网络。因此IP还会将主机号分为子网号和主机号,一个B类地址,既有的16 bit是网络号,剩余的16 bit可以将8 bit用于子网,8 bit用于主机,因此就可以分为254个子网(去掉广播地址),每个子网可以包含最多254个主机。

与30个C类地址相比,用一个包含30个子网的B类地址的好处是,它可以缩小路由表的规模。B类地址划分为多个子网对于所有子网外部的网络是透明的,一个IP数据包要发送都其中某一个子网的某个IP地址,只需要发送到该B类地址的路由器即可,然后再转发到对应的子网,子网再发送到对应主机。

子网掩码

子网掩码是用来区分IP地址有多少bit用于子网号,多少bit用于主机号。掩码是一个32bit的值,其中全1的bit留给网络号和子网号,全0的bit留给主机号。如下图所示,第一个IP地址采用自然划分法,将前8 bit作为子网号,后8 bit作为主机号,而第二个IP地址,前11 bit作为子网号,后5 bit作为主机号。 给定了IP地址和子网掩码后,主机就可以确定IP数据报的目的是:

  1. 本子网上的主机;
  2. 本网络中其他子网上的主机;
  3. 其他网络上的主机。 如果知道本地IP地址,那么就知道它是A类、B类或C类地址(从IP地址的高位就可以得知),也就知道网络号和子网号之间的分界线,而根据子网掩码就可以知道子网号和主机号之间的分界线。