网络层

来源:互联网 发布:java web start 1.4.2 编辑:程序博客网 时间:2024/05/18 07:22


  IP(Internet Protocol,网络协议):主要负责将数据包发送给最终的目标计算机。因此,IP能够让世界任何两台计算机之间进行通信。
  TCP/IP的心脏是互联网。这一层主要由IP和ICMP(Internet Control Message Protocol)两个协议组成。

一、IP协议

1、IP基础知识

  网络层的主要作用是“实现终端节点之间的通信”。这种终端节点之间的通信也叫“点对点通信”。
  数据链路层的主要作用是在互连同一种数据链路的节点之间进行包传递。而一旦跨越多种数据链路,就需要借助网络层。网络层可以跨越不同的数据链路,即使在不同的数据链路上也能实现两端节点之间的数据包传输。
  
  主机:配置有IP地址,但是不进行路由控制的设备。
  路由器:即配有IP地址又具有路由控制能力的设备,跟主机有所区别。
  节点:主机和路由器的统称。

1.1.网络层与数据链路层的关系
  数据链路层提供直连两个设备之间的通信功能。两者可以这么认为:就像外出旅行一样,某一站地就相当于数据链路层,而整个全程的行程表的作用就相当于网络层。
  IP大致分为三大模块,它们是IP寻址、路由(最终节点为止的转发)、以及IP分包与组包。下面讲这三点
  
1.2.IP地址属于网络层地址
  在计算机通信中,为了识别通信对端,必须要有一个类似于地址的识别码进行标识。数据链路的MAC地址:用于标识同一个链路中不同计算机的一种识别码。
  网络层的IP地址:连接到网络中的所有主机中识别出进行通信的目标地址。在TCP/IP通信中所有主机或路由器必须设定自己的IP地址。(严格来说,要针对每块网卡至少配置一个以上的IP地址)

1.3.路由控制
  路由控制(Routing)上指将分组数据发送到最终目标地址的功能。一旦这个路由器控制的运行出现异常,分组数据极有可能“迷失”,无法到达目标地址。因此,一个数据包之所以能够成功地到达最终的目标地址,全靠路由控制。
  1).发送数据至最终目标地址
  Hop中文叫“跳”,它是指网络中的一个区间。IP包正是在网络中一个跳间被转发,因此IP路由也叫做多跳路由,在每一个区间决定着包在下一跳被转发的路径。多跳路由是指路由器或主机在转发IP数据包时只指定下一个路由器或主机,而不是将到最终目标地址为止的所有通路全部都指定出来。
  2).路由控制表
  为了将数据包发给目标主机,所有主机都维护着一张路由控制表,该表记录IP数据在下一步应该发给哪个路由器,IP包将根据这个路由表在各个数据链路上传输。

1.4.数据链路的抽象化
  IP是实现多个数据链路之间通信的协议,数据链路根据种类的不同各有特点,对这些不同数据链路的相异特性进行抽象化也是IP的重要作用之一。数据链路的地址可以被抽象化为IP地址,因此,对IP的上一层来说,不论底层数据链路使用以太网还是无线LAN或是PPP,都将被一视同仁。
  不同数据链路有个最大的区别,就是它们各自的最大传输单位(MTU: maximum Transmission Unit)不同,就像不同的交通工具运输重量不同。MTU的值在以太网中是1500字节,在FDDI中是4352字节,而ATM则为9180字节。IP的上一层可能会要求传送比这些MTU更多字节的数据,因此必须在线路上传送比包长还要小的MTU。
  为了解决这个问题,IP进行分片处理,分片处理是指将较大的IP包分成多个较小的IP包

1.5.IP属于面向无连接型
  IP面向无连接,即发包前,不需要建立与对端目标地址之间的连接。
  面向有连接情况下,需要事先建立连接,如果对端主机关机或不存在,也就不可能建立连接。反之,一个没有建立连接的主机也不可能发送数据过来。
  而面向无连接的情况,即使对端主机关机或不存在,数据包还是会被发送出去。反之对于一台主机来说,它会何时从哪里收到数据也是不得而知的,因此,在面向无连接的方式下可能会有很多冗余的通信。
那么,为什么IP要采用面向无连接呢?
  主要有两点原因:一是为了简化,二是为了提速。需要有连接时,可以委托上一层提供此项服务,所以为了提高可靠性,上一层的TCP采用面向有连接型,TCP负责保证对端主机确实接收到数据。
为什么不让IP具有可靠传输的功能,从而把这两种协议合并到一起呢?
  主要是为了有效分层。

2、IP地址基础知识

  在用TCP/IP通信时,用IP地址识别主机和路由器。为了保证正常通信,有必要为每个设备配置正确的IP地址。在互联网通信中,必须设定正确的IP地址,否则根本无法实现正常的通信。
  IP地址(IPv4地址)由32位正整数来表示,由网络标识主机标识组成。

2.1.IP地址的分类
  IP地址分为四个级别,分别为A类,B类,C类,D类,还有一直未使用的E类。
1).A类地址
  A类地址首位以”0”开头的地址,从第1-8位是它的网络标识,网络地址范围:0.0.0.0~127.0.0.0是A类的网络地址,A类地址的后24位相当于主机标识,因此主机地址上限为(2^24 - 2)个
2).B类地址
  B类IP地址是前两位为“10”的地址,从1~16位是它的网络标识,网络地址范围:128.0.0.0~191.255.0.0。B类地址的后16位相当于主机标识,主机地址上限为(2^16 - 2)。
3).C类地址
  C类是IP地址是前三位为“110”的地址,从1~24位是它的网络标识,网络地址范围:192.0.0.0~223.255.255.0。主机地址上限为(2^8 -2)
4).D类地址
   D类是IP地址是前四位为“1110”的地址,从1~32位是它的网络标识,网络地址范围:224.0.0.0~239.255.255.255。D类地址没有主机标识,常被用于多播。
5).关于分配IP主机地址的注意事项
  在分配IP地址时要注意主机地址不能全部为0或1,全为0只有在表示对应的网络地址或IP地址不可获知的情况下才使用,而全部为1的主机地址通常作用主播地址。

