IP 数据报首部分析

来来来, 爷们. 不是一直说纸上得来终觉浅么. 今咱就抓个数据报具体看一看真实网络中的 IP 报首部.

操作方法很简单, 使用wireshark进行抓包. 抓包后随便找个包看一下就行, 毕竟所有通信的包都需要经过网络层.(同时, wireshark会对协议的相关信息给出标识, 更方便我们查看)

其中数据链路层的首部信息在整个数据的最前面, 其后跟着的是网络层, 传输层, 最后剩下的是传输的数据内容. 这个很好理解, 数据从上到下, 每过一层, 都会添加对应的头部信息, 先过传输层就先加上咯.

咱们今儿个主要就看看 IP 协议的首部内容. 走着...

要查看指定字段在其中的位置, 左键点击一下, 数据内容就会高亮了. 好贴心哦.

简单介绍一下各个字段的意思:

  • 协议版本号(4b): 标识当前 IP 协议的版本号.
  • 首部长度(4b): 标识首部长度. 单位是/4B. 也就是首部最长15*4=60B
  • 区分服务(8b):
  • 总长度(16b): 首部+数据的长度. 因为 TCP 的首部是在传输层加上的, 所以传输层的首部也会被认为是数据的一部分. IP 层可传输的数据长度为 65535-60=65475B
  • 标识(16b): 当数据包被分组时, 用于标识不同的分组. 方便接收方对数据包进行重组
  • 标志(3b): 用于一些特殊标志
  • 片偏移量(13b): 当数据包超出长度后, 会分组传输. 此字段标识数据的偏移量. 单位是/8B
  • 生存时间(8b): 数据包在网络中的寿命, 经过 n 跳之后就不再转发了
  • 协议(8b): 标识当前包的数据部分协议
  • 校验和(8b): 用于校验在网络传输中是否失真. 仅校验首部
  • 源地址(32b): 数据包的源IP地址
  • 目标地址(32b): 数据包的目标 IP 地址
  • 可选内容: 一些其他的可选字段

对于网络层协议来说, 每增加一个字段, 都会影响整体的传输速度. 所以当初设计协议的时候, 定是经过了一再斟酌, 最终才保留了这些不可获取的字段.

协议版本号

标识当前协议的版本, 目前主要用来区分 IPV4和 IPV6.

若此字段缺失, 则无法区分不同版本 IP 协议

首部长度

因为协议的首部存在可选字段, 所以需要添加字段用来指明首部的长度. 以4B 为一个单位应该也是经过多次探讨的了. 当首部为20b 时, 则没有使用可选字段.

若此字段缺失, 无法正确识别协议首部结尾.

区分服务

标识此数据包在传输过程中的一些要求服务.

  • 1-3位: 标识数据包重要性. 在网络分组传输种, 较为重要的包会优先传输. 如一个语音通话的数据包, 和一个文件下载的数据包, 明显前者更为优先.
  • 4位: 0(正常延迟), 1(想要较低的延迟)
  • 5位: 1(想要高流量)
  • 6位: 1(要高可靠性)
  • 7位: 也是拥塞控制相关的.
  • 8位: 1(网络拥塞预警)

总长度

用于对识别当前数据报的结尾.

标识

因为数据在网络层会被分片, 所以增加标识分片所在分组.

若此字段缺失, 则无法对数据包进行正确重组.

标志

  • 第一位: 保留
  • 第二位: 0(可以分段), 1(不能分段)
  • 第三位: 0(当前是最后一个分段), 1(后面还有更多的分段)

偏移量

当接收方接收到多个数据分段时, 进行重组的依据. 该字段占13b, 单位是8B. 也就是说 IP 协议传输数据超过: (2^14-1)*8=131064B≈123kb. 不过一个网络层的包也不会这么大.

而网络层对数据包进行分段是依据 MTU 计算的. MTU 则是其自动协商, 取链路最小值.

若此字段缺失, 则接收方无法对数据包进行正确重组.

生存时间

就是你在使用ping命令时, 现实的ttl. 此值每经过一次转发, 就会减一. 当减到0的时候, 该数据包就被丢弃了.

若此字段缺失, 当出现在网络中不存在的目标, 导致数据包在网络中循环传输时永远都不会消失. 而这样的数据一多, 则整个网络都会变得拥堵.

协议

