Linux下HTTP协议调试:从报文结构到抓包实战
这个标题看上去很基础基础到你甚至会怀疑有没有必要单独写一篇长文。但我在Linux底下跟接口调试打了这么多年交道越来越觉得“应用层协议HTTP”这六个字恰恰是区分“会用浏览器”和“会做接口调试”的分水岭。很多人遇到问题只会刷新页面可真到了服务器上连个curl输出都不敢说完全看懂。HTTP是应用层协议整个Web服务的请求与响应都由它承载而在Linux上你几乎没有办法靠“点一点”绕过它只能用命令行工具把报文一层层剥开。这篇文章适合那些想在Linux上真正掌握HTTP的开发者也适合被接口超时、状态码异常、重复请求问题折磨过的人。我会从报文格式、命令行实战、实时抓包到排障技巧把这条链路尽量讲透少走我之前走过的弯路。1. 理解HTTP前先搞懂它在Linux下的完整链路1.1 从“浏览器能开”到“命令行能拜”浏览器最大的“罪过”就是封装太好。你在开发者工具里看到的格式化请求头和响应头其实已经帮你把TCP连接、DNS解析、TLS握手、HTTP报文生成这些事全部做了。可服务器上没有图形界面只有Shell这时候curl、nc、tcpdump这些工具才是你的眼睛。你必须自己关心Host头有没有写、Content-Length是谁算出来的、重定向要不要跟、连接是不是Keep-Alive。我之前遇到过一个典型问题同事说接口在浏览器里能正常拿到数据但在服务器上用curl执行就是失败。排查到最后发现是这台服务器的curl版本太旧不支持某个新TLS扩展证书校验直接失败。浏览器用的是系统自带的“现代网络栈”而curl则完全依赖自身和openssl编译时的能力。理解了这个差异你会发现很多所谓的“灵异事件”其实都是应用层细节没有被真正掌握。所以在Linux上调试HTTP核心不是背命令而是理解一条请求从进程到内核再到远端服务器的完整路径。只有把这个路径摸清遇到问题时你才知道该在哪一层打日志、在哪一层抓包、在哪一层修配置。1.2 用strace看一次HTTP请求的系统调用全过程很多人把HTTP请求想得太抽象其实它最终就是进程往socket文件描述符里写一段文本再从同一个fd里读回另一段文本。为了把这件事讲清楚我习惯先在本机起一个临时HTTP服务再用strace看系统调用。比如先用Python标准库起一个最简单的文件服务python3 -m http.server 8000 --bind 127.0.0.1然后在另一个终端里用strace跟踪curl的网络相关系统调用strace -e tracenetwork curl -s http://127.0.0.1:8000/hello你会看到类似这样的输出socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC, IPPROTO_TCP) 3 connect(3, {sa_familyAF_INET, sin_porthtons(8000), sin_addrinet_addr(127.0.0.1)}, 16) 0 sendto(3, GET /hello HTTP/1.1\r\nHost: 127.0.0.1:8000\r\nUser-Agent: curl/8.0\r\nAccept: */*\r\n\r\n, 84, 0, NULL, 0) 84 recvfrom(3, HTTP/1.0 200 OK\r\nServer: SimpleHTTP/0.6 Python/3.9\r\nDate: ...\r\n\r\nHello, ...) 102这里的socket创建的是TCP套接字connect完成三次握手sendto发送的就是HTTP请求报文本身recvfrom读回的是HTTP响应报文。内核不关心你发的文本是什么意思它只负责原样搬运真正解析内容的是应用层的HTTP库或者服务器程序。这个理解非常重要。当你以后遇到“请求发出去了但服务端说没收到”的问题时你至少知道该用strace去看sendto是否真正执行返回了多少字节。如果是0或者-1那就是内核层就没送出去别急着怀疑应用逻辑。2. 报文结构拆解亲手发送一次原始HTTP请求2.1 请求行和首部用curl -v看一次真实交互HTTP请求报文由四个部分组成请求行、请求头、空行、请求体。请求行格式是固定的比如GET /hello HTTP/1.1方法 空格 请求URI 空格 协议版本最后以回车换行CRLF结尾。这里我特意强调CRLF是因为很多初学者喜欢用echo -e GET / HTTP/1.1\nHost: localhost\n\n发请求结果服务器直接返回400。原因就是只用了\n没用\r\n。协议规定行结束符必须是CRLF也就是十六进制的0x0d 0x0a。为了直观看到一次真实交互执行curl -v http://127.0.0.1:8000/hello输出里开头的是你发出去的请求开头的是服务器返回的响应 GET /hello HTTP/1.1 Host: 127.0.0.1:8000 User-Agent: curl/8.0 Accept: */* HTTP/1.0 200 OK Server: SimpleHTTP/0.6 Python/3.9 Date: Fri, ... Content-type: text/plain Hello注意请求头和响应头之后都有一个空行这个空行是必不可少的“分隔符”它告诉接收方“头部到此结束接下来是实体内容”。很多自写TCP服务解析HTTP头时都会去找\r\n\r\n这个序列搜不到就认为头还没发完。关于请求体GET请求通常没有。POST请求则会把表单或JSON放在请求头空行之后。比如常见的application/x-www-form-urlencoded格式body就是一串keyvaluekey2value2。服务器不会自动帮你拼接数据它只是按照Content-Type字段去解析你丢来的原始字节。2.2 响应状态行状态码背后的处理逻辑响应报文的起始行是状态行格式是协议版本 空格 状态码 空格 原因短语例如HTTP/1.1 200 OK。HTTP协议规定状态码是三位数字共分五类我整理了一张速查表状态码范围类型常见码及含义1xx临时响应100 Continue继续发送请求体101 Switching Protocols协议切换2xx成功200 OK正常返回201 Created创建成功204 No Content无返回体3xx重定向301永久移动302临时移动304 Not Modified缓存未修改4xx客户端错误400 Bad Request报文格式错401未认证403禁止访问404资源不存在413太大429请求过频5xx服务端错误500内部错误502网关坏503服务不可用504网关超时在Linux脚本里我几乎不会用眼睛盯着curl的整个输出。更常见的做法是直接用-w输出状态码和耗时把结果交给监控系统处理curl -s -o /dev/null -w http_code%{http_code} time%{time_total}s\n http://127.0.0.1:8000/hello这条命令会把响应体丢进黑洞只把状态码和总耗时打到标准输出。放在监控脚本或者接口巡检脚本里都非常好用。这里面的核心逻辑是HTTP状态码是“结果”的一部分但你不能只看状态码还要结合耗时、响应头、重定向次数这些维度来判断问题出在哪一层。3. 命令行调试HTTP接口的实战套路3.1 curl参数不是背出来的是按需求组合出来的curl是Linux上调试HTTP的首选工具但很多人只会curl url遇到复杂请求就懵。我建议你从四个需求维度去记忆参数改方法、改头、带数据、看过程。要自定义请求方法可以写-X POST但事实上如果你用-d传数据curl会自动切换为POST不必画蛇添足。要改请求头用-H Content-Type: application/json。要带URL参数之外的body数据用-d {a:1}。如果body是一个文件用-d file.json注意符号的作用。要看完整交互过程用-v。看一个POST JSON的常用组合curl -s -v \ -H Content-Type: application/json \ -H Authorization: Bearer xxx \ -d {name:test,count:1} \ http://127.0.0.1:8000/api这里-v会把请求行、请求头、响应头都打出来方便你确认Content-Type是否真的被带上。一个很典型的坑是加了-d之后Content-Type默认是application/x-www-form-urlencoded如果你忘记用-H指定JSON服务端很可能会因为格式不符拒绝请求。另外要重点记住两个超时参数--connect-timeout和--max-time。前者只控制TCP连接建立的等待时间后者控制整个请求从开始到结束的最大时间。很多服务端程序处理慢连接建立了但迟迟不返回数据如果只设connect超时你会一直挂在那里。所以在脚本里我习惯两个都设比如--connect-timeout 5 --max-time 30。还有一个坑是代理环境变量。curl会读取http_proxy、https_proxy这些环境变量如果服务器上设置了代理你访问127.0.0.1也可能被代理接管表现就是连接超时或者拿到奇怪的响应。出现“本地curl访问不了localhost”时先执行echo $http_proxy看一眼然后加--noproxy *绕过代理。3.2 用nc和telnet裸写HTTP请求理解协议最底层curl已经帮我们组装好了报文但如果你想彻底理解协议得亲手把报文打出来。ncnetcat和telnet是干这件事的好工具。最简单的裸请求测试可以这样printf GET /hello HTTP/1.1\r\nHost: 127.0.0.1:8000\r\nConnection: close\r\n\r\n | nc -v 127.0.0.1 8000注意这里必须写Connection: close否则HTTP/1.1默认会保持连接服务器返回完响应后不关闭连接nc就会一直等在那里。也可以进入交互模式nc 127.0.0.1 8000 GET /hello HTTP/1.1 Host: 127.0.0.1:8000 Connection: close输入完最后一行后多敲一个回车发送空行服务器就会返回响应。这个过程中你可以看到报文其实就是一行一行的纯文本没有什么神秘之处。用HTTP/1.0还有个好处是Host头不是必填。HTTP/1.1规定Host头必选如果服务器收到HTTP/1.1请求却没有Host会直接回400 Bad Request。你可以亲手测试一下这个限制把Host头去掉再发一次观察服务端的反应。通过这种“破坏性测试”你对协议约束的印象会比读十遍文档都深。3.3 用Python一行命令起一个本地HTTP服务快速造出测试对象调试过程中最怕没有目标服务。Python标准库自带的http.server模块可以在一秒内起一个只读文件服务python3 -m http.server 8000 --bind 127.0.0.1默认它会提供当前目录下的文件列表支持GET和HEAD请求。如果只是想临时验证curl、nc、tcpdump这个服务完全够用。但如果你想调试POST请求想看看body长什么样那我们可以写一个几行的自定义处理器。比如import json from http.server import BaseHTTPRequestHandler, HTTPServer class Handler(BaseHTTPRequestHandler): def do_GET(self): body bhello world self.send_response(200) self.send_header(Content-Type, text/plain) self.send_header(Content-Length, str(len(body))) self.end_headers() self.wfile.write(body) def do_POST(self): length int(self.headers.get(Content-Length, 0)) data self.rfile.read(length) print(POST body:, data.decode()) resp json.dumps({echo: data.decode()}).encode() self.send_response(200) self.send_header(Content-Type, application/json) self.send_header(Content-Length, str(len(resp))) self.end_headers() self.wfile.write(resp) HTTPServer((127.0.0.1, 8000), Handler).serve_forever()这个脚本会用Content-Length从socket里读出请求体再原样返回JSON。你可以在另一个终端用curl发POST观察它的输出。我特别强调用Content-Length来读body是因为这恰好呼应了HTTP协议中一个核心机制接收方必须先知道body有多长才能避免读多读少。4. 抓包分析让HTTP流量无处可藏4.1 tcpdump抓取HTTP请求包把“看不见的数据”摆在眼前遇到线上问题只靠curl看结果远远不够。你得能看到真实的网络包确认请求到底有没有发出去、响应是什么时候开始返回的。tcpdump是Linux上最经典的工具。比如前面我们在本地起了8000端口的服务那么可以这样抓取回环接口上的HTTP包sudo tcpdump -i lo -A -s 0 port 8000 -c 4这里-i lo监听回环接口-A把包内容以ASCII形式打印-s 0表示抓整个包而不截断port 8000过滤出与8000端口相关的流量-c 4只抓4个包后退出。然后在另一个终端执行curl -s http://127.0.0.1:8000/hellotcpdump输出会是类似这样的12:34:56.789012 IP 127.0.0.1.34567 127.0.0.1.8000: Flags [P.], seq 1:85, ack ..., length 84 GET /hello HTTP/1.1 Host: 127.0.0.1:8000 User-Agent: curl/8.0 Accept: */* Connection: close 12:34:56.789123 IP 127.0.0.1.8000 127.0.0.1.34567: Flags [P.], seq 1:103, ack ..., length 102 HTTP/1.0 200 OK Server: SimpleHTTP/0.6 Python/3.9 ...这里Flags [P.]表示TCP的Push标志说明这段数据是应用层写入的。你可以看到HTTP报文整个嵌在TCP负载里。如果你抓到了请求内容但服务端日志没有记录那问题多半在应用层解析如果连请求内容都抓不到那问题在更底层。如果流量很大不要把全部内容直接打印到终端先存成pcap文件再用图形化工具慢慢分析更高效sudo tcpdump -i any -s 0 port 8000 -w /tmp/http.pcap这样生成的pcap文件可以拷贝到本机用Wireshark打开也可以直接用tshark -r /tmp/http.pcap做命令行解析。4.2 从抓包反推Keep-Alive和Content-Length问题抓包最大的价值之一是能帮你理解HTTP的持久连接和消息边界问题。HTTP/1.1默认是Keep-Alive的也就是说同一个TCP连接上可以连续发多个请求复用连接避免重复握手。那接收方怎么知道一个响应结束了、下一个响应从哪里开始呢答案是看响应头里的Content-Length或者Transfer-Encoding: chunked。如果响应头里没有Content-Length也没有chunked那客户端只能认为“连接关闭时读到EOF就是响应结束”。这在HTTP/1.0的时代很常见但在HTTP/1.1的长连接下就会出问题服务端返回完数据不关闭连接客户端又没有边界信息就只能一直等直到超时。我在自写TCP服务时踩过这个坑。当时返回的响应没算对Content-Length客户端表现为“数据不完整”或“请求挂住”。后来用tcpdump抓包才发现TCP流里服务器回的数据其实早就到了只是客户端因为Content-Length比实际数据长还在继续等待后续字节。这就是报文边界没定清楚的典型症状。再单独说chunked编码。它用于响应体长度不确定的场景比如流式输出。格式是每个分块先写一行十六进制数字表示块长度再跟块内容最后以0\r\n\r\n结束。看一个例子HTTP/1.1 200 OK Transfer-Encoding: chunked 5 Hello 6 World 0这里的“5”表示下一块是5个字节即Hello“6”表示下一块是6个字节即World。最后的0表示整个响应体结束。排查流式接口时如果发现客户端迟迟不出数据很多时候不是服务端没推而是chunked格式写错了接收方在等块长度行。5. 常见问题与排查技巧实录5.1 状态码从1xx到5xx快速定位问题层次接口出问题时第一步永远是看状态码。状态码本身就是最好的线索。4xx开头的错误要先怀疑客户端的问题。比如400最常见的是报文格式不对尤其容易发生在手动拼POST数据或者漏了必要的请求头时。403通常代表身份或权限不够先检查认证头再检查IP白名单。404不一定代表路径不存在也可能是因为路由匹配规则太严格。429说明请求太频繁这时候要加退避而不是傻傻重试。5xx开头的错误就要转向服务端排查。500是代码内部异常去看进程日志502说明上游服务不可达或返回非法响应503往往伴随“服务过载”或“维护中”的字样如果你自己就是客户端那最好的策略是稍后重试504说明网关等了很久没等到上游响应可以往上查服务端线程池和数据库耗时。我见过很多人写脚本时不管状态码只看curl进程是否返回0。但curl的返回值只代表“请求完成”不代表“请求成功”。比如服务端返回500curl照样愉快地exit 0。所以脚本里一定要先抓出HTTP状态码再决定后续逻辑。5.2 curl返回空数据但浏览器正常的怪现象这个现象我遇到太多次了浏览器访问某个接口正常返回JSON但在Linux服务器上执行curl要么空白要么提示403。大多数时候问题出在“请求头差异”。最典型的是User-Agent。浏览器会带上一长串UA标识而curl默认的UA是curl/8.0。不少服务端逻辑会拿UA做统计或者判断客户端类型如果你不带浏览器UA它就给你返回一个降级内容甚至直接拒绝访问。解决办法就是在curl命令里显式加上浏览器UAcurl -s -H User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ... http://127.0.0.1:8000/api另一个常见原因是Referer头。服务端可能校验了来源页面没有Refereer或者来源不匹配就不放行。你可以用-H Referer: http://127.0.0.1:8000/试一下。第三个坑是证书问题。浏览器用的是系统根证书库curl可能因为编译时指定的证书路径不对而找不到CA。HTTPS请求出现SSL certificate problem时先确认证书链不要一上来就-k跳过校验。生产环境必须解决证书问题跳过校验只能作为临时手段。第四个容易被忽视的问题是环境变量代理。前面提过curl会读取系统代理变量。如果服务器上配置了http_proxy指向内网代理访问外网接口时可能会得到一片空白因为代理替你连了另一个地址。遇到怪问题时env | grep -i proxy这行命令值得先跑一下。5.3 超时与重试的边界处理在自动化脚本里超时和重试是两个必须小心设计的东西。没有超时控制的请求遇到服务端死锁时就是无限挂起最后把整个脚本拖死。我的标准做法是code$(curl -s -o /tmp/resp.json \ --connect-timeout 5 \ --max-time 30 \ --retry 3 \ --retry-delay 2 \ -w %{http_code} \ http://127.0.0.1:8000/api || true)这里--retry 3会在连接失败或者遇到某些临时HTTP错误时自动重试三次。curl默认重试的条件包括连接失败、408、429、500、502、503、504这些但不会对404之类的4xx错误重试。这是合理的因为4xx重试一万次也是同样的结果。但要注意--retry重试的是整个请求包括可能已经消耗完的流量。如果你在移动网络下自动化下载大文件盲目重试可能产生重复流量。更好的方式是把断点续传的逻辑也考虑进去用-C -参数让curl支持断点续传。在shell脚本中我还习惯把curl的耗时指标一起记录下来curl -s -o /dev/null \ -w connect%{time_connect}s starttransfer%{time_starttransfer}s total%{time_total}s code%{http_code}\n \ http://127.0.0.1:8000/apitime_connect是TCP连接建立耗时time_starttransfer是从开始到收到第一个字节的耗时time_total是总耗时。如果connect很低但starttransfer很高说明服务端处理慢如果connect很高先查网络和DNS。最后再分享一个小技巧调试HTTP接口时不要急着看业务内容先用curl -v或者tcpdump把“报文本身”看清楚。一次请求的报文就是一手证据请求头、响应头、原始body全在证据里。把这层能力练扎实你以后排查问题会比别人快一个量级。

