网络编程——数据包的组装和拆解

数据包的组装和拆解

一、数据包在各个层之间的传输

在这里插入图片描述

二、各个层的封包格式

1、链路层封包格式

在这里插入图片描述

+------------------+------------------+----------------------+--------------------+---------------------+-----------------------------------+
| 目标MAC地址(6字节) | 源MAC地址(6字节) | 类型/长度字段(2字节) | 数据(46-1500字节) | 帧校验序列(4字节) | 没有数据填充(0-46字节) |
+------------------+------------------+----------------------+--------------------+---------------------+-----------------------------------+

目的地址:目标MAC地址(6字节),这是数据帧要发送到的目标设备的MAC地址。它唯一标识了数据帧的目的地。

源地址:源MAC地址(6字节), 这是数据帧的发送者的MAC地址。它唯一标识了数据帧的来源。

类型:类型/长度字段(2字节),确定以太网头后面跟的是哪个协议
0x0800 ip协议
0x0806 arp协议
0x0835 rarp协议

数据(46-1500字节): 这是实际要传递的数据,它的长度可以在46字节到1500字节之间。如果数据不足46字节,会被填充至46字节,确保帧的最小长度。

帧校验序列(4字节): 这是用于检测数据传输中可能发生的错误的冗余校验码。校验码可以检测数据在传输过程中是否发生了损坏。

没有数据填充(0-46字节): 如果数据字段的长度不足46字节,可能需要添加填充来保持帧的最小长度。

注意
1、IEEE802.2/802.3封装常用在无线
2、以太网封装常用在有线局域网

2、网络层封包格式(IPV4)

在这里插入图片描述

版本/头部长度: 这个字段包含IP协议版本号和IP头部的长度。版本通常是IPv4(4位),头部长度指示IP头部的字节数,通常为20字节,但可能会因选项字段的存在而变化。

服务类型: 这个字段用于指示数据包的服务质量和优先级。

总长度(2字节): 这个字段表示整个IP数据报的长度,包括头部和数据。

标识: 这个字段用于标识数据报的顺序和重组。

标志/片偏移: 这个字段包含分片数据报的标志位和数据片的偏移。

生存时间: 这个字段用于防止数据包在网络中永远循环,通过逐跳减少来实现。

协议: 这个字段表示传输层协议,例如TCP(6)、UDP(17)等。

校验和(2字节): 这个字段用于检测头部字段的错误。

源IP地址和目标IP地址(各4字节): 这些字段表示源和目标设备的IP地址。

可选项和填充(可选): 这个字段包含可选的IP选项,以及填充字段,以确保IP头部长度为32位的倍数。

数据: 这个字段是实际要传递的数据。

3、传输层封包格式(TCP和UDP)

①TCP封包格式:
在这里插入图片描述

源端口和目标端口(各2字节): 这些字段指示数据的源端口和目标端口。

序列号和确认号(各4字节): 这些字段用于TCP的流控制和确认机制。

首部长度/保留位: 首部长度字段指示TCP首部的长度,保留位用于未来的扩展。

控制标志(2字节): 这个字段包含TCP控制标志,如ACK、SYN、FIN等,用于管理连接状态和数据传输。

窗口大小(2字节): 这个字段表示接收方能够接受的数据量。

校验和(2字节): 这个字段用于校验TCP头部和数据的完整性。

紧急指针(2字节): 这个字段用于指示紧急数据的位置。

选项(可选): 这个字段包含可选的TCP选项,如窗口扩大因子、时间戳等。

数据: 这个字段是实际要传递的数据。

+----------------+----------------+----------------+----------------+
| 源端口(2字节)  | 目标端口(2字节) | 序列号(4字节)  | 确认号(4字节)  |
+----------------+----------------+----------------+----------------+
| 首部长度/保留位  | 控制标志(2字节) | 窗口大小(2字节)  | 校验和(2字节)  |
+----------------+----------------+----------------+----------------+
| 紧急指针(2字节) | 选项(可选)         | 数据(可变长度)   |
+----------------+----------------+----------------+----------------+

②UDP封包格式

在这里插入图片描述

+----------------+----------------+----------------+----------------+
| 源端口(2字节)  | 目标端口(2字节) | 长度(2字节)    | 校验和(2字节)  |
+----------------+----------------+----------------+----------------+
| 数据(可变长度)   |
+----------------+

源端口和目标端口(各2字节): 这些字段指示数据的源端口和目标端口。

