网络协议格式 | 以太网帧、ARP数据报、IP数据报、UDP数据报、TCP数据报

news2024/10/6 8:30:51

在这里插入图片描述

欢迎关注博主 Mindtechnist 或加入【Linux C/C++/Python社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。


网络协议格式 | 以太网帧、ARP数据报、IP数据报、UDP数据报、TCP数据报

    • 数据包封装
    • 以太网帧格式
    • ARP数据报格式
    • IP段格式
    • UDP数据报格式
    • TCP数据报格式


专栏:《网络编程》


数据包封装

传输层及其以下的机制由内核提供,应用层由用户进程提供(后面将介绍如何使用socket API编写应用程序),应用程序对通讯数据的含义进行解释,而传输层及其以下处理通讯的细节,将数据从一台计算机通过一定的路径发送到另一台计算机。应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation),如下图所示:

TCP/TP数据包封装

不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报(datagram),在链路层叫做帧(frame)。数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理。

以太网帧格式

以太网的帧格式如下所示:

以太网帧格式

其中的源地址和目的地址是指网卡的硬件地址(也叫MAC地址),长度是48位,是在网卡出厂时固化的。可在shell中使用ifconfig命令查看,“HWaddr 00:15:F2:14:9E:3F”部分就是硬件地址。协议字段有三种值,分别对应IP、ARP、RARP。帧尾是CRC校验码。
以太网帧中的数据长度规定最小46字节,最大1500字节,ARP和RARP数据包的长度不够46字节,要在后面补填充位。最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU,如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU,则需要对数据包进行分片(fragmentation)。ifconfig命令输出中也有“MTU:1500”。注意,MTU这个概念指数据帧中有效载荷的最大长度,不包括帧头长度。

ARP数据报格式

