通信协议仿真:通信协议基础_(9).通信协议仿真案例分析

通信协议仿真案例分析

在上一节中,我们介绍了通信协议的基础知识,包括通信协议的定义、分类以及重要性。本节将通过具体的案例分析,深入探讨通信协议仿真的实际应用和实现方法。我们将从简单的串行通信协议开始,逐步分析更复杂的网络通信协议,如TCP/IP协议栈的仿真。每个案例都将包括原理分析、仿真步骤和具体代码示例。

1. 串行通信协议仿真

1.1 原理分析

串行通信协议是一种常见的通信方式,数据在通信线路上一位一位地传输。串行通信通常用于点对点通信,如计算机与外部设备之间的数据传输。常见的串行通信协议包括UART(通用异步收发传输器)、SPI(串行外设接口)和I2C(内部集成电路总线)。

1.1.1 UART协议

UART协议是一种异步通信协议,使用两个信号线进行数据传输:发送线(TX)和接收线(RX)。UART协议不需要时钟信号,通过起始位和停止位来同步数据传输。每个数据帧通常包含1个起始位、5到9个数据位、1个可选的奇偶校验位和1到2个停止位。

1.2 仿真步骤

  1. 定义数据帧格式:根据UART协议,定义数据帧的各个部分。
  2. 生成发送数据:模拟发送设备生成数据帧。
  3. 传输数据:通过通信线传输数据帧。
  4. 接收数据:模拟接收设备接收并解析数据帧。
  5. 验证数据:检查接收数据是否与发送数据一致。

1.3 代码示例

以下是一个简单的UART协议仿真示例,使用Python实现。

# UART协议仿真示例# 定义数据帧格式classUARTFrame:def__init__(self,data,parity='none',start_bit=0,stop_bits=1,data_bits=8):""" 初始化UART数据帧 :param data: 要发送的数据(字节) :param parity: 奇偶校验方式('none', 'even', 'odd') :param start_bit: 起始位 :param stop_bits: 停止位数 :param data_bits: 数据位数 """self.data=data self.parity=parity self.start_bit=start_bit self.stop_bits=stop_bits self.data_bits=data_bitsdefgenerate_frame(self):""" 生成UART数据帧 :return: UART数据帧(二进制字符串) """frame=''frame+=str(self.start_bit)# 起始位# 数据位foriinrange(self.data_bits):bit=(self.data>>(self.data_bits-1-i))&1frame+=str(bit)# 奇偶校验位ifself.parity=='even':parity_bit=self.data.bit_count()%2frame+=str(parity_bit)elifself.parity=='odd':parity_bit=(self.data.bit_count()+1)%2frame+=str(parity_bit)# 停止位frame+='1'*self.stop_bitsreturnframedefparse_frame(self,frame):""" 解析UART数据帧 :param frame: 接收到的UART数据帧(二进制字符串) :return: 解析后的数据(字节) """iflen(frame)!=self.data_bits+1+self.stop_bits+(1ifself.parity!='none'else0):raiseValueError("帧长度错误")# 检查起始位ifframe[0]!=str(self.start_bit):raiseValueError("起始位错误")# 检查停止位ifframe[-self.stop_bits:]!='1'*self.stop_bits:raiseValueError("停止位错误")# 提取数据位data_bits=frame[1:1+self.data_bits]data=int(data_bits,2)# 检查奇偶校验位ifself.parity=='even':ifdata.bit_count()%2!=int(frame[1+self.data_bits]):raiseValueError("奇偶校验错误")elifself.parity=='odd':if(data.bit_count()+1)%2!=int(frame[1+self.data_bits]):raiseValueError("奇偶校验错误")returndata# 生成发送数据defsend_data(data,parity='none',start_bit=0,stop_bits=1,data_bits=8):uart_frame=UARTFrame(data,parity,start_bit,stop_bits,data_bits)frame=uart_frame.generate_frame()print(f"发送的数据帧:{frame}")returnframe# 接收数据defreceive_data(frame,parity='none',start_bit=0,stop_bits=1,data_bits=8):uart_frame=UARTFrame(0,parity,start_bit,stop_bits,data_bits)data=uart_frame.parse_frame(frame)print(f"接收的数据:{data}")returndata# 测试data=0b10101010# 发送的数据parity='even'# 奇偶校验方式start_bit=0# 起始位stop_bits=1# 停止位数data_bits=8# 数据位数# 生成并发送数据帧frame=send_data(data,parity,start_bit,stop_bits,data_bits)# 接收并解析数据帧received_data=receive_data(frame,parity,start_bit,stop_bits,data_bits)# 验证数据ifreceived_data==data:print("数据验证成功")else:print("数据验证失败")

