IP,网际协议 ∞
theoryTCP, UDP, ICMP, IGMP等底层都是以IP数据报的格式传输的。
IP协议不是一个可靠的协议,它的安全性需要上一层来保证。当传输出错时,它只会简单地丢弃包,然后回发一个ICMP消息给信源端。
同时它也是无连接的,它不维护任何关于后续数据报的状态信息。它发送的数据报之间是独立,不保证哪个包先到。
IP数据报的首部:
图中可以看出,每一层都有4个字节,传输次序是从左到右四个字节一起传的,这个方式称作big endian字节序。TCP/IP首部中的所有的二进制整数在网络中传输时都要求以这种次序来传,因此它又被称为:网络字节序
以其它形式存储二进制整数的机器(如little endian)在传输前都得转换成网络字节序。
首部长度最多为60个字节(为什么?因为首部长度是用4bit表示的,它最大可表示15,即15层,一层4个字节,共60个,笔者猜)。
服务类型:TOS,包括一个3bit的优先权子字段(现已被忽略),4bit的TOS子字段和1bit的未用位,但必须置0。其中4bit的TOS分别表示:最小时延,最大吞吐量,最高可靠性,最小费用。这四个bit中,一次只能有一个是1,其它都为0。若都0,则表示这是一般的服务。详细如下表:
Telnet和Rlogin这两个交互应用要求最小的传输时延,因为人们主要用它们来传输少量的交互数据。另一方面,FTP文件传输则要求有最大的吞吐量。最高可靠性被指明给网络管理SNMP,和路由选择协议。用户网络新闻(Usenet news,NNTP)是唯一要求最小费用的应用。
但现在大多数的TCP/IP都不支持TOS特性了,不过自4.3BSD Reno以后的新版系统都以它进行了设置。另一方面,新的路由协议如OSPF和IS-IS都能根据这些字段的值进行路由决策。
16位的总长度是指整个IP数据报的长度,单位byte。16位可表示65535byte,但实际的应用中都不会这么大,大多数链路层都会对它进行切片。以太网最小帧长为46字节(上一篇文章图),但IP数据报可能会更短。总长度字段是必须的。
16位的标识字段唯一的标识主机发送的每一份数据报,每发送一份,它的值就会加1。
标志字段和片偏移在讨论分片的时候再讲
TTL(time to live)生存时间,设置了数据报可以经过的最多路由器数,每经过一个,值就减1,直到为0时,它就被丢弃,并发送ICMP报文通知源主机。
协议字段,用来确定上层协议,根据它可以知道是哪个协议向IP传送数据。
首部检验和,它不对首部后面的数据进行计算。ICMP、IGMP、UDP、TCP在它们各自的首部中均含有同时覆盖首部和数据检验和码。它们计算首部检验和时,都是先把检验和字段重置0,再对首部中每个16bit进行二进制反码求和,结果放回这个检验和字段中。收到数据时,同样对首部每16bit进行反码求和,结果为全1时,说明没问题,否则IP就会丢弃收到的这个数据报,而不生成ICMP。另外,路由器会修改TTL字段,每次把它减1,这时不用重新计算,只需把检验和加1。
IP路由选择
先简单地分析一下。如果只是主机的话,IP路由选择是很简单的:
如果目的主机与源主机直接相连,如点对点,或都在一个共享网络上(以太网或信息环网),那么IP数据报就直接送到目的主机上。
否则,主机把数据报发往一默认的路由器上,由路由器来转发该数据报。
主机和路由器对于数据报的处理,区别在于主机从不把数据报从一个接口转发到另一个接口,而路由器则要转发数据报。
在主机上,当数据报是来自某个网络接口时,IP首先检查目的IP地址是否为本机的IP地址之一或者IP广播地址。如果确实是这样,数据报就被送到由IP首部协议字段所指定的协议模块进行处理。如果数据报的目的不是这些地址,那么:如果IP层被设置成路由器的功能,那么就对数据报进行转发;否则数据报被丢弃。
对于路由器,它也不知道到达任何目的地的完整路径,它只知道下一站路由器的IP地址,它都假定下一站比自己更接近目的地。
IP路由主要完成下面功能:
1、搜索路由表,找与目的IP完全IP地址完全匹配的表目(网络号/主机号都匹配),如果是则把报文发送给该表目指定的下一站路由器或直接连接的网络接口(由标志字段的值来确定)。
2、搜索路由表,找能与目的网络号匹配的表目(也就是同网络号,不同主机号)。找到则把报文发送给该表目指定的下一站路由器或直接连接的网络接口。
3、搜索路由表,找标为“默认default”的表目。找到就把报文发送给该表目指定的下一站路由器。
第二点还和子网掩码有关,下面会讲。
如果这些步骤都没找到的话,则该数据报不会被传送,如果这个数据报是本机发出的,那么生成该数据报的应用程序会收到一个“主机不可达”或“网络不可达”。
子网寻址
1.0.0.1–126.255.255.255 —— A类地址,00xxxxxx和01xxxxxx都是,(二进制表示为:00000001 00000000 00000000 00000001 - 01111110 11111111 11111111 11111111)
128.0.0.1–191.255.255.255 —— B类地址,10xxxxxx都是,(二进制表示为:10000000 00000000 00000000 00000001—-10111111 11111111 11111111 11111111)
192.0.0.1–223.255.255.255 —— C类地址,110xxxxx都是,(二进制表示为: 11000000 00000000 00000000 00000001 - 11011111 11111111 11111111 11111111)
224.0.0.1–239.255.255.254 —— D类地址,1110xxxx都是,(二进制表示为:11100000 00000000 00000000 00000001 - 11101111 11111111 11111111 11111111)
240.0.0.1–255.255.255.254 —— E类地址,1111xxxx都是,(二进制表示为:11110000 00000000 00000000 00000001 - 11111111 11111111 11111111 11111111)
D类地址用于多点播送,作为备用地址。E类则只作实验和开发用。
现在的网络的IP大都分为三个段:网络号、子网号、主机号。
举例:一个大公司,有一个自己的B类的网络号140.252,它底下又有好几个网段140.252.1~140.252.10,每一个网段用一个子网掩码,每个网段里面有很多主机,如140.252.3.3。
自然的划分是把前16bit给网络号,接着8bit给子网号,最后8位给主机号。但这也可以改。如:后16位中,拿10位当子网号,剩下的6位当主机号
大多数子网例子都是B类地址。其实还可以用于C类地址,只是它可用的比特数较少而已。很少用A类,因为它本来就少,不过大部分的A类地址都是进行子网划分的。
本文主要拿B类地址来描述。被分成多个子网的事实是对外网透明的。外部只要知道总路由的地址就行,因此140.252只需一个路由表目。
由IP地址和子网掩码就可以知道这个IP是外网还同一子网中的主机,或是不同子网中的主机。
特殊的IP地址