网络层(3)IP数据报
IP协议介绍
1、IP协议是TCP/IP协议族中最为核心的协议。IP协议将多个包交换网络连接起来,它在源地址和目的地址之间传送一种称为数据包的东西,它还提供对数据大小的重新组装功能,以适应不同网络对包大小的要求。IP协议承载所有上层的TCP、UDP、ICMP数据都以IP数据报格式进行传输。
2、IP提供不可靠、无连接的数据报传送服务。不可靠(unreliable)意为它不提供端到端的或(路由)结点到(路由)结点的确认,对数据没有差错控制,它只使用报头的校验码,它不提供重发和流量控制,如果出错可以通过ICMP报告,ICMP在IP模块中实现,任何需要可靠传输的数据都需要TCP来提供。无连接(connetionless)意为它不维护任何后续数据报的状态信息,每个数据报的处理是相互独立的,数据报可以不按发送顺序接收。
IPv4协议结构
1、版本(4bit):目前的协议版本号是4,IP也称为IPv4。
2、首部长度(4bit):指的是包括IP首部固定部分和可变部分的总长(不含数据部分)。由于首部长度占4bit,可以表示的最大数值为15(二进制数为1111),那它能表示的最长首部长度为60字节。这60字节是怎么计算的呢?因为这里规定 首部长度的单位是1bit 代表4B 也就是32bit,是1bit位代表4B = 32bit,那么15 * 4B(32bit/8bit) = 60B(字节)。另外IP数据报的最小长度是20B(字节),那么首部长度的值最小应该对应 5,对应的二进制数为 0101。
IP数据报规定了IP首部的长度的最小值是5、最大值是15,可以表示的最小长度是20B(字节)最大长度是60B(字节)。
3、区分服务(8bit):设置数据报的优先级,包括一个3位的优先字段,4位的TOS字段和1位的保留字段(必须置0)。
优先字段3位:设置了数据包的重要性,取值越大数据越重要,取值范围为:0(正常)- 7(网络控制),延迟字段:1位,取值:0(正常)、1(期特低的延迟)。
流量字段:1位,取值:0(正常)、1(期特高的流量)。
可靠性字段:1位,取值:0(正常)、1(期特高的可靠性)。
成本字段:1位,取值:0(正常)、1(期特最小成本)。
4、总长度(16bit):总长度是指数个IP数据报的长度,以字节为单位,即IP数据报首部 + 数据部分 。利用IP首部长度字段和总长度字段,就可以知道IP数据报中数据内容的起始位置和长度。该字段长16bit,因此数据报的最大长度为2^16-1=65535字节。当一个数据报封装成链路层的帧时,此数据报的总长度(即首部加上数据部分)一定不能超过下面的数据链路层的MTU值。
5、标识(16bit):IP协议在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。但这个“标识”并不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。当数据报由于长度超过网络的MTU而必须分片时,这个标识字段的值就被复制到所有的数据报的标识字段中,因此同一个数据报的所有分片都具有相同的标识值。
6、标志(3bit):第一位保留。第二位(Don’t Fragment,DF)表示“禁止分片”,如DF=1 禁止分片 DF=0 允许分片。如果设置了这个位,IP模块将不对数据报进行分片,在这种情况下,如果IP数据报长度超过MTU的话,IP模 块将丢弃该数据报并返回一个ICMP差错报文,第三位(More Fragment,MF)表示“更多分片 MF=1 还有分片 MF=0 没有分片”,除了数据报的最后一个分片外,其他分片都要把它置1。
7、片偏移(13bit):较长的分组在分片后,某片在原分组中的相对位置。也就是说,相对用户数据字段的起点,该片从何处开始,片偏移以8个字节为偏移单位,这就是说,除了最后一个分片,每个分片的长度一定是8字节(64位)的整数倍。
8、生存时间(8bit):(Time To Live,TTL)是数据报到达目的地之前允许经过的路由器跳数。TTL值被发送端设置(常见的值是64)。数据报在转发过程中每经过一个路由,该值就被路由器减1。当TTL值减为0时,路由器将丢弃数据报,并向源端发送一个ICMP差错报文。TTL值可以防止数据报陷入路由循环。
9、协议(8bit):用来区分数据部分所使用的上层协议,其中,ICMP是1,TCP是6,UDP是17。
10、首部检验和(16bit):这个字段只检验数据报的首部,但不包括数据部分,这是因为数据报每经过一个路由器,路由器都要重新计算一下首部检验和。(交换机是二层设备不识别IP数据报文这要注意)
11、源地址(32bit):
12、源端IP地址和目的端IP地址:用来标识数据报的发送端和接收端。一般情况下,这两个地址在整个数据报的传递过程中保持不变,而不论它中间经过多少个中转路由器。
13、可选字段(40bit):这部分最多包含40字节,因为IP头部最长是60字节(其中包含固定部分20字节)。此字段的长度可变,从1个字节到40个字节不等,取决于所选择的项目,某些选项项目只需要1个字节,它只包括1个字节的选项代码。但还有些选项需要多个字节,这些选项一个个拼接起来,中间不需要有分隔符,最后用全0的填充字段补齐成为4字节的整数倍。可选包括:
记录路由(record route),告诉数据报途经的所有路由器都将自己的IP地址填入IP头部的选项部分,这样我们就可以跟踪数据报的传递路径。
时间戳(timestamp),告诉每个路由器都将数据报被转发的时间,填入IP头部的选项部分,这样就可以测量途经路由之间数据报传输的时间。
松散源路由选择(loose source routing),指定一个路由器IP地址列表,数据报发送过程中必须经过其中所有的路由器。
严格源路由选择(strict source routing),和松散源路由选择类似,不过数据报只能经过被指定的路由器。
14、填充(16bit):全0,把首部补全成4B的整数倍。
IP数据报分片实例
IP数据报封装格式
IP路由选择(实例 )
测试路由的走向,我用H3c模拟器做了实验,整个环境中有R1、R2、R3三台路由器,路由器的MAC、IP都标识如下:
测试项目
1、目标IP与本地IP是同一地址段(如172.16.1.1 -> 172.16.1.2),不需要网关转发,即可通信,
请求时,源MAC地址(78:51:7b:21:0f:05)、源IP地址(172.16.1.1) 向 目标MAC地址(78:51:84:11:10:05)目标IP地址(172.16.1.2)发请求包;
回复时,目标MAC地址(78:51:84:11:10:05)、目标IP地址(172.16.1.2)向 源MAC地址(78:51:7b:21:0f:05)、源IP地址(172.16.1.1) 发回复包。
2、目标IP与本地IP是不同地址段(如172.16.1.1 -> 172.16.2.2),需要网关转发,才可通信,
请求时,源MAC地址(78:51:7b:21:0f:05)、源IP地址(172.16.1.1) 向 目标MAC地址(78:51:84:11:10:05)目标IP地址(172.16.2.2)发请求包;
回复时,目标MAC地址(78:51:84:11:10:05)、目标IP地址(172.16.2.2)向 源MAC地址(78:51:7b:21:0f:05)、源IP地址(172.16.1.1) 发回复包。
注:通过观查测试结果可以知道,当目标IP与本地IP是不同地址段时,请求和回复时,都需要通过R1路由器上的网关R2上的接口地址请求和回复,也就是需要网关来完成数据报的转发,而IP地址无论是请求还是回复两种测试项目中都无变化(没有做NAT的情况)。