2.2.广播地址
  广播地址用于在同一个链路中相互连接的主机之间发送数据包,将IP地址中的主机地址全部设置为1,就成为了广播地址。
1)两种广播
  广播分为本地广播和直播广播两种。
  在本网络内的广播叫做本地广播。如网络地址为192.168.0.0/24的情况下,广播地址是192.168.0.255。因为这个广播地址的IP包会被路由器屏蔽,所以不会到达192.168.0.0/24以外的其他链路上。
  在不同网络之间的广播叫做直播广播。如网络地址为192.168.0.0/24向192.168.1.255/24的目标地址发送IP包。收到这个包的路由器,将数据转发给192.168.1.0/24,从而使得所有192.168.1.1~192.168.1.254的主机都能收到这个包(由于直播广播有一定的安全问题,多数情况下会在路由器上设置为不转发)

2.3.IP多播
1).同时发送提高效率
  多播用于将包发送给特定组内的所有主机,由于其直播使用IP协议,因此也不存在可靠传输。
  而随着多媒体应用的发展,对于向多台主机同时发送数据包,在效率上的要求也日益提高。在电视会议系统中对于1对N,N对N通信的需求明显上升。而具体实现上往往采用复制1对1通信的数据,将其同时发送给多个主机的方式。
  在人们使用多播功能之前,一直采用广播的方式。那时广播将数据发给所有终端主机,再由这些主机IP之上的一层去判断是否有必要接收数据。是则接收,不是则丢弃。
  然而这种方式会给那些毫无关系的网络或主机带来影响,造成网络上很多不必要的流量。况且由于广播无法穿透路由,若想给其他网段发送同样的包,就不得不采取另一种机制。因此,多播这种即可以穿透路由器,又可以实现只给那些必要的组发送数据包的技术就成为必选之路了。

2).IP多播与地址
  多播使用D类地址。因此,如果从首位开始到第4位是“1110”,就可以认为是多播地址,而剩下的28位可以成为多播的组编号。TTL(Time To Live)生成时间

2.4.子网掩码
  直接使用A类、B类、C类地址浪费资源
  使用子网掩码通过子网网络细分出更小粒度的网络。自从引用了子网以后,一个IP地址就有了两种识别码。一是IP地址本身,另一个是表示网络部的子网掩码。
  子网掩码用二进制方式表示的话,也是一个32位的数字。它对应IP地址网络标识部分的位全部为“1”,对应IP地址主机标识部分则全部为“0”。因此一个IP地址可以不再受限制自己的类别,而是可以用这样的子网掩码自由地定位自己的网络标识长度。当然,子网掩码必须是Ip地址的首位开始连续的“1”。
  子网掩码表示方式有两种:一种是跟ip地址类似,另一种是在每个IP地址后面追加网络地址的位数,用”/”分开,如192.168.0.0/24(可以省略后面的0, 192.168/24)


3.路由控制

  实现IP通信的主机和路由器都必须持有一张路由控制表,也正是在这个表格的基础上才得以进行数据包发送的。
  该路由控制表的形成方式有两种:一种是管理员手动设置,这收静态路由控制;另一种是路由器与其他路由器相互交换信息时自动刷新,叫动态路由控制。IP协议始终认为路由表是正确的。然而,IP本身并没有定义制作路由控制表的协议。即IP没有制作路由控制表的机制。该表是由一个叫做”路由协议“(这个协议有别于IP)的协议制作而成。
  路由协议详解地址:路由协议详解
  
3.1.IP地址与路由控制
  IP地址的网络地址部分用于进行路由控制。路由控制表中记录着网络地址与下一步就忘发送到路由器的地址。在发送IP包时,首先要确定IP包首部中的目标地址,再从路由控制表中找到与该地址具有相同网络地址的记录,根据该记录将IP包转发给相应的下一个路由器。如果路由控制表中存在多条相同网络地址的记录,就选择一个最吻合的网络地址。所谓最为吻合是指相同位数最多的意思。
  如172.20.100.52的网络地址与172.20/16和172.20.100/24两项都匹配,此时应该选择匹配最长的172.20.100/24。此外,如果路由表中下一个路由器的位置记录着某个主机或路由器网卡的IP地址,那就意味着”发送的目标地址属于同一个链路“。
1).默认路由
  如果一张路由表中包含所有的网络及其子网的信息,将会造成无端的浪费。这时默认路由是不错的选择,默认路由是指路由表中任何一个地址都能与之匹配的记录。
  默认路由一般标记为0.0.0.0/0或default。这里的0.0.0.0/0并不是指IP地址是0.0.0.0,由于后面是”/0“,所以并没有标识IP地址(0.0.0.0的IP地址应该记述为0.0.0.0/32),它只是为了避免人们误以为0.0.0.0是IP地址。有时默认路由器也被标记为default,但是在计算机内部和路由协议的发送过程中还是以0.0.0.0/0进行处理。
2).主机路由
  “IP地址/32”也被称为主机路由。如192.168.153.15/32(其对应的子网掩码为255.255.255.255)就是一种主机路由,它的意思是整个IP地址的所有位都将参与路由。进行主机路由,意味着要基于主机上网卡上配置的IP地址本身,而不是基于该地址的网络地址部分进行路由。
主机路由多被用于不希望通过网络地址路由的情况。(使用主机路由会导致路由表膨大,路由负荷增加,进而造成网络性能下降)
3).环加路由
  环回地址是在同一台计算机上的程序之间进行网络通信时所使用的一个默认地址。计算机使用一个特殊的IP地址127.0.0.1作为环回地址。与该地址具有相同意义的是一个叫做localhost的主机名,使用这个IP或主机名,数据包不会流向网络。

3.2.路由控制表的聚合(也叫路由汇总)
  利用网络地址的比特分布可以有效地进行分层配置,对内即使有多个子网掩码,对外呈现出的也是同一个网络地址。这样可以更好的构建网络,通过路由信息的聚合可以有效地减少路由表的条目。
能够缩小路由表的大小是它最大的优势。


4.IP分割处理与再构成处理

4.1.数据链路不同,MTU则相异
  每种数据链路的最大传输单元(MTU)都不相同。
  