1.4 案例描述

在这个示例中,我们定义了一个UARTFrame类来表示UART数据帧。类的构造函数接受数据、奇偶校验方式、起始位、停止位数和数据位数作为参数。generate_frame方法用于生成完整的UART数据帧,包括起始位、数据位、奇偶校验位和停止位。parse_frame方法用于解析接收到的UART数据帧,检查起始位、停止位和奇偶校验位是否正确,最后提取数据位并返回解析后的数据。

我们还定义了两个函数send_datareceive_data,分别用于生成和发送数据帧,以及接收和解析数据帧。通过测试这两个函数,我们验证了发送和接收的数据是否一致。

2. TCP/IP协议栈仿真

2.1 原理分析

TCP/IP协议栈是互联网的基础通信协议,包括多个层次:应用层、传输层、网络层和链路层。每一层都有特定的协议和功能,如应用层的HTTP、传输层的TCP和UDP、网络层的IP和链路层的以太网协议。

2.1.1 TCP协议

TCP(传输控制协议)是一种面向连接的、可靠的传输层协议。它通过三次握手建立连接,通过四次挥手断开连接。TCP协议还包括数据包的序号和确认号,以确保数据的可靠传输。

2.2 仿真步骤

  1. 建立连接:模拟三次握手过程。
  2. 发送数据:生成TCP数据包并发送。
  3. 接收数据:接收并解析TCP数据包。
  4. 断开连接:模拟四次挥手过程。
  5. 验证数据:检查接收数据是否与发送数据一致。

2.3 代码示例

以下是一个简单的TCP协议仿真示例,使用Python的socket库实现。

# TCP协议仿真示例importsocket# 定义TCP数据包classTCPDataPacket:def__init__(self,data,seq_num,ack_num,flags):""" 初始化TCP数据包 :param data: 要发送的数据(字节) :param seq_num: 序号 :param ack_num: 确认号 :param flags: 标志位(字典,包含SYN, ACK, FIN等) """self.data=data self.seq_num=seq_num self.ack_num=ack_num self.flags=flagsdefto_bytes(self):""" 将TCP数据包转换为字节序列 :return: TCP数据包的字节序列 """flags_byte=0forflag,valueinself.flags.items():ifvalue:flags_byte|=1<<flag packet=f"{self.seq_num:04x}{self.ack_num:04x}{flags_byte:02x}{self.data.hex()}"returnbytes.fromhex(packet)@classmethoddeffrom_bytes(cls,packet_bytes):""" 从字节序列解析TCP数据包 :param packet_bytes: TCP数据包的字节序列 :return: 解析后的TCP数据包对象 """packet_hex=packet_bytes.hex()seq_num=int(packet_hex[:4],16)ack_num=int(packet_hex[4:8],16)flags_byte=int(packet_hex[8:10],16)data=bytes.fromhex(packet_hex[10:])flags={'SYN':(flags_byte&0x02)!=0,'ACK':(flags_byte&0x10)!=0,'FIN':(flags_byte&0x01)!=0}returncls(data,seq_num,ack_num,flags)# 三次握手deftcp_three_way_handshake(server_socket,client_socket):""" 模拟TCP三次握手过程 :param server_socket: 服务器套接字 :param client_socket: 客户端套接字 """# 客户端发送SYNsyn_packet=TCPDataPacket(b'',0,0,{'SYN':True,'ACK':False,'FIN':False})client_socket.sendto(syn_packet.to_bytes(),server_socket.getsockname())print("客户端发送SYN")# 服务器接收SYN并发送SYN-ACKsyn_data,client_addr=server_socket.recvfrom(1024)syn_packet=TCPDataPacket.from_bytes(syn_data)print(f"服务器接收SYN:{syn_packet.flags}")syn_ack_packet=TCPDataPacket(b'',syn_packet.seq_num+1,syn_packet.ack_num+1,{'SYN':True,'ACK':True,'FIN':False})server_socket.sendto(syn_ack_packet.to_bytes(),client_addr)print("服务器发送SYN-ACK")# 客户端接收SYN-ACK并发送ACKack_data,server_addr=client_socket.recvfrom(1024)syn_ack_packet=TCPDataPacket.from_bytes(ack_data)print(f"客户端接收SYN-ACK:{syn_ack_packet.flags}")ack_packet=TCPDataPacket(b'',syn_ack_packet.ack_num,syn_ack_packet.seq_num+1,{'SYN':False,'ACK':True,'FIN':False})client_socket.sendto(ack_packet.to_bytes(),server_addr)print("客户端发送ACK")# 发送数据deftcp_send_data(server_socket,client_socket,data):""" 模拟TCP发送数据 :param server_socket: 服务器套接字 :param client_socket: 客户端套接字 :param data: 要发送的数据(字节) """# 客户端发送数据包seq_num=0ack_num=0data_packet=TCPDataPacket(data,seq_num,ack_num,{'SYN':False,'ACK':False,'FIN':False})client_socket.sendto(data_packet.to_bytes(),server_socket.getsockname())print(f"客户端发送数据包:{data_packet.data}")# 服务器接收数据包并发送ACKdata_data,client_addr=server_socket.recvfrom(1024)data_packet=TCPDataPacket.from_bytes(data_data)print(f"服务器接收数据包:{data_packet.data}")ack_packet=TCPDataPacket(b'',data_packet.ack_num,data_packet.seq_num+len(data_packet.data),{'SYN':False,'ACK':True,'FIN':False})server_socket.sendto(ack_packet.to_bytes(),client_addr)print("服务器发送ACK")# 四次挥手deftcp_four_way_handshake(server_socket,client_socket):""" 模拟TCP四次挥手过程 :param server_socket: 服务器套接字 :param client_socket: 客户端套接字 """# 客户端发送FINfin_packet=TCPDataPacket(b'',0,0,{'SYN':False,'ACK':False,'FIN':True})client_socket.sendto(fin_packet.to_bytes(),server_socket.getsockname())print("客户端发送FIN")# 服务器接收FIN并发送ACKfin_data,client_addr=server_socket.recvfrom(1024)fin_packet=TCPDataPacket.from_bytes(fin_data)print(f"服务器接收FIN:{fin_packet.flags}")ack_packet=TCPDataPacket(b'',fin_packet.ack_num,fin_packet.seq_num+1,{'SYN':False,'ACK':True,'FIN':False})server_socket.sendto(ack_packet.to_bytes(),client_addr)print("服务器发送ACK")# 服务器发送FINfin_packet=TCPDataPacket(b'',0,0,{'SYN':False,'ACK':False,'FIN':True})server_socket.sendto(fin_packet.to_bytes(),client_addr)print("服务器发送FIN")# 客户端接收FIN并发送ACKfin_data,server_addr=client_socket.recvfrom(1024)fin_packet=TCPDataPacket.from_bytes(fin_data)print(f"客户端接收FIN:{fin_packet.flags}")ack_packet=TCPDataPacket(b'',fin_packet.ack_num,fin_packet.seq_num+1,{'SYN':False,'ACK':True,'FIN':False})client_socket.sendto(ack_packet.to_bytes(),server_addr)print("客户端发送ACK")# 测试server_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)server_socket.bind(('127.0.0.1',12345))client_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)# 三次握手tcp_three_way_handshake(server_socket,client_socket)# 发送数据data=b"Hello, World!"tcp_send_data(server_socket,client_socket,data)# 四次挥手tcp_four_way_handshake(server_socket,client_socket)# 关闭套接字server_socket.close()client_socket.close()

