1.IP服务的特点
IP协议是TCP/IP协议族的动力,它为上层协议提供无状态、无连接、不可靠的服务
- 无状态是指IP通信双方不同步传输数据的状态信息,因此所有IP数据报的发送、传输和接收是相互独立、没有上下文关系的。所以最大的缺点为无法处理乱序和重复的IP数据报。
- 无连接是指IP通信双方都不长久的维持对方的任何信息。
- 不可靠是指IP协议不能保证IP数据报准确的到达接收端,它只是尽最大努力。
- IP数据报头部提供了一个标识字段用以唯一标识一个IP数据报,但它是被用来处理IP分片和重组的,而不是用来指示接收顺序的。
- 优点:简单,高效。无须为保持通信的状态而分配一些内核资源,也无须每次传送数据时都携带状态信息。
2.IPv4头部结构
IPv4头部结构如下图,其长度通常为20字节,除非含有可变长的选项部分
- 4位版本号指定IP协议的版本
- 4位头部长度标识该IP头部有多少个32bit,因为4位最大表示15,所以IP头部最长是60字节。
- 8位服务类型包括一个3位的优先权字段(现已忽略),4位的TOS字段和1位保留字段(必须置0).4位的TOS字段分别标识:最小延时,最大吞吐量,最高可靠性和最小费用。其中最多有一个能置为1.
- 16位总长度是指整个IP数据报的长度,以字节为单位,因此IP数据报的最大长度为65535字节,但由于MTU的限制,长度超过MTU的数据报都将被分片传输。
- 16位标识唯一地标识主机发送的每一个数据报。其初始值由系统随机生成,每发送一个数据报,其值就加1.该值在数据报分片时被复制到每个分片中,因此同一个数据报的所有分片都具有相同的标识值。
- 3位标志字段的第一位保留。第二位(Don’t Fragment, DF)表示“禁止分片”。第三位(More Fragment, MF)表示“更多分片”,除了数据报最后一个分片外,其他分片都要把它置1.
- 13位分片偏移是分片相对原始IP数据报开始处(仅指数据部分)的偏移。实际偏移值是该值左移3位后得到的。
- 8位生存时间(Time To Live, TTL)是数据报到达目的地址之前允许经过的路由器跳数。
- 8位协议用来区分上层协议。
- 16位头部校验和由发送端填充,接收端对其使用CRC算法以检验IP数据报头部在传输过程中是否损坏。
- 32位的源端IP地址和目的端IP地址用来标识数据报的发送端和接收端。
- 最后一个选项字段是可变长的可选信息。这部分最多40字节。可选用的IP选项包括:
【1】记录路由,告诉数据报途径的所有路由器都将自己的IP地址填入IP头部的选项部分,这样就可以跟踪数据报的传递路径。
【2】时间戳,告诉每个路由器都将数据报被转发的时间填入IP头部的选项部分,装就可以测量途径路由之间数据报传输的时间。
【3】松散源路由选择,指定一个路由其IP地址列表,数据报发送过程中必须经过其中所有的路由器。
【4】严格源路由器选择,数据报只能经过被指定的路由器
3.IP分片
【1】上一篇博客说过,当数据报的长度超过帧的MTU时,将被分片传输。分片可能发生在发送端,也可能发生在中转路由器上,而且可能在传输过程中被多次分片,但只有在最终的目标机器上,这些分片才会被内核中的IP模块重新组装。
【2】以太网帧的MTU是1500字节(可通过ifconfig命令或者netstat命令查看)
因此它被携带的IP数据报的数据部分最多是1480字节(IP头部占用20字节)。用IP数据报封装一个长度为1481字节的ICMP报文(包括8字节的ICMP头部,所以其数据部分长度为1473字节),则该数据报在使用以太网帧传输时必须被分片。
第一个分片长度为1500字节,第二个IP分片的长度为21字节。每个IP分片都包含自己的IP头部,且第一个IP分片的IP头部设置了MF标志,而第二个没有设置该标志,因为它已经是最后一个分片了。原始IP数据报中的ICMP头部内容被完整的复制到了第一个IP分片中,第二个IP分片不包括ICMP头部信息,因为IP模块重组该ICMP报文的时候只需要一份ICMP头部信息。
4.IP路由
IP协议的一个核心任务是数据报的路由,即决定发送数据报到目标机器的路径。4.1IP模块工作流程
【1】当IP模块接收到来自数据链路层的IP数据报时,它首先对该数据报的头部做CRC校验,确认无误后就分析其头部的具体信息。
【2】如果该IP数据报的头部设置了源站选路选项,则IP模块调用数据报转发子模块来处理该数据报。如果该IP数据报的头部中目标IP地址是本机的某个IP地址,或是广播地址,即该数据是发给本机的,则IP模块就会根据数据报中头部中的协议字段来决定将它发送给哪个上层应用。如果IP模块发现该数据不是发给本机的,则也调用数据报转发子模块来处理该数据报。
【3】数据报转发子模块将先检测系统是否允许转发,如果不允许,IP模块就将数据报丢弃。如果允许,数据报转发子模块将对该数据报执行一些操作,然后将它交给IP数据报输出子模块。
【4】IP数据包应该发送到哪个下一跳路由(或目标机器),以及经过哪个网卡来发送,就是IP路由过程。IP模块实现数据报路由的核心数据结构是路由表
【5】IP输出队列中存放的是所有等待发送的IP数据报,其中除了需要转发的IP数据报外,还包括封装了本机上层的IP数据报。
ps: 虚线箭头显示了路由表更新的过程。这一过程是指通过路由协议或者route命令调整路由表,使之更适应最新的网络拓扑结构,称之为IP路由策略
4.2 路由机制
【1】路由表的查看,使用route命令或netstat命令。
【2】路由表的内容
【3】IP的路由机制
1.查找路由表中和数据报的目标IP地址完全匹配的主机IP地址。如果找到就使用该路由项,没找到到第二步。
2.查找路由表中和数据报的目标IP地址具有相同网路ID的网络IP地址。如果找到就使用该路由项,没找到到第三步。
3.选择默认路由项,这通常意味数据报的下一跳路由是网关。
4.3路由表更新
【1】路由表必须能够更新以反应网络连接的变化,这样IP模块才能准确、高效的转发数据报。route命令可以修改路由表。 【2】通过route命令或其他工具修改路由表是静态的路由更新方式。对于大型的路由器,通常通过BGP、RIP、OSPF等协议来发现路径,并更新自己的路由表,这种更新方式是动态的、自动的。5.IP转发
对于允许IP数据报转发的系统,数据报转发子模块将对期望转发的数据报执行如下操作:- 检查数据报头部的TTL值。(如果TTL是0,则丢弃该数据报)
- 查看数据报头部的严格源路由选择选项。如果该选项设置,则检测数据报的目标IP地址是否是本机的某个IP地址。如果不是,则发送一个ICMP源站选路失败报文给发送端。
- 如果有必要,给源端发送一个ICMP重定向报文,以告诉它更合理的下一跳路由器。
- 将TTL值减1。
- 处理IP头部选项。
- 如果有必要,执行IP分片操作。
6.重定向
【1】IP模块工作流程图中,显示了ICMP重定向报文也能用于更新路由表
【2】ICMP重定向报文格式
ICMP重定向报文的数据部分含义:
1.引起重定向的IP数据报的源端IP地址;
2.应该使用的路由器的IP地址;
接收主机根据这两个信息就可以断定引起重定向的IP数据报应该使用哪个路由器来转发,并且以此来更新路由表(通常是更新路由表缓冲,而不是直接更改路由表)。
7.IPv6头部结构、
IPv6解决了IPv4地址不够的问题,还做了改进,例如增加了多播和流的功能,为网络上多媒体内容的质量提供精细的控制;引入自动配置功能,使得局域网管理更方便……
7.1 IPv6固定头部结构
由40字节的固定头部和可变长的扩展头部组成。
- 4位版本号(version)指定IP协议的版本。对IPv6来说,其值是6。
- 8位通信类型(traffic class)指示数据流通信类型或优先级,和IPv4中的TOS类似。
- 20位流标签(flow label)是IPv6新增加的字段,用于某些对连接的服务质量有特殊要求的通信,比如音频或视频等实时数据传输。
- 16位净荷长度(payload length)指的是IPv6扩展头部和应用程序数据长度之和,不包括固定头部长度。
- 8位下一个包头(next header)指出紧跟IPv6固定头部后的包头类型,如扩展头(如果有的话)或某个上层协议头(比如TCP,UDP或ICMP)。它类似于IPv4头部中的协议字段,且相同的取值有相同的含义。
- 8位跳数限制(hop limit)和IPv4中的TTL含义相同。
- IPv6用128位(16字节)来表示IP地址,使得IP地址的总量达到了2^128个.
- 32位表示的IPv4地址一般用点分十进制来表示,而IPv6地址则用十六进制字符串表示,比如“FE80:0000:0000:0000:1234:5678:0000:0012”。可见,IPv6地址用“:”分割成8组,每组包含2字节。但这种表示方法过于麻烦,通常可以使用所谓的零压缩法来将其简写,也就是省略连续的、全零的组。比如,上面的例子使用零压缩法可表示为“FE80::1234:5678:0000:0012”。不过零压缩法对一个IPv6地址只能使用一次,比如上面的例子中,字节组“5678”后面的全零组就不能再省略,否则我们就无法计算每个“::”之间省略了多少个全零组。
7.2 IPv6扩展头部
它的长度可以为0,表示数据报没使用任何扩展头部。一个数据报可以包含多个扩展头部,每个扩展头部的类型由前一个头部中的下一个包头字段指定。 目前可用的扩展头部: