HTTP协议详解:图解请求响应模型与Python代码实践

HTTP协议,这个几乎每天都在打交道的东西,真正能把“请求-响应”这条链路讲清楚的内容其实不多。标题里提到“图解”和“代码解析”,正好戳中很多人的痛点:看了一堆概念,打开浏览器按 F12 却不知道每个字段在干什么;用 requests 发了个请求,出了错也不知道去排查哪一段。这篇文章不绕弯子,直接从一次真实请求切入,把 HTTP 报文拆到骨头,再配合能跑的 Python 代码,带你完整看懂从浏览器输入网址到页面渲染之间到底发生了什么。适合刚入门想建立完整认知的开发者,也适合写了好几年接口但没系统捋过协议细节的同学。

1. HTTP协议到底在解决什么问题

很多教科书喜欢从“超文本传输协议”的定义讲起,说实话,这反而是最难啃的一种方式。我更愿意把它当成一门“约定好的对话语言”:客户端和服务器之间通过一套统一的格式交流,谁开口、谁应答、说什么、怎么换行、怎么结尾,都提前定好。只要双方都遵守这个约定,不管你是电脑上的 Chrome 还是手机里的 App,都能和背后千差万别的服务器对上话。

1.1 从一次浏览器访问说起

假设你在地址栏输入了一个网址。从输入到页面展示,中间经历了这样几件事:浏览器先把网址里的域名解析成 IP 地址,通过 DNS 找到服务器;然后和服务器建立底层的网络连接;连接建立后,浏览器按照 HTTP 规则发出一个“请求报文”,告诉服务器“我要访问哪个路径”;服务器处理完后,同样按照 HTTP 规则返回一个“响应报文”,包含状态、页面内容或数据;最后浏览器拿到响应,渲染页面。整个过程里,HTTP 处于“应用层协议”的位置,相当于对话的语法规则;底下是谁负责传数据,HTTP 并不关心。

很多初学者容易被“协议”两个字吓到,实际上你可以把它类比成点餐。你作为客户端,向服务员(服务器)说“我要一份菜单第 3 道菜”,这就是请求;服务员把菜端上来,就是响应。至于后厨怎么备菜、用什么锅炒,那是服务器内部的事,HTTP 层面根本不关注。这个“只管要什么、只管返回什么”的约定,就是 HTTP 的边界。

1.2 请求-响应模型:一对一的问答

HTTP 的工作模式非常朴素,核心就是“请求-响应”,而且这个结构是严格对称的。客户端永远是发起方,服务器永远是应答方。服务器不会主动给客户端发数据,哪怕你希望它推消息,也得先由客户端发一个请求把通道“打毛”。这种设计让服务器实现变得简单,也让整个协议极度可靠。

一个请求对应一个响应,这是 HTTP/1.1 的基本模型。你在浏览器里看到一张网页包含几十张图片,其实是几十个独立的请求-响应循环,只是一般由浏览器并发执行。每一个请求都是独立的,彼此之间不共享状态。这就引出了 HTTP 最著名的几个特性:无状态、无连接。无状态的意思是,服务器不记得你上一次请求是谁;无连接则指传统模式下,每次请求结束后连接就可能被关闭。为了改善体验,后面才有了 Cookie、Session、Keep-Alive 这些补充机制。

1.3 无状态、无连接为什么重要

无状态听起来像缺陷,但在分布式系统里反而是优点。服务器不需要在内存里保存大量用户会话,横向扩展容易得多:任何一台服务器都能独立处理任意请求,只要请求里把需要的信息带齐全。你登录之后,服务器发一个 Cookie 给你,你下次请求带上它,服务器就“认识”你了。Session 则是把这些状态存在服务端,用 Session ID 关联。理解这一点,你就能看懂为什么现代接口设计里经常强调“无状态 REST”,为什么 JWT 这种东西会流行——本质都是在跟“无状态”这个底层设定协同作战。

2. 图解拆解一次完整请求与响应

这一章我们不用代码,先把“报文”这个最核心的东西看明白。所谓报文,就是网络上真正传输的那一串字节。不要觉得它很神秘,它就是一个有固定格式的文本块,按行堆叠。只要按格式解析,服务器就能从里面拿到完整信息。

2.1 请求报文的四段结构

一次 HTTP 请求报文由四部分组成:请求行、请求头、空行、请求体。

POST /api/login HTTP/1.1 Host: example.com User-Agent: Mozilla/5.0 Content-Type: application/json Content-Length: 27 {"username":"tom","password":"123"}