2.4 案例描述

在这个示例中,我们定义了一个TCPDataPacket类来表示TCP数据包。类的构造函数接受数据、序号、确认号和标志位作为参数。to_bytes方法用于将TCP数据包转换为字节序列,from_bytes方法用于从字节序列解析TCP数据包。

我们还定义了三个函数:tcp_three_way_handshake用于模拟三次握手过程,tcp_send_data用于模拟发送数据,tcp_four_way_handshake用于模拟四次挥手过程。通过测试这些函数,我们验证了TCP协议的基本功能,包括建立连接、发送数据和断开连接。

3. 以太网协议仿真

3.1 原理分析

以太网协议是一种常见的链路层协议,用于局域网中的数据传输。它定义了数据帧的格式,包括前导码、目的MAC地址、源MAC地址、类型/长度字段、数据字段和帧校验序列(FCS)。

3.1.1 以太网数据帧

以太网数据帧的格式如下:

  • 前导码(Preamble):56位,用于接收设备同步时钟。
  • 目的MAC地址(Destination MAC Address):48位,表示接收设备的MAC地址。
  • 源MAC地址(Source MAC Address):48位,表示发送设备的MAC地址。
  • 类型/长度字段(Type/Length):16位,表示上层协议类型或数据帧的长度。
  • 数据字段(Data):46到1500字节。
  • 帧校验序列(FCS):32位,用于校验数据帧的完整性。

3.2 仿真步骤

  1. 生成数据帧:根据以太网协议生成数据帧。
  2. 传输数据帧:通过通信线传输数据帧。
  3. 接收数据帧:接收并解析数据帧。
  4. 校验数据帧:检查帧校验序列是否正确。
  5. 验证数据:检查接收数据是否与发送数据一致。

3.3 代码示例

以下是一个简单的以太网协议仿真示例,使用Python实现。

# 以太网协议仿真示例importsocketimportstructimportbinascii# 定义以太网数据帧classEthernetFrame:def__init__(self,dest_mac,src_mac,eth_type,data):""" 初始化以太网数据帧 :param dest_mac: 目的MAC地址(6字节) :param src_mac: 源MAC地址(6字节) :param eth_type: 类型/长度字段(2字节) :param data: 要发送的数据(字节) """self.dest_mac=dest_mac self.src_mac=src_mac self.eth_type=eth_type self.data=datadefgenerate_frame(self):""" 生成以太网数据帧 :return: 以太网数据帧(字节序列) """frame=self.dest_mac+self.src_mac+self.eth_type+self.data fcs=self.calculate_fcs(frame)frame+=fcsreturnframedefcalculate_fcs(self,frame):""" 计算帧校验序列(FCS) :param frame: 数据帧(字节序列) :return: FCS(4字节) """# 使用CRC-32算法计算FCScrc=binascii.crc32(frame)&0xFFFFFFFFreturnstruct.pack('<I',crc)defparse_frame(self,frame):""" 解析以太网数据帧 :param frame: 接收到的以太网数据帧(字节序列) :return: 解析后的数据(字节) """iflen(frame)<18:# 最小帧长度为18字节(不包括前导码)raiseValueError("帧长度错误")# 提取MAC地址和类型/长度字段dest_mac=frame[:6]src_mac=frame[6:12]eth_type=frame[12:14]data=frame[14:-4]fcs=frame[-4:]# 校验FCScalculated_fcs=self.calculate_fcs(frame[:-4])iffcs!=calculated_fcs:raiseValueError("FCS校验错误")returndest_mac,src_mac,eth_type,data# 生成发送数据defsend_frame(dest_mac,src_mac,eth_type,data):eth_frame=EthernetFrame(dest_mac,src_mac,eth_type,data)frame=eth_frame.generate_frame()print(f"发送的数据帧:{binascii.hexlify(frame)}")returnframe# 接收数据defreceive_frame(frame):eth_frame=EthernetFrame(b'',b'',b'',b'')dest_mac,src_mac,eth_type,data=eth_frame.parse_frame(frame)print(f"接收的数据帧: 目的MAC={binascii.hexlify(dest_mac)}, 源MAC={binascii.hexlify(src_mac)}, 类型/长度={binascii.hexlify(eth_type)}, 数据={binascii.hexlify(data)}")returndata# 测试dest_mac=b'\x00\x11\x22\x33\x44\x55'# 目的MAC地址src_mac=b'\x66\x77\x88\x99\xAA\xBB'# 源MAC地址eth_type=b'\x08\x00'# 类型字段,0x0800表示IP协议data=b"Hello, Ethernet!"# 发送的数据# 生成并发送数据帧frame=send_frame(dest_mac,src_mac,eth_type,data)# 接收并解析数据帧received_data=receive_frame(frame)# 验证数据ifreceived_data==data:print("数据验证成功")else:print("数据验证失败")