相关新闻

TrueType字体解析:表目录、字符映射与轮廓还原

TrueType字体解析:表目录、字符映射与轮廓还原

简介:这份资源是一套TrueType字体格式解析类,面向从事游戏开发、图形设计、文本渲染等方向且需要深入处理字体文件的开发者。压缩包共2个文件,包含1个cpp实现文件和1个h头文件,整体仅42KB,代码量精简,便于直…

2026/10/18 5:41:43 阅读更多 →
同样标着五层瓦楞,怎么判断是不是“偷克重”的低配纸板?

同样标着五层瓦楞,怎么判断是不是“偷克重”的低配纸板?

同样标着五层瓦楞,怎么判断是不是“偷克重”的低配纸板?一、“偷克重”的常见手法五层瓦楞纸板由面纸、两张芯纸、两张瓦楞纸组成,部分厂家会在标注五层结构的前提下,降低各层原纸的克重,或是减薄芯纸、瓦楞纸的厚度。…

2026/10/18 5:41:43 阅读更多 →
JQuickExcel 流式导出配置:从阈值、窗口到临时文件的工程取舍

JQuickExcel 流式导出配置:从阈值、窗口到临时文件的工程取舍

JQuickExcel 流式导出配置:从阈值、窗口到临时文件的工程取舍 tags: #JQuickExcel #JavaExcel #开源 #POI #Excel工具 更多示例: JQuick-Excel 官网示例 https://www.jquick.org/jquick-excel/#demo-formulas0005 简介 我在处理大批量 Excel 导出时,…

