常用网络数据帧格式

2023-11-11


本文主要介绍ARP、ICMP、UDP、TCP等常用网络数据帧格式。

1 ARP帧格式

当一个应用层的数据在网络中传输时,会被逐步封装成链路层的帧,而帧是通过链路层的MAC地址进行定位传输的,那么一个初次通信的主机如何知道对方的MAC地址呢,这时候就需要ARP地址解析协议来获取对方的MAC地址,ARP是提供网络层地址(IP地址)到相关硬件地址(MAC)的映射。ARP工作在网络层,其格式如下图所示,每个字段的说明如下:

  • MAC层
    • 目的地址:数据包的目的MAC地址。
    • 源地址:数据包的源MAC地址。
    • 类型:上层协议类型,0x0800表示上层协议为IP协议,0x0806表示ARP协议,0x835表示RARP协议。
    • 数据:数据负载。
    • 校验码:检测数据是否在传输过程中出错。
  • ARP层
    • 硬件类型:指出硬件地址类型,对于以太网,该值为1。
    • 协议类型:指出映射的协议地址类型,对于IPv4地址,该值为0x0800。
    • 硬件大小:指出硬件地址的字节数,对于以太网中使用IPv4地址的ARP请求或应答,他的值为6。
    • 协议大小:指出协议地址的字节数,对于以太网中使用IPv4地址的ARP请求或应答,他的值为4。
    • 操作类型:指出该操作是ARP请求(值为1)、ARP应答(值为2)、RARP请求(3)、或者RARP应答(4)。
    • 源硬件地址:发送方以太网的MAC地址。
    • 源协议地址:发送方的协议地址(一般是IPv4协议地址)。
    • 目的硬件地址:接收方以太网的MAC地址。
    • 目的协议地址:接收方的协议地址(一般是IPv4协议地址)。

在这里插入图片描述
这里存在着一些重复的信息,以太网的头部和ARP消息中都存在发送方的硬件地址。对于一个ARP请求,除了需要获取的目的硬件地址为0之外,其他字段都需要填充,当一个系统收到一个ARP请求,它填充自己的硬件地址,将两个发送方地址和两个接收方的地址互换,把操作类型字段设置为2,然后发送生成的应答。ARP的基本工作流程如下:

  • 当目的地址和发送方在同一网段
    • ARP帧头部的目的MAC地址是FF:FF:FF:FF:FF:FF(广播地址,注意是头部中的目的MAC地址,而不是ARP消息中的目的MAC地址),同一广播域中的主机都可以收到这个广播帧。这包括运行任何协议的系统(IPV4或IPV6等),但不包括位于不同VLAN中的系统,因为VLAN划分了广播域。
    • 同一网段中的所有主机都会解析这一帧,如果发现这个帧中的目的IP地址就是自己时,就会以单播的形式响应。如果其他主机解析后发现不是发给自己的,则丢弃这个帧。这时接收的这个主机会记下发送方的IP地址到MAC地址的映射,以方便下次通信时使用。
  • 当目的地址和发送方在不同网段
    • 这时候需要网关介入,主机会先发送一个广播帧来获取网关的MAC地址,网关收到帧后会响应给主机自己的MAC地址。
    • 主机收到网关的MAC地址后,又封装了一个带有目标IP的帧以单播的形式给网关,网关收到这个帧后会解析其中的IP地址,根据自己的路由表来决定怎么转发这个包,网关会把源IP地址和源MAC地址改为自己的地址,目的IP不变来生成一个新的ARP帧转发给下一跳。
    • 经过一次或数次转发后这个数据包会到达目标主机所在的子网中,发送给对应的目标主机,目标主机响应一个帧来回应。

在这里插入图片描述
在这里插入图片描述

2 ICMP帧格式