3.4 案例描述

在这个示例中,我们定义了一个EthernetFrame类来表示以太网数据帧。类的构造函数接受目的MAC地址、源MAC地址、类型/长度字段和数据作为参数。generate_frame方法用于生成完整的以太网数据帧,包括目的MAC地址、源MAC地址、类型/长度字段、数据字段和帧校验序列(FCS)。calculate_fcs方法使用CRC-32算法计算FCS,parse_frame方法用于解析接收到的以太网数据帧,检查FCS是否正确,最后提取数据字段并返回解析后的数据。

我们还定义了两个函数send_framereceive_frame,分别用于生成和发送数据帧,以及接收和解析数据帧。通过测试这两个函数,我们验证了发送和接收的数据是否一致。

3.5 实际应用

以太网协议仿真在实际应用中非常有用,特别是在网络设备开发、网络故障排除和网络安全测试中。通过仿真以太网数据帧,我们可以在实验室环境中测试网络设备的性能和可靠性,确保设备在真实网络环境中的表现符合预期。

3.6 进一步扩展

以太网协议仿真可以进一步扩展,包括:

  • 多播和广播:模拟多播和广播数据帧的生成和传输。
  • 错误注入:在数据帧中注入错误,测试设备的错误检测和恢复能力。
  • 流量控制:模拟流量控制机制,如CSMA/CD(载波监听多路访问/冲突检测)。

通过这些扩展,我们可以更全面地测试和验证以太网协议在各种情况下的表现。

4. 总结

通过以上三个案例的分析和实现,我们可以看到通信协议仿真在理解和验证协议行为方面的巨大价值。无论是简单的串行通信协议,还是复杂的TCP/IP协议栈和以太网协议,仿真都能帮助我们更好地理解协议的工作原理,发现潜在的问题,并进行优化。

  • 串行通信协议:通过生成和解析数据帧,验证数据的正确传输。
  • TCP/IP协议栈:通过模拟三次握手、数据传输和四次挥手,验证TCP协议的连接管理和数据传输可靠性。
  • 以太网协议:通过生成和解析数据帧,校验FCS,验证数据的完整性。

这些仿真示例不仅适用于教学和研究,还可以在实际工程项目中作为测试和验证工具,提高系统的可靠性和性能。希望这些示例能对读者理解和应用通信协议仿真提供一定的帮助。

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

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

相关文章

hal_uart_transmit驱动开发全流程:初始化到发送一文说清

从零搞懂HAL_UART_Transmit&#xff1a;不只是调用一个函数&#xff0c;而是掌握嵌入式通信的底层逻辑你有没有遇到过这种情况&#xff1a;明明代码写得和例程一模一样&#xff0c;串口就是发不出数据&#xff1f;或者用了HAL_UART_Transmit发送日志&#xff0c;结果主循环卡住…

物理公式学习神器:免费无广含多分支助记忆