第一行是请求行,包含三样东西:请求方法、请求路径、HTTP 版本。这里的路径不直接写完整域名,因为域名已经在 Host 头里了。接着是多行请求头,每一行都是“键: 值”格式,表达给服务器的附加信息。然后是一个空行,这是协议里最关键的分隔符,表示请求头到此结束。空行之后是请求体,不是所有请求都有,GET 通常没有,POST、PUT 通常会有。

我见过很多初学者用网络抓包看报文时一脸懵,就是因为没有意识到“空行”是一个真正的节点。服务器解析请求时,要一直读到空行才能确定头部的边界,然后根据 Content-Length 或 Transfer-Encoding 读取后续的请求体。报错时如果发现后面跟着的东西被吞了,先检查是不是拼接报文时少写了一个\r\n。

2.2 响应报送的三段结构

响应报文和请求报文高度对称,唯一区别是第一行不是请求行,而是状态行。

HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 Content-Length: 52000 Cache-Control: max-age=3600 <!DOCTYPE html> <html>...</html>

状态行由 HTTP 版本、状态码、状态描述组成。200 OK是最常见的成功响应;404 Not Found代表资源不存在;500 Internal Server Error代表服务器内部出错。状态码后面那段英文描述,是给人读的,真正决定逻辑的是三位数字。三位数字涵盖五类:1xx 表示信息,2xx 表示成功,3xx 表示重定向,4xx 表示客户端问题,5xx 表示服务器问题。这个分类标准是非常重要的排查起点,看到第一位数字,你就知道问题大概出在哪一边。

响应头里的 Content-Type 告诉浏览器用什么方式解析响应体,Content-Length 告诉浏览器要读取多少字节。如果响应体是压缩过的,还会出现 Content-Encoding: gzip 这样的字段,浏览器收到后会自动解压。想从协议层理解网页大小、加载时间,这些字段都是关键证据。

2.3 全流程示意图

用字符画一张最简化的请求-响应流程,把前面说的内容串起来:

客户端(浏览器) 服务器 | | |--------1. DNS解析域名---------------->| |--------2. TCP三次握手---------------->| |--------3. 发送HTTP请求报文----------->| | (请求行/请求头/空行/请求体) | | | |<-------4. 返回HTTP响应报文------------| | (状态行/响应头/空行/响应体) | | | |--------5. TCP四次挥手(或复用)------->| | |

这里面的第 2 步和第 5 步,属于 TCP/IP 层面,HTTP 本身不管连接怎么建立和关闭。但理解整套流程时,一定要把 TCP 的存在放在心里,因为很多 HTTP 的“怪现象”其实是 TCP 层面的问题。比如连接超时,往往不是服务器没响应,而是 TCP 握手阶段就没走完。又比如 HTTP/1.1 默认开启了 Keep-Alive,同一个 TCP 连接可以反复发送多个请求,避免每次都要重新握手的开销。如果你用抓包工具看,会发现在一段连接上可能连续出现多组请求-响应,这就是连接复用。

2.4 图解里藏着哪些关键点

这张图看似简单,但每个箭头背后都有讲究。注意图中的“请求-响应”是严格成对出现的,服务器在一个连接上不会莫名其妙给你发请求之外的数据。另外,一次请求对应一次响应,但一次浏览器页面交互可能对应几十个请求,比如一个网页里引用了多个 CSS、JS、图片资源。资源多、连接多,所以现代浏览器每站点最多并发 6 到 8 个 TCP 连接,HTTP/2 又进一步支持多路复用,把多个请求并发复用到一个连接上。这些优化都建立在理解基础流程之上,否则只会越学越乱。

3. 代码解析:亲手发一个请求、搭一个服务

这一章是整篇文章的重头戏。我会用三段代码带你从不同层面观察 HTTP:第一段用 Python 标准库的 socket 手工构造请求,让你看到报文最原始的面貌;第二段用 requests 库做常规开发;第三段用 socket 写一个最简服务器,站在服务端视角看一次请求是怎么被读进来的。

3.1 用 socket 手工构造 HTTP 请求

协议本质是文本,这就意味着你可以完全不依赖任何 HTTP 库,直接用最底层的 socket 把请求“打出去”。下面的代码建立一个 TCP 连接到某台服务器,然后发送一个 GET 请求并读回响应:

import socket # 1. 建立 TCP 连接 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(("example.com", 80)) # 2. 构造 HTTP 请求报文 request = ( "GET / HTTP/1.1\r\n" "Host: example.com\r\n" "Connection: close\r\n" "User-Agent: demo-client/1.0\r\n" "\r\n" ) # 3. 发送请求 client.send(request.encode("utf-8")) # 4. 读取响应(这里简化处理,一次性读全部) response = b"" while True: chunk = client.recv(4096) if not chunk: break response += chunk # 5. 关闭连接并打印 client.close() print(response.decode("utf-8", errors="ignore"))