ICMP允许主机或路由报告差错情况和提供有关异常情况。ICMP是因特网的标准协议,但ICMP不是高层协议,而是IP层的协议。通常ICMP报文被IP层或更高层协议(TCP或UDP)使用。一些ICMP报文把差错报文返回给用户进程。ICMP报文作为IP层数据报的数据,加上数据报的首部,组成数据报发送出去。其格式如下图所示,每个字段的说明如下:

  • MAC层:同ARP帧
  • IP层
    • 版本:IP协议版本,IPv4为0x4。
    • 首部长度:IP首部长度,单位长度为4个byte,下图所示为5,即20byte。
    • 服务类型:前3bits优先级字段(现在已经不用了),后4bits TOS字段, 最后1bit备用位。4bits TOS位分别代表D(delay)最小时延、T(throughput)最大吞吐量、R(reliability)最高可靠性和C(cost)最小费用,只能设置其中1bit,如果所有 4bits均为0,那么就表示是一般服务。
    • 总长度:包括首部和数据部分,能表示的最大长度为 65535(216-1)。不过由于链路层的MTU限制。超过1480字节后就会被分片(以太帧MTU为1500的情况下,除去20字节的包头)。
    • 标识:用来唯一标识主机发送的每一份数据报,IP软件会在存储器中维持一个计数器,每产生一个数据段,计数器就加1,并将此值赋给标志字段。如数据报由于超过网络的MTU(最大传送单元)而必须分片时,这个标志字段的值就会被复制到所有的数据报的标识字段中,相同的标识字段的值使分片后各数据报片能正确的重装成为原来的数据报。
    • 标志:第一位0bit保留;中间位DF(Don’t Fragment),DF为0 表示能分片,DF为1 表示不能分片。最低位为MF(More Fragment) ,MF为1表示后面还在传输数据报的分片,MF为0表示最后一个报文段。
    • 片偏移:用于数据包分片和重组。13位(片)偏移字段,较长的分组在分片后,某片在原来分组中的相对位置。分片偏移以8bytes做为计量单位,第一个分片偏移为0。所以当片偏移为0时,表示这个数据报文没有分片,或者第一个分片。
    • 生存时间:用来设置数据报最多可以经过的路由器数,由发送数据的源主机设置,通常为32、64、128等,每经过一个路由器,其值减1,直到0,该数据报被丢弃。
    • 协议:指明IP数据字段中的数据采用上层什么协议封装的,常见的有ICMP(1)、IGMP(2)、TCP(6)、UDP(17)。
    • 首部校验和:填充根据IP头部计算得到的校验和码。计算方法是:对头部中每个16比特进行二进制反码求和,但不含涉及头部后的数据字段。
    • 源IP地址:数据包的源IP地址。
    • 目的IP地址:数据包的目的IP地址。
    • 数据:数据负载。
  • ICMP层:ICMP所有报文的前4个字节都是一样的,其它字段根据ICMP报文类型不同而不同。
    • 类型(type):ICMP报文类型,用于标识错误类型的差错报文或者查询类型的报告报文。
    • 代码(code):根据ICMP差错报文的类型,进一步分析错误的原因,代码值不同对应的错误也不同,例如:类型8、代码0表示回显请求(ping请求);类型0、代码0表示回显应答(ping应答);类型11、代码0代表超时。
    • 校验和(checksum):包括数据在内的整个ICMP数据包的检验和;其计算方法和IP头部检验和的计算方法一样的。
    • 标识符(Identifier):对于每一个发送的数据报进行标识。
    • 序列号(Sequence number):对于发送的每一个数据报文进行编号,发送的第一个数据报序列号为1,第二个序列号为2。
    • 数据:数据负载。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3 UDP帧格式

UDP是User Datagram Protocol的简称,中文名是用户数据报协议,是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。一个完整的UDP帧也包含MAC层和IP层的字段,UDP层包含的字段如下图所示,各字段含义如下:

  • 源端口号:由基于UDP应用程序的用户进程随机选择。
  • 目的端口号:接收者所用的端口号,一般由应用程序来指定。
  • UDP长度:标明UDP头部和UDP数据的总字节长度。
  • UDP校验和:用来对UDP头部和UDP数据进行校验。
  • 数据:数据负载。