4.2.IP报文的分片重组
  任何一台主机都有必要对IP分片进行相应的处理。分片往往在网络上遇到比较大的报文无法一下子发送出去才会进行处理(分片以8个字节的倍数为单位进行)。
  例子:如果以太网的默认MTU的是1500字节,因此4342字节的IP数据报无法在一个桢当中发送完成。这时,路由器将此IP数据报划分成了3个分片进行发送。而这种分片处理只要路由器认为有必要,会周而复始地进行
  经过分片之后的IP数据报在被重组的时候,只能由目标主机进行。路由器虽然做分片但不会进行重组。这样的处理是由诸多方面的因素造成的。如现实中无法保证IP数据报是否经由同一个路径传送,因此途中即使等待片刻,数据包也有可能无法到达目的地。此处拆分之后的每个分片也有可能会中途中丢失,即使在途中某一处被重组,再经过其他路由时还会面临被分片的可能。

4.3.路径MTU发现
分片机制也有它的不足:
  1).路由器的处理负担加重。由于路由需要做的其他处理越来越多,加上物理传输速度不断提升,只要允许,是不希望由路由器进行IP数据包的分片处理的。
  2).在分片处理中,一旦某个分片丢失,则会造成整个IP数据报作废。
  为了应对以上问题,产生了一种新的技术“路径MTU发现”:指从发送端主机到接收端主机之间不需要分片时最大MTU的大小,即路径中存在的所有数据链路中最小的MTU。而路径MTU发现从发送主机按照路径MTU的大小将数据报分片后进行发送。这样就可以避免在中途的路由器上进行分片处理,也可以在TCP中发送更大的包。

路径MTU发现的工作原理如下:
  1).发送端主机发送IP数据报时将首部的分片禁止标志位设置为1(不分片)。根据这个标志位,途中的路由器即使遇到需要分片才能处理的大包,也不会去分片,而是将包丢弃。
  2).随后通过一个ICMP的不可达消息将数据链路上MTU的值给发送主机,将它设置为当前MTU。
  3-1).对于UDP,UDP中没有重发处理。发送主机在发送下一个消息时会根据这个MTU对数据报进行分片处理,如此反复,直到数据报被发送到目标主机为止没有再收到任何ICMP,就认为最后一次ICMP所通知的MTU即是一个合适的MTU值。
  4-1).所有的分片到达目标主机后被重组,再传给UDP层。
  3-2).对于TCP,根据TCP的重发处理,数据报会被重新发送。TCP负责将数据分成IP层不会再被分片的粒度以后传给IP层,IP层不再做分片处理
  4-2).不需要重组。数据被原样发送给接收端主机的TCP层。


5.IPv4与IPv6

  IPv6(IP version 6)是为了根本解决IPv4地址耗尽的问题而被标准化的网际协议。IPv4的地址长度为4个8位字节,即32比特。而IPv6的地址长度则是原来的4倍,即128比特,一般写成8个16位字节。从IPv4切换到IPv6极其耗时,需要将网络中所有主机和路由器的IP地址进行重新设置。

5.1.IPv6的特点
  IPv6的功能中的一部分在IPv4中已经得以实现,然而,即便是那些实现IPv4的操作系统,也并非实现了所有的IPv4功能。这中间有很多是根本无法使用或需要管理员介入才能实现的部分。而IPv6将这些通通作为必要的功能,减轻了管理员的负担。
1).IP地址的扩大与路由控制表的聚合
  IP地址依然适应互联网分层构造。分配与其地址结构相适应的IP地址,尽可能避免路由表膨大。
2).性能提升
  包首部长度采用固定的值(40字节),不再采用首部检验码。简化首部结构,减轻路由器负荷。路由器不再做分片处理(通过路径MTU发现只由发送端主机进行分片处理)
3).支持即插即用功能
  即使没有DHCP服务器也可以实现自动分配IP地址。
4).采用认证与加密功能
  应对伪造IP地址的网络安全功能以及防止线路窃听的功能
5).多播、Mobile IP成为扩展功能
  多播、Mobile IP被定义为IPv6的扩展功能。由此可以预期,曾在IPv4中难于应用的这两个功能在IPv6中能够顺利使用。

5.2.IPv6中IP地址的标记方法
  IPv6和IPv4在标记方法上进行区分,一般人们将128比特IP地址以每16比特为一组,每组用”:”隔开进行标记,而如果出现连续的0时还可以将这些0省略,并用两个冒号”::”隔开。但是一个IP地址只允许出现一次连续的冒号

5.3.IPv6的地址的结构

5.4.IPv6分段处理
  IPv6的分片处理中在作为起点的发送端主机上进行,路由器不参与分片。这也是为了减少路由器的负荷,提高网速。因此IPv6的”路径MTU发现“功能必不可少。
不过IPv6的最小MTU为1280字节,因此,在嵌入式系统中对于那些有一定系统资源限制的ymtlgo说,不需要进行”路径MTU发现“,而是在发送IP包时直接以1280字节为单位分片送出。


IPv4首部


  位/比特(bit)是计算机中最小的数据单位。一比特是单个的二进制数值,0或1。一字节(byte)由八比特构成。
IPv4协议头格式
  数据在经过IP网络层时,也会对数据进行封装,也就有相应的IP协议包头了。在以太网帧中,IPv4包头紧跟着以太网帧头,同时以太网帧头中的协议类型值设置为十六进制的0800。IPv4数据包由首部和数据两部分组成,首部由固定20字节的基本部分和0~40字节可变长度的任意选项组成
1).版本(Version)
  占4位,标识目前采用的IP协议的版本号。一般的值为0100(IPv4),0110(IPv6)
2).首部长度(Internet Header Length,IHL)
  占4 位,用来表示IP报首部的长度。指明IPv4协议首部长度的字节数包含多少个32位。范围是0000–1111(十进制表示15)
  在IP数据报中有4位bit来标示首部长度;1bit的标示数代表了首部是4个字节长(因为IPv4是32位,即4个字节),所以15对应60字节;当没有可选项时,这个标识符值为5,IP首部的长度为20字节(4 * 5);60是最大字节长。
  由于IPv4的包头可能包含可变数量的可选项,所以这个字段可以用来确定IPv4数据报中数据部分的偏移位置。当ip首部的度不是4字节的倍数时,必须要用最后的填充字段填充。所以数据部分的长度要从4字节的整数倍数开始。