在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址,而数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃。因此在通讯前必须获得目的主机的硬件地址。ARP协议就起到这个作用。源主机发出ARP请求,询问“IP地址是192.168.0.1的主机的硬件地址是多少”,并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播),目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中。
每台主机都维护一个ARP缓存表,可以用arp -a命令查看。缓存表中的表项有过期时间(一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址。想一想,为什么表项要有过期时间而不是一直有效?
ARP数据报的格式如下所示:

ARP数据报格式

源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。硬件类型指链路层网络类型,1为以太网,协议类型指要转换的地址类型,0x0800为IP地址,后面两个地址长度对于以太网地址和IP地址分别为6和4(字节),op字段为1表示ARP请求,op字段为2表示ARP应答。
看一个具体的例子。
请求帧如下(为了清晰在每行的前面加了字节计数,每行16个字节):
以太网首部(14字节)

0000: ff ff ff ff ff ff 00 05 5d 61 58 a8 08 06

ARP帧(28字节)

0000: 00 01
0010: 08 00 06 04 00 01 00 05 5d 61 58 a8 c0 a8 00 37
0020: 00 00 00 00 00 00 c0 a8 00 02

填充位(18字节)

0020: 00 77 31 d2 50 10
0030: fd 78 41 d3 00 00 00 00 00 00 00 00

以太网首部:目的主机采用广播地址,源主机的MAC地址是00:05:5d:61:58:a8,上层协议类型0x0806表示ARP。
ARP帧:硬件类型0x0001表示以太网,协议类型0x0800表示IP协议,硬件地址(MAC地址)长度为6,协议地址(IP地址)长度为4,op为0x0001表示请求目的主机的MAC地址,源主机MAC地址为00:05:5d:61:58:a8,源主机IP地址为c0 a8 00 37(192.168.0.55),目的主机MAC地址全0待填写,目的主机IP地址为c0 a8 00 02(192.168.0.2)。
由于以太网规定最小数据长度为46字节,ARP帧长度只有28字节,因此有18字节填充位,填充位的内容没有定义,与具体实现相关。
应答帧如下:
以太网首部

0000: 00 05 5d 61 58 a8 00 05 5d a1 b8 40 08 06

ARP帧

0000: 00 01
0010: 08 00 06 04 00 02 00 05 5d a1 b8 40 c0 a8 00 02
0020: 00 05 5d 61 58 a8 c0 a8 00 37

填充位

0020: 00 77 31 d2 50 10
0030: fd 78 41 d3 00 00 00 00 00 00 00 00

以太网首部:目的主机的MAC地址是00:05:5d:61:58:a8,源主机的MAC地址是00:05:5d:a1:b8:40,上层协议类型0x0806表示ARP。
ARP帧:硬件类型0x0001表示以太网,协议类型0x0800表示IP协议,硬件地址(MAC地址)长度为6,协议地址(IP地址)长度为4,op为0x0002表示应答,源主机MAC地址为00:05:5d:a1:b8:40,源主机IP地址为c0 a8 00 02(192.168.0.2),目的主机MAC地址为00:05:5d:61:58:a8,目的主机IP地址为c0 a8 00 37(192.168.0.55)。

IP段格式

IP数据报格式

IP数据报的首部长度和数据长度都是可变长的,但总是4字节的整数倍。对于IPv4,4位版本字段是4。4位首部长度的数值是以4字节为单位的,最小值为5,也就是说首部长度最小是4x5=20字节,也就是不带任何选项的IP首部,4位能表示的最大值是15,也就是说首部长度最大是60字节。8位TOS字段有3个位用来指定IP数据报的优先级(目前已经废弃不用),还有4个位表示可选的服务类型(最小延迟、最大?吐量、最大可靠性、最小成本),还有一个位总是0。总长度是整个数据报(包括IP首部和IP层payload)的字节数。每传一个IP数据报,16位的标识加1,可用于分片和重新组装数据报。3位标志和13位片偏移用于分片。TTL(Time to live)是这样用的:源主机为数据包设定一个生存时间,比如64,每过一个路由器就把该值减1,如果减到0就表示路由已经太长了仍然找不到目的主机的网络,就丢弃该包,因此这个生存时间的单位不是秒,而是跳(hop)。协议字段指示上层协议是TCP、UDP、ICMP还是IGMP。然后是校验和,只校验IP首部,数据的校验由更高层协议负责。IPv4的IP地址长度为32位。

UDP数据报格式

UDP数据段

下面分析一帧基于UDP的TFTP协议帧。
以太网首部

0000: 00 05 5d 67 d0 b1 00 05 5d 61 58 a8 08 00

IP首部

0000: 45 00
0010: 00 53 93 25 00 00 80 11 25 ec c0 a8 00 37 c0 a8
0020: 00 01

UDP首部

002005 d4 00 45 00 3f ac 40

TFTP协议

0020: 00 01 'c'':''\''q'
0030: 'w''e''r''q''.''q''w''e'00 'n''e''t''a''s''c''i'
0040: 'i'00 'b''l''k''s''i''z''e'00 '5''1''2'00 't''i'
0050: 'm''e''o''u''t'00 '1''0'00 't''s''i''z''e'00 '0'

0060: 00以太网首部:源MAC地址是00:05:5d:61:58:a8,目的MAC地址是00:05:5d:67:d0:b1,上层协议类型0x0800表示IP。
IP首部:每一个字节0x45包含4位版本号和4位首部长度,版本号为4,即IPv4,首部长度为5,说明IP首部不带有选项字段。服务类型为0,没有使用服务。16位总长度字段(包括IP首部和IP层payload的长度)为0x0053,即83字节,加上以太网首部14字节可知整个帧长度是97字节。IP报标识是0x9325,标志字段和片偏移字段设置为0x0000,就是DF=0允许分片,MF=0此数据报没有更多分片,没有分片偏移。TTL是0x80,也就是128。上层协议0x11表示UDP协议。IP首部校验和为0x25ec,源主机IP是c0 a8 00 37(192.168.0.55),目的主机IP是c0 a8 00 01(192.168.0.1)。
UDP首部:源端口号0x05d4(1492)是客户端的端口号,目的端口号0x0045(69)是TFTP服务的well-known端口号。UDP报长度为0x003f,即63字节,包括UDP首部和UDP层pay-load的长度。UDP首部和UDP层payload的校验和为0xac40。
TFTP是基于文本的协议,各字段之间用字节0分隔,开头的00 01表示请求读取一个文件,接下来的各字段是:

c:\qwerq.qwe
netascii
blksize 512
timeout 10
tsize 0

一般的网络通信都是像TFTP协议这样,通信的双方分别是客户端和服务器,客户端主动发起请求(上面的例子就是客户端发起的请求帧),而服务器被动地等待、接收和应答请求。客户端的IP地址和端口号唯一标识了该主机上的TFTP客户端进程,服务器的IP地址和端口号唯一标识了该主机上的TFTP服务进程,由于客户端是主动发起请求的一方,它必须知道服务器的IP地址和TFTP服务进程的端口号,所以,一些常见的网络协议有默认的服务器端口,例如HTTP服务默认TCP协议的80端口,FTP服务默认TCP协议的21端口,TFTP服务默认UDP协议的69端口(如上例所示)。在使用客户端程序时,必须指定服务器的主机名或IP地址,如果不明确指定端口号则采用默认端口,请读者查阅ftp、tftp等程序的man page了解如何指定端口号。/etc/services中列出了所有well-known的服务端口和对应的传输层协议,这是由IANA(Internet Assigned Numbers Authority)规定的,其中有些服务既可以用TCP也可以用UDP,为了清晰,IANA规定这样的服务采用相同的TCP或UDP默认端口号,而另外一些TCP和UDP的相同端口号却对应不同的服务。
很多服务有well-known的端口号,然而客户端程序的端口号却不必是well-known的,往往是每次运行客户端程序时由系统自动分配一个空闲的端口号,用完就释放掉,称为ephemeral的端口号,这是为什么呢?
前面提过,UDP协议不面向连接,也不保证传输的可靠性,例如:
发送端的UDP协议层只管把应用层传来的数据封装成段交给IP协议层就算完成任务了,如果因为网络故障该段无法发到对方,UDP协议层也不会给应用层返回任何错误信息。
接收端的UDP协议层只管把收到的数据根据端口号交给相应的应用程序就算完成任务了,如果发送端发来多个数据包并且在网络上经过不同的路由,到达接收端时顺序已经错乱了,UDP协议层也不保证按发送时的顺序交给应用层。
通常接收端的UDP协议层将收到的数据放在一个固定大小的缓冲区中等待应用程序来提取和处理,如果应用程序提取和处理的速度很慢,而发送端发送的速度很快,就会丢失数据包,UDP协议层并不报告这种错误。
因此,使用UDP协议的应用程序必须考虑到这些可能的问题并实现适当的解决方案,例如等待应答、超时重发、为数据包编号、流量控制等。一般使用UDP协议的应用程序实现都比较简单,只是发送一些对可靠性要求不高的消息,而不发送大量的数据。例如,基于UDP的TFTP协议一般只用于传送小文件(所以才叫trivial的ftp),而基于TCP的FTP协议适用于 各种文件的传输。TCP协议又是如何用面向连接的服务来代替应用程序解决传输的可靠性问题呢。

TCP数据报格式

TCP数据段

与UDP协议一样也有源端口号和目的端口号,通讯的双方由IP地址和端口号标识。32位序号、32位确认序号、窗口大小稍后详细解释。4位首部长度和IP协议头类似,表示TCP协议头的长度,以4字节为单位,因此TCP协议头最长可以是4x15=60字节,如果没有选项字段,TCP协议头最短20字节。URG、ACK、PSH、RST、SYN、FIN是六个控制位,本节稍后将解释SYN、ACK、FIN、RST四个位,其它位的解释从略。16位检验和将TCP协议头和数据都计算在内。紧急指针和各种选项的解释从略。


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


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

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

相关文章

计算机视觉实战--OpenCV进行红绿灯识别

前言: Hello大家好,我是Dream。 OpenCV是一个开源的计算机视觉库,可以用于实现各种图像和视频处理任务,包括红绿灯识别。可以帮助自动驾驶汽车、智能交通系统等设备准确地识别红绿灯的状态,以便做出正确的决策。今天&a…

2022-Deep generative molecular design reshapes drug discovery-分子生成设计重塑药物发现

文章目录 药物发现中的深度生成模型化合物/分子的表示 Deep Generative Models递归神经网 RNN变分自动编码器 VAE生成性对抗网络 (Generative Adversarial Networks, GANs)Flow-based models强化学习(Reinforcement Learning, RL) 在小分子药物设计中的应用生成有效的小分子生成…

X2000 freeRTOS usb_bulk通信

例程 官方例程..\freertos\example\usb\device\gadget_generic_bulk.c&#xff0c;代码如下&#xff1a; #include <common.h> #include <usb/gadget_bulk.h> #include <os.h>static const struct gadget_id bulk_id {.vendor_id 0x1CBE,.product_id 0x…

3.1. 字符串与StringBuilder

1. 字符串&#xff08;String&#xff09; 在Java中&#xff0c;字符串由String类表示。字符串是一系列字符的组合&#xff0c;用于表示文本数据。字符串是不可变的&#xff0c;这意味着一旦创建了一个字符串对象&#xff0c;就不能修改它的内容。 创建字符串 创建字符串的方…

真的裂开了呀,现在的00后,真是卷死了,辞职信已经写好了

谁说00后躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。这不&#xff0c;上个月我们公司来了个00后&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪22K&#xff0c;都快接近我了。 后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。 …

Android 应用打包和编译技术

Android 应用打包和编译技术非常重要&#xff0c;因为它们可以帮助开发者将代码转换成可执行的应用程序&#xff0c;并优化应用程序的性能和稳定性。 1. Gradle Gradle 是基于 Groovy 语言和 Java 虚拟机&#xff08;JVM&#xff09;运行的构建工具&#xff0c;通过它来配置应…

【目标检测】yolov5代码实战

文章目录 一、yolov5介绍二、yolov5安装2.1 yolov5的源码下载2.2 预训练模型下载2.3 安装yolov5的依赖项2.4 检测是否安装成功 三、yolov5训练自己的数据集参考资料 一、yolov5介绍 YOLO 是 “You only look once” 缩写 , 是将图像划分为网格系统的对象检测算法&#xff0c;网…

110.(cesium篇)cesium动态河流流水

听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: cesium动态河流流水 下面献上完整代码,代码重要位置会做相应解释 <html lang="en

HHDESK及HHDBCS快捷升级功能

为提升用户体验&#xff0c;HHDESK及HHDBCS新增了一项功能&#xff0c;一键升级。 1 使用软件时快捷升级 在产品首页点击帮助&#xff0c;选择软件升级 弹出如下对话框&#xff1b;点击确定 随即弹出对话框&#xff1b;点击浏览&#xff0c;选择下载到本机上的新版本产品…

踢碎破局陷阱,来一场酣畅淋漓的 SLG!

SLG 作为深度策略游戏品类的代表&#xff0c;一直是展现人类智慧之光的最佳舞台之一。欣赏顶尖玩家间的对决是一场大脑的狂欢&#xff0c;奇谋频出、神机莫测般的对局让人不禁摩拳擦掌&#xff0c;跃跃欲试。但当我们打开游戏时&#xff0c;往往是高玩难觅&#xff0c;人机相陪…

3.4. Java集合框架(List、Set、Map等)

Java集合框架是Java提供的一套用于存储和操作数据的接口和类。它包括以下几个主要部分&#xff1a; 接口&#xff1a;集合框架定义了一系列接口&#xff0c;如Collection、List、Set、Map等。实现类&#xff1a;集合框架提供了一些实现这些接口的类&#xff0c;如ArrayList、L…

【HISI IC萌新虚拟项目】cpu_if模块方案文档

该文档仅为参考,如果在进行本系列虚拟项目的学习与实践,请自行完成本部分内容。 由于文档格式在之前博客中已展现,因此本文只针对关键点写一下方案。 cpu_if模块概述 cpu_if模块主要是寄存器单元以及寄存器访问通路的处理,可以看下整体结构图: 因此我们可以概括cpu_if模…

看完这篇 教你玩转渗透测试靶机vulnhub—DarkHole

Vulnhub靶机DarkHole渗透测试详解 Vulnhub靶机介绍&#xff1a;Vulnhub靶机下载&#xff1a;Vulnhub靶机安装&#xff1a;Vulnhub靶机漏洞详解&#xff1a;①&#xff1a;信息收集&#xff1a;②&#xff1a;逻辑漏洞&#xff1a;③&#xff1a;文件上传GetShell&#xff1a;④…

用可编程逻辑器件FPGA LCMXO2-4000HC-6MG132I 实现智能汽车解决方案设计

LCMXO2-4000HC-6MG132I lattice莱迪斯深力科 MachXO2 可编程逻辑器件 (PLD) 由六个超低功耗、即时启动、非易失性 PLD 组成&#xff0c;可提供 256 至 6864 个查找表 (LUT) 的密度。 MachXO2 系列 PLD 提供多种特性&#xff0c;例如嵌入式块 RAM (EBR)、分布式 RAM 和用户闪存 …

PhoneHelper

不一样的手机管理工具 一款基于 Golang 语言开发的手机管理软件——PhoneHelper。 PhoneHelper 是一款支持无线&#xff08;安卓11及以上支持扫码连接&#xff09;和有线的adb方式连接设备并且管理设备的软件&#xff0c;同时已适配 Windows、Linux、MacOS 平台&#xff0c;在不…

在Linux设备上让程序在任意目录都能执行

目录 0. 前言1. 编写代码2. 创建软链接3. 其他Linux文章 0. 前言 在Ubuntu上使用espidf中往往需要先设置环境变量&#xff0c;再执行export.sh&#xff0c;对环境装的乱七八糟的我造成了很大的不便我希望无论我在哪个目录&#xff0c;都能快速执行某个命令 我先是使用了编写b…

2023年高级系统架构设计师 如何备考?

高级架构有一定的难度&#xff0c;但是值得挑战一下 新版《系统架构设计师考试大纲》出版了&#xff01; 可以去官网看看 系统架构设计师是软考的高级科目之一&#xff0c;系统架构设计师一年只有一次考试机会&#xff0c;是在下半年11月份考试 考试科目分为&#xff1a;综合…

Spring5 学习笔记

前置知识&#xff1a; 掌握Java基础知识&#xff08;特别是反射&#xff09;掌握Java注解掌握XML掌握Maven Spring5学习笔记 1、Spring概述1.1、简介1.2、优点1.3、组成1.4、拓展 2、IOC理论推导2.1、分析实现2.2、IOC本质 3、HelloSpring3.1、导入jar包3.2、编写代码3.3、思考…

KUC720AE01 3BHB003431R0001 基于浏览器的简单配置

实时自动化是工业通信领域的最高权威&#xff0c;拥有广泛的网关&#xff0c;可将最多产的工业协议连接到您的MicroLogix、KUC720AE01 3BHB003431R0001、CompactLogix、PLC-5和SLC 5/05 PLC&#xff0c;因此用户可以获得一个简单易用的连接解决方案来集成他们的各种设备。像所有…

黄金期货CFD会亏损吗?有哪些黄金期货CFD常见问题

差价合约(Contract For Difference&#xff0c;CFD)是一种热门的衍生性金融商品&#xff0c;CFD 可以在不实际持有资产的情况下&#xff0c;透过保证金方式来针对股市指数、外汇、贵金属、原物料等商品进行多、空任一方向之交易。投资者在选择黄金交易时&#xff0c;会遇到哪些…