概述
IP 是 TCP/IP 协议族中最为核心的协议。所有的 TCP、UDP、ICMP 和 IGMP 数据都是以 IP 数据报格式传输。IP 协议处于网络层,网络层主要是实现点对点的通信。IP 协议是一种不可靠、无连接的协议。不可靠即不能保证 IP 数据报能够成功到达目的端,在传输过程中发生某种错误时,IP 协议会丢弃数据报,然后发送 ICMP 消息给信源端,其他任何要求的可靠性必须由上层来提供。无连接即 IP 协议并不维护任何关于后续数据报的状态信息,每个数据报都是相互独立的。因此,IP 数据报可以不按顺序接收。
IP 地址
在计算机通信中,为了识别通信对端,必须有一个类似于地址的识别码进行标识。数据链路层中使用 MAC 地址进行标识同一个链路中不同计算机的一种识别码。相同,在网络层的 IP 中,使用 IP 地址来识别通信的主机。IP 地址由 32 位整数来表示,每 8 位为一组,分成 4 组,每组以”.“隔开,再将每组数转换为十进制。有关《IP
地址》具体讲解可以参考前面博文。
IP 首部
IP 数据报的格式如下图所示,普通的 IP 首部长为 20 字节,除非含有选项字段。
前 20 字节和紧接其后的选项部分是 IP 数据报的首部,其中选项是可选的。首部的每一行是一个 32 位字的单位,最高位在左边,为 0 bit,最低位在右边,为 31 bit。4 个字节的 32 bit 值以下面的次序传输:首先是 0~7 bit,其次是 8~15 bit,然后 16~23 bit,最后是 24~31 bit。这种传输次序称为 big endian 字节序。由于 TCP/IP 首部中所有二进制整数在网络中传输时都要求以这种次序,因此它又称为网络字节序(即大端字节序,可参考博文《字节序》)。其他形式存储的二进制数据,如
little endian 格式,则必须在传输数据之前把首部转化成网络字节序。
版本号由 4 bit 来确认 IP 首部属于哪个版本,例如为 IPv4 时,则其值为 4。
首部长度是指首部占 32 bit 字的数目,包括任何选项。因为 4 位的最大值为 15(即从 0 开始计算),且由于是一个 4 比特段,因此首部最长为 60 字节,也即是说选项部分的最大值为 40 字节,不够 4 的倍数,要用 0 填充,使数据部分的起始地址为 4 的倍数。
服务类型(TOS)字段包括一个 3 bit 的优先权子段,4 bit 的 TOS 子字段和 1 bit 未用位但必须设为 0。4 bit 的 TOS 分别代表:最小延时、最大吞吐量、最高可靠性和最小费用。4 bit 中只能置其中 1 bit ,若所有 4 bit 均为 0,则意味着是一般服务。
总长度字段是指整个 IP 数据报的长度(即包括 IP 首部和数据),以字节为单位。利用首部长度字段和总长度字段就可以确定 IP 数据报中数据内容的起始位置和长度。由于该字段是 16 比特,所有 IP 数据报总长度可达 65535 字节,但是大多数的链路层都会对其进行分片,而且,实际上还要考虑网络的最大承载能力等因素,主机并不要求接收超过 576 字节的数据报。
IP 路由选择
发送数据报时使用网络地址(即 IP 地址),但是仅仅只有 IP 地址也不能够把数据报成功发送到达目的端地址,还需要一种类似于路由器或主机的信息,以便真正发往目的地址,这种信息存储在路由控制表中。路由控制表有两种形式:一种是管理员手动设置(即静态路由控制表);另一种是路由器与其他路由器交换信息时自动刷新(即动态路由控制表),为使动态路由控制表正常工作,必须设置好路由协议。
路由控制表记录着目的 IP 地址(网路地址)、下一步应该发送至路由器的 IP 地址和标志(该标志确认目的 IP 地址是网络地址还是主机地址或下一个路由器是否为路由器接口卡)。在发送 IP 数据报时,首先要确认 IP 数据报中首部的目的地址,再从路由控制表中找到与该地址具有相同网络地址的记录,根据该记录将 IP 数据报转发给相应的下一个路由器。若路由控制表存在多个相同的网络地址记录,就选择一个相同位数最多的网络地址。若路由控制表中下一个路由器的位置记录着某个主机或路由器网卡的
IP 地址,则意味着发送端和目的端属于同一条链路。
IP 路由选择是逐跳地进行,在路由控制表中,IP 并不知道到达任何目的的完整路劲。所有的 IP 路由选择只为数据报传输提供下一个路由器的 IP 地址。IP 路由选择主要按以下步骤:
- 搜索路由表,优先搜索匹配主机,如果能找到和 IP 地址完全一致的目标主机,则将该包发向目标主机;
- 搜索路由表,如果匹配主机失败,则匹配同子网的路由器,这需要子网掩码的协助。如果找到路由器,则将该包发向路由器;
- 搜索路由表,如果匹配同子网路由器失败,则匹配同网号路由器,如果找到路由器,则将该包发向路由器;
- 搜索路由表,如果以上都失败了,就搜索默认路由,如果默认路由存在,则发包;
- 如果以上都失败了,就丢掉这个包;
子网掩码
IP 地址在子网网络中不再是简单的由网络号和主机号组成,而是把主机号再分成子网号和主机号。因此,在子网网络中,IP 地址有两种识别码:一种是 IP 地址本身;另一种是表示网络部的子网掩码;子网由子网掩码与该子网中的 IP 地址相"与"得到。
给定 IP 地址和子网掩码,主机可以确定 IP 数据报的目的是:
---本子网上的主机;
---本网络中其他子网中的主机;
---其他网络上的主机;
参考资料:
《TCP/IP 详解》
《图解 TCP/IP》
《IP 协议》http://blog.csdn.net/ns_code/article/details/29894111