软件介绍 今天要介绍的这款工具是“物理公式手册”&#xff0c;它是应小伙伴需求专门带来的物理学习辅助软件——上次推荐数学公式手册后&#xff0c;不少人留言说想要物理版的&#xff0c;这不&#xff0c;今天就安排上这款好用的物理公式手册&#xff0c;帮大家搞定物理公式…

QoS质量配置

他们祝你挺拔&#xff0c;再挺拔一点&#xff1b;我只祝你&#xff0c;永远年少&#xff0c;永远一骑当先.1. QoS的概念 QoS(服务质量)是指一个网络能够利用各种各样的基础技术向选定的网络通信提供更好 的服务的能力。这些基础技术包括&#xff1a;帧中继&#xff08;FrameRel…

Spark大数据ETL实战:数据清洗与转换最佳实践

Spark大数据ETL实战&#xff1a;数据清洗与转换最佳实践 关键词&#xff1a;Spark、ETL、数据清洗、数据转换、大数据处理、最佳实践、分布式计算 摘要&#xff1a;本文系统解析Apache Spark在大数据ETL中的核心应用&#xff0c;聚焦数据清洗与转换的关键技术。通过深入剖析Spa…

【教程4>第10章>第20节】基于FPGA的图像sobel锐化算法开发——图像sobel锐化仿真测试以及MATLAB辅助验证

目录 1.软件版本 2.通过FPGA实现图像sobel锐化 3.testbench编写 4.程序操作视频 欢迎订阅FPGA/MATLAB/Simulink系列教程 《★教程1:matlab入门100例》 《★教程2:fpga入门100例》 《★教程3:simulink入门60例》 《★教程4:FPGA/MATLAB/Simulink联合开发入门与进阶X例》

【毕业设计】SpringBoot+Vue+MySQL 高校学科竞赛平台平台源码+数据库+论文+部署文档

&#x1f4a1;实话实说&#xff1a;CSDN上做毕设辅导的都是专业技术服务&#xff0c;大家都要生活&#xff0c;这个很正常。我和其他人不同的是&#xff0c;我有自己的项目库存&#xff0c;不需要找别人拿货再加价。我就是个在校研究生&#xff0c;兼职赚点饭钱贴补生活费&…

STM32CubeMX安装步骤系统学习:配套工具链配置

STM32CubeMX安装与工具链配置全解析&#xff1a;从零搭建高效嵌入式开发环境 你是不是也曾遇到这样的情况&#xff1f;刚下载好STM32CubeMX&#xff0c;双击启动却弹出“ No Java virtual machine was found ”&#xff1b;或者好不容易打开界面&#xff0c;想生成Keil工程时…

python的sql解析库-sqlparse

内容目录 一、基本方法: 1.parse(sql)2.format(sql)3.split()4.parsestream() 二、Token三、其他类型四、案例: 提取所有查询的字段和表名 sqlparse 是一个 Python 库&#xff0c;是一个用于 Python 的非验证 SQL 解析器, 用于解析 SQL 语句并提供一个简单的 API 来访问解析后…

数字频率计共阴极数码管驱动电路实战

数码管驱动实战&#xff1a;如何用51单片机点亮4位频率计显示屏&#xff1f;你有没有遇到过这样的问题&#xff1a;想做个数字频率计&#xff0c;测出的频率值却没法“亮”出来&#xff1f;或者好不容易接上数码管&#xff0c;结果显示闪烁、重影&#xff0c;甚至MCU IO口直接拉…

Java Web 教学资源库系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】

&#x1f4a1;实话实说&#xff1a;有自己的项目库存&#xff0c;不需要找别人拿货再加价&#xff0c;所以能给到超低价格。摘要 随着信息技术的快速发展&#xff0c;教育领域对数字化教学资源的需求日益增长。传统的教学资源管理方式存在资源分散、检索效率低、共享困难等问题…

Python爬虫完整代码拿走不谢

对于新手做Python爬虫来说是有点难处的&#xff0c;前期练习的时候可以直接套用模板&#xff0c;这样省时省力还很方便。 使用Python爬取某网站的相关数据&#xff0c;并保存到同目录下Excel。 直接上代码&#xff1a; import re import urllib.error import urllib.requestimp…

