《计算机网络》课后探研题书面报告_网际校验和算法
网际校验和算法
摘 要
本文旨在研究和实现网际校验和(Internet Checksum)算法。通过阅读《RFC 1071》文档理解该算法的工作原理,并使用编程语言实现网际校验和的计算过程。本项目将对不同类型的网络报文(包括ICMP、TCP、UDP等)进行差错检验,对捕获的报文进行校验和计算并验证其正确性。项目包括报文数据的读取、校验和的计算以及结果的输出展示等功能。本报告详细描述了算法的实现过程、测试方法和实验结果,并对网际校验和算法在网络通信中的应用进行了分析。通过本次探研,加深了对网络协议差错检测机制的理解,提高了协议分析与实现的能力。
关键字:网际校验和、差错检测、网络协议、报文验证
一、算法概述
网际校验和算法是一种简单且高效的错误检测机制,广泛应用于网络协议中,如IP、TCP、UDP等。其核心思想是在数据传输前生成一个校验和,并通过对数据进行分段求和及取反操作来实现错误检测。接收端通过相同的算法重新计算校验和,如果结果为全0,则说明数据传输过程中未发生错误。
1 算法原理
网际校验和算法由两个核心组件构成:校验和的生成与验证。在数据传输过程中,发送方负责生成校验和,而接收方则执行校验和的验证工作。下面是校验和的详细生成流程:
①数据分块:在算法开始时,首先将数据流划分为16位(2字节)为单位的字块。如果数据总长度不是16位的整数倍,则需要在末尾填充0来补足。
②把校验和字段置为0:在计算校验和之前,需要先将校验和字段的值置为0。这是因为校验和字段本身也会参与计算,但计算时应当使用0值。
③逐块求和:对每个16位字块进行加和,若产生进位(即求和结果超过16位,产生大于65535的结果),则将进位加回到结果的最低位。这个进位的处理是算法的关键,使得加法操作能避免丢失信息。
④按位取反:将上述求和结果按位取反(即对所有位进行反转),得到最终的校验和。取反操作是为了增强错误检测的能力,避免某些类型的错误模式(如全0或全1错误)无法被检测到。
校验和的验证则在接收端进行。在接收端,重新进行相同的求和和取反操作(不进行第②步)。如果最终结果是全0,则认为数据未发生错误;如果结果不是全0,则说明数据在传输过程中出现了错误。
该算法的设计使其能够快速且有效地检测常见的数据传输错误,如单比特错误、字节错误等。但它也有局限性,对于一些特定类型的错误(例如数据的字块顺序被改变)可能不敏感,因此它并不是一种完美的错误检测算法,但在多数应用场景下,已能满足需求。
2 算法特点
网际校验和算法在计算机网络中扮演着重要角色,其设计目标是通过简单的操作实现数据传输中的错误检测。由于其独特的特点和广泛的应用价值,该算法在多种网络协议中被广泛采用。以下将从多个方面介绍网际校验和算法的主要特点:
(1)简单高效:计算过程中仅需基本的加法和按位取反操作,执行效率较高,适合硬件加速实现,适用于实时性要求较高的应用场景。
(2)检错能力适中:能有效检测大多数单比特错误和字块错误,但对某些复杂的错误模式(如字节重排)敏感度较低。
(3)广泛应用:被广泛用于IP、TCP、UDP等网络协议中,尤其在需要高效和实时处理的环境中,已成为标准校验方法之一。
(4)实现灵活:由于其简单性,校验和的计算可以根据数据长度和类型的不同进行调整,灵活性较高。
3 算法应用
网际校验和算法因其独特的技术特征,在实际应用中具有广泛的实用价值。该算法凭借计算简便、检错能力适度等优势,已被广泛集成至各类网络协议和应用系统中,为数据传输的完整性与可靠性提供了有效保障。以下将详细介绍该算法在不同领域中的典型应用:
(1)网络通信协议:
- IP层(IPv4首部校验和):用于检测IP数据包的头部是否在传输过程中被篡改或损坏。
- 传输层(TCP、UDP报文段校验和):用于校验TCP和UDP报文段中的数据完整性,确保数据在传输过程中未被修改。
(2)数据完整性验证:
- 文件传输与存储完整性检测:校验和可用于验证文件传输过程中的数据完整性,确保文件未在传输中发生损坏。
- 网络设备数据包处理:网络设备通过校验和算法确保接收和转发的数据包完整性。
(3)嵌入式系统:
在嵌入式系统中,尤其是通信模块,使用该算法进行数据校验,确保通信过程中的数据不被篡改或丢失。
(4)网络安全与监控:
网络入侵检测与数据包分析工具:在安全系统中,算法可用于检测网络数据包中的错误或恶意篡改,从而保障网络的安全性。
二、编程实现
1 程序编写
下文将详细介绍如何通过编程实现网际校验和算法。本章节将从编程环境搭建开始,逐步说明代码实现的具体步骤、关键函数的设计思路以及数据处理的方法。通过这个实践过程,我们不仅能够深入理解网际校验和算法的工作原理,也能掌握如何将理论算法转化为可执行的程序代码。程序采用Python语言实现,代码结构清晰,便于理解和后续的维护与扩展。
1.1 编程环境
编程环境的正确配置是确保程序开发和运行顺利进行的重要前提。我选择了Windows 11作为开发平台,搭配功能强大的PyCharm作为集成开发环境,使用广受欢迎的Python编程语言,并将处理来自Wireshark工具导出的“.txt”格式数据文件。这些工具的选择既考虑了开发效率,也兼顾了程序的可移植性和扩展性。
- 操作系统:Windows 11
- 开发工具:PyCharm
- 编程语言:Python
- 数据文档格式:从Wireshark工具软件导出的原始数据包,为“.txt”格式。
图1 数据文档格式图
1.2 校验流程
本次编码不仅完成了对IP数据报首部的校验,还实现了ICMP、TCP、UDP报文的校验功能。鉴于整个实现流程较为复杂,此处仅展示IP数据报首部的关键校验流程。具体的IP数据报首部校验流程如下图所示(非标准流程图):
图2 IP数据报首部校验流程图
1.3 核心代码
鉴于IP报文首部校验和的计算与验证机制涉及多个分散的代码模块,此处仅展示其核心实现部分。完整的实现细节请参阅源代码。
(1)校验和计算函数`checksum_calculating`:实现标准的网际校验和算法,用于计算IP头部校验和。在函数中,校验和的计算流程如下:①从输入数据中检查长度,若为奇数则进行字节补齐;②对数据按16位为单位进行累加计算;③将进位加至最低位;④对最终结果取反得到校验和。具体代码如下图所示:
图3 校验和计算函数
(2)校验和验证函数`process_packet_to_string`:实现接收数据包的校验和验证。在函数中,校验和的验证流程如下:①从接收的IP首部中提取原始校验和;②构造用于校验和计算的IP首部数据;③调用`checksum_calculating`函数计算当前校验和;④将计算得到的校验和与原始校验和进行比对。部分代码如下图所示:
图4 校验和验证函数(部分)
2 程序测试
为验证程序的正确性,下面我将对我编写的用于网际校验和验证的程序进行测试。
2.1 测试文件
本次测试的数据文件均来自于计网实验5,从中选取典型的ICMP、UDP、TCP报文各一个。测试文件分别为“ICMP.txt”、“TCP.txt”、“UDP.txt”。这些文件包含了真实网络环境中的典型数据包,能够很好地验证算法在实际应用场景中的表现。测试文件内容格式如前文所述。
图5 测试文件
2.2 测试结果
(1)ICMP
下图是ICMP报文的具体内容,可以看到它的IP首部校验和为“f2 24”(图中蓝色高亮部分)。
图6 ICMP报文
下图是程序读取该报文后的测试结果,程序运行结果正确,与预期一致。
图7 ICMP报文测试结果
(2)TCP
下图是TCP报文的具体内容,可以看到它的IP首部校验和为“cd 6c”(图中蓝色高亮部分)。
图8 TCP报文
下图是程序读取该报文后的测试结果,程序运行结果正确,与预期一致。
图9 TCP报文测试结果
(3)UDP
下图是UDP报文的具体内容,可以看到它的IP首部校验和为“c0 d3”(图中蓝色高亮部分)。
图10 UDP报文
下图是程序读取该报文后的测试结果,程序运行结果正确,与预期一致。
图11 UDP报文测试结果
结 论
本次探研通过深入分析网际校验和算法的原理并进行实践实现,取得了以下主要成果:
(1)完成了网际校验和算法的理论研究和代码实现。通过研读《RFC 1071》文档,深入理解了该算法的工作原理,包括数据分块、校验和计算和验证等核心过程。研究表明该算法具有实现简单、计算效率高等特点,这也解释了其在网络协议中的广泛应用。
(2)成功开发了一个能够处理多种网络协议报文的校验程序。该程序不仅实现了IP数据报首部的校验,还扩展支持了ICMP、TCP、UDP等多种协议报文的校验功能。通过实际测试,程序能够正确计算和验证各类报文的校验和,验证结果与实际数据包中的校验和完全匹配。
(3)通过实践验证了网际校验和算法在差错检测方面的有效性。虽然该算法在某些特定错误模式(如字节重排)的检测上存在局限性,但其简单高效的特点使其非常适合网络通信中的实时差错检测需求。
(4)本次探研的实践过程加深了对网络协议差错检测机制的理解,提高了协议分析与实现的能力。通过编程实现和测试验证,不仅掌握了算法的技术细节,也认识到了在实际网络环境中确保数据传输可靠性的重要性。
总的来说,本次探研不仅完成了对网际校验和算法的理论学习和实践实现,还通过具体的程序开发和测试验证了该算法的实用价值。这些工作为进一步理解和应用网络协议中的差错检测机制奠定了基础。
参考文献
- Braden R, Borman D A, Partridge C. RFC 1071 Computing the Internet Checksum[S]. Fremont: RFC Editor, 1988.
- 李毅,张帆,张润宇.IPv4头部校验和的反码算法[J].武汉理工大学学报,2003,(04):64-68.
- 刘派.IP首部校验算法[J].电脑知识与技术,2010,6(19):5194-5196.
- 乔世成,张智丰,廉洁.IP首部校验和算法研究[J].内蒙古民族大学学报(自然科学版),2016,31(05):400-402.DOI:10.14045/j.cnki.15-1220.2016.05.010.
- 孔庆春.当前应用于计算机通信中的差错检测与控制技术[J].信息与电脑(理论版),2017,(18):146-148.
参考代码
import struct
import tkinter as tk
from tkinter import filedialog, messagebox, scrolledtextdef checksum_calculating(data):"""计算给定数据的校验和(使用Internet Checksum算法)。参数:data (bytes): 要计算校验和的字节数据。返回:int: 计算得到的校验和。"""# 如果数据长度为奇数,补一个0字节if len(data) % 2 != 0:data += b'\x00'checksum = 0for i in range(0, len(data), 2):word = struct.unpack('!H', data[i:i + 2])[0]checksum += word# 处理进位while checksum >> 16:checksum = (checksum & 0xffff) + (checksum >> 16)checksum = ~checksum & 0xffffreturn checksumdef parse_ethernet_frame(data):"""解析以太网帧头,提取EtherType。参数:data (bytes): 以太网帧的字节数据。返回:tuple: (ethertype (int), payload (bytes))。异常:ValueError: 数据长度不足以解析以太网帧头。"""if len(data) < 14:raise ValueError("数据长度不足以解析以太网帧头")# 查找EtherType为0x0800(IPv4)的位置for i in range(len(data) - 2):if data[i] == 0x08 and data[i + 1] == 0x00:eth_header = data[:i + 2]payload = data[i + 2:]return 0x0800, payload# 如果未找到,使用标准解析方法eth_header = data[:14]eth_fields = struct.unpack('!6s6sH', eth_header)ethertype = eth_fields[2]payload = data[14:]return ethertype, payloaddef parse_ip_packet(data):"""解析IP数据包,提取协议类型和IP头部。参数:data (bytes): IP数据包的字节数据。返回:tuple: (protocol (int), ip_header (bytes), payload (bytes))。异常:ValueError: 数据长度不足以解析IP头部或完整的IP头部。"""if len(data) < 20:raise ValueError("数据长度不足以解析IP头部")version_ihl = data[0]ihl = (version_ihl & 0x0F) * 4 # 头部长度if len(data) < ihl:raise ValueError("数据长度不足以解析完整的IP头部")ip_header = data[:ihl]protocol = data[9]payload = data[ihl:]return protocol, ip_header, payloaddef parse_icmp_packet(data):"""解析ICMP数据包。参数:data (bytes): ICMP数据包的字节数据。返回:tuple: (icmp_type (int), icmp_code (int), icmp_data (bytes),received_checksum (int), checksum_data (bytes))。异常:ValueError: 数据长度不足以解析ICMP头部。"""if len(data) < 4:raise ValueError("数据长度不足以解析ICMP头部")icmp_header = data[:4]icmp_fields = struct.unpack('!BBH', icmp_header)icmp_type = icmp_fields[0]icmp_code = icmp_fields[1]received_checksum = icmp_fields[2]icmp_data = data[4:]# 创建用于计算校验和的数据(校验和字段置0)checksum_data = data[:2] + b'\x00\x00' + data[4:]return icmp_type, icmp_code, icmp_data, received_checksum, checksum_datadef parse_tcp_packet(data):"""解析TCP数据包。参数:data (bytes): TCP数据包的字节数据。返回:tuple: (src_port (int), dest_port (int), seq_num (int), ack_num (int),tcp_header_for_checksum (bytes), tcp_data (bytes),received_checksum (int))。异常:ValueError: 数据长度不足以解析TCP头部。"""if len(data) < 20:raise ValueError("数据长度不足以解析TCP头部")tcp_header = data[:20]tcp_fields = struct.unpack('!HHLLHHHH', tcp_header)src_port = tcp_fields[0]dest_port = tcp_fields[1]seq_num = tcp_fields[2]ack_num = tcp_fields[3]offset_reserved_flags = tcp_fields[4]window = tcp_fields[5]received_checksum = tcp_fields[6]urgent_pointer = tcp_fields[7]# 提取数据偏移、保留和标志位data_offset = (offset_reserved_flags >> 12) & 0xF # 数据偏移(高4位)reserved = (offset_reserved_flags >> 6) & 0x3F # 保留位(中间6位)flags = offset_reserved_flags & 0x3F # 标志位(低6位)data_offset = data_offset * 4tcp_data = data[data_offset:]# 校验和计算时,将校验和字段置零,但保留整个20字节头部tcp_header_for_checksum = tcp_header[:16] + b'\x00\x00' + tcp_header[18:20]return src_port, dest_port, seq_num, ack_num, tcp_header_for_checksum, tcp_data, received_checksumdef parse_udp_packet(data):"""解析UDP数据包。参数:data (bytes): UDP数据包的字节数据。返回:tuple: (src_port (int), dest_port (int), length (int),udp_header_for_checksum (bytes), udp_data (bytes),received_checksum (int))。异常:ValueError: 数据长度不足以解析UDP头部。"""if len(data) < 8:raise ValueError("数据长度不足以解析UDP头部")udp_header = data[:8]udp_fields = struct.unpack('!HHHH', udp_header)src_port = udp_fields[0]dest_port = udp_fields[1]length = udp_fields[2]received_checksum = udp_fields[3]udp_data = data[8:]# 将校验和字段置零用于计算udp_header_for_checksum = udp_header[:6] + b'\x00\x00'return src_port, dest_port, length, udp_header_for_checksum, udp_data, received_checksumdef hexstr_to_bytes(line):"""将十六进制字符串转换为字节数据。参数:line (str): 包含十六进制数的字符串,每个字节由两个十六进制字符表示,字节之间用'|'分隔。返回:bytes or None: 转换后的字节数据,如果转换失败则返回None。"""try:parts = line.strip().split('|')# 去除空白部分parts = [p.strip() for p in parts if p.strip()]if len(parts) > 1:parts = parts[1:] # 去掉偏移量字段# 确保每个部分有两个字符,不足则前置补零hex_pairs = [p.zfill(2) for p in parts]hex_cleaned = ''.join(hex_pairs)return bytes.fromhex(hex_cleaned)except Exception:return Nonedef process_packet_to_string(packet_bytes):"""处理数据包并将解析结果格式化为字符串。参数:packet_bytes (bytes): 要处理的数据包字节数据。返回:str: 格式化后的解析结果。"""result = []result.append(f"原始报文数据 ({len(packet_bytes)} 字节): {packet_bytes.hex()}")try:# 解析以太网帧ethertype, payload = parse_ethernet_frame(packet_bytes)result.append(f"以太网类型: 0x{ethertype:04x}")if ethertype == 0x0800: # IPv4protocol, ip_header, ip_payload = parse_ip_packet(payload)result.append(f"IP协议版本: {ip_header[0] >> 4}")result.append(f"IP首部长度: {(ip_header[0] & 0x0F) * 4} 字节")result.append(f"IP协议: {protocol}")# IP校验和received_ip_checksum = struct.unpack('!H', ip_header[10:12])[0]ip_header_for_checksum = ip_header[:10] + b'\x00\x00' + ip_header[12:]calculated_ip_checksum = checksum_calculating(ip_header_for_checksum)result.append(f"接收的IP校验和: 0x{received_ip_checksum:04x}")result.append(f"计算的IP校验和: 0x{calculated_ip_checksum:04x}")if received_ip_checksum == calculated_ip_checksum:result.append("IP校验和正确")else:result.append("IP校验和错误")if protocol == 1: # ICMPicmp_type, icmp_code, icmp_data, received_checksum, checksum_data = parse_icmp_packet(ip_payload)calculated_checksum = checksum_calculating(checksum_data)result.append(f"ICMP类型: {icmp_type}, 代码: {icmp_code}")result.append(f"ICMP接收的校验和: 0x{received_checksum:04x}")result.append(f"ICMP计算的校验和: 0x{calculated_checksum:04x}")if received_checksum == calculated_checksum:result.append("ICMP校验和正确")else:result.append("ICMP校验和错误")elif protocol == 6: # TCPsrc_port, dest_port, seq_num, ack_num, tcp_header_for_checksum, tcp_data, received_checksum = parse_tcp_packet(ip_payload)source_ip = ip_header[12:16] # 源IP地址destination_ip = ip_header[16:20] # 目的IP地址reserved_zero = b'\x00'protocol_byte = struct.pack('!B', protocol)segment_length = len(tcp_header_for_checksum) + len(tcp_data)tcp_length = struct.pack('!H', segment_length)# 构造伪头部用于校验和计算pseudo_header = source_ip + destination_ip + reserved_zero + protocol_byte + tcp_lengthchecksum_data = pseudo_header + tcp_header_for_checksum + tcp_dataif len(checksum_data) % 2 != 0:checksum_data += b'\x00'calculated_checksum = checksum_calculating(checksum_data)result.append(f"TCP源端口: {src_port}, 目的端口: {dest_port}")result.append(f"TCP接收的校验和: 0x{received_checksum:04x}")result.append(f"TCP计算的校验和: 0x{calculated_checksum:04x}")if received_checksum == calculated_checksum:result.append("TCP校验和正确")else:result.append("TCP校验和错误")elif protocol == 17: # UDPsrc_port, dest_port, length, udp_header_for_checksum, udp_data, received_checksum = parse_udp_packet(ip_payload)source_ip = ip_header[12:16] # 源IP地址destination_ip = ip_header[16:20] # 目的IP地址reserved_zero = b'\x00'protocol_byte = struct.pack('!B', protocol)udp_length = struct.pack('!H', length)# 构造伪头部用于校验和计算pseudo_header = source_ip + destination_ip + reserved_zero + protocol_byte + udp_lengthchecksum_data = pseudo_header + udp_header_for_checksum + udp_dataif len(checksum_data) % 2 != 0:checksum_data += b'\x00'calculated_checksum = checksum_calculating(checksum_data)result.append(f"UDP源端口: {src_port}, 目的端口: {dest_port}")result.append(f"UDP接收的校验和: 0x{received_checksum:04x}")result.append(f"UDP计算的校验和: 0x{calculated_checksum:04x}")if received_checksum == calculated_checksum:result.append("UDP校验和正确")else:result.append("UDP校验和错误")else:result.append(f"未支持的IP协议类型: {protocol}")else:result.append(f"未支持的以太网类型: 0x{ethertype:04x}")except ValueError as ve:result.append("解析报文时出错: " + str(ve))return '\n'.join(result)def main_gui():"""主函数,创建图形界面,选择文件,解析报文,计算校验和并显示结果。"""root = tk.Tk()root.title("网际校验和分析工具")root.geometry("800x600")# 创建可滚动文本区域显示结果text_area = scrolledtext.ScrolledText(root, wrap=tk.WORD, width=100, height=40)text_area.pack(padx=10, pady=10, fill=tk.BOTH, expand=True)def select_file():"""处理文件选择和报文解析。"""file_path = filedialog.askopenfilename(title="选择测试文件",filetypes=(("文本文件", "*.txt"), ("所有文件", "*.*")))if not file_path:messagebox.showinfo("提示", "未选择任何文件。")returntry:with open(file_path, 'r', encoding='utf-8') as f:content = f.read().strip()packets = content.split('\n\n')output = []for packet in packets:lines = packet.strip().split('\n')if len(lines) < 2:continuedata_line = Nonefor line in lines:if line.startswith('|'):data_line = linebreakif not data_line:continuepacket_bytes = hexstr_to_bytes(data_line)if packet_bytes is None:output.append(f"无法解析的数据行: {data_line[:50]}...")continuepacket_result = process_packet_to_string(packet_bytes)output.append(packet_result)# 显示解析结果text_area.delete(1.0, tk.END)text_area.insert(tk.END, '\n\n'.join(output))except Exception as e:messagebox.showerror("错误", f"发生错误: {e}")# 创建选择文件并分析的按钮select_button = tk.Button(root, text="选择测试文件并分析", command=select_file)select_button.pack(pady=10)root.mainloop()if __name__ == "__main__":main_gui()
相关文章:
《计算机网络》课后探研题书面报告_网际校验和算法
网际校验和算法 摘 要 本文旨在研究和实现网际校验和(Internet Checksum)算法。通过阅读《RFC 1071》文档理解该算法的工作原理,并使用编程语言实现网际校验和的计算过程。本项目将对不同类型的网络报文(包括ICMP、TCP、UDP等&a…...
【论文阅读+复现】High-fidelity Person-centric Subject-to-Image Synthesis
以人物为中心的主体到图像的高保真合成,CVPR2024 code:CodeGoat24/Face-diffuser: [CVPR2024] Official implementation of High-fidelity Person-centric Subject-to-Image Synthesis. paper:2311.10329 背景 研究问题:这篇文…...
Flink集成TDEngine来批处理或流式读取数据进行流批一体化计算(Flink SQL)拿来即用的案例
Flink 以其流批一体化的编程模型而备受青睐。它支持高吞吐、低延迟的实时流计算,同时在批处理方面也表现出色。Flink 提供了丰富的 API,如 DataStream API 和 DataSet API,方便开发者进行数据处理操作,包括转换、聚合、连接等,使得开发者能够轻松构建复杂的数据处理逻辑。…...
Zookeeper特性与节点数据类型详解
1、 Zookeeper介绍 ZooKeeper 是一个开源的分布式协调框架,是Apache Hadoop 的一个子项目,主要用来解决分布式集群中应用系统的一致性问题。Zookeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集…...
C# HslCommunication库
C# HslCommunication库是一个用于建立TCP连接并进行Modbus通讯的库。下面将详细介绍如何使用该库进行TCP通讯。 首先,需要在C#项目中引用HslCommunication库。 创建一个TCP连接对象,可以使用HslCommunication.ModBus.ModbusTcpNet类,例如&am…...
springMVC实现文件上传
目录 一、创建项目 二、引入依赖 三、web.xml 四、编写上传文件的jsp页面 五、spring-mvc.xml 六、controller 七、运行 一、创建项目 二、引入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.o…...
【深度学习】Windows系统Anaconda + CUDA + cuDNN + Pytorch环境配置
在做深度学习内容之前,为GPU配置anaconda CUDA cuDNN pytorch环境,在网络上参考了很多帖子,但pytorch的安装部分都有些问题或者比较复杂繁琐,这里总结了相对简单快速的配置方式 文章目录 AnacondaCUDAcuDNNpytorchtorchtorchau…...
springboot整合rabbitmq
1. 添加依赖 首先,在你的 pom.xml 文件中添加 RabbitMQ 的依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency> 2. 配置 RabbitMQ …...
【React】脚手架进阶
目录 暴露webpack配置package.json的变化修改webpack.config.js配置less修改域名、端口号浏览器兼容处理处理跨域 暴露webpack配置 react-scripts对脚手架中的打包命令进行封装,如何暴露这些打包配置呢?上篇写到在package.json中的scripts配置项中有eje…...
Unreal Engine 5 (UE5) Metahuman 的头部材质
在图中,你展示了 Unreal Engine 5 (UE5) Metahuman 的头部材质部分,列出了头部材质的多个元素。以下是对每个部分的解释: 材质解释 Element 0 - MI_HeadSynthesized_Baked 作用: 这是 Metahuman 的主要头部材质,控制整…...
当自动包布机遇上Profinet转ModbusTCP网关,“妙啊”,工业智能“前景无限
在自动化控制技术日新月异的当下,Profinet与ModbusTCP这两种协议在工业通信领域占据着举足轻重的地位。ModbusTCP是基于以太网的串行通信协议,而Profinet则是依托工业以太网的现场总线协议。它们在数据传输速度、实时性表现以及兼容性等方面各具特色。不…...
Elasticsearch 批量导入数据(_bluk方法)
官方API:https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html 建议先看API POST /<索引名>/_bulk 格式要求: POST _bulk { "index" : { "_index" : "test", "_id" : &q…...
lammps应用于热电材料
文章目录 1.热传导理论1.热导率2.晶格振动3.晶体热容4.声子平均自由程5.傅里叶定律 2.lammps计算Ar热导率3.lammps模拟SiGe热电材料4.平衡分子动力学(EMD) 1.热传导理论 1.热导率 热传递机制随介质材料相的不同而改变:固体(热传导)、液体(热对流)、气体(对流和辐射…...
SAP资产盘盈盘亏的过账处理、入账价值错误调整、资产减值准备
文章目录 一、SAP资产盘盈盘亏处理1、ABNAN盘盈 (往年资产) ABZON (当年资产)2、ABAVN盘亏 二、资产价值入账错了(价值多了或少了),怎么调账1、价值少了2、价值多了 三、资产减值准备1、启用重估2、指定间隔…...
Adobe与MIT推出自回归实时视频生成技术CausVid。AI可以边生成视频边实时播放!
传统的双向扩散模型(顶部)可提供高质量的输出,但存在显著的延迟,需要 219 秒才能生成 128 帧的视频。用户必须等待整个序列完成才能查看任何结果。相比之下CausVid将双向扩散模型提炼为几步自回归生成器(底部ÿ…...
MYSQL学习笔记(一):准备数据和数据库的最基本命令
前言: 学习和使用数据库可以说是程序员必须具备能力,这里将更新关于MYSQL的使用讲解,大概应该会更新30篇,涵盖入门、进阶、高级(一些原理分析);这一篇是入门准备数据和一些关于数据库的操作命令;虽然MYSQL命令很多&…...
求矩阵不靠边元素之和(PTA)C语言
求矩阵的所有不靠边元素之和,矩阵行的值m从键盘读入(2<m<10),调用自定义函数Input实现矩阵元素从键盘输入,调用Sum函数实现求和。(只考虑float型,且不需考虑求和的结果可能超出float型能表示的范围)。 函数接口定义&#x…...
仿infobip模板功能-可通过占位符配置模板内容
模仿infobip制作的模板功能,正文可在任意位置加参数的功能。如下图所示:在正文中通过{{\d}}进行占位,在使用模板时,可在此位置自定制内容,并预览效果。 代码: <template><div class"templa…...
STM32第6章、WWDG
一、简介 WWDG:全称Window watchdog,即窗口看门狗,本质上是一个能产生系统复位信号和提前唤醒中断的计数器。 特性: 是一个递减计数器。 看门狗被激活后, 当递减计数器值从 0x40减到0x3F时会产生复位(即T6位…...
没有正确使用HTTP Range Request,导致访问Azure Blob存储的视频没有实现流式播放
引文: 组里的小伙伴在修改视频播放相关的代码,修改之前的方案使用CDN转发,可以实现流式播放,修改之后的代码因为没有正确的使用Http Range Request, 导致画面访问Azure Blob存储的视频没有实现流式播放,整理下线索在这…...
React中Fiber树构建过程详解——react中render一个App组件(包含子组件)的流程详解
在 React 中,渲染一个包含子组件的组件涉及一系列底层流程,包括构建虚拟 DOM(React Element)、协调(Reconciliation)、Fiber 树管理和最终的 DOM 操作。以下是一个从底层解析的详细流程: 1. 初始…...
机器学习赋能的智能光子学器件系统研究与应用
在人工智能与光子学设计融合的背景下,科研的边界持续扩展,创新成果不断涌现。从理论模型的整合到光学现象的复杂模拟,从数据驱动的探索到光场的智能分析,机器学习正以前所未有的动力推动光子学领域的革新。据调查,目前…...
晨辉面试抽签和评分管理系统之七:面试成绩核算的三种方式
晨辉面试抽签和评分管理系统(下载地址:www.chenhuisoft.cn)是公务员招录面试、教师资格考试面试、企业招录面试等各类面试通用的考生编排、考生入场抽签、候考室倒计时管理、面试考官抽签、面试评分记录和成绩核算的面试全流程信息化管理软件。提供了考生…...
语音合成的预训练模型
语音合成的预训练模型 与 ASR(语音识别)和音频分类任务相比,语音合成的预训练模型检查点明显较少。在 Hugging Hub 上,可以找到近 300 个适合的检查点。 在这些预训练模型中,重点关注两种在 Huggingface Transformers 库中开箱即用的架构——SpeechT5 和 Massive Multili…...
Windows怎么搭建rust环境?
在Windows上搭建Rust开发环境相对简单,主要步骤如下: ### 1. 安装Rust 最简单的方法是使用官方提供的安装脚本。打开命令提示符(Command Prompt)或PowerShell,然后运行以下命令来下载并安装Rust: bash cu…...
【Flink】Flink内存管理
Flink内存整体结构图: JobManager内存管理 JVM 进程总内存(Total Process Memory)Flink总内存(Total Flink Memory):JVM进程总内存减去JVM Metaspace(元空间)和JVM Overhead(运行时开销)上图解释: JVM进程总内存为2G;JVM运行时开销(JVM Overh…...
React方向:react中5种Dom的操作方式
1、通过原生JS获取Dom去操作 通过document.querySelector(#title)原生js的方式去拿到dom节点,然后去进行操作。 import {Component} from "react";class App extends Component {//定义获取Dom的函数handleGetDom(){let title document.querySelector(#t…...
K8s数据存储之详解(Detailed Explanation of K8s Data Storage)
K8s数据存储相关概念详解(临时存储,节点存储,网络存储,PV/PVC) 本篇文章分享一下存储卷和数据持久化的相关概念: 存储卷概述 临时存储卷(Ephemeral Volumes) 节点存储卷ÿ…...
PyTorch 中的 Dropout 解析
文章目录 一、Dropout 的核心作用数值示例:置零与缩放**训练阶段****推理阶段** 二、Dropout 的最佳使用位置与具体实例解析1. 放在全连接层后2. 卷积层后的使用考量3. BatchNorm 层与 Dropout 的关系4. Transformer 中的 Dropout 应用 三、如何确定 Dropout 的位置…...
计算机网络 (41)文件传送协议
前言 一、文件传送协议(FTP) 概述: FTP(File Transfer Protocol)是互联网上使用得最广泛的文件传送协议。FTP提供交互式的访问,允许客户指明文件的类型与格式(如指明是否使用ASCII码࿰…...
AOSP 14及以上userdebug无法调试的问题
参考链接:原文...
【Vue】点击侧边导航栏,右侧main对应显示
需求:点击侧边导航栏,右侧main对应显示 通过v-if或v-show等指令来控制不同内容的显示隐藏来实现 注意: 使用v-if时候进行导航栏切换,右侧显示区域可能会出现样式错乱;使用v-show则不会出现此错误 <template>&…...
Python Selenium 库学习指南
Python Selenium 库学习指南 目录 Selenium 基础介绍 Selenium 是什么安装 SeleniumSelenium 的工作原理 Selenium 基本用法 启动浏览器定位元素常见操作:点击、输入、滚动 高级用法 切换窗口与标签页模拟鼠标操作与键盘输入动态加载的网页处理 等待机制 显式等待…...
如何解决Webview和H5缓存问题,确保每次加载最新版本的资源
WebView 用于加载 H5 页面是常见的做法,它能够加载远程的 HTML、CSS、JavaScript 资源,并且让 Web 应用嵌入到原生 App 中。然而,WebView 的缓存机制有时会导致用户看到的是旧版本的页面或资源,尤其是在 H5 发版后,iOS…...
costmap 中点与多边形的相对位置关系
一、背景 近期在阅读move_base源码costmap部分(感觉想玩转movebase导航,costmap必须理解呀)。读到两处点与多边形的相对位置关系。在此总结一下,分别是: intersects: 利用待测点向右引出的射线与多边形的交点数来确定相对位置。有的称 射线交叉算法&am…...
C#与Vue2上传下载Excel文件
1、上传文件流程:先上传文件,上传成功,返回文件名与url,然后再次发起请求保存文件名和url到数据库 前端Vue2代码: 使用element的el-upload组件,action值为后端接收文件接口,headers携带session信…...
.NetCore 使用 NPOI 读取带有图片的excel数据
在.NetCore使用NPOI插件进行批量导入时,获取Excel中的所有的图片数据,存到集合中。 1.定义类PictureData 代码如下: public class PictureData { public byte[] Data { get; set; } } 2.数据集引用 using NPOI.XSSF.UserModel; usin…...
鸿蒙打包发布
HarmonyOS应用/元服务发布(打包发布) https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/ide-publish-app-V13?catalogVersionV13 密钥:包含非对称加密中使用的公钥和私钥,存储在密钥库文件中,格式…...
C++并发编程之跨应用程序与驱动程序的单生产者单消费者队列
设计一个单生产者单消费者队列(SPSC队列),不使用C STL库或操作系统原子操作函数,并且将其放入跨进程共享内存中以便在Ring3(用户模式)和Ring0(内核模式)之间传递数据,是一…...
22、PyTorch nn.Conv2d卷积网络使用教程
文章目录 1. 卷积2. python 代码3. notes 1. 卷积 输入A张量为: A [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ] \begin{equation} A\begin{bmatrix} 0&1&2&3\\\\ 4&5&6&7\\\\ 8&9&10&11\\\\ 12&13&14&15 \end{b…...
智汇云舟参编《城市轨道交通安全防范系统技术要求》国标正式发布
近日,根据国家标准化管理委员会官网,全国标准信息公共服务平台发布的公告,国家标准《城市轨道交通安全防范系统技术要求》(GB/T 26718-2024)已由全国城市轨道交通标准化技术委员会上报国家标准化管理委员会,…...
C# 数据拟合教程:使用 Math.NET Numerics 的简单实现
C# 数据拟合实战:使用 Math.NET Numerics 快速实现 引言 在科学计算、工程建模或数据分析中,数据拟合是一个非常重要的技术。无论是线性拟合还是非线性拟合,借助适当的工具都可以快速解决问题。本文将向您展示如何使用 C# 和强大的数值计算…...
WEB攻防-通用漏洞_XSS跨站_权限维持_捆绑钓鱼_浏览器漏洞
目录 XSS的分类 XSS跨站-后台植入Cookie&表单劫持 【例1】:利用beef或xss平台实时监控Cookie等凭据实现权限维持 【例2】:XSS-Flash钓鱼配合MSF捆绑上线 【例3】:XSS-浏览器网马配合MSF访问上线 XSS的分类 反射型(非持久…...
瑞芯微 RK 系列 RK3588 使用 ffmpeg-rockchip 实现 MPP 视频硬件编解码-代码版
前言 在上一篇文章中,我们讲解了如何使用 ffmpeg-rockchip 通过命令来实现 MPP 视频硬件编解码和 RGA 硬件图形加速,在这篇文章,我将讲解如何使用 ffmpeg-rockchip 用户空间库(代码)实现 MPP 硬件编解码。 本文不仅适…...
MySQL数据库(SQL分类)
SQL分类 分类全称解释DDLData Definition Language数据定义语言,用来定义数据库对象(数据库,表,字段)DMLData Manipulation Language数据操作语言,用来对数据库表中的数据进行增删改DQLData Query Languag…...
SpringBoot-Day1
1.Springboot入门 创建Maven工程 导入spring-boot-stater-web起步依赖 编写Controller 提供启动类 2.yml配置信息书写与获取 书写 # 发件人信息 email:user: 172349823457qq.comcode: sajdajlwhjfgfkllwhost: smtp.qq.comauth: true # 学生爱好 hobbies:- 打篮球- 踢…...
【JavaScript】基础内容,HTML如何引用JavaScript, JS 常用的数据类型
HTML 嵌入 Javascript 的方式 引入外部 js 文件 <head> <script Language "javaScript" src"index.js"/> </head>内部声明 <head> <script language"javascript">function hello(){alert("hello word&qu…...
mysql中创建计算字段
目录 1、计算字段 2、拼接字段 3、去除空格和使用别名 (1)去除空格 (2)使用别名:AS 4、执行算术计算 5、小结 博主用的是mysql8 DBMS,附上示例资料: 百度网盘链接: https://pan.baidu.co…...
如何优化zibll子比主题SEO并设置有效robots文件
如果你不知道 robots.txt 是什么,也不确定如何正确地设置它,本篇文章会向您介绍适用于子比主题的 robots.txt 文件,利用它可以提升 SEO 的效果,避免收录无关页面,从而解决网站被收录但无权重的困境。 作为一款高效的 …...
线程间通信
线程间通信(Inter-Thread Communication, 简称ITC)是指在多线程编程中,不同线程之间如何交换信息或协调彼此的行为。良好的线程间通信机制是构建高效、可靠的并发程序的关键。Java语言提供了多种内置工具和库来支持线程间的通信,包…...