在这里插入图片描述

4 TCP帧格式

TCP协议与UDP协议在同一层,一个完整的TCP帧也包含MAC层和IP层的字段。TCP是一种网络传输协议,它可以确保数据在网络中传输的可靠性。它使用可靠的传输机制来确保数据在网络中传输的完整性和可靠性。TCP层包含的字段如下图所示,每个字段的含义如下所述:

  • 源端口号:由基于UDP应用程序的用户进程随机选择。
  • 目的端口号:接收者所用的端口号,一般由应用程序来指定。
  • 序号:用来标识从TCP源端向TCP目的端发送的数据字节流,它表示在这个报文段中的第一个数据字节的序号。如果将字节流看作在两个应用程序间的单向流动,则TCP用序号对每个字节进行计数,序号是32bit的无符号数,序号达到 232-1 后又从0开始。比如我们收到一个数据报中序号为0,数据报内容为20字节,那么下一个数据报的序号就应该是21。当建立一个新的连接时,控制位中SYN标志变为1,序号字段包含由这个主机选择的该连接的初始顺序号ISN。
  • 确认序号:包含发送确认的一端所期待收到的下一个顺序号。因此,确认序号应该是上次已经成功收到数据字节顺序号加1 。比如我们收到的一个数据报的序号0 ,数据报内容为20字节,那么我们的确认序号应该是21,用来表明序号为0,内容为20字节的数据报已经收到,接下来期望收到的是序号为21的数据报。只有控制位中ACK标志为1时确认序号字段才有效。
  • 首部长度:给出报头中4个byte字的数目(没有“选项”字段时为4’d5),需要这个值是因为“选项”字段的长度是可变的,这个字段占4bit,即TCP最多有60(15*4)字节的首部。
  • 保留:保留给将来使用,目前必须置为0。
  • 控制位:控制位包括
    • URG:为1表示紧急指针有效,为0则忽略紧急指针值。
    • ACK:为1表示确认号有效,为0表示报文中不包含确认信息,忽略确认号字段。
    • PSH:为 1 表示是带有PUSH标志的数据,表示发送端缓存中已经没有待发送的数据,指示接收方应该尽快将这个报文段交给应用层而不用等待缓冲区装满。
    • RST:用于复位由于主机崩溃或其他原因而出现错误的连接。它还可以用于拒绝非法的报文段和拒绝连接请求。一般情况下,如果收到一个RST为1的报文,那么一定发生了某些问题。
    • SYN:同步序号,为1表示连接请求,用于建立连接和使序号同步。
    • FIN:用于释放连接,为1表示发送方已经没有数据发送了,即关闭本方数据流。
  • 窗口大小:表示从确认序号开始,本报文的源方可以接收的字节数,即源方接收窗口的大小。窗口大小是一个16bit字段,因而窗口大小最大为216-1 。
  • 校验和:对整个的TCP报文段(包括TCP头部和TCP数据以及伪报文头)进行校验和计算。这是一个强制性的字段,要求由发送方计算和存储,并由接收端进行验证(接收端要与发送端数值结果完全一样,才能证明数据是有效的)。
  • 紧急指针:是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式,只有当URG标志置为1时紧急指针才有效。
  • 选项:n*4字节,常见的可选字段是最长报文大小MSS(Maximum Segment Size)。每个连接方通常都在通信的第一个报文段 (为建立连接而设置 SYN 标志的那个段)中指明这个选项,它指明本端所能接收的最大长度的报文段。选项长度不一定是32位字的整数倍,所以需要添加填充位,使得报文长度为32位字的整数倍。
  • 数据:数据负载。