2026/10/18 5:41:43 阅读更多 →

最新新闻

跨境电商前端HTML模板:多语言多币种可落地骨架

跨境电商前端HTML模板:多语言多币种可落地骨架

简介:这是一套面向前端初学者与电商项目开发者的跨境电商网站前端模板代码,基于HTMLCSSJS构建,可快速搭建具备商品展示、购物车、响应式布局等基础功能的电商页面。资源共188个文件,包含26个结构清晰的HTML页面、7个核心CSS样式表…

2026/10/18 6:32:52 阅读更多 →
滴水OS 2.0 Pre:AI原生智能座舱操作系统架构与技术解析

滴水OS 2.0 Pre:AI原生智能座舱操作系统架构与技术解析

今年的CES2026展区里,智能座舱依然是绝对的流量担当,但真正让我停下来反复琢磨的,并不是哪家又堆了一块更大的屏幕,而是“滴水OS 2.0 Pre”这套主打“AI原生”的座舱操作系统。看了发布信息和现场演示之后,我的感觉是&…

2026/10/18 6:32:52 阅读更多 →
基于sherpa-onnx的Android离线语音识别与语音合成实战指南

基于sherpa-onnx的Android离线语音识别与语音合成实战指南

早些年做语音产品,总觉得离线识别和合成是稀罕事,直到真把 sherpa-onnx 跑在 Android 上,才意识到本地 ASR / TTS 的门槛可以压得非常低。用云端方案当然省事,但网络一抖就抓瞎,还会带来延迟和隐私问题。这阵子我重新把…

