协议簇:IPv4 解析

简介

IP 是一种无连接的协议. 操作在使用分组交换的链路层(如以太网)上。此协议会尽最大努力交付数据包。

尽最大努力意味着:
IP 协议不保证数据的可靠传输, 没有流量控制机制, 不保证传输序列(意味着 IP 数据包会在传输过程中乱序), 没有接受确认 (ACK) 机制, 也没有重传机制.

主要功能

IP 协议提供了两个基本的功能 寻址(Address)分片(Fragmentation).

这里我们先简单看一下概念,后面会详细分析具体是如何实现的.

寻址(Address)

IP 协议定义了 32 bit 的 IP 地址. IP 协议的实现模块会根据 IP 数据包头部中的目的地址发送/转发数据包到目的地址.

  1. 数据包在由源地址到目的地址的过程中,可能会经过多个中间节点, 这些节点需要使用适当的路由协议转发数据包。也可能丢弃数据包。
  2. IP 协议实现模块认为每个 IP 数据包都是独立的,任意两个 IP 数据包之间没有任何联系.

IP 协议还提供了以下机制来配置 IP 协议提供的服务:

  1. Type of Service: 用来保证 IP 协议服务的的质量.
  2. Time to Live: 指定一个 IP 数据包的生命周期的上限. 这个值由发送发设置,该数据包没经过一个中间节点,该数据包中的 Time to Live 值便减少1,当这个值变为零并且还未到达目的地址,该数据包会在该中间节点被丢弃.
  3. Options: 一些控制位,在某些情况下会被使用.
  4. Header Checksum: 用来检测数据包在传输过程中是否发生了错误. 如果在某个节点发现数据出错,数据会在该节点被丢弃.

分片(Fragmentation)

由于不同的物理链路对于数据的最大长度有着不同的限制,因此 IP 数据在传输过程中可能会被拆分为多个较小的数据包进行传输.

发送方可以将数据包设置为 ”don‘t fragment", 这种数据包会被丢弃当数据包的大小大于当前物理链路的最大数据包限制.

IPv4 Header 格式

IP Header Format
接下来,我们逐一介绍一下每个字段的含义:

  1. Version: 4 bit. 表明当前 IP 协议的版本.
  2. IHL: 是 Internet Hander Length 的缩写,长度为 4 bit. 它的值是一个整数,指向 IP 数据包中所承载的实际数据的开始字节. 单位为 4 字节.
  3. Type of Service: 8 bit. 表明当前数据包所期待的服务类型。 8 个 bit 的含义分别如下:
    • bits 0-2: 表明数据包的优先级
    • bit 3: 0 代表 Normal-Delay, 1 代表 Low-Delay
    • bit 4: 0 代表 Normal-Throughput,1 代表 High-Throughput
    • bit 5: 0 代表 Normal-Reliable, 1 代表 High-Reliable
    • bits 6-7: 保留
      这个字段很少使用,这里仅供参考.
  4. Total Length: 16 bit. 表明当前数据包的总长度, 包括 IP 头和数据. 单位是字节. 最大长度为 65535 字节,
  5. Identification: 16 bit. 一个由发送者设置的 id 值,用来帮助将分片后的数据包整合为一个数据包. 后边详细介绍
  6. Flags: 3 bit. 每个 bit 的含义如下:
    • bit 0: 保留
    • bit 1: (DF) 0 代表 May Fragment, 1 代表 Don’t Fragment
    • bit 2: (MF) 0 代表 Last Fragment, 1 代表 More Fragments
  7. Fragment Offset: 13 bit. 表明当前分片在所有分片中的位置. 单位为 8 字节.第一个分片该字段的值为 0.
  8. Time to Live: 8 bit.
  9. Protocol: 8 bit. 表明当前 IP 数据包中所承载的数据的协议. 也就是位于 IP 协议之上的协议.
  10. Header Checksum: 16 bit. 在数据包传输过程中,该值会随着 IP头部的值的改变而改变. 比如: Time to Live 变化,或者 IP 包被分片,这种情况下,都需要重新计算 checksum.
  11. Source Address, Destination Address: 各占 32 bit.
  12. Options: 可变长度字段. 由于 Options 比较复杂,下面详细描述
  13. Padding: 可变长字段. 用来将 IP 数据包长度填充为 32 bit 的整数倍. 填冲的 bit 位的值均为 0.

Options

该字段在 IP 头部属于可选字段,可以出现也可以不出现.

Optinos 字段中可以包含 0 到多个 Option,对于每个 Option 它的合法格式有以下两种:

  1. 使用一个单独的 Option-Type 作为该字段的值
  2. Option-Type + Option-Length + Option-Data 作为该字段的值

一个字节的 Option-Length 表明 后续 Option-Data 的长度. 单位也为字节.

Option-Type:

该类型长度为 8 bit. 每个 bit 的含义如下:

  • bit 0: copied field,
  • bit 1-2: option class
  • bit 3-7: option number
Copied field:

表明当需要对原始数据包进行分片时,该 Option 是否需要拷贝到每个分片中去.

  • 0 代表 not copied
  • 1 代表 copied
Option class:
  • 0: 代表 Control
  • 1: 保留
  • 2: 代表 Debugging and measurement
  • 3: 保留
当前可用的 Option
ClassNumberLengthDescription
00-End of Option list. 占用一个字节.没有长度
01-No operation. 占用一个字节.没有长度
0211Security.
03var.Loose Source Routing. 使用源发送者所提供的信息路由当前数据包
09var.Strict Source Routing. 使用源发送者所提供的信息路由当前数据包
07var.Record Route. 用于跟踪当当前数据包的路由
084Stream ID. 用于包含 Stream ID
24var.Internet Timestamp

抓包分析

未分片IP包

经过上面的学习,我们来尝试着分析一个 Wireshark 抓到的 IP 数据包.
Wireshakr IP Package
原始二进制数据为:
45 00 00 28 fa f1 40 00 32 06 ec 59 a1 75 ff 00
c0 a8 00 66

  1. 第一个字段为 Version,这里是 IPv4 协议,因此第一个字节便是 4.
  2. 第二个字段为 IHL, 我们看到它的值是 5, 由于该字段的单位为 4 字节,因此实际的数据是 20. 也就是说我们这个 IP包的包头长度为 20 字节. 说明一点, IP头的最小长度便是 20 字节。
  3. 第三个字段为 Type of Service. 很明显 wireshark 使用的描述和 RFC 中定义不同. 不过也没关系,该字段的值为 0. 也就是未使用.
  4. 第四个字段为 Total Length, 表明当前 IP包的整体长度为 40 字节。 20 字节的 IP 头部 和 20 字节的 TCP 数据.
  5. 第五个字段是 Identification
  6. 第六个字段是 Flags,它的值是 010 (二进制), 表明不要对当前 IP 数据包分片,且当前分片是 last frament.
  7. 第七个字段是 Fragment Offset, 由于该 IP 数据包未被分片,因此 我们看到 Fragment Offset 字段为 0.
  8. 第八个字段是 Time to Live, 它的值是 50.
  9. 第九个字段是 Protocol, 表明当前 IP 数据包中所承载的数据是 TCP 协议的数据包.
  10. 第十个字段是 Checksum
  11. 第十一个字段和十二个字段分别代表源地址和目的地址.
  12. Padding: 截图中未体现出来. 由于该数据包的实际长度为 50 字节,并非是 32 bit 的整数倍,因此需要使用 Padding 字段来填充该 IP 数据包. 计算得知 padding 应为 2 个字节,值为 0x0000.

分片 IP包

接下来我们来看看分片的 IP 数据包是怎么样的.
这里我们将会看到一个分成三个分片的数据包. 这里我们只关注分片相关的几个字段,其他字段参照上面分析.

第一个分片
IP Fragmentation: First Fragment
这里我们需要关注的字段有: Identification, Flags, 和 Fragment Offset 三个字段.

且看上图,这是一个IP包被分为三片中的第一片.

  1. 我们知道 Identification 的值是一个 Id,并没有具体意义,暂且略过.
  2. Flags 的值为 001(二进制), 根据 Flags 的定义我们知道:
    • 第二个 bit 为 0, 代表 May Fragment,说明该数据包可以被分片
    • 第三个 bit 为 1, 代表 More Fragment, 说明该数据包不是原始数据包分片中的最后一个.
  3. Fragment Offset 为 0, 代表当前分片是原始数据包分片中的第一个.