这段代码很好地展示了前面讲到的报文结构:请求行的三个元素,Host 头,以及最后的空行。任何 HTTP 库,本质上都是在帮你做类似的事情——把请求对象按照同样的格式序列化成字节流,再发送出去。注意这里用了Connection: close,告诉服务器处理完后关闭连接,这样recv才能读到 0 字节作为结束标志。如果不加这个头,服务器默认会保持连接,你的代码就会一直阻塞在那里,这也是很多手写 HTTP 请求教程里没提到的坑。

3.2 requests 库:日常开发的标准姿势

生产环境很少有人用原始 socket 发 HTTP 请求,requests 库是目前最主流的选择。它把报文构造、编码、重定向、超时都封装好了,代码写起来非常直观:

import requests # GET 请求 resp = requests.get("https://example.com/api/user", params={"page": 1}, headers={"User-Agent": "my-app/1.0"}, timeout=5) print(resp.status_code) print(resp.json()) # POST 请求 resp = requests.post("https://example.com/api/login", json={"username": "tom", "password": "123"}, timeout=5) print(resp.headers.get("Content-Type"))

timeout=5这个参数很多人不写,这是生产事故多发点。不设置超时,连接长期挂起时会一直占用线程或连接池资源。requests 的 timeout 同时作用于“连接超时”和“读取超时”,底层对应 socket 的超时参数。如果你希望两者分开控制,可以传一个元组:timeout=(3.05, 15),第一个数表示连接超时,第二个数表示读取超时。个人经验里,连接超时设小一点,读取超时设大一点,这样能把“连不上”和“服务慢”区分开。

3.3 用 socket 手写一个最小 HTTP 服务器

知道了请求长什么样,再站在服务端视角看一眼,整个协议就完整了。下面这个服务器用最底层的方式监听端口,收到连接后读一串数据,解析出请求行和请求头,然后返回一个固定响应:

import socket server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server.bind(("127.0.0.1", 8000)) server.listen(5) print("listening on :8000") while True: conn, addr = server.accept() data = conn.recv(65536) text = data.decode("utf-8", errors="ignore") lines = text.split("\r\n") request_line = lines[0] method, path, version = request_line.split(" ") print(f"收到请求: {method} {path} {version}") # 构造响应报文 body = "<html><body><h1>Hello HTTP</h1></body></html>" response = ( "HTTP/1.1 200 OK\r\n" "Content-Type: text/html; charset=utf-8\r\n" f"Content-Length: {len(body.encode('utf-8'))}\r\n" "Connection: close\r\n" "\r\n" + body ) conn.send(response.encode("utf-8")) conn.close()

重点看两处。一是解析一侧:收到的 data 可能不完整,也可能包含多个请求,这里为了教学简化成一次 recv 直接读完;真实服务器必须按头部中的 Content-Length 来判断请求体是否读完。二是响应一侧:Content-Length 必须和实际体长度严格一致,否则浏览器会一直等待后面的数据。之前踩过一个坑,就是 body 里包含中文,算用len(body)而不是len(body.encode("utf-8")),导致 Content-Length 比实际字节少,页面半天加载不出来。中文一个字符在 UTF-8 下占三字节,这种细节最容易翻车。

你可以用浏览器访问127.0.0.1:8000,也可以用前面那段 socket 客户端代码访问它。两边代码一对照,一个典型 HTTP 周期就被完整观察到了。

3.4 HTTP 版本与连接复用

上面代码里写的都是 HTTP/1.1。在 HTTP/1.1 中,每次请求-响应默认走同一个连接,服务端如果不主动关闭,客户端可以继续复用。但你要注意,早期 HTTP/1.0 是“短连接”模式,一次请求一个 TCP 连接,用完就关。我们的最小服务器为了简单直接走 close,浏览器也能正常展示,但性能上完全比不了真实生产环境。HTTP/2 在格式上不再采用纯文本报文,改成二进制分帧,并且支持多路复用,这才是现代性能优化的基础。理解 HTTP/1.1 的文本结构,并不代表落伍,因为 HTTP/2 的语义层仍然保留了方法、头部、状态码这些概念,只是传输方式变了。

4. 常见问题与排查技巧实录

光看协议概念很容易觉得自己掌握了,直到线上接口报错,才发现脑子里全是浆糊。这一章是实战中最常遇到的问题,我把它们整理成一套可以直接照着操作的排查思路。

4.1 状态码速查:4xx 找自己,5xx 找服务端