3).服务类型(Type of Service,TOS)
  占8位,一般不使用。
4).总长度(Total Length,TL)
  占16位,表示的是数据和首部之和的长度。单位为字节,最大长度为2^16-1=65535个字节。尽管可以传送一个长达65535字节的IP数据报,但是大多数的链路层都会对它进行分段,即IP分片。
  
5).标识(Identification)
  占16位,当数据报的长度超过网络的MTU而必须分片时,这个唯一标识就被复制到所有的数据报片的标识中。具有相同的标识字段的值使分片后的各数据报能正确的重装成原来的数据报。
  标识字段唯一地标识主机发送的每一份数据报。通常每发送一份消息它的值就会加1。RFC791认为标识字段应该由让IP发送数据报的上层来选择。假设有两个连续的IP数据报,其中一个是由TCP生成的,而另一个是由UDP生成的,那么它们可能具有相同的标识字段。尽管这也可以照常工作(由重组算法来处理),但是在大多数从伯克利派生出来的系统中,每发送一个IP数据报,IP层都要把一个内核变量的值加1,不管交给IP的数据来自哪一层。内核变量的初始值根据系统引导时的时间来设置。
6).标志(Flags)
  占3位,目前只有后两位有意义
  MF=1时,表示后面还有分片,当MF=0时,表示这已是数据报中的最后一个。
  DF=1时 表示不能有分片。当DF=0时,允许分片。
7).片偏移(Fragment Offset,FO)
  占13位,表示当前片在原分组中相对于用户数据字段起点的相对位置。片偏移以8个字节为偏移单位。也就是说每个分片的长度一定是8字节的整数倍。
  IP协议头格式规定当封包被分段之后,由于网路情况或其它因素影响其抵达顺序不会和当初切割顺序一至,所以当封包进行分段的时候会为各片段做好定位记录,以便在重组的时候就能够对号入座。值为多少个字节,如果封包并没有被分段,则FO值为“0”。 占13位。
  
8).生存时间(Time To Live,TTL)
  占8位表示数据报在网络中的寿命
  TTL的意义是指明数据报在因特网中至多可以经过多少路由器。显然数据报能在因特网中经过的路由器的最大数值是255。
  当TTL初始值设为1时,表明这个数据报只能在本局域网中传送。
  TTL的初始值由源主机设置(通常为32或64),一旦经过一个处理它的路由器,它的值就减去1。当该字段的值为0时,数据报就被丢弃,并发送ICMP消息通知源主机。这样当封包在传递过程中由於某些原因而未能抵达目的地的时候就可以避免其一直充斥在网路上面。
9).协议(Protocol,PROT)
  占8位。表示上层所使用的协议。
  指该封包所使用的网络协议类型,如ICMP、DNS等。各协议对应的值如表所示。

分配编号 简称 00 IP 01 ICMP 02 IGMP 06 TCP 17 UDP协议

10).首部检验和(Header checksum)
  占16位 这个字段只检验数据报的首部,不会检验数据部分,ICMP、IGMP、UDP和TCP协议在它们各自的首部中均含有同时覆盖首部和数据检验和码。。数据报每经过一个路由器,路由器都要重新计算一下首部校验和。
  这个数值用来检错用的,用以确保封包被正确无误的接收到。当封包开始进行传送后,接收端主机会利用这个检验值会来检验余下的封包,如果一切无误就会发出确认信息表示接收正常。与UDP和TCP协议包头中的校验和作用是一样的。占16位。
  IP协议头格式规定了:计算一份数据报的IP检验和,首先把检验和字段置为0。然后,对首部中每个16位进行二进制反码求和(整个首部看成是由一串16位的字组成),结果存在检验和字段中。当接收端收到一份IP数据报后,同样对首部中每个16 位进行二进制反码的求和。由于接收方在计算过程中包含了发送方存在首部中的检验和,因此,如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该为全1。如果结果不是全1(即检验和错误),那么IP就丢弃收到的数据报。但是不生成差错消息,由上层去发现丢失的数据报并进行重传。
  ICMP、IGMP、UDP和TCP都采用相同的检验和算法,尽管TCP和UDP除了本身的首部和数据外,在IP首部中还包含不同的字段。由于路由器经常只修改TTL字段(减1),因此当路由器转发一份消息时可以增加它的检验和,而不需要对IP整个首部进行重新计算。
  
11).源地址(Source Address,SA)
  发送IP数据包的IP地址。占32位。
12).目的地址(Destination Address)
  接收IP数据包的IP地址。也占32位。
13).选项(Options)+填充(Padding)
  这两个选项较少使用,只有某些特殊的封包需要特定的控制才会利用到。共32位。这些选项通常包括:
  1).安全和处理限制:用于军事领域
  2).记录路径:让每个路由器都记下它的IP地址
  3).时间戳:让每个路由器都记下它的IP地址和时间
  4).宽松的源站选路:为数据报指定一系列必须经过的IP地址
  5).严格的源站选路:与宽松的源站选路类似,但是要求只能经过指定的这些地址,不能经过其他的地址。
  以上这些选项很少被使用,而且并非所有的主机和路由器都支持这些选项。选项字段一直都是以32位作为界限,在必要的时候插入值为0的填充字节。这样就保证IP首部始终是32位的整数倍(这是首部长度字段所要求的)。
  从以上IP协议头格式可以看出,IP协议包头大小也有两种:当没有“选项”这个字段时,为160位,20个字节;当有“选项”字段时为192位,24个字节。它与TCP协议包头大小是一样的。
  
下面看一个使用WireShark抓取到的一条信息的IP首部:

Internet Protocol, //互联网协议Src: 202.203.44.225 (202.203.44.225),//源IP地址Dst: 202.203.208.32 (202.203.208.32),//目的IP地址  Version: 4//版本4位,表示版本号,即常说的IPv4;相信IPv6以后会更广泛Header length: 20 bytes // IP包头部长度  Differentiated Services Field:0x00(DSCP 0x00:Default;ECN:0x00)//差分服务字段  Total Length: 48// IP包的总长度Identification:0x8360 (33632) //标志字段Flags: //标记字段Fragment offset: 0 //分段偏移量  Time to live: 128 //生存期TTL  Protocol: TCP (0x06) //此包内封装的上层协议为TCP  Header checksum: 0xe4ce [correct] //头部数据的校验和  Source: 180.97.33.108 (180.97.33.108) // 源IP地址  Destination: 192.168.2.56 (192.168.2.56) //目的IP地址