2026/10/18 6:32:52 阅读更多 →
2026年国产协作工具实测:8款高性价比选型指南

2026年国产协作工具实测:8款高性价比选型指南

我刚把团队里正在用的几套协作工具换了一轮,跑了大概两个月的对比测试,说实话,2026年拿来主义式地选协作工具已经不够用了,版本更新太快,功能卷得飞起,但很多团队的刚需其实就几条:任务看得见、…

2026/10/18 6:32:52 阅读更多 →
RK3562+RK817充电关机后无法开机:PMIC电源状态分支的排查与修复

RK3562+RK817充电关机后无法开机:PMIC电源状态分支的排查与修复

前阵子调一块 RK3562 RK817 的带电池主板,遇到一个特别折磨人的现象:插着充电器的时候系统能正常关机,但关机后马上按电源键,整机就像彻底断电一样,串口一个字符都没有,U-Boot 完全没有跑起来。拔掉充电器…

2026/10/18 6:32:52 阅读更多 →
SpringBoot+Vue健身房管理系统设计与实现全解析

SpringBoot+Vue健身房管理系统设计与实现全解析

1. 项目概述与业务价值拆解1.1 这个管理系统到底解决什么问题先说结论:健身房管理系统是目前JavaWeb毕设里性价比极高的一类选题。它不像电商系统那样业务链路冗长,也不像纯后台管理系统那样缺乏亮点,而是处在一个恰到好处的位置——业务逻辑…

2026/10/18 6:31:52 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →