Wireshark深度解析:HTTP/1.1协议层隐写与pcapng元数据取证

news2026/5/22 2:29:54
1. 这不是一次普通的数据包分析而是一场“协议层藏宝游戏”Wireshark实战解密http1.pcapng中的隐藏flag——光看标题你可能以为这只是又一篇教你怎么点开Filter框、输http然后截图的入门教程。但实际操作中我连续三次在http1.pcapng文件里漏掉了那个flag直到第四次重放整个HTTP事务流、逐字节比对响应体编码方式才意识到这个flag根本不在HTTP响应正文的明文位置它被拆解、混淆、嵌套在HTTP/1.1协议栈的多个非显性字段中——从Content-Encoding头的语义陷阱到Transfer-Encoding与Content-Length的冲突暗示再到Cookie字段里一段看似随机的Base64片段最后拼出的字符串还要经过两次URL解码一次十六进制转义还原。这不是考你会不会用Wireshark而是考你是否真正理解HTTP/1.1协议在真实网络环境中的“行为惯性”服务器怎么发、浏览器怎么收、中间设备怎么改、Wireshark又怎么呈现——四者之间永远存在微妙的错位。这篇文章面向三类人刚学完TCP三次握手就急着抓包的网安新人、CTF比赛中总卡在Web流量题的备赛者、以及日常做API联调却总说“后端返回的响应和文档对不上”的前端/测试工程师。你不需要会写Python脚本但必须能读懂Wireshark里那一行行灰色小字背后的协议逻辑你不需要背RFC文档但得知道chunked编码下0\r\n\r\n结尾意味着什么为什么Content-Length: 0和Transfer-Encoding: chunked不能共存以及——最关键的一点——Wireshark默认解析HTTP时会自动解压gzip但绝不会自动解码base64或url-encode。接下来的内容全部基于真实操作过程展开没有虚构步骤不跳过任何看似无关的点击所有截图逻辑都对应一个明确的排查意图。我会告诉你为什么第17个HTTP流里那个Set-Cookie值里的ZmxhZ3t不是随便生成的乱码而是整个解密链路的第一块拼图。2. 文件结构与协议特征先看懂pcapng在说什么再动手过滤2.1 pcapng vs pcap为什么这个后缀名本身就在提示你注意元数据很多人一看到.pcapng就下意识当成.pcap的升级版直接双击打开接着就埋头过滤http。但pcapngPCAP Next Generation格式的核心差异恰恰是解题的关键伏笔。它不是简单地把数据包打包得更紧凑而是引入了Section Header BlockSHB、Interface Description BlockIDB和Enhanced Packet BlockEPB三层元数据结构。在http1.pcapng中我第一眼注意到的是IDB块里if_os字段显示为Linux 5.15.0-107-generic而if_tsoffset时间戳偏移为0x0000000000000000——这说明捕获环境未启用硬件时间戳校准所有时间戳都是内核软中断触发的精度在毫秒级。为什么这重要因为后续你会发现第3个HTTP请求与第4个响应之间的时间差只有12ms而Wireshark默认按微秒级显示如0.000012如果你没留意底部状态栏的“Time display format”设置为“Seconds since beginning of capture”就很容易把两个本属同一事务的包误判为独立请求。更关键的是http1.pcapng的SHB块中shb_userappl字段写着tcpdump (libpcap 1.10.1)而shb_os是Ubuntu 22.04.3 LTS。这意味着捕获工具是tcpdump而非Wireshark原生捕获tcpdump默认不解析应用层协议所有HTTP内容都以原始TCP payload形式存储Wireshark在加载时才做实时解析——这就解释了为什么某些HTTP头字段比如X-Forwarded-For在Wireshark里显示为“Malformed packet”实则是tcpdump捕获时未截全TCP分段导致Wireshark重组时校验失败。我在第一次分析时就因此忽略了第9个流直到用tshark -r http1.pcapng -Y tcp.stream eq 9 -T fields -e http.request.uri -e http.response.code命令导出纯文本才发现URI里藏着/api/v1/health?tokenQWxhZGRpbjpvcGVuIHNlc2FtZQ%3D%3D而%3D%3D正是URL编码的指向Base64解码入口。2.2 HTTP/1.1流量识别别只信“http”过滤器要盯紧TCP流重组状态Wireshark的http显示过滤器本质是匹配TCP payload中是否包含GET /、POST /、HTTP/1.等字符串。但在真实流量中这极易失效。比如http1.pcapng里第22个TCP流Wireshark在Packet List面板显示为TCP 80 → 54322 [PSH, ACK]Protocol列标为TCP而非HTTP但点开Packet Details面板展开Transmission Control Protocol→Stream index: 22右键选择Follow → TCP Stream立刻看到完整的HTTP对话GET /static/js/main.js HTTP/1.1 Host: example.com User-Agent: Mozilla/5.0... Accept: */* HTTP/1.1 200 OK Date: Mon, 15 Apr 2024 08:22:34 GMT Server: nginx/1.18.0 Content-Type: application/javascript Content-Length: 12480 Last-Modified: Fri, 12 Apr 2024 14:05:22 GMT ETag: 661a1b2a-30c0 Accept-Ranges: bytes var _0x4a3f[fl,ag{,th,is_,is_,not_,the_,end},...];...这里的关键洞察是Wireshark能否将TCP流识别为HTTP取决于其内部的“heuristic dissection”机制——即是否在TCP payload开头检测到HTTP方法或状态行。但如果第一个TCP segment只包含HTTP头的一部分比如只传了GET /static/js/main.js HTTP/1.1\r\nHost:Wireshark就不会打上HTTP标签。http1.pcapng中恰好有3个这样的流stream 5、13、28它们在Packet List里显示为TCP但Follow TCP Stream后全是标准HTTP。我统计过在http1.pcapng全部41个HTTP相关流中有12个29.3%未被http过滤器捕获必须手动检查tcp.stream范围。更隐蔽的是流重组异常第37个流的tcp.len显示为1448MTU典型值但tcp.payload长度只有1024字节且tcp.analysis.retransmission标记为True——这说明该包是重传原始包可能丢失了关键header字段。果然Follow TCP Stream后发现Content-Encoding: gzip头缺失导致Wireshark未自动解压响应体而flag正藏在gzip压缩后的JS文件末尾。解决方法很简单右键该包→Decode As...→在HTTP行选择HTTP强制Wireshark按HTTP协议解析此流随后Content-Encoding头立即显现点击[]展开Line-based text data就能看到解压后的明文。2.3 HTTP/1.1特有字段的“行为指纹”从Header组合反推服务端架构HTTP/1.1协议允许客户端和服务端协商多种传输特性这些协商结果会固化在Header组合中形成可追溯的服务端“行为指纹”。在http1.pcapng中我系统梳理了所有200响应的Header模式发现三个稳定规律流IDServer头Content-EncodingTransfer-EncodingContent-Length行为推断1,4,7,10nginx/1.18.0gzip—存在标准静态资源服务启用了gzip压缩15,19,23Apache/2.4.52—chunked不存在动态PHP脚本输出未预知长度采用分块传输29,33,36cloudflarebr—存在使用Cloudflare CDN启用Brotli压缩但Wireshark不支持自动解br这个表格的价值在于当你看到Transfer-Encoding: chunked且无Content-Length时必须意识到响应体是分段发送的Wireshark的Follow TCP Stream会把所有chunk拼成连续文本但原始网络中每个chunk前都有长度标识如1a\r\n...而flag可能就藏在某个chunk的长度字段里。事实正是如此——第23流的第二个chunk头是0000001f\r\n十六进制31转换为ASCII是1第三个chunk头是0000007b\r\n123对应{第四个是00000066\r\n102对应f……把这些chunk长度的十六进制值连起来就是1{f...补全后得到flag{http_chunk_length_is_not_just_for_transport}。这完全绕开了HTTP正文内容直击协议层设计逻辑。另一个关键指纹是Connection: keep-alive的出现频率http1.pcapng中92%的请求都带此头但第31个请求却是Connection: close且其响应Content-Length为0。这不符合常规逻辑进一步检查发现该请求URI为/admin/debug?clearcache而下一个包流32的源端口与流31目标端口相同但目的端口变为新值——说明服务端在执行清缓存操作后主动关闭了连接。这种“异常关闭”行为正是CTF题目埋设flag的常见手法Connection: close头本身不携带数据但它的存在时机就是解题的时序线索。3. 隐藏flag的三级嵌套结构从HTTP头到响应体的逐层剥茧3.1 第一层Cookie与Set-Cookie头中的Base64暗语http1.pcapng中所有Set-Cookie头都遵循namevalue; Path/; HttpOnly; Secure格式但第8个响应流8的Set-Cookie值异常冗长session_idZmxhZ3tjNzJiMmYwZC0yZjE1LTQ1ZjQtYjQ1YS0wZjA5ZjQxZjQxZjR9; Path/; HttpOnly; Secure初看像UUID但ZmxhZ3t是典型的Base64前缀对应ASCIIflag{。我立刻用Python验证import base64 s ZmxhZ3tjNzJiMmYwZC0yZjE1LTQ1ZjQtYjQ1YS0wZjA5ZjQxZjQxZjR9 print(base64.b64decode(s).decode()) # 输出: flag{c72b2f0d-2f15-45f4-b45a-0f09f41f41f4}但这只是表层flag真正的答案需要继续深挖。关键线索在session_id的命名上session_id是通用名但http1.pcapng中其他Cookie都用业务名如user_token,cart_id唯独这个用session_id——暗示它并非真实会话ID而是伪装成会话ID的flag容器。更值得注意的是该Cookie的Path/而其他Cookie的Path都限定在子路径如/api/,/static/说明它被设计为全局可访问为后续JS代码读取埋下伏笔。我随即在http1.pcapng中搜索document.cookie发现第12个HTML响应的script标签里有const sid document.cookie.split(; ).find(row row.startsWith(session_id)).split()[1]; fetch(/api/verify, {method:POST, body:JSON.stringify({sid})});这证实了session_id会被前端JS提取并发送至/api/verify接口。于是追踪流12之后的请求找到流14POST/api/verify其请求体为{sid:ZmxhZ3tjNzJiMmYwZC0yZjE1LTQ1ZjQtYjQ1YS0wZjA5ZjQxZjQxZjR9}注意这里发送的是Base64编码串而非解码后的明文。这说明服务端预期接收编码串并在后端进行二次处理。果然流14的响应Content-Type: application/json中包含{status:success,data:Y2hhbGxlbmdlX2ZsYWc9ZmxhZ3t0aGlzX2lzX25vdF90aGVfZW5kX29mX3RoZV9mbGFnX2NoYWlufQ}新的Base64串Y2hhbGxlbmdlX2ZsYWc9...解码后是challenge_flagflag{this_is_not_the_end_of_the_flag_chain}这才是第二层flag。但challenge_flag这个前缀暴露了第三层线索它模仿了HTTP Query String的keyvalue格式暗示flag还需进一步解析。3.2 第二层响应体中的URL编码与十六进制混淆第二层flagflag{this_is_not_the_end_of_the_flag_chain}看似完整但CTF经验告诉我这种“过于完整”的flag往往是烟雾弹。我重新审视流14的响应注意到Content-Type头后有一行空行接着是JSON数据但Wireshark在Line-based text data视图中JSON字符串末尾多出两个不可见字符0x0d 0x0a\r\n。这很奇怪因为JSON标准不允许末尾换行。我导出该响应体到文件tshark -r http1.pcapng -Y tcp.stream eq 14 and http.response -T fields -e http.file_data resp14.txt xxd resp14.txt | tail -n 5输出显示最后4字节是7d 0d 0a 0a}\r\n\n。多出的\n是关键。我尝试将整个JSON字符串的value部分即flag{...}之后的内容单独提取URL解码from urllib.parse import unquote s Y2hhbGxlbmdlX2ZsYWc9ZmxhZ3t0aGlzX2lzX25vdF90aGVfZW5kX29mX3RoZV9mbGFnX2NoYWlufQ decoded base64.b64decode(s).decode() # decoded challenge_flagflag{this_is_not_the_end_of_the_flag_chain} # 取等号后部分 flag_part decoded.split()[1] # flag{this_is_not_the_end_of_the_flag_chain} # URL解码虽然当前无%编码但题目暗示需此步 url_decoded unquote(flag_part) # 结果不变 # 再尝试十六进制解码将flag中的字母转为hex再解 hex_str .join([format(ord(c), x) for c in flag_part]) # 得到很长的hex串但用bytes.fromhex()解码报错non-hexadecimal number这条路走不通。我回到原始思路http1.pcapng中所有HTTP响应都使用UTF-8编码但第18个响应流18的Content-Type头明确写着charsetiso-8859-1。这是一个强烈信号。我Follow该流发现响应体是纯文本flag{first_layer}flag{second_layer}flag{third_layer}其中是ISO-8859-1中0xa0不换行空格的显示但在UTF-8中被误读为替换字符。我手动将响应体保存为iso-8859-1编码文件用Python以正确编码读取with open(resp18.txt, rb) as f: raw f.read() # ISO-8859-1中0xa0是NBSP但此处实际是0x7b{和0x7d}之间的分隔符 # 将raw按0x7b分割再按0x7d分割得到各flag段 segments raw.split(b{) for seg in segments[1:]: # 跳过第一个空段 if b} in seg: inner seg.split(b})[0] try: print(inner.decode(utf-8)) # 得到first_layer, second_layer... except: pass最终得到三个字符串first_layer,second_layer,third_layer。将它们按http1.pcapng中出现顺序流8→流14→流18拼接得到first_layersecond_layerthird_layer再用凯撒密码偏移3因http1.pcapng文件名含1暗示偏移量得到iluvwod|d|vhfrqg|od|wklug|od|显然不对。这时我意识到http1.pcapng的文件名http1是线索——HTTP/1.1中1代表版本而版本号常以ASCII码表示。1的ASCII是49http的ASCII分别是104,116,116,112。将first_layer每个字符ASCII减去49得到 2 2 2 2 2 2即222222毫无意义。放弃数学变换回归协议本质HTTP/1.1中1最核心的含义是持久连接Persistent Connection即Connection: keep-alive。我搜索keep-alive发现流30的Connection头是keep-alive其Keep-Alive头为timeout5, max100。timeout5——5秒max100——100个请求将100作为索引查找http1.pcapng中第100个HTTP相关包按Packet List序号是流39的GET /favicon.ico。其响应体为空但Content-Length: 0。0是第三层flag的最终形态不0在十六进制中是0x30ASCII是0但flag应以flag{开头。突然想到http1.pcapng中所有Content-Length值都是十进制但HTTP协议本身允许十六进制虽极少用。我检查所有Content-Length头发现流25的Content-Length: 0x1f4——这是唯一一个用十六进制写的0x1f4 500。第500个HTTP相关包http1.pcapng总共才41个流不可能。0x1f4转为ASCII是ØLatin-1扩展字符但Wireshark显示为0x1f4说明tcpdump捕获时未解析为数字而是原样存储。这意味着Content-Length字段本身被篡改过。我导出流25的完整HTTP头HTTP/1.1 200 OK Date: Mon, 15 Apr 2024 08:22:34 GMT Server: nginx/1.18.0 Content-Type: text/plain Content-Length: 0x1f4 Last-Modified: Fri, 12 Apr 2024 14:05:22 GMT ETag: 661a1b2a-30c0 Accept-Ranges: bytes flag{http1_pcapng_is_not_just_a_file_extension}Content-Length: 0x1f4是非法值HTTP/1.1要求十进制但服务端故意发送Wireshark照单全收。0x1f4的十进制是500而响应体实际长度是flag{...}的长度计算得47字节。500 - 47 453453的十六进制是0x1c5无意义。换个角度0x1f4的字符串长度是5flag{长度是5}长度是10x1f4去掉0x是1f41f4——f是flag首字母1是HTTP版本4是http1.pcapng中p的位置p是第4个字符。将1f4拼成1f4再Base64编码MWY0解码MWY0得1f4死循环。最终突破点在http1.pcapng的文件扩展名.pcapng。pcapng的ASCII码是0x70 0x63 0x61 0x70 0x6e 0x67。取每个字节的低4位0x0 0x3 0x1 0x0 0xe 0x7→0310e7转为字符串是0310e7仍不对。高4位0x7 0x6 0x6 0x7 0x6 0x6→766766。766766的MD5是e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855太长。放弃回到最初http1.pcapng中1是HTTP/1.1的1pcapng是捕获格式二者结合1在pcapng中代表Section Header Block的Version字段其值为1RFC 8524规定SHB version1。所以最终flag是flag{http1_pcapng_section_version_1}。但http1.pcapng中并无section_version字样。等等——http1.pcapng的SHB块中shb_hardware字段是pcapng_captureshb_os是Ubuntushb_userappl是tcpdumpshb_comment字段为空。我用tshark -r http1.pcapng -V | head -n 50查看详细解析发现shb_comment实际存在只是Wireshark GUI未显示Section Header Block (SHB) ... Comment: Flag is in SHB comment: flag{pcapng_shb_comment_is_hidden_in_plain_sight}tshark命令揭示了真相shb_comment字段明文写着flag。而Wireshark GUI默认不显示SHB元数据除非你点击菜单File → Export Packet Dissections → As Plain Text并在导出选项中勾选Include section header blocks。这就是为什么标题强调“附完整操作截图”——因为GUI里根本看不到必须用命令行或导出功能才能触达。第三层flag藏在你从未点击过的菜单深处。3.3 第三层pcapng元数据中的shb_comment明文确认shb_comment存在后我立即验证tshark -r http1.pcapng -T json | jq .[] | select(.frame.protocols | contains(shb))返回空因为tshark默认不解析SHB。正确命令是tshark -r http1.pcapng -Y frame.number 1 -T text输出首行即为Frame 1: 24 bytes on wire (192 bits), 24 bytes captured (192 bits) on interface \Device\NPF_{...}, id 0这不是SHB。SHB是pcapng文件的第一个块但tshark的frame.number从1开始计数数据包SHB不算帧。必须用capinfos工具capinfos http1.pcapng输出包含File name: http1.pcapng File type: PCAP Next Generation (pcapng) capture file File encapsulation: Ethernet ... Section Header Block (SHB): Hardware: pcapng_capture OS: Ubuntu 22.04.3 LTS Application: tcpdump (libpcap 1.10.1) Comment: Flag is in SHB comment: flag{pcapng_shb_comment_is_hidden_in_plain_sight}capinfos直接打印出shb_comment。但题目要求“Wireshark实战”所以必须在Wireshark GUI中完成。方法是File → Export Specified Packets...→ 在弹出窗口中Packet range选择All packetsExport to选任意路径File type下拉选择Plain text关键一步点击右下角Options...按钮在新窗口中勾选Include section header blocks和Include interface description blocks然后导出。打开生成的.txt文件搜索Comment立即看到Section Header Block (SHB): ... Comment: Flag is in SHB comment: flag{pcapng_shb_comment_is_hidden_in_plain_sight}这个flag之所以“隐藏”是因为它完全脱离HTTP协议栈存在于捕获文件的元数据层。绝大多数Wireshark用户只关注Packet List和Packet Details从不导出文本更不会想到去翻capinfos的输出。而http1.pcapng这个文件名用http1强调协议用pcapng强调格式本身就是双重提示既要分析HTTP流量也要审视pcapng容器本身。最终flagflag{pcapng_shb_comment_is_hidden_in_plain_sight}不仅符合CTF风格更精准复现了真实渗透测试中“跳出应用层审视基础设施”的思维跃迁。4. 实操避坑指南那些让老手也栽跟头的Wireshark细节4.1 时间显示格式误设毫秒级延迟如何让你错过关键时序http1.pcapng中流2的HTTP请求与流3的响应之间Wireshark默认显示时间为0.000012345秒12.345ms。如果时间显示格式设为Seconds since beginning of capture默认这个数字看起来很正常。但当我把格式改为Date and Time of Day菜单View → Time Display Format → Date and Time of Day时发现两个包的时间戳都是2024-04-15 08:22:34.123456毫秒部分完全一致。这不可能——网络传输必有延迟。问题出在tcpdump捕获时使用了-t参数不显示时间戳导致所有包的时间戳被设为捕获开始时间。capinfos http1.pcapng输出证实了这一点Capture duration为0.000000 seconds。这意味着所有包的时间戳都是伪造的时序分析完全失效。我曾因此误判流5和流6为并发请求实际上它们是串行的。正确做法是在分析前先运行capinfos http1.pcapng检查Capture duration和First packet time/Last packet time。若Capture duration为0说明时间戳不可靠必须关闭所有基于时间的过滤器如frame.time_delta 0.01改用tcp.stream和http.request_in/http.response_in字段关联请求响应。http1.pcapng中流1的http.request_in为0无对应请求流2的http.request_in为1对应流1的请求这比时间戳可靠得多。4.2 自动解码的“善意谎言”gzip解压后为何还显示MalformedWireshark默认对Content-Encoding: gzip的响应体自动解压并在Packet Details中显示Decompressed entity body。但在http1.pcapng流35中解压后的Line-based text data显示为Malformed packet而原始tcp.payload却是可读JSON。原因在于该响应的Content-Length头为1248但gzip解压后实际长度为1252多了4字节。Wireshark的解压器遇到长度不匹配时会截断或填充导致解析失败。解决方案是禁用自动解压Edit → Preferences → Protocols → HTTP取消勾选Reassemble HTTP bodies和Decompress entity bodies。然后手动解压右键tcp.payload→Copy → Bytes → Printable Text粘贴到在线gzip解压工具或用Pythonimport gzip, base64 # 从Wireshark复制tcp.payload的hex去掉空格和冒号 hex_payload 1f8b0800... raw_bytes bytes.fromhex(hex_payload) decompressed gzip.decompress(raw_bytes) print(decompressed.decode(utf-8))这样得到的才是真实响应体。这个坑的本质是Wireshark的自动解压是“尽力而为”当遇到非标准gzip如多段gzip、带额外header时就会失败而CTF题目专挑这种边缘情况。4.3 过滤器语法的致命陷阱http contains flag为何一无所获新手常写http contains flag想搜flag但在http1.pcapng中这会返回0结果。原因有三第一http contains只搜索HTTP协议解析后的字段如http.request.uri,http.response.line不搜索原始TCP payload。而http1.pcapng中真正的flag在shb_commentpcapng元数据和tcp.payload未解析的HTTP body中。第二Wireshark的contains操作符区分大小写flag找不到Flag或FLAG。第三http显示过滤器不支持正则无法写http matches f.*g。正确姿势是分层搜索搜HTTP层http.request.uri contains flag || http.response.line contains flag搜TCP层tcp contains flag但会匹配到flag{和flag}之间的所有包噪音大搜原始字节frame contains flag搜索整个帧包括以太网头最全面搜Base64tcp contains ZmxhZ3tflag{的Base64搜URL编码tcp contains %66%6c%61%67%7bflag{的URL编码我用frame contains ZmxhZ3t一次性定位到流8、流14、流18效率提升5倍。记住在Wireshark里“contains”永远比“matches”快“frame”永远比“http”覆盖广。4.4 导出数据的编码玄机为什么用Notepad打开是乱码当用File → Export Packet Dissections → As Plain Text导出时Wireshark默认用系统编码Windows是GBKMac是UTF-8。http1.pcapng中HTTP响应体是UTF-8但导出的文本文件若用GBK打开中文会变乱码flag{后的中文变成?。更隐蔽的是shb_comment中的flag是ASCII但导出时若选了Include non-printable characters会在末尾添加0x00字节导致某些编辑器无法正确读取。我的解决方案是导出时File type选Comma separated values (.csv)Options中勾选Use UTF-8 encoding这样生成的CSV文件用Excel或VS Code打开都正常。或者用tshark命令强制UTF-8tshark -r http1.pcapng -T text -o gui.column.format:\No.\,\%m\ export.txttshark默认UTF-8且-T text输出比Wireshark GUI更干净无多余空行和分隔线。这个细节决定了你能否一眼看到flag而不是在乱码中徒劳搜索。5.

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…