IPv6首部


1).版本
  类似于IPV4的版本号,字段为6。不过这个字段好像没什么用,因为IPv4和IPv6不兼容,在数据链路层都已经加以区分了,比如以太网数据链路层的数据帧,已经用不同协议族的协议帧来区分开来了。
2).通信量类
  8位,相当于IPv4的服务类型TOS字段。由于TOS在IPv4中几乎没有什么建树,未能成为卓有成效的技术,本计划在IPv6中删除这个字段。不过,出于今后研究的考虑还是保留了该字段。
3).流标号
  20位,准备用于服务质量(QoS: Quality Of Service)控制。使用该字段提供怎样的服务已经成为未来研究的课题。不用QoS时每一位可以全部设置为0.
  在进行服务质量控制时,将流标号设置为一个随机数,然后利用一种可以设置流的协议RSVP(Resource Reservation Protocol)在路由器上进行QoS设置。当某个包在发送途中需要QoS时,需要附上RSVP预想的流标号。路由器接收到这样的IP包后先将流标号作为查找关键字,迅速从服务质量控制信息中查找并做相应处理。
  此外,只有流标号、源地址、目标地址三项完全一致时,才被认为是一个流
  
4).有效载荷长度
  16位,给出了IPV6数据报中跟在定长的40直接数据报首部后面的字节数量,也就是包的数据部分。
  IPv4的总长度TL(Total Length)把首部计算在内,而IPv6没有。本字段为0表示实际长度超过16位字段的表示范围(可见不存在只有IPv6首部的数据报),于是放在一个特大净荷选项中(该字段长度为16比特,因此数据最大长度可达65535(FFFF)字节。不过,为了让更大的数据也能通过IP包发送出去,便增加了大型有效载荷选项。该选项为32比特,IPv6就可以一次发送最大4G字节的包)。
5).下一个首部
  8位,与IPV4的协议字段相似。字段类似与IPv4的协议字段,通常表示IP的上一层协议是TCP或UDP。不过在有IPv6扩展首部的情况下,该字段表示后面第一个扩展首部的协议类型。
6).跳数限制
  8位,类似于IPV4的TTL。为了强调“可通过路由器个数”这个概念,才将名字改成了“Hop Limit”。数据每经过一次路由器就减1,减至0就丢弃数据。

7).源地址和目的地址
  都128比特(16个8位字节)构成,表示发送端的IP地址 或接收端IP地址
8).IPv6扩展首部
  IPv6的首部长度固定,无法将可选项加入其中。取而代之的是通过扩展首部对功能进行了有效扩展。
  扩展首部通常介于IPv6首部与TCP/UDP首部中间。在IPv4中可选项长度固定为40字节,而IPv6的扩展首部可以是任意长度。扩展首部当中还可以包含扩展首部协议以及下一个扩展首部字段。
  IPv6首部中没有标识以及标志字段,在需要对IP数据报进行分片时,可以使用扩展首部。
  具体的扩展首部可以去查查。如当需要对IPv6的数据进行分片时,可以设置扩展域为44.
  
从对比可以看到,IPV6相对于IPV4做出的变化:
  1).扩大的地址容量,IPV4的IP地址只有32位比特,即4亿多个地址。而IPV6有128位地址,即3.4028237e+38个地址。
  2).标识、标志以及片偏移在IPV6已经去掉了。因为分片也是有开销的,这是路由器和端系统更为复杂。同时,分片容易被用于生成致命的DOS攻击。因此在IPV6不执行分片了。这是如果路由器收到的IPV6数据报因太大而不能转发到出链路,则路由器只需丢掉该数据报,并向发送方发回一个“分组太大的”ICMP差错报文。于是发送方能够使用较小长度的IP数据报重发数据。
  3).IPV6去掉了首部检验和(因为TCP与UDP在做检验和计算的时候使用伪首部,所以可以验证IP地址或协议是否正确。因此,即使在IP层无法提供可靠传输,在TCP或UDP层也可以提供可靠传输的服务),因此路由器不再需要计算检验和,从而也提高了包的转发率。因为在因特网上,运输层和链路层都执行了检验操作。而且快速处理IP分组才是关注重点。
  4).选项也不再是标准IP首部的一部分,但它并没有消息,而是当需要时放在“下一个首部”
  5).正因为上述的改变,IPV6形成了40个字节的定长首部。这就允许更快地处理IP数据报。

  下面为IPv6与IPv4的主要不同。可以理解对IPv4这个协议进行了优化,优化最关键的就是要找到瓶颈,找到短板。由于数据量很大,路由的处理速度就是这个短板。IPv6对头部设计上采取了简化措施,把一些不必要的东西,或者可以放到上层的东西从头部拿掉,放到上层(其实没有分层,可以理解为放到除了首部别的地方),让路由的“职责单一”,尽可能的高效,有点OOD的意思。
  1).没有首部长度字段,这样路由读取处理的时候就方便了多。IPv6固定头部字段为40个字节。在40个字节的首部之后可以跟任意种类和数目的扩张首部,不过这都和路由没什么关系,路由器也不关心。
  2).如果首部是64位对齐,那么IPv6的地址字段也是64位对齐的,加快在64位体系结构上的处理。
  3).IPv6首部没有用于分片的字段,因为IPv6另有一个独立的分片首部用于该目的。做出如此设计决策因为分片属于异常情况,而异常情况不应该减慢正常处理。
  4).IPv6没有自身的校验和字段。因为上层协议(TCP、UDP、和ICMPv6)数据单元都有各自的校验和字段,其校验和包括上层协议首部、上层协议数据。转发IPv6分组的路由器不必在修改跳限字段之后重新计算首部校验和。从而加快路由的转发
  5).IPv6路由器不对所转发的分组执行分片,如果不经分片无法转发某个分组,路由器就丢弃该分组,同时向其源头发送一个ICMPv6错误,也就是说IPv6分片只发生在数据报的源头主机上。


二、IP协议相关技术

  IP旨在让最终目标主机收到数据包,但是在这一过程中仅仅有IP是无法实现通信的。必须还有能够解析主机名称和MAC地址的功能,以及数据包在发送过程中异常情况处理的功能。下面介绍DNS(应用层),、DHCP(应用层), ARP, ICMP等协议。

1.DNS

  DNS(Domain Name System),应用层协议。是一个维护一个用来表示组织内部主机名和IP地址之间对应关系的数据库。主机往往会利用一个叫hosts的数据库文件 。不仅适用于IPv4, 还适用于IPv6.
  DNS详解


2.ARP

  只要确定了IP地址,就可以向这个目标地址发送IP数据报。然而,在底层数据链路层,进行实现通信时却有必要了解每个IP地址所对应的MAC地址。
  ARP(Address Resolution Protocol)是一种解决地址问题的协议。以目标IP地址为线索,用来定位一个应该接收数据分包的网络设备对应的MAC地址。如果目标主机不在同一个链路上时,可以通过ARP查找下一跳路由器的MAC地址。不过ARP只适用于IPv4,不能用于IPv6。IPv6中可以用ICMPv6替代ARP发送邻居探索消息。
  
2.1.ARP的工作机制
  ARP又是如何知道MAC地址的呢?简单地说,ARP是借助ARP请求与ARP响应两种类型的包确定MAC地址的。
  过程:
  1).主机A为了获得主机B的MAC地址,起初要通过广播发送一个ARP请求包,这个包包含了主机B的IP地址。广播的包可以被同一个链路上所有的主机或路由接收,因此ARP的请求包也就会被这同一链路上所有的主机和路由器接收。
  2).如果ARP请求包中的目标IP地址与自己的IP地址一致,那么这个节点就将自己的MAC地址放入到ARP响应包返回给主机A。
  总之,从一个IP地址发送ARP请求包以了解其MAC地址(请求包还有一个作用:将自己的MAC地址告诉对方),目标地址将自己的MAC地址填入其中的ARP响应包返回到IP地址。由此,可以通过ARP从IP地址获得MAC地址,实现链路内的IP通信。
  根据ARP可以动态地进行地址解析,因此,在TCP/IP的网络构造和网络通信中无需事先知道MAC地址究竟是什么,只要有IP地址即可。为了提高效率,通常的做法是把获取的MAC地址放到缓存里,接收主机端也把发送端的MAC地址放入缓存里。
  
2.2.IP地址和MAC地址缺一不可
  为什么既需要IP地址又需要MAC地址?考虑一下发送给其他数据链路中某一个主机时的情况,就不难理解了。如主机A想要发送IP数据报给主机B时必须得经过路由器C。即使知道了主机B的MAC地址,由于路由器C会隔断两个网络,还是无法直接从主机A发送数据报给主机B.
  “只要知道了IP地址,即使不做ARP,只要在数据链路上做一个广播不就能发给主机B了吗?”假如MAC地址就用广播地址,那么路由器D(无关路由器)也将会收到该广播消息,于是路由器D又将消息转发给路由器C(必经过的路由器),导致数据包被重复发送两次。为了防止这种现象出现,目前路由器可以做到将那些MAC地址成为了广播地址的IP数据报不进行转发。
  在以太网上发送IP包时,”下次要经过由哪个路由器发送数据报“这一信息非常重要,这里的”下一个路由器“就是相应的MAC地址。
  如此看到IP地址和MAC地址缺一不可。于是就有将这两个地址相关联的ARP协议。
  
2.3.RARP
  RARP(Reverse Address Resolution Protocol)是将ARP反过来,从MAC地址定位IP地址的一种协议。如将打印机服务器等小型嵌入式设备接入到网络时就经常会用得到。

2.4.代理ARP
  通常ARP包会被路由器隔离,但是采用代理ARP的路由器可以将ARP请求转发给邻近的网段。由此,两个以上网段的节点之间可以像在同一个网段中一样进行通信。
在目前的TCP/IP网络当中,一般情况下用路由器连接多个网络时,会在每个网段上定义各自的子网,从而进行路由控制。然后,对于那些不支持设定子网掩码的老设备来说,不使用代理ARP,有时就无法更好地使用网络。


3.ICMP

  ICMP(Internet Control Messages Protocol)互联网信报控制协议。ICMP只负责其中与IP相关的设置。
  架构IP网络时需要特别注意两点:1确认网络是否正常工作,2遇到异常时进行问题诊断
  ICMP的主要功能:1确认IP包是否成功送达目标地址,2通知在发送过程当中IP包被废弃的具体原因,改善网络设置等。不过ICMP是基于尽力而为的IP上进行工作的,是不可靠协议,因此无法保证服务质量,而且在网络安全优先于便利性的环境里往往无法使用ICMP。
在IP通信中如果某个IP包因为某种原因未能达到目标地址,那么这个具体的原因将由ICMP负责通知,ICMP的这种通知消息会使用IP进行发送。
  下面是 ICMP 报文的数据结构:
  
  类型:一个 8 位类型字段,表示 ICMP 数据包类型;
  代码:一个 8 位代码域,表示指定类型中的一个功能,如果一个类型中只有一种功能,代码域置为 0;
  检验和:数据包中 ICMP 部分上的一个 16 位检验和;

  ICMP的消息大致可以分为两类:一类是通知出错原因的错误消息,另一类是用于诊断的查询消息。
  
  