看到 4xx 开头的,第一反应应该是“客户端请求有问题”。比如 404 是路径不存在,400 是报文格式非法,401 是没带身份凭证,403 是带了凭证但没权限。这里有个容易混淆的点:401 和 403。401 表示“你没登录”,服务器不知道你是谁;403 表示“服务器认识你,但你没有权限访问”。调试时如果分不清,先看有没有携带身份信息。看到 5xx 开头的,则是服务器内部出了问题,比如 500 是代码异常,502 是网关拿到了上游的无效响应,503 是服务暂时不可用。记住这条分界线,能省下大把找 bug 的时间。

4.2 请求头里的高频坑

请求头错误是最隐蔽的一类问题。下面几个坑我都真实踩过:

  • Content-Type 没有携带 charset:服务器按默认编码解析,中文全部乱码。正确做法是application/json; charset=utf-8,前后端要一致约定。
  • 缺少 Host 头:HTTP/1.1 中 Host 是必选头。如果你直接把裸 socket 连接到服务器,少写 Host 头,很多服务器直接返回 400。
  • User-Agent 被服务器拦截:有些服务会拒绝没有 UA 的请求,浏览器开发时正常,脚本一跑就 403,十有八九是 UA 没带上。
  • Cookie 漏传:登录后调接口报 401,检查请求头里 Cookie 或 Authorization 字段是否带上,这是最常见的“登录后还是没权限”的元凶。

4.3 超时与重试的策略

超时要区分几个概念。连接超时是 TCP 建连阶段超过设置的时间;读取超时是连接建立后,服务器迟迟没有返回数据超过设置的时间。两者混在一谈,排查方向就会跑偏。我习惯把连接超时设在 3 到 5 秒,读取超时设在 10 到 30 秒,根据接口耗时调整。重试只对“幂等”的操作安全,比如 GET、PUT 或带唯一 ID 的 POST。纯 POST 不幂等的话,重试可能造成重复创建订单或重复扣款。解决方案是业务上做去重,或者生成请求唯一 ID,服务端检查是否已处理。

4.4 排查工具速查

遇到 HTTP 问题,第一选择不是到代码里打日志,而是用工具直接看原始报文。

  • curl -v https://example.com/api:输出完整的请求行、请求头、响应头,这几乎是最快的排查方式。
  • nc -v example.com 80:本机手工输入 HTTP 报文,适合确认服务器是不是有响应。
  • 浏览器开发者工具的 Network 面板:可以看到每个请求的耗时、请求头、响应头和调用顺序。
  • tcpdump -i eth0 port 80:看网络层真实进出数据包,适合排查“请求到底有没有发出”。

实际排查我只能建议一条路径:先用 curl 明确“请求能不能成功”,再去看业务代码。因为 curl 能排除程序内部的干扰,如果 curl 都失败,问题大概率在网络、DNS、证书或防火墙,而不是你的代码逻辑。

5. 一些个人体会

写接口写久了,最深的感受是:HTTP 协议不像一门编程语言,倒更像一门“江湖规矩”。很多问题用协议思维去理解,原因一眼就能看透。比如之前排查过一次线上超时,代码检查了半天都没发现问题,最后用抓包工具看,发现请求被系统代理服务器转发到了另一个环境,导致延迟巨大。如果不理解请求头、代理、TCP 连接这些链路环节,你很容易在业务代码里陷入死循环。

还有一点想建议各位:学协议一定要动手改报文。找一个测试接口,用 curl 加几个头、改一下请求体,看看服务端返回有什么变化;故意去掉 Content-Length,看服务器怎么处理;把 Host 改成别的域名,看会不会触发拦截。这种“把正常请求故意弄坏”的练习,比读一百遍 RFC 文档记得都牢。HTTP 是互联网里最值得花时间彻底搞懂的基础设施,你在这上面下的功夫,迟早会在某个查 bug 的深夜得到回报。

相关新闻

局域网文件传输工具Davor:从设备发现到WebSocket传输的完整实践

局域网文件传输工具Davor:从设备发现到WebSocket传输的完整实践

“Davor”这名字&#xff0c;说来挺随意。我有个朋友&#xff0c;做嵌入式出身&#xff0c;帮我调过几次网络问题&#xff0c;每次都是远程开着终端敲几行命令就完事&#xff0c;省了我大把折腾时间。有次喝酒我说&#xff0c;以后我做个小工具就起你名字。后来真做出来了&…

2026/10/21 7:10:51 阅读更多 →
风电箱变智能监测系统:从传感器选型到部署实践

风电箱变智能监测系统:从传感器选型到部署实践