系统管理工具,多功能隐私清理文件粉碎工具

软件介绍 今天给大伙儿安利个全能的系统管理工具&#xff0c;它叫 Windows超级管理器。功能那叫一个全乎&#xff0c;系统检测、文件清理、隐私保护、磁盘管理、文件粉碎这些实用活儿它都能干&#xff0c;堪称系统管家&#xff01; 绿色单文件版&#xff1a;小巧便携的系统管…

SpringBoot+Vue 智能推荐卫生健康系统平台完整项目源码+SQL脚本+接口文档【Java Web毕设】

&#x1f4a1;实话实说&#xff1a;CSDN上做毕设辅导的都是专业技术服务&#xff0c;大家都要生活&#xff0c;这个很正常。我和其他人不同的是&#xff0c;我有自己的项目库存&#xff0c;不需要找别人拿货再加价。我就是个在校研究生&#xff0c;兼职赚点饭钱贴补生活费&…

【踩坑记】WSL1 下 Docker 报错 iptables: No chain/target/match by that name 排查实录

这是一篇为你整理的“踩坑记”&#xff0c;还原了从报错、排查到发现核心原因并解决的全过程。【踩坑记】WSL1 下 Docker 报错 iptables: No chain/target/match by that name 排查实录1. 背景与环境今天在 WSL (Ubuntu 24.04) 环境下部署 Dify 项目&#xff0c;执行启动命令时…

autosar软件开发中诊断协议栈配置实践案例

AUTOSAR诊断协议栈配置实战&#xff1a;从UDS服务到DTC管理的全链路解析在一辆现代智能汽车中&#xff0c;当你用诊断仪读取一个故障码、刷新ECU程序&#xff0c;或是远程获取车辆实时数据时——背后支撑这一切的&#xff0c;正是AUTOSAR架构中的诊断通信协议栈。它不仅是连接整…

MPC5634 Bootloader

MPC5634 Bootloader嵌入式工程师最怕遇到设备变砖&#xff0c;而好的Bootloader设计就是咱们的救命稻草。今天咱们来盘一盘飞思卡尔MPC5634这颗工业级控制器的Bootloader实现&#xff0c;直接上干货不啰嗦。先说启动流程&#xff0c;这货上电先执行0x00地址的启动代码。来看关键…

无线网络仿真:5G网络仿真_(3).5G关键技术和性能指标

5G关键技术和性能指标 1. 大规模MIMO技术 1.1 原理 大规模MIMO&#xff08;Multiple-Input Multiple-Output&#xff09;技术是5G网络中的一项重要技术&#xff0c;通过在基站和用户设备上部署大量的天线&#xff0c;可以显著提升无线通信系统的容量和频谱效率。大规模MIMO技术…

洗衣店订单管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】

&#x1f4a1;实话实说&#xff1a;有自己的项目库存&#xff0c;不需要找别人拿货再加价&#xff0c;所以能给到超低价格。摘要 随着现代生活节奏的加快&#xff0c;洗衣服务行业逐渐成为城市居民日常生活的重要组成部分。传统的洗衣店管理方式依赖手工记录订单信息&#xff0…

RabbitMQ 集群部署方案

RabbitMQ 一、安装 RabbitMQ 二、更改配置文件 三、配置集群 四、测试 环境准备&#xff1a;三台服务器&#xff0c;系统是 CentOS7 IP地址分别是&#xff1a; rabbitmq1&#xff1a;192.168.152.71rabbitmq2&#xff1a;192.168.152.72rabbitmq3&#xff1a;192.168.152.…

WSL Ubuntu 安装 Docker 操作指南

环境信息 操作系统&#xff1a;Windows 10/11WSL版本&#xff1a;WSL 1 或 WSL 2Linux发行版&#xff1a;Ubuntu 24.04 LTSDocker版本&#xff1a;29.1.4 前提条件 已安装WSL已安装Ubuntu 24.04发行版具有sudo权限的用户账户 安装步骤 1. 检查WSL环境状态 首先检查WSL的运…