ICMP 差错报文
  当发送一份差错报文时,报文始终包含 IP 的首部和产生 ICMP 差错报文的 IP 数据报的前 8 位字节。这样,接收 ICMP 差错报文的模块就会把它与某个特定的协议(根据 IP 数据报首部中的协议字段来判断)和用户进程(根据包含在 IP 数据报前 8 个字节中的 TCP 或 UDP 报文首部中的 TCP 或 UDP 端口号来判断)联系起来。
  下面各种情况不会导致产生 ICMP 差错报文:
  1).ICMP 报文差错(ICMP查询报文可能会产生ICMP差错报文);
  2).目的地址是广播地址或多播地址的 IP 数据报;
  3).作为链路层广播的数据报;
  4).不是 IP 分片的第一片;
  5).源地址不是单个主机的数据报,也就是说,源地址不可能是零地址、环回地址、广播地址或多播地址;

  以下针对 ICMP 差错报文的类型进行分析:
  1).ICMP目标不可达消息(类型3):IP路由器无法将IP数据报发送给目的地址时,会给发送端主机返回一个目标不可达ICMP消息,并在这个消息中显示不可达的具体原因。
  2).ICMP重定向消息(类型5):如果路由器发现发送端主机使用次优的路径发送数据时,那么它会返回一个ICMP重定向消息给这个主机,这个消息包含了最合适的路由信息和源数据。主要发生在路由器持有更好的路由信息的情况下,路由器会通过这个 ICMP 重定向消息给发送端主机一个更合适的发送路由。
  3).ICMP超时消息(类型11):IP数据包中有一个字段TTL(Time to live,生存周期),它的值随着每经过一个路由器就会减1,直到减到0时该IP数据包被丢弃。此时,IP 路由器将发送一个ICMP超时消息给发送端主机,并通知该包已被丢弃。
  设置IP包生存周期的主要目的,是为了在路由控制遇到问题发生循环状况时,避免IP包无休止地在网络上被转发。

traceroute程序
  traceroute使用ICMP报文和IP首部中的TTL字段,它充分利用了ICMP超时消息。可以显示出由执行程序的主机到达特定主机之前历经多少路由器。其原理是:利用IP包的TTL从1开始按照顺序递增的同时发送UDP包,强制接收ICMP超时消息的一种方法。这样可以将所有路由器的IP地址逐一呈现。这个程序在网络上发生问题时,是问题诊断常用的一个强大工具,用法是”tracerout 目标主机地址”

  4).源抑制消息(类型4):当 TCP/IP 主机发送数据到另一主机时,如果速度达到路由器或者链路的饱和状态,路由器发出一个ICMP源抑制消息。

ICMP 查询报文
  1).ICMP回送消息:用于进行通信的主机或路由之间,判断发送数据包是否成功到达对端的消息。可以向对端主机发送回送请求消息,也可以接收对端主机回来的回送应答消息。网络上最常用的ping命令就是利用这个消息实现的。
  2).ICMP地址掩码消息:主要用于主机或路由想要了解子网掩码的情况。可以向那些主机或路由器发送 ICMP 地址掩码请求消息,然后通过接收 ICMP 地址掩码应答消息获取子网掩码信息。
  3).ICMP时间戳消息:可以向那些主机或路由器发送 ICMP 时间戳请求消息,然后通过接收 ICMP 时间戳应答消息获取时间信息。


4.DHCP

  应用层协议。如果逐一为每一台主机设置IP地址会非常麻烦,特别是在移动使用电脑手机等设备时,每移动到一个新地地方,都要重新设置IP地址。
  为了实现自动设置IP地址、统一管理IP地址分配,就有了DHCP(Dynamic Host Configuration Protocol)动态主机配置协议。有了DHCP协议,计算机只要连接到网络,就可以进行TCP/IP通信。也就是说DHCP让即插即用变得可能。而DHCP不仅在IPv4中,在IPv6中也可能使用。
  DHCP详解

5.IP隧道

  在如下图的网络环境里,网络A与网络B之间将无法直接进行通信。为了让它们之间正常通信,这时必须得采用IP隧道的功能。
  
  IP隧道中可以将那些从网络A发过来的IPv6的包统和为一个数据,再为之追加一个IPv4的首部以后转后给网络C。
  一般情况下,紧接着IP首部的是TCP或UDP的首部,然而,现在的应用当中”IP首部的后面还是IP首部/IPv6的首部“等情况与日俱增。这种在网络层的首部后面继续追加网络层首部的通信方法就叫做”IP隧道“
  
  构建一个既支持IPv4又支持IPv6的网络是一个极其庞大的工程,因此,那些不支持的路由器就可以采用IP隧道的技术转发数据包,而对应的IP地址也可以在一旁进行统一管理,这也大量减少了投资成本和减轻了管理员的部分工作(隧道一旦设置有误,会导致数据包在网络上无限循环等严重问题,因此此处的设置需要缓期谨慎)。
  Mobile IP、多播包的转播、IPv4网络中传送IPv6的包、IPv6网络中传送IPv4的包、数据链路桢通过IP包发送。
  下面为利用IP隧道转发多播消息的例子。由于现在很多路由器上没有多播包的路由控制信息,多播消息也就无法穿越路由器发送信息。那么在这类环境中,如果使用IP隧道,就可以使路由器用单播的形式发包(发包前为隧道追加IP首部,接收包前删除隧道IP首部),也就能够向距离较远的链路转发多播消息。


6、NAT

  NAT(Network Address Translation,网络地址转换):是用于在本地网络中使用私有地址,在连接互联网时转而使用全局IP地址的技术。除转换IP地址外,还出现了可以转换TCP、UDP端口号的NAPT(Network Address Ports Translator)技术,由此可以实现一个全局IP地址与多个主机的通信。(通常人们提到的NAT,多半是指NAPT)
  NAT(NAPT)实际上是为正在面临地址枯竭的IPv4而开发的技术。不过在IPv6中为了提高网络安全也在使用NAT,在IPv4和IPv6之间的相互通信当中常常使用NAT-PT

私有ip地址划分
  tcp/ip协议中,专门保留了三个IP地址区域作为私有地址,其地址范围如下:
    10.0.0.0/8: 10.0.0.0~10.255.255.255
    172.16.0.0/12:172.16.0.0~172.31.255.255
    192.168.0.0/16:192.168.0.0~192.168.255.255
  使用保留地址的网络只能在内部进行通信,而不能与其他网络互连。因为本网络中的保留地址同样也可能被其他网络使用,如果进行网络互连,那么寻 找路由时就会因为地址的不唯一而出现问题。但是这些使用保留地址的网络可以通过将本网络内的保留地址翻译转换成公共地址的方式实现与外部网络的互连。这也 是保证网络安全的重要方法之一。
  家用路由器的地址为192.168.1.1(其实还有192.168.0.1;192.168.1.254等等)就是因为这个网段足以支持家用小型局域网的使用,但是具体的设置会由与厂商本身的设定而不同。