标明数据部分的协议, 用于正确识别数据包上层协议, 并将数据正确转交给指定进程.

搜一下: IP 协议号, 随便打开一个可以看到所有的协议.

若此字段缺失, 则网络层无法将数据正确上交.

校验和

接收方校验在物理传输过程中, 协议首部是否存在损坏. 数据部分不做检查.

若此字段缺失, 则接收方无法缺失接收的数据与发送的数据是否一致.

源地址

用于标识数据包的源地址.

目标地址

用于标识数据包的目标地址.

可选内容

方便后面对协议的扩充. 现在已有的如:

  • 记录路径: 每个路由器都记下其IP 地址
  • 记录时间戳: 每个路由都记下其IP 与时间
  • 等等

感觉可选内容在使用中很少用到, 我抓了各种包, 暂时还没有碰到过有使用的.


协议在设计的时候真的是省吃俭用啊, 平常开发时用到的数据都是以字节为单位的, 人家网络层协议是以位为单位使用的.

后面再看TCP首部的时候, 也可以如此查看其在传输过程种的真正模样.

爷们, 希望你看到这里了...

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

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

相关文章

git 子模块在项目中的使用

在公司的项目中, 经常会遇到一些公共的内容, 多个项目中间通用的, 不可能每次都将整个代码复制一遍, 遇到这种情况有很多不同的解决方案, 一般来说, 项目是通过 git 来管理的, 巧了, git 也同样支持子模块. 创建子模块 git submodule add gitgitee.com:hujingnb/submodule_so…

GO 内存对齐

前言 之前遇到过这样一个情况(发现问题的结构体并不长这样, 不过为了引出问题, 改了一下): type Test struct { b bool i3 int32 i8 int8 i64 int64 by byte } func main() { t : Test{} fmt.Printf("%d", unsafe.Sizeof(t)) } 创建一个结构体, 查看一下其内存占用.…

HBase 命令行

hbase是一款分布式数据库. 其对数据的索引只通过row key进行. 在存储数据的时候, 通过row key的排序进行存储. 在面对一个新的数据库时, 深究其原理并不知一个明智的选择, 正如开车一般, 大多数人都是先学会开车, 然后在开车的过程中车子出故障了, 再慢慢学着去修理. 不管怎么说…

《论可计算数及其在判定上的应用》简单理解

刚刚拜读了一本书, 《图灵的秘密》. 该书介绍了图灵的论文《论可计算数及其在判定上的应用》, 其指出: 一个拥有铅笔, 纸和一串明确指令的人类计算者, 可以被看做是一种图灵机. 那么图灵机是什么呢? 是图灵为了描述可计算数而引出的一个虚构的可以做一些简单操作的计算机器. 尽…

PHP为什么empty可以访问不存在的索引

开始之前, 先抛出问题: $arr []; echo empty: , PHP_EOL; var_dump(empty($arr[1])); echo is_array: , PHP_EOL; var_dump(is_array($arr[1]));这段代码的运行结果: 你是否和我有过同样的疑问? 同样是函数, 为什么empty访问不存在的索引就不会报错呢? 按理说哈, 函数调用的…

浮点数运算丢失精度

今天碰到了这样一个情况, 使我又去翻阅了原来课本, 在Pthon中如果输入下面这段程序: print(sys.float_info.max - 1.0) print(sys.float_info.max)结果如下: 结果发现, 这数字根本没有变化. 本来这没什么, 看这数字, 10的308次方, 也就是说, 减去的1是在308位之后了, 这里没有…

变量的作用域

起因 最近闲来无事, 在 Python 官网上看到了2.0版本, 是2001年的. 打算装起来体验一下最初发布的版本, 但是发现只有 Windows 版本, 所以我就装了个 Windows10的虚拟机, 就在我打算安装的时候, 发现: 这激起了我的好胜欲, 于是我就依次安装了Windows 8, Windows 7, Windows XP…

PHP8的注解

PHP8.0增加了注解的支持, 虽然 PHP的注解没用过, 但是咱用过JAVA的注解呀. 注解这玩意怎么用? 简单说就下面几步: 定义注解类使用注解提取注解 到了PHP中, 也基本上换汤不换药. 使用 定义注解类 #[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_FUNCTION)] cl…

HBase 数据存储结构

在HBase中, 从逻辑上来讲数据大概就长这样: 单从图中的逻辑模型来看, HBase 和 MySQL 的区别就是: 将不同的列归属与同一个列族下支持多版本数据 这看着感觉也没有那么太大的区别呀, 它解决了 MySQL 的那些问题呢? 每一个新事物的出现, 都是为了解决原本存在的问题. 对写入…

spark计算操作整理

spark 的计算流程大概如图: 其中, 通过多次处理, 生成多个中间数据, 最后对结果进行操作获得数据. 本文不涉及任何原理, 仅总结spark在处理的时候支持的所有操作, 方便后面使用的时候, 可以参照本文进行数据的处理. 以下函数整理, 基与Python中RDD对象. 数据的转换操作 数据…

软件工程模型

你在工作中, 软件的开发流程是怎样的? 你是否想过, 除了你当前使用的流程, 还存在其他怎样的流程? 现在的流程有哪些问题, 又能够如何解决? 别说, 前辈们已经给出了一些项目流程的模型, 既软件工程. 可以简单了解一下, 带动一下我这生了锈的脑子. 在很久以前, 一个软件的从…

路径.git下的文件

用了这么久的git, 可以毫不谦虚地说对git是一无所知. 每天用来用去的就是commit, add, merge 等几个有限的命令, 这不符合我这刨根问底的性格啊. 不行, 得研究研究, 从哪里下手呢? 别的咱先不说, 所有 git 项目都有这么一个文件夹.git, 不如就从它入手 ? 那咱就看看这个文件夹…

git 操作二进制文件

平常用git进行项目管理已经稀松平常了, 今天咱来点不一样的. 平常管理的都是普通的文本文件, 如果是二进制文件, git能够处理么? 比如word文档. 测试一下. 新建一个项目, 在其中创建test1.docx, test2.txt两个空文件并提交. 之后编辑文件并添加标题, git diff看一下效果: 效…

搭建个人博客

一直都想着搞一个自己的个人博客, 拖着这么久, 最近终于开始动手了. 故留下一篇完整的记录, 若你也刚好有相同的需要, 那这篇文章应该恰好能够帮助到你. 准备 云服务器个人域名 如果没有云服务器, 将应用跑在自己的电脑上, 通过内网穿透大概也能达到效果, 但是个人电脑实在没…

nginx 配置文件的匹配规则

引出 之前在对php-fpm 进行nginx代理时, 为了对后台限定 IP 访问, 添加了如下配置: location ^~ /admin {allow 127.0.0.1;deny all; }结果呢? 所有admin路径下的php文件, 全都没有解析, 变成文件下载了. 当时我不知道是什么问题, 不过将这段配置去掉之后, 问题就消失了. 所…

计算机是如何进行时间同步的

WHY 在网络世界中, 各个计算机之间要想协同工作, 时间同步是一个十分重要的基础. 在计算机内部是有自己的时间的, 这个时间通过内部的晶体振荡器差生的固定频率, 来模拟时间流逝进行计算. 虽然频率十分稳定, 但也是有误差的, 虽然现在的工艺水平误差已经十分小了. (关于震荡的…

WordPress架构简单剖析

前言 最近在搭建自己的博客站点时, 选择了网站使用较多的WordPress, 随着慢慢的使用, 它灵活的插件和主题令我折服. 基本上任何想要实现的功能, 都可以在上面通过插件的形式进行添加. 无论是在访问前的缓存、访问后的统计、访问中的过滤、各种流程的修改等等, 几乎都能够以插件…

阿里云定时任务并自动释放

前言 最近写了一个爬虫脚本, 脚本跑在一台北京的 ecs 上. 但奈何因某种未知力量, 需要连接代理才能访问目标网站. 本来想着自己搭代理, 但是太贵了, 就暂时搁置了. 直到我发现了这个: 阿里云香港的服务器, 一个小时才5分钱. 如果脚本直接跑在香港服务器上不就可以了咩, 按照这…

智能优化算法应用:基于金豺算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于金豺算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于金豺算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.金豺算法4.实验参数设定5.算法结果6.参考文献7.MA…

PHP-PDO参数绑定问题

前言 今天在执行这样一段代码: $data [username > hujingnb,address > beijing, ]; $dbh new PDO("mysql:host{$host};dbname{$dbname}", $username, $password); $statement $dbh->prepare(INSERT INTO test_user (username, address) VALUES (:usern…