接下来且看第二个分片
IP Fragmentation: Second Fragment
4. 注意到当前分片的 Identification 值与第一个分片的值相同.
5. Flags 的值为 001(二进制), 根据 Flags 的定义我们知道:
- 第二个 bit 为 0, 代表 May Fragment,说明该数据包可以被分片
- 第三个 bit 为 1, 代表 More Fragment, 说明该数据包不是原始数据包分片中的最后一个.
6. Fragment Offset 为 1480. 这里需要注意 wireshark 显示的是计算过之后的值,如果你看它的原始数据的画你会发现该位的实际值为 .00010111001(二进制), 由于该字段的单位为 8 byte,因此等同于 00010111001 * 8 也就是 wireshark 中显示的那个值了. 由第一张图可以看到,第一个分片中的数据长度为 1480,因此第二个分片中的 Fragment offset 便对应于原始数据包中从 1480 位置除开始的数据. 数据长度依然为 1480.

接下来且看最后一个分片
IP Fragmentation:Last Fragment
7. 注意到当前分片的 Identification 值与前两个分片的值相同.
8. Flags 的值为 000(二进制), 根据 Flags 的定义我们知道:
- 第二个 bit 为 0, 代表 May Fragment,说明该数据包可以被分片
- 第三个 bit 为 0, 代表 Last Fragment, 说明该数据包是最后一个分片.
9. Fragment Offset 为 2960. 由于前两个分片的数据长度均为 1480,这个分片中的数据自然要从 2960 处开始了.

总结一下 IP 分片:
10. 如果将一个数据包的 Flags 中的 Don’t Flag 标志设置为 1, 那么该 IP 数据包不能被分片
11. 对于需要进行分片的数据包而言,分片规则如下:
- 对于第一个分片, Framgent Offset 设置为 0, 需要设置 More Fragment
- 对于中间分片, 需要设置 More Fragment, 且 Frament Offset 为之前所有分片中数据长度之和除以 8.
- 对于最后一个分片, 需要设置 Last Fragment, 且 Fragment Offset 为之前所有分片数据长度之和除以 8
- 同一个 IP 数据包分片之后的 IP 数据包需要设置相同的 Identification.

END!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499683.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

协议簇:ICMP 解析

简介 ICMP 是 Internet Control Message Protocol 的简写. 它主要用来调试网络通信环境中存在的问题. 比如,当 IP 数据包总是无法正常的发送到目的地址, 当网关没有足够的 buffer 来转发对应的数据包 等问题. 值得一提的是,它属于网络层,不属…

协议簇:TCP 解析: 基础

简介 本文我们将从 RFC 学习一下 RFC793 中描述的 TCP 协议. 这将区别于通常讲解计算机网络书籍中所描述的 TCP. 但他们必然是相统一的,不会互相冲突. 系列文章 协议簇:TCP 解析:基础 协议簇:TCP 解析:建立连接 协议…

协议簇:TCP 解析: 建立连接

简介 接前文 协议簇:TCP 解析: 基础, 我们这篇文章来看看 TCP 连接建立的过程,也就是众所周知的”三次握手“的具体流程. 系列文章 协议簇:TCP 解析:基础 协议簇:TCP 解析:建立连接 协议簇&a…

协议簇:TCP 解析: 连接断开

简介 接前文 协议簇:TCP 解析: 建立连接, 我们这篇文章来看看 TCP 连接断开的过程,也就是众所周知的”四次挥手“的具体流程. 系列文章 协议簇:TCP 解析:基础 协议簇:TCP 解析:建立连接 协议…

协议簇:TCP 解析: Sequence Number

简介 序列号(Sequence Number) 是 TCP 协议中非常重要的一个概念,以至于不得不专门来学习一下。这篇文章我们就来解开他的面纱. 在 TCP 的设计中,通过TCP协议发送的每个字节都对应于一个序列号. 由于每个字节都有自己的序列号&a…

CodeTank iOS App Technical Support

CodeTank iOS App Technical Support For All Email: z253951598outlook.com TEL: 86-17782749061 App Screen Shoots

CentOS 7 防火墙命令