在这里插入图片描述
TCP可靠传输机制使用三次握手机制来确保数据的可靠传输。在三次握手机制中,客户端和服务器之间会发送三个报文段,以确认连接的建立。在第一次握手中,客户端发送一个SYN报文段,表示客户端准备建立连接。在第二次握手中,服务器会发送一个SYN/ACK报文段,表示服务器已经收到客户端的请求,并准备建立连接。在第三次握手中,客户端会发送一个ACK报文段,表示客户端已经收到服务器的确认,并准备建立连接。此外,TCP可靠传输机制还使用确认机制来确保数据的可靠传输。在确认机制中,每当客户端发送一个数据报文段,服务器都会发送一个ACK报文段,表示服务器已经收到客户端发送的数据报文段。如果客户端没有收到服务器发送的ACK报文段,客户端会重新发送数据报文段,直到收到服务器发送的ACK报文段为止。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

常用网络数据帧格式 的相关文章

  • 读写锁 share_mutex

    实现一个Windows下的共享锁 读写锁 一 作者 tyc611 cublog cn 2008 11 18 在Windows Vista Server 2008之前 Windows没有提供共享锁 通俗称为读写锁 只能靠自己实现 但从Wind
  • java基础面试题系列(71 - 80)

    20200714 by 1z 请你说明HashMap 和 HashTable的区别 1 是否同步 HashMap是非同步的 HashTable是同步的 2 继承体系 HashTable继承自Dictionary HashMap继承自Abst
  • Linux下多进程通信(signal,pipe)

    操作系统实验导航 实验一 银行家算法 https blog csdn net weixin 46291251 article details 115384510 实验二 多级队列调度和多级反馈队列调度算法 https blog csdn n

随机推荐

  • GpuMat ROI

    在引用GpuMat数据的ROI时 需要保证该数据在Gpu 内存中存储是连续的 使用gpu createContinuous创建连续空间 cuda GpuMat dst pyr laplace tmp dst pyr laplace gpu
  • LL(1)文法构造FIRST、FOLLOW、分析表并分析

    一 实验目的 学生运用编译原理的知识在实验技能和方法自行设计实验方案并加以实现 二 使用仪器 器材 计算机一台 操作系统 Windows10 编程软件 Intellij IDEA 三 实验内容及原理 1 实验内容 输入任意一个正确的文法G
  • Windows音量变化通知 - 系统音量监控

    Windows音量变化通知 系统音量监控 Endpoint Volume Controls 1 实现IAudioEndpointVolumeCallback接口 2 主函数 总结 参考 Endpoint Volume Controls 本次
  • 婚姻好不好,嫁给谁很重要

    都说幸福的婚姻是相似的 不幸的婚姻各有各的不幸 事实上 那些不幸的婚姻 追根究底不过都是找错了人 婚姻好不好 关键就在于嫁给谁 因为 值得相信的从来不是感情 而是人 人若靠谱 婚姻便可靠 人若靠不住 婚姻迟早生变 这世上 有的夫妻恩恩爱爱
  • 一次发生在JVM新生代和老年代的GC过程简述

    首先 我们假设程序当前的堆空间的情况如下 然后 程序在运行过程中 开始了我们的第一次YoungGC 年轻代GC 得到如下的图 通过这次的GC 我们的2 3 4对象都被回收了 只有1对象得到了保留 进入了S1 幸存者区 然后我们的程序在运行的
  • Java 通过Soap方式调用WebService接口

    import org apache commons lang3 StringEscapeUtils import org apache http HttpEntity import org apache http client config
  • 短视频seo抖音矩阵源码开发搭建技术解析

    一 短视频seo抖音矩阵源码开发需要考虑以下几个方面 技术选型 选择合适的开发语言 框架和数据库 常用的开发语言有Java PHP等 常用的框架有Spring Django等 常用的数据库有MySQL MongoDB等 服务器的选择 根据应
  • 如何在 NodeJs 中上传、处理和存储文件:分步手册

    存储文件有三种基本方法 1 直接将其存储在数据库中 2 将其存储在文件系统中并将路径保存到数据库 3 将其存储在某些云存储中 例如 Amazon S3 Google Cloud Storage 或 Microsoft Azure Blob
  • 去除自定义AlertDialog黑边

    http blog csdn net mwj 88 article details 45482421 1 现象描述 html view plain copy View view LayoutInflater from getActivity
  • java学习笔记——day1

    java笔记 字面量 变量 数据类型 命名规则 类型转换 运算符operator API 程序的流程控制 数组 字面量 变量 字面量 计算机用来处理数据的 字面量就是告诉程序员 数据在程序中的书写格式 字符 单引号 一个字符 字符串 双引号
  • python+selenium自动化软件测试(第3章):unittes

    3 1 unittest简介 前言 python基础比较弱的 建议大家多花点时间把基础语法学好 这里有套视频 可以照着练习下 http pan baidu com s 1i44jZdb 密码 92fs 熟悉java的应该都清楚常见的单元测试
  • 分层测试(一):什么是分层测试?

    什么是分层测试 分层测试是通过对质量问题分类 分层来保证整体系统质量的测试体系 模块内通过接口测试保证模块质量 多模块之间通过集成测试保证通信路径和模块间交互质量 整体系统通过端到端用例对核心业务场景进行验证 用户体验通过手工测试确保无妨碍
  • Unity开发(2)建片草地

    文章目录 1 简述 2 创建 2 1 创建项目 2 2 进入开发窗体 3 建个地面 3 1 新建地面 3 2 调整地面大小 3 3 添加草地 3 3 1 初识Unity图片资源 3 3 2 添加图片资源 3 3 3 修改图片在场景中大小 1
  • C语言入门知识1(零基础新手适用)

    C语言入门知识1 零基础新手适用 程序语言 1 机器语言 机器语言是低级语言 是用01码来编写的二进制代码语言 2 汇编语言 汇编语言也是低级语言 是用英文字母和符号串编写的 3 高级语言 由于汇编语言依赖于硬件体系且符合较多 为了方便高级
  • Go中 defer的使用

    文章目录 简介 示例 使用场景 捕获异常 文件操作 简介 defer 是 Golang 中的一个非常有用的关键字 它用于注册延迟调用 也就是一个函数的执行被延迟到调用它的函数返回之后 常用于资源清理 异常处理等场景 示例 defer 是注册
  • python实现电子邮件编程

    一 几个专业名词 MUA MTA MDA 假设我们自己的电子邮件地址是me 163 com 对方的电子邮件地址是friend sina com 注意地址都是虚构的哈 现在我们用Outlook或者Foxmail之类的软件写好邮件 填上对方的E
  • C++提高8: 类模板成员函数类外实现和类模板分文件编写

    1 类模板成员函数类外实现 类外实现主要有三个关键点 作用域 识别T的数据类型 告诉编译器这是一个类模板 剩下的 就还是基础的类内声明类外定义实现了 直接上代码观察一下 include
  • redis后台实现投票功能

    原创文章 转载请注明出处https blog csdn net qq 41969845 article details 108406059 一 前言 本文以投票功能为例 从实际例子中熟练掌握redis的应用 阅读本文需要有一定的Java基础
  • SparkStreaming与Kafka010之05之01 Consumer

    package Kafka010 import Kafka010 Utils MyKafkaUtils import org apache kafka clients consumer ConsumerRecord import org a
  • 常用网络数据帧格式

    常用网络数据帧格式 1 ARP帧格式 2 ICMP帧格式 3 UDP帧格式 4 TCP帧格式 本文主要介绍ARP ICMP UDP TCP等常用网络数据帧格式 1 ARP帧格式 当一个应用层的数据在网络中传输时 会被逐步封装成链路层的帧 而