风电场里最容易被忽视却又最要命的设备&#xff0c;往往就是箱变。机组发了多少电、能不能稳定送出去&#xff0c;全看这台密封铁柜子的脸色。我在现场见过太多次这样的场景&#xff1a;运维人员打着手电&#xff0c;凌晨三点爬上箱变底座&#xff0c;耳朵贴着柜体听内部有没有…

2026/10/21 7:10:51 阅读更多 →
华为云Hadoop伪分布式安装实战指南

华为云Hadoop伪分布式安装实战指南

1. 项目概述&#xff1a;为什么从伪分布式开始学Hadoop&#xff0c;而不是直接上集群&#xff1f;“华为云hadoop伪分布式安装学习笔记&#xff08;一&#xff09;”这个标题里藏着一个非常务实的起点——它没写“高可用集群部署”&#xff0c;也没提“PB级数据处理实战”&…

2026/10/21 7:09:51 阅读更多 →

最新新闻

Text-to-Prototype与D2C实战:从一句话到可交互原型的工程化工作流

Text-to-Prototype与D2C实战:从一句话到可交互原型的工程化工作流

一句话丢给 AI&#xff0c;它真能吐出一套能点、能跳转、能填表单的 App 原型&#xff1f;这个问题在过去一年里被问了无数遍&#xff0c;我自己也拿它当正经课题折腾了小半年。Text-to-Prototype&#xff0c;也就是文本生成原型&#xff0c;再到 D2C&#xff08;Design to Cod…

2026/10/21 7:54:10 阅读更多 →
2026年Agent智能体趋势观察:从玩具到员工的关键跃迁

2026年Agent智能体趋势观察:从玩具到员工的关键跃迁

想要准确判断一份行业报告的含金量&#xff0c;其实看两样东西就够&#xff1a;它可以不用被证伪的底层逻辑&#xff0c;以及它敢不敢给出明确的到达时间点&#xff0c;而不是和稀泥。最近我深度研读了一份来自某头部科技公司研究团队的调研报告预览稿&#xff0c;报告的名字很…

2026/10/21 7:54:10 阅读更多 →
Bootstrap 5实战:从源码构建到深色模式一键切换

Bootstrap 5实战:从源码构建到深色模式一键切换

简介&#xff1a;本资源是一套面向前端初学者与进阶开发者的Bootstrap 4.0系统化学习材料&#xff0c;聚焦响应式网页开发核心能力培养&#xff0c;解决从零掌握栅格布局、组件集成、JS插件调用到真实项目落地的全链路学习痛点。压缩包共1389个文件&#xff0c;涵盖250个HTML实…

2026/10/21 7:54:10 阅读更多 →
Anaconda多环境管理:AI编程环境隔离与依赖管理实战指南

Anaconda多环境管理:AI编程环境隔离与依赖管理实战指南

1. 为什么Python多环境管理是AI编程的第一道坎搞AI编程的人&#xff0c;十个里有八个被Python版本和依赖冲突折磨过。你兴冲冲地从某个开源仓库clone下来一个项目&#xff0c;README上写着"pip install -r requirements.txt"&#xff0c;你老老实实执行了&#xff0c…

2026/10/21 7:54:10 阅读更多 →
本地批量文本替换工具:正则、编码与安全操作全解析

本地批量文本替换工具:正则、编码与安全操作全解析

简介&#xff1a;随风文本替换专家 v2.0 是一款面向程序员、编辑校对与数据分析人员的文本批量处理工具&#xff0c;主要解决大量文件中重复替换、批量添加内容的低效问题。软件支持纯文本、Java、HTML 等常见格式&#xff0c;并具备正则表达式匹配、替换预览与整目录批量处理能…

2026/10/21 7:54:10 阅读更多 →
MySQL字符集与校对规则完全指南:从乱码到utf8mb4实践

MySQL字符集与校对规则完全指南:从乱码到utf8mb4实践

1. 字符集与校对规则的真实分工&#xff1a;一个管“存”&#xff0c;一个管“比”先抛个很多人在面试或排查乱码时都会卡住的经典问题&#xff1a;为什么我给表指定了utf8mb4&#xff0c;也存进去了一些中文&#xff0c;可一查出来全是“???”&#xff0c;或者搜索a和A的结…

2026/10/21 7:53:09 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事&#xff1a;AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里&#xff0c;按宣传口径&#xff0c;本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”&#xff0c;而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起&#xff1a;用户到底在追求什么“封号重开”这四个字&#xff0c;放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流&#xff0c;背后是大量的时间和精力成本。正常情况下&#xff0c;没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”&#xff0c;而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时&#xff0c;就意识到&#xff1a;单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/21 4:27:17 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练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/20 9:50:45 阅读更多 →