查看防火墙状态 systemctl status firewalld如果已经开启,状态为 active 如果未开启,状态为 inactive 开启防火墙 systemctl start firewalld关闭防火墙 systemctl stop firewalld查看当前防火墙的配置 firewall-cmd --list-all这里,我…

QTcpSocket connectToHost 建立连接速度慢问题

问题场景 在使用 QT 开发一个客户端 App 的时候,我们通过 QTcpSocket 与后台服务器进程通信。 后台程序使用其他语言编写。 问题: 在客户端启用之后尝试建立与后台程序的 TCP 连接的时候,发现连接速度非常慢(肉眼可见的慢&#x…

GTank iOS App Technical Support

GTank iOS App Technical Support For All Email: z253951598outlook.com TEL: 86-17782749061 App Screen Shoots ​​

证书体系: CSR 解析

原文同时发布于本人个人博客: https//kutank.com/blog/cert-csr/ 简介 CSR 全称 “证书签名请求”(Certificate Signing Request). 本文我们将来详细的学习 CSR 的知识,重点集中在 CSR 所包含的信息,及其意义。 CSR 的作用: CSR 通常由想要获…

模拟网页行为之工具篇二

先说360浏览器,打开开发者选项,可以看到界面提供了几个功能选项,如图: 这个图片的第一个搜索图标点中过后,再去选中网页你感兴趣的部分就可以在Element选项中跳转到你感兴趣的代码。也可以直接ctrlF2搜寻你感兴趣网页元…

模拟网页行为之实践篇三

现在来谈下验证码图片的获取方式,带有验证码的地方都会附带有个刷新按钮,而刷新按钮的地方就是获取验证码网址代码。如果看过前面写的《模拟网页行为之工具篇》就会很容易定位到代码位置。定位到代码位置后看下图: 基本可以看到的是获取验证码…

SHA-256算法实现

SHA-256 算法输入报文的最大长度不超过2^64 bit,输入按512-bit 分组进行处理,产生 的输出是一个256-bit 的报文摘要。该算法处理包括以下几步: STEP1:附加填充比特。对报文进行填充使报文长度与448 模512 同余(长度…

ecc算法入门介绍

一、从平行线谈起。 平行线,永不相交。没有人怀疑把:)不过到了近代这个结论遭到了质疑。平行线会不会在很远很远的地方相交了?事实上没有人见到过。所以“平行线,永不相交”只是假设(大家想想初中学习的平行…

Intel Hex概述

什么是Intel Hex文件 Intel HEX文件时遵循Intel HEX文件格式的ASCII文本文件。在Intel HEX文件的每一行都包含了 一个HEX记录。这些记录是由一些代表机器语言代码和常量的16进制数据组成的。Intel HEX文件常用来传输要存储在ROM 或者 EPROM中的程序和数据。大部分的EPROM编程器…

AndroidStudio+ideasmali动态调试smali汇编

0x00 前言 之前对于app反编译的smali汇编语言都是静态分析为主,加上一点ida6.6的动态调试,但是ida的调试smali真的像鸡肋一样,各种不爽,遇到混淆过的java代码就欲哭无泪了。后来知道IDEA用一款插件也可以实现smali的动态调试&a…

使用IDA Pro动态调试SO文件

(1)在IDA的安装路径中找到android_server文件。 (2)将android_server拷贝到手机的/data/local/tmp目录下面。 (3) 将手机插上电脑,打开命令提示符, 先输入”adb shell”,然后输入”…

机器学习或深度学习的数据读取工作(大数据处理)

机器学习或深度学习的数据读取工作(大数据处理)主要是.split和re.findall和glob.glob运用。 读取文件的路径(为了获得文件内容)和提取文件路径中感兴趣的东西(标签) 1,“glob.glob”用于读取文件路径 2,“.…

Android系统架构图

一、Aplications(应用层) 应用是用Java语言编写的云新在虚拟机上的程序。 二、Application Framework(应用框架层) 这一层是编写Google发布的核心应用时所使用的API框架,开发人员可以使用这些框架来开发自己的应用。 V…

AES算法重点详解和实现

可以看到,在原始数据长度为16的整数倍时,假如原始数据长度等于16*n,则使用NoPadding时加密后数据长度等于16*n,其它情况下加密数据长度等于16*(n1)。在不足16的整数倍的情况下,假如原始数据长度等于16*nm[其中m小于16]…