长度(2字节): 这个字段表示UDP数据报的长度,包括头部和数据。

校验和(2字节): 这个字段用于校验UDP头部和数据的完整性。

数据: 这个字段是实际要传递的数据。

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

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

相关文章

WebView2对比CefSharp的超强优势

第一次使用了CefSharp组件,集成开发结束后,测试及使用过程中遇到了一些无法处理的bug及严重的性能问题。然后又测试对比了其他多种组件,具体情况可以阅读我的博客​ ​《.NET桌面程序集成Web网页开发的十种解决方案》​​。最终选用了微软新出…

Ubuntu 22.04安装和使用ROS1可行吗

可行。 测试结果 ROS1可以一直使用下去的,这一点不用担心。Ubuntu会一直维护的。 简要介绍 Debian发行版^_^ AI:在Ubuntu 22.04上安装ROS1是可行的,但需要注意ROS1对Ubuntu的支持只到20.04。因此,如果要在22.04上安装ROS1&am…

中间件多版本冲突的4种解决方案和我们的选择

背景 在小小的公司里面,挖呀挖呀挖。最近又挖到坑里去了。一个稳定运行多年的应用,需要在里面支持多个版本的中间件客户端;而多个版本的客户端在一个应用里运行时会有同名类冲突的矛盾。在经过询问chatGPT,百度,googl…

linux下.run安装脚本制作

1、安装文件(install.sh) PS: .run安装包内部执行脚本文件 2、资源文件(test.zip) PS: 待安装程序源文件 3、制作.run脚本(install.run) cat install.sh test.zip > install.run chmod ax install.run

【软件工程】3 ATM系统的设计

目录 3 ATM系统的设计 3.1体系结构设计 3.2 设计模式选择 3.3 补充、完善类图 3.4 数据库设计 3.4.1 类与表的映射关系 3.4.2 数据库设计规范 3.4.3 数据库表 3.5 界面设计 3.5.1 界面结构设计 3.5.2 界面设计 3.5.2.1 功能界面设计 3.5.2.2 交互界面 总博客&…

基于Python++PyQt5马尔科夫模型的智能AI即兴作曲—深度学习算法应用(含全部工程源码+测试数据)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境PC环境配置 模块实现1. 钢琴伴奏制作1)和弦的实现2)和弦级数转为当前调式音阶3)根据预置节奏生成伴奏 2. 乐句生成1)添加音符2)旋律生成3)节…

SpringBoot + Docker 实现一次构建到处运行~

一、容器化部署的好处 图片 Docker 作为一种新兴的虚拟化方式,它可以更高效的利用系统资源,不需要进行硬件虚拟以及运行完整操作系统等额外开销。 传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行…

linuxARM裸机学习笔记(7)----RTC实时时钟实验

基础概念: I.MX6U 内部也有个RTC 模块,但是不叫作“ RTC ”,而是叫做“ SNVS ”。 SNVS 直译过来就是安全的非易性存储, SNVS 里面主要是一些低功耗的外设,包括一个 安全的实时计数器 (RTC) 、一个单调计数器 (mo…

socket 到底是个啥

我相信大家在面试过程中或多或少都会被问到这样一个问题:你能解释一下什么是 socket 吗 我记得我当初的回答很是浅显:socket 也叫套接字,用来负责不同主机程序之间的网络通信连接,socket 的表现方式由四元组(ip地址&am…

利用线程池多线程并发实现TCP两端通信交互,并将服务端设为守护进程

文章目录 实现目标实现步骤封装日志类封装线程池封装线程封装锁封装线程池 TCP通信的接口和注意事项accept TCP封装任务客户端Client.hppClient.cc 服务端Server.hpp Server.cc实现效果 守护进程服务端守护进程化 实现目标 利用线程池多线程并发实现基于TCP通信的多个客户端与…

使用webpack插件webpack-dev-server 出现Cannot GET/的解决办法

问题描述 文档地址深入浅出webpack 使用 DevServer运行webpack,跑起来之后提示Cannot GET/: 解决方案: 查阅官方文档 根据目录结构修改对应的配置: 然后就可以成功访问:

通过easyui实现动态控制表格字段显示、导出表格数据

前言 学过layui前端框架的都知道,layui默认帮我们实现了控制表格字段显示以及数据的导出功能。 1、控制表格字段显示 2、数据导出 3、导出为pdf:导出按钮的右边那个按钮就是打印pdf的 那么,easyui要怎么实现这些功能呢?这篇文章就…