柯南君上一章讲了《TIP/IP之协议分层》,本章主要讲一下IP协议,这个是大家最关注的
IP是TCP / IP协议族中最为核心的协议。所有的TCP、UDP、ICM P及IGMP数据都以IP数据报格式传输。许多刚开始接触TCP/IP的人对IP提供不可靠、无连接的数据报传送服务感到很奇怪,特别是那些具有X.25或SNA背景知识的人。 不可靠(unreliable)的意思是它不能保证IP数据报能成功地到达目的地。IP仅提供最好的传输服务。如果发生某种错误时,如某个路由器暂时用完了缓冲区, IP有一个简单的错误处理算法:丢弃该数据报,然后发送ICMP消息报给信源端。任何要求的可靠性必须由上层来提供(如TCP)。 无连接(connectionless)这个术语的意思是IP并不维护任何关于后续数据报的状态信息。每个数据报的处理是相互独立的。这也说明, IP数据报可以不按发送顺序接收。如果一信源向相同的信宿发送两个连续的数据报(先是A,然后是B),每个数据报都是独立地进行路由选择,可能选择不同的路线,因此B可能在A到达之前先到达。
IP数据报的格式 :TCP/IP协议定义了一个在因特网上传输的包,称为IP数据包(IP DATAGRAM),在这里,为了便于大家的理解,我用了两张图(分别是两本参考资料)表示IP数据包格式的真实意思,有些理解不到位的地方希望多交流。
(如图3 - 1所示)。普通的IP首部长为20个字节,除非含有选项字段。
如上图所示:
IP首部 :最高的在左边,记为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格式,则必须在传输数据之前把首部转换成网络字节序。
备注:
A)bit:中文名称是位,音译“比特”,是用以描述电脑数据量的最小单位。
二进制数系统中,每个0或1就是一个位(bit)。
bit 来自binary digit (二进制数字) 有以下用途:数据率---就是数据的传输速率,单位是:比特/秒(意思是每秒传送多少二进制数字《1或0》)
通常记为: bit/s b/s Kb/s Mb/s Gb/s Tb/s bps(bit per second)而这几个英文字母的来源:K:kilo(千) M:mega(兆) G:giga(吉) T:tera(太)
单位换算
1Byte=8bit
1KB=1024Byte(字节)=8*1024bit
1MB=1024KB
1GB=1024MB
1TB=1024GB
B) endian:big-Endian 和 Little-Endian 字节排序
字节排序 含义 Big-Endian 一个Word中的高位的Byte放在内存中这个Word区域的低地址处。 Little-Endian 一个Word中的低位的Byte放在内存中这个Word区域的低地址处。 必须注意的是:表中一个Word的长度是16位,一个Byte的长度是8位。如果一个数超过一个Word的长度,必须先按Word分成若干部分,然后每一部分(即每个Word内部)按Big-Endian或者Little-Endian的不同操作来处理字节。 一个例子: 如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为 big-endian little-endian 0x0000 0x12 0xcd 0x0001 0x34 0xab 0x0002 0xab 0x34 0x0003 0xcd 0x12 (注意:0xab换算成2进制是10101011,是个8bit的数。) 详细介绍如下: 不同体系的CPU在内存中的数据存储往往存在着差异。例如,Intel的x86系列处理器将低序字节存储在起始地址,而一些RISC架构的处理器,如IBM的370主机使用的PowerPC或Motorola公司生产的CPU,都将高序字节存储在起始位置。这两种不同的存储方式被称为little-endian和big-endian。
① 版本:目前的协议版本号是4,因此IP有时也称作IPV4。
② 首部长度:指的是首部占32 bit字的数目,包括任何选项。由于它是一个4比特字段,因此首部最长为60个字节。
占4位,可表示的最大十进制数值是15。请注意,这个字段所表示数的单位是32位字长(1个32位字长是4字节),因此,当IP的首部长度为1111时(即十进制的15),首部长度就达到60字节。当IP分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充。因此数据部分永远在4字节的整数倍开始,这样在实现IP协议时较为方便。首部长度限制为60 字节的缺点是有时可能不够用。但这样做是希望用户尽量减少开销。最常用的首部长度就是20字节(即首部长度为0101),这时不使用任何选项。
(#我们一般看到的版本和首部长度两个字段是十六进制45,就是版本号version=4,headlength=5,也就是首部长度是60个字节)
③ 区分服务:占8位,用来获得更好的服务。这个字段在旧标准中叫做服务类型,但实际上一直没有被使用过。1998年IETF把这个字段改名为区分服务DS(Differentiated Services)。只有在使用区分服务时,这个字段才起作用。服务类型(TOS)字段包括一个3 bit的优先权子字段(现在已被忽略),4 bit的TOS子字段和1 bit未用位但必须置0。4 bit的TOS分别代表:最小时延、最大吞吐量、最高可靠性和最小费用。4 bit中只能置其中1 bit。如果所有4 bit均为0,那么就意味着是一般服务。下边图列出了对不同应用建议的TOS值。在最后一列中给出的是十六进制值,因为这就是在后面将要看到的tcpdump命令输出。
备注:如上图所示:Telnet和Rlogin这两个交互应用要求最小的传输时延,因为人们主要用它们来传输少量的交互数据。另一方面, FTP文件传输则要求有最大的吞吐量。最高可靠性被指明给网络管理(SNMP)和路由选择协议。用户网络新闻( Usenet news, NNTP)是唯一要求最小费用的应用。现在大多数的TCP/IP实现都不支持TO S特性,但是自4.3BSD Reno以后的新版系统都对它进行了设置。另外,新的路由协议如OSPF和IS-IS都能根据这些字段的值进行路由决策。④ 总长度: 总长度指首部和数据之和的长度,单位为字节。总长度字段为16位,因此数据报的最大长度为2的16-1方=65535字节。
在IP层下面的每一种数据链路层都有自己的帧格式,其中包括帧格式中的数据字段的最大长度,这称为最大传送单元MTU(Maximum Transfer Unit)。当一个数据报封装成链路层的帧时,此数据报的总长度(即首部加上数据部分)一定不能超过下面的数据链路层的MTU值。
⑤ 标识(identification): 占16位。IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。但这个“标识”并不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。当数据报由于长度超过网络的MTU而必须分片时,这个标识字段的值就被复制到所有的数据报的标识字段中。相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报。
⑥ 标志(flag): 占3位,但目前只有2位有意义。
⑧ 生存时间: 占8位,生存时间字段常用的的英文缩写是TTL(Time To Live),表明是数据报在网络中的寿命。由发出数据报的源点设置这个字段。其目的是防止无法交付的数据报无限制地在因特网中兜圈子,因而白白消耗网络资源。最初的设计是以秒作为TTL的单位。每经过一个路由器时,就把TTL减去数据报在路由器消耗掉的一段时间。若数据报在路由器消耗的时间小于1秒,就把 TTL值减1。当TTL值为0时,就丢弃这个数据报。
⑨ 协议: 占8位,协议字段指出此数据报携带的数据是使用何种协议,以便使目的主机的IP层知道应将数据部分上交给哪个处理过程。(在scapy中,下层的这个
protocol一般可以从上曾继承而来,自动填充,我们一般可以省略不填此项)
10 部检验和: 占16位。这个字段只检验数据报的首部,但不包括数据部分。这是因为数据报每经过一个路由器,路由器都要重新计算一下首部检验和(一些字段,如生存时间、标志、片偏移等都可能发生变化)。不检验数据部分可减少计算的工作量。
2、IP路由选择
IP路由选择,是思科网络工程师必须要了解的一个基础知识。其实,IP路由并没有大家想的那么复杂。将通过一个案例,来帮助大家深入了解IP路由的选择过程。希望这篇文章能够帮助大家扫清IP路由选择上的一些误区。 如下图,现在这么一个网络。主机甲与主机乙分别在两个不同的网段上,中间通过路由器进行连接。现在假设主机甲要跟主机乙进行通信,那么主机甲如 何才能够找到主机乙的位置呢?笔者现在就通过这个例子,跟大家详细解释IP路由选择的整个过程。在这里,笔者以Cisco的路由器为例进行介绍。
假设现在主机甲的用户利用Ping命令,来确认主机乙的连通性问题。这个网络架构虽然比较简单,但是其路由选择过程的步骤则是一步不缺的。主要通过如下步骤: 第一步:当用户在主机甲上输入PING 172.168.80.8之后,主机甲中有一个因特网控制报文协议,英文简称为ICMP。这个协议将创建一个回应请求数据包,在它的数据域中只包含有字母。 第二步:英特网控制报文协议会将这个有效负荷(即刚创建的数据包)交给因特网协议(英文简称IP)。然后这个因特网协议也会创建一个数据包。在这个英特网协议创建的数据包中,所包含的内容要比因特网控制报文协议所创建的数据包丰富的多。在这个包中包括主机甲的IP地址、目的地主机已的IP地址以 及值为01h的协议字段。当数据包到达主机乙时,这些内容就是告诉对方,应该将这个有效负荷交给因特网控制报文协议来处理。 第三步:IP协议会判断目的IP地址是属于远程网络,还是在本地网络。由于根据IP地址规划规则,主机甲与主机已是属于不同的网络。此时,刚才英特网协议(IP)所创建的数据包将会被发送到默认的网关中去。在主机甲的网络属性配置中,除了有自身的逻辑IP地址,还有默认的网关地址。网关地址就是 用来不同网络之间的主机进行通信的一扇门。只有通过网关,主机甲的数据包才能够被发送到不同网络的主机乙中。 第四步:确认路由器相应接口的MAC地址。假设主机甲(IP地址为172.168.60.6)的默认网关被配置为172.168.60.1。若主机甲的数据包要发送到这个默认网关上,则就必须知道其对应的路由器接口的物理地址,即MAC地址。因为只有如此,数据包才能够被传递到更下一层的数据链 路层并根据一定的规则生成帧。然后主机甲才能够把数据包发送给172.168.60.0网络连接的路由器接口。在本地局域网上,主机只可以通过硬件地址来 相互之间进行通信。所以当主机甲要把数据包发送给特定的网关时,必须要知道这个网关所对应的MAC地址。这一个过程是不可避免的。为了达到这个目的,主机 甲首先会检查自己的ARP缓存,查看一个默认网关的IP地址是否已经解析为对应接口的硬件地址。如果在ARP缓存表中已经有对应的记录,表示已经被成功解析。此时,数据包将会被释放并传递到数据链路层并生成帧。其中目的方的硬件地址也将同数据包一起下传到数据链路层。通常情况下,在主机甲上,可以通过 ARP命令来查看主机当前的IP地址与MAC地址的对应表。如下图。笔者现在电脑所设置的默认网关为192.168.0.254,后面的16位字符就是默 认网关所对应的硬件地址。
第五步:生成帧。当这个数据包和目的方的硬件地址被传递给数据链路层之后,局域网驱动器将用来提供媒体访问服务,以通过以太网进行数据传输。一 个数据帧即将产生,使用一些控制信息来封装这个数据包。在这个数据帧中会包含有目的方和源方的硬件地址。以及以太网类型字段。这个以太网类型字段主要用来描述的是交付这个数据包岛数据链路层的网络层协议。在这个帧的结尾,是一种被称作为帧校验序列的字段,它是装载循环冗余校验计算值的区域。也就是说,在这 个帧中,主要包括目的MAC地址(对应路由器接口的MAC地址)、源MAC地址(主机甲的MAC地)、以太网类型字段、数据包、帧校验序列五部分内容。注意,这里指的目的地址并不是主机乙的地址,而是里主机甲最近的默认网关地址。在第一次通信时,主机 甲并不知道主机乙的MAC地址。一旦完成帧的封装,则这个帧将会被交付到物理层。如果企业网络是利用双绞线组建的话,则将会以一次一位的方式发往物理媒体。
待续...