6.1.NAT的工作机制
  以10.0.0.10的主机与163.221.120.9的主机进行通信为例。利用NAT,途中的NAT路由器将发送源地址从10.0.0.10转换为全局的IP地址(202.244.174.37)再发送数据。反之,当包从地址163.221.120.9发过来时,目标地址(202.244.174.37)先被转换成私有IP地址10.0.0.10以后再被转发。
  
  在NAT(NAPT)路由器内部,有一张自动生成的用来转换地址的表(这种转换表在NAT路由器上自动生成。如,在TCP的情况下,建立TCP连接首次握手时的SYN包一经发出,就会生成这个表。而后又随着收到关闭连接时发出FIN包的确认应答从表中删除)。当10.0.0.10向163.221.120.9发送第一个包时生成这张表,并按照表中的映射关系进行处理。
  当私有网络内的多台机器同时都要与外部进行通信时,仅仅转换IP地址,人们不免担心全局IP地址是否不够用。这时采用包含端口号一起转换的方式(NAPT)可以解决这个问题。
   这一点在传输层有详细的说明,只有目标地址、源地址、目标端口、源端口、协议类型都一致时才被认为是同一个通信连接。此时所使用的正是NAPT。

6.2.NAT-PT(NAPT-PT)

PT是Protocol Translatio的缩写。严格来讲NAT-PT是用来翻译IP地址,而NATP-PT则用来翻译IP首部与端口号的。

  现在很多互联网服务都基于IPv4,如果这些服务不能做到在IPv6中也能正常使用的话,搭建IPv6网络环境的优势也就无法谈起了。
  为了解决这个问题,就产生了NAT-PT(NAPT-PT)规范。NAT-PT是将IPv6的首部转换为IPv4的首部的一种技术。有了这种技术,那些只有IPv6地址的主机也就能够与IPv4地址的其他主机进行通信了。
  NAT-PT有很多形式,其中最让人们期待的当属结合DNS和IP首部替换的DNS-ALG(Application Level Gateway)。不过无论采用哪种形式,它们都避免不了下一小节涉及的问题。

6.3.NAT的潜在问题
  由于NAT(NAPT)都依赖自己的转换表,因此会有如下几点限制:
  * 无法从NAT的外部向内部服务器建立连接。(虽然可以指定端口号允许向内部访问,但是数量要受限于全局IP地址的个数)
  * 转换表的生成与转换操作都会产生一定的开销。
  * 通信过程中一旦NAT遇到异常需重新启动时,所有的TCP连接都将被重置
  * 即使备置两台NAT做容灾备份,TCP连接还是会被断开。

6.4.解决NAT的潜在问题与NAT穿越
  解决NAT上述潜在的问题有两种方法:
  1).改用IPv6。如果因为地址枯竭的问题得到解决,那么也就没必要再使用NAT了。然而,IPv6的普及到现在为止都远不及人们的预期,前景不容乐观。
  2).即使在一个没有NAT的环境里,根据所制作的应用,用户可以完全忽略NAT的存在而进行通信。原理:【在NAT内侧(私有IP地址的一边)主机上运行的应用为了生成NAT转换表,需要先发送一个虚拟的网络包给NAT的外侧。而NAT并不知道这个虚拟的包究竟是什么,还是会照样读取包首部中的内容,并自动生成一个转换表。这里,如果转换表构造合理,那么还能实现NAT外侧的主机与内侧的主机建立连接进行通信】。有了这个方法,就可以让那么处在不同NAT内侧的主机之间也能够进行相互通信。此外,应用还可以与NAT路由器进行通信生成NAT表,并通过一定的方法将NAT路由器上附属的全局IP地址传给应用。这种现象叫做“NAT穿越”。
  NAT外侧与内侧可以进行通信,这种现象叫做“NAT穿越”。于是NAT那个“无法从NAT的外部向内部服务器建立连接”的问题也就迎刃而解了。而且这种方法与已有的IPv4环境的兼容性非常好,即使不迁移到IPv6也是通信自如。也因为这样,IPv4的寿命又延长了,向IPv6的迁移也就放慢脚步了。
  
  缺点:
  1).NAT的规范越来越复杂,应用的实现变得更耗时。
  2).而且应用旦运行在一个开发者未预想的特殊网络环境中时,会出现无法正常工作、遇到状况时难于诊断等问题。


关于IP协议常见的问题:
1.为什么IP不是可靠连接的协议
  IP层没有超时和重传机制,没有连接握手协议。
2.IP数据报经过路由器都做了哪些改动
  IP没经过一个路由器,TTL数就会减一,如果最后TTL为0了,但是依然没有到达目的地,这个IP包将会被丢弃。
  这样做了目的是为了防止出现循环回路。并且最后一跳的路由器会发送一个ICMP不可达的数据包给源IP。
3.关于分片的问题
  IP数据包的长度为16,也就是说最大为65535个字节。但是我们知道数据链路层规定MTU最大传输单元为1500个字节。
  当IP数据包的大小超过了1500,IP数据包必须要进行分片处理。这还只是初始发送端的分片,在网络中如果某个路由器的MTU小于1500,那么还需要在路由器端做分片,这就给IP包的完整接收照成了很大的不确定性(我们知道数据包达到终点不一定是按照顺序的),因为万一某一个分片丢失,可能会造成真个IP重传,当然前提是高层协议支持重传。对于TCP协议,不存在分片的问题,因为TCP报头的选项字段有MSS字段,规定一个TCP包最大可传输的字节数,一般是1500-20-20=1460字节。也就是说到达IP封包的时候最大可承载数据只有1460个字节,这样就可以避免分片的问题。但是对于UDP这一类的协议,分片操作还是交给IP完成,虽然这样可以增加载荷的效率,但是稳定性会受到很大的影响。
  
为什么需要TCP/IP在运输层与网络层都执行差错检测?
  1.IP层只对IP首部计算了检验和,而TCP/UDP检测和是对整个TCP/UDP报文段进行的。
  2.TCP/UDP与IP不一定都必须属于同一个协议栈。TCP可以运行不同的协议上,而IP能够携带不一定要传递给TCP/UDP的数据。

原创粉丝点击