Skip to content

Releases: zhidian-cmd/gitport-github

GitPort GitHub v0.5.3

Choose a tag to compare

@zhidian-cmd zhidian-cmd released this 02 Nov 17:03

相对 v0.5.2,这一版主要动三件事:大文件派发的调度模型、内容域的兜底路径,以及一批「失败了却不说」的地方。

一、大文件派发:段是可缩的边界,不是一条命的连接

  • 让位取代掐流:空闲下来的连接把「预计最晚下完」那段的后半切走,父段只把 end 缩到切点,父流读到新边界自然收工。旧版是「比你慢就掐断重来」,掐一次留一个洞,补发上限用完整个响应体就结束——九段被砍成一段就是这么来的。
  • 两道闸防震荡:全局 2.5 秒最多让位一次,刀口不超过帮手速度×3(钳 512KB–64MB)。切得太频是消息风暴,刀口太大下一轮又被判慢再切一刀。
  • 补发按「没有进展」计数:删掉全局 2 次上限,有进展就清零,连续多次一个字节都没下到才认输;停滞只把没收到的那截转补发,缓冲里的字节不丢。
  • 收尾冻结速率:连接断了 begin 还在走,均速会一路衰减成「假慢」,然后被更快的段抢走尾巴——越抢越慢。现在段一收尾速率立即定格。
  • 测速改 500ms 时间槽:三个原子量加一次除法,删掉 EWMA 的时间戳/帧距机器;没有样本的候选不再靠猜。

二、内容域全灭时,借 assets 已建好的通道

头像、raw、camo 只有 .133 段的默认证书覆盖,这批 IP 一死整族直连就失败。但 Fastly 的路由依据是 :authority 而不是 SNI——同一条 githubassets 连接,换个 :authority 就能取内容域(实测 avatars/raw 都是 200 整包)。

  • 只借池里现成的连接,绝不为此新建:新建要么真名暴露、要么伪装证书过不了内容域校验,两条都是死路。
  • 按通道负载挑:这条上还挂着几条借出的流优先,同负载再取快的;借出计数挂在响应体上,体走完或丢弃自动归还。
  • 一条坏了只冷藏这一条(30 秒),同一次请求里换另一条重试,不让请求陪死通道一起落到镜像链。
  • 服务端若回 421(不收跨 :authority),停整条借道路径 30 秒,不冤枉连接。

三、顺带挖出的老 bug:双通道其实只有一条

冷启动竞速里每个拨号任务成功时已经入过一次库,收尾任务收到「晚成者」又存了一遍。MAX_CONNS_PER_HOST=2,第三次 push 把先成的那条挤掉了——github.com、api.github.com、raw、avatars、githubassets 这五个「双通道」域名,池里其实一直是同一个连接的两个副本。

修好后实测:6 个并发 raw 文件按 3/3 落在两条通道上。

四、证书 / 系统代理 / 开机自启 / 托盘:从「静默失败」到「看得见」

  • 装根证书不再调 certutil(它把错误打在 stdout,程序只读 stderr,所以报错只有一个空冒号),改为直接调证书存储 API,失败带 Win32 错误码。
  • 系统代理:Internet Settings 键只按读权限打开(普通进程对该键取 KEY_SET_VALUE 会拒绝访问,PAC 一直卡在这一步),写系统代理统一走 InternetSetOption。
  • 托盘自己建窗、自己泵消息,Shell_NotifyIcon 的返回值和 Shell_NotifyIconGetRect 的真实坐标都写进日志。根因是 exe 带完整性标签时进程会被压到该级别,Medium 进程被 High 的 explorer 用 UIPI 拒掉(err=5)——所以重新编译覆盖 exe 后要清一次完整性标签,否则托盘会消失。
  • 三者各打一行启动日志,不再靠猜。

五、其余

  • 本地 MITM 从 rustls 迁到 boring,跟直连腿同一套指纹,rustls 降为测试依赖;二进制 8.5MB → 8.35MB。
  • codeload 并入小文件域:直连优先,失败按校准链序逐家,撤掉整包竞速。
  • 日志降噪:启动成功不出声,每 host 只留首条,复用按分钟聚合成一行;事故、决策和失败原因全保留。
  • 测试集中到 src/tests/,生产文件不再夹测试代码。

升级方式:用新 exe 覆盖旧版即可,plans.json / settings.json / 根证书全部保留,无需重新配置。覆盖后如果托盘图标不出现,先确认 exe 上没有完整性标签(icacls 输出里不该有 Mandatory Label)。

GitPort GitHub v0.5.2

Choose a tag to compare

@zhidian-cmd zhidian-cmd released this 31 Oct 18:48

相对 v0.5.1,这次动的是大文件派发的内核:14 个文件 +982/−441(另有 4100 行只是把测试从生产文件挪进 src/tests/,运行期零影响)。

一、派发:先实测一遍,再按预计下完时间竞速

  • 探测轮:链上有没测过的镜像时,并发分片一片一家轮着发(原子游标),先把每家的真实速度测出来;全员有成绩之后才进入 ECT 竞速。此前没测过的候选只能按 2MB/s 猜,排在后面的、中途新增的镜像都在拿猜测当分母。
  • ECT 无容差:预计下完时间(在途字节 ÷ 实测速度)绝对最小者胜;只有完全相等才看谁的并发流少,仍相等才轮转。旧版 5% 并列带在实测速度差几十倍的环境里,等于把分片白送给慢腿。
  • 测速从响应头起算:拨号、建连、等待服务器开腔的耗时只算墙钟,不进速度样本。等待是常数,混进去会把快镜像稀释得更狠,候选差距被压平。
  • 清场:探测片交卷后,明显慢于链内最快者的镜像盖纪元号,在途流断流交客户端重发;判据用刚测出的实测分,不是猜的。

二、大小文件彻底分开

头像、raw、gist 这类小文件不再参与速度记账、不进 ECT、不写失败窗,只按校准后的链序从头试。大文件才跑探测轮和竞速。此前两类文件共用一本账,一次 40KB 头像的慢启动能决定 2GB 源码包以后走哪家。

三、镜像治理

  • 可信镜像白名单:带签名(约 1 小时有效的下载凭证)的下载地址默认只给直连;在工作台勾了「信任」的镜像才放行参与竞速。只对自建、明确不留日志的镜像开启。
  • 链序按速度重排:测出的速度直接决定大文件链的顺序并写回 plans.json,IDM 首片和非下载器场景直接命中快腿;重排本身限一秒一次,不占下载路径。
  • 镜像价值评估:每次探测的终值记一份到 .cache/mirror_stats.json,攒够样本后按中位速度找出长期垫底者,只在界面和日志里提示「建议停用」,绝不自动改配置。

四、安全与长期运行

  • 可信镜像判定由「前缀匹配」改为「同源全等」:https://gh-proxy.org.evil.tld 不再被当成 https://gh-proxy.org——签名 URL 等同提货凭证,前缀一松就等于送人。
  • 叶子证书缓存带签发时长,超过 358 天自动重签。此前只查域名不看有效期,常驻满一年后该域名的 MITM 握手会集体失败。
  • 清理:串发拨号里永远不会触发的取消分支、只做转发的 range_bytes_of。

升级方式:用新 exe 覆盖旧版即可,plans.json / settings.json / 根证书全部保留,无需重新配置。

GitPort GitHub v0.5.1

Choose a tag to compare

@zhidian-cmd zhidian-cmd released this 29 Oct 15:46

一、下载加速:直连同台竞速

以前 Release 附件 / 源码包是镜像链的自留地,直连只是「镜像全灭之后」的兜底——这低估了直连:实测下来直连的速度并不输镜像,很多时候甚至更快。

现在直连以「伪镜像」的身份加入 ECT 考试。ECT(预计最早下完时间)= 在途字节 ÷ 实测速度;每个请求开考前,全体候选(镜像 + 直连)按 ECT 排座次,谁预计最早下完谁接这单,失败自动顺延下一位。直连考砸了(拨不通 / 超时)记 60 秒失败窗,先坐冷板凳,窗口一过自己考回来,全程不用手动切换。冷启动没有成绩的候选按链位梯度铺开,不再全挤在链头。

二、负载均衡:不再逮着一只羊薅

以前几家镜像的 ECT 分数一样或相近时,排序基本固定,分片可能一直砸向同一家。现在每单派发做三级抉择:

  1. ECT 最小者胜;
  2. 分数相差 ≤5% 算并列——并列组里优先交给「在途并发流最少」的那家:既看速度,也看它手里正压着几条活。负载摊开之后,每条流分到的带宽更厚,还能从源头减少误掐;
  3. 在途流数也一模一样?随机轮转,雨露均沾。

顺带补了一条「探测轮末位淘汰」:下载器把大文件切成几十个分片并发,每家镜像接到的第一个分片就是它的入学试卷。小分片几秒读完,熬不过慢镜像掐断的 2 秒观察窗——以前考砸了什么账都留不下,下次还当头牌;现在流读完时成绩当场入账,第一个分片就显著慢于同伴中位数一半的,直接 60 秒降权,不给第二次拖后腿的机会。

三、用户反馈的 bug 修复

  1. 工作台填镜像会冲掉手改:以前在界面点保存,plans.json 里手改 / 收编的条目会被旧页面内存里的清单整个覆盖。现在保存前先合并服务端最新清单,旧页面覆盖不了新条目;删除也改成「合并后剔除」,两个窗口同时开着互删条目的问题一并修掉。
  2. 全新安装镜像落不进链:首次安装时镜像注册表还没按内容域建键,填了镜像也不生效。现在对齐前先按内容域建好键,填了就生效。
  3. 示例 Worker 代码修复:自定义镜像页那段自建 CF Worker 的示例代码有几个 bug(边缘缓存的三个缺口),已修。

四、四轮代码审计清出来的问题

  • Release 附件 502(重要):GitHub 的 Release 附件 URL 百分百带签名参数(sig / jwt),以前代理见到签名串就把整个请求拒了——直连同台也被一起误杀,零镜像环境下等于无路可走,表现就是「怎么下都 502,过一会儿又自己好」。现在带签名的 URL 只派直连(与浏览器直开行为一致,签名串不落任何第三方),根因清除。
  • 双击 exe 唤不出窗口:第二实例通知主实例弹窗的请求,被自家的防跨站校验 403 了。补了个标记头,托盘模式下双击唤窗恢复。
  • 系统代理自愈不再误伤别人:启动时清理「残留 PAC」的逻辑过于自信,会把其他代理工具设置的 127.0.0.1 PAC 当成自己的残留删掉。现在只有我们真正接管过(开关开过 / 有备份)才碰注册表,备份判定也改成只认自己写过的地址。
  • 白名单域名分片掩体修复:docs / pages 等 10 个域名的 ClientHello 三段分片,因为一个「首字节重复判定」的 bug,实际上只切了第一刀,100ms 间隔从未生效。现在是真·三段发送,封锁窗口期的抗 RST 能力回到设计值。
  • git:// 与经代理的 SSH:CONNECT 到非 443 端口(9418 / 22)以前会被按 443 去拨,注定失败;现在明文协议走普通 TCP 隧道,端口照用。
  • 其他:客户端明确拒绝压缩(gzip;q=0)不再被强塞压缩体;诊断头 X-GitPort-Route 如实标注实际胜出者(direct / mirror,不再一律写 mirror);502 页面区分失败原因,并指引补充镜像。

升级方式:用新 exe 覆盖旧版即可,plans.json / settings.json / 根证书全部保留,无需重新配置。

GitPort GitHub v0.5.0

Choose a tag to compare

@zhidian-cmd zhidian-cmd released this 28 Oct 11:46

GitPort GitHub v0.5.0

相对 v0.4.3:镜像链从「静态链序串行」改成「按请求动态分派」。以前填 8 个镜像等于 1 个在用、7 个备胎;现在 8 个能同时干活。

⚡ 大文件在线下载:多镜像终于有意义了

以前每条链是串行的——同一时刻只有一家在服务,其余的只在失败时才顶上。多填镜像的唯一用处是「坏一个换一个」。

现在每个分片请求单独选家:ECT =(该镜像在途未交付字节 + 本次请求字节)÷ 实测速度,取预计最早下完的那家。

  • 忙但快的镜像照样可能赢;快镜像在途堆到一定程度,公式自己会改选空闲的那家
  • 下载器开几个线程,代理就把这几个分片摊给几家不同镜像——填了几家用几家
  • 没有测速样本时统一假设 2MB/s,退化为「选在途最少」,再退化为链序,冷启动不用等校准
  • 只填一家镜像的用户,行为与旧版逐字节一致

本机实测(IDM,163MB 的 release 包):48 个 Range 分片,13 秒下完(约 12.5MB/s),8 条镜像链全部用上,零镜像失败、零掐断,最终 zip 校验完好。

🎯 垃圾镜像不再拖后腿:显著性检验掐断

判据是「跟同组同伴比」,不是绝对水位——绝对阈值在全员都慢的时候会误杀。

  • 每 128KB 评估一次,流速率 < 同伴中位数 ÷ 20 判为显著离群 → 断流,交下载器重发;重发请求自动重新选家
  • 同伴必须在 30s 内有速度样本且至少 3 个;全员低速的窗口里谁也不比谁慢 20 倍 → 零误杀
  • 每链每 60s 最多掐 4 次,掐满就放行(宁可慢,不自残)
  • 无 Range 的流永不掐——浏览器单线程直接下载,掐断就是用户可见的失败
  • 掐断瞬间把慢速率强制写进速度表(直接覆盖旧印象,不做平滑),下次派发不会再派回它

📦 plans.json 拆成两个字典

mirrors_big(codeload / objects / release-assets)与 mirrors_small(raw / gist / avatars / user-images / media)。

两类资源体质不一样:大文件拼持续吞吐,小文件拼头延迟,分开管才不会互相污染。

  • 分类权在 host 上:条目放错字典,启动时也会被归位,不会出错
  • 旧的单字典 mirrors 照常读入、按 host 归位,下一次落盘自动转双字典,一条不丢(plans.json.bak 兜底仍在)
  • github.com 自己的镜像链除名(内容域 9 → 8):那条链在生产路径上根本走不到,/archive 与 /releases/download 早已归属 codeload / release-assets 专属链

🔧 校准瘦身:大文件不再做合成测速

  • 退役大文件吞吐校准(5MB × N 家并发,白烧公益镜像带宽,测出来的也不是真实下载速度):大文件域的速度改由真实流量 EWMA 持续学习
  • 保留图片链 TTFB 校准(那是头延迟,真实流量学不到);WebUI 只留图片链按钮,并注明大文件无需校准

✅ 响应校验补洞

  • 带 Range 的请求必须回 206:镜像不认 Range 回 200 = 把整个文件灌回来 = 断流,判失败换家
  • 304 无正文直接放行(顺带修掉 304 带 content-type 被误判成假站的老问题)

🧵 该配哪个下载器

浏览器自己下载是单线程、不带 Range,代理没法给它分片——所以这套优化只对支持多线程分片的下载器生效,也正因为如此,代理永远不会掐断浏览器的下载。

推荐 IDM / Motrix / MotrixNext 这类,线程数开大一些才有意义:线程数就是同时使用几家镜像的上限。理论上镜像越多、并发上限越高,但这是公式推出来的,没做上限实测,别当承诺。


验证:95 项测试通过,release 构建零警告。
升级提示:无需手改配置。旧 plans.json 的单字典 mirrors 会在启动时按 host 自动并入 mirrors_big / mirrors_small,下次落盘即完成转换。

GitPort GitHub v0.4.3

Choose a tag to compare

@zhidian-cmd zhidian-cmd released this 28 Oct 03:43

GitPort GitHub v0.4.3

相对 v0.4.2:一个主题贯穿始终——把实测数字摆上桌,哪里慢修哪里。全部改动来自与同类工具的同机交替实测和日志证据。

⚡ API 池提速:中位 330ms → 135ms(快 2.4 倍)

与同类工具 20 轮交替实测发现:api 池 6 条 IP 全是 140.82.11x 段(TCP 中位 257-280ms),没有 Azure GLB 段。

  • 补入实测 91ms 的 20.27.177.116 等地址,8 条候选按实测延迟重排——新用户首次启动从表头起步,最快的 IP 不能埋在末尾
  • 效果:api 上游侧中位 330ms → 135ms,复用连接 95ms

🔀 双通道重做:从两条碰运气的连接到有分工的系统

双通道的目的回归本位:HTTP/2 单连接有流控窗口与队头阻塞,大响应占着窗口时后续请求只能排队——两条连接让新请求不排队(浏览器同款思路)。

  • 游标分键:每族两把游标钥匙(主键 + ~2),两条通道各记各的最优 IP,互不覆盖;副键提前写入 settings.json 固定键位,重启即有记忆
  • 冷启动并行竞速:两个建连任务同时发射,同组认领互避(对方试过/正在试/已建成的 IP 一律绕行);先成者立即服务请求,晚成者建成直接上岗接走排队请求
  • 拨号永远避开池中活连接:修掉一个暗坑——旧代码重拨会撞上池里还活着的连接,无意间造出同 IP 双连
  • 实测:冷启动 1-2 秒建成两通道且不同 IP;真实流量中一条连接被 GitHub 正常 GOAWAY 时,另一条无感接管

🔍 搜索链路稳定化:翻页与退出全部秒回

搜索是 GitHub 反爬最敏感的接口,v0.4.3 拆掉了四层问题:

  • 搜索请求固定走主通道:同会话的搜索流量在两个 IP 间漂移会触发 GitHub blackbird 反爬降级(症状:结果数巨大、列表却是空的)
  • 限流骨架不入缓存:GitHub 降级返回的无结果骨架页不再被缓存固化——降级是一次性的,配额恢复即自愈,不再"一直坏"
  • 翻页页入缓存 + 内容分钥匙:GitHub 翻页是 React 软导航(不是页面跳转),且同一 URL 按 Accept 协商出 JSON/HTML 两种正文——分钥匙各存各取,不会拿错
  • 查询串归一化:?p=1 与无 p 同键、参数重排同键——从第二页回第一页直接命中

效果:翻页、从仓库退出回列表,第二次起全部本地秒回(实测文档命中 0 上游)。

🖼️ 头像入口 302 记忆:来回归零

GitHub 的头像入口 github.com/<user>.png 是「302 跳转 + no-cache」设计:浏览器每次渲染页面都必须重问一遍跳转,260-310ms × 十几个并行——这是列表页内容"逐渐蹦出来"的最大一块。代理现在记住跳转目标、本地直答:浏览器行为完全不变,那个来回归零。

🖥️ 系统代理修复:开机自动接管

修复"界面开关开着、日志说已同步、浏览器却没走代理":改用 Windows 连接级接口写入「启用自动配置脚本」标志位。现在开机自动接管、退出自动还原,不再需要手动关开一次开关。

🧹 其他

  • 产物体积 9.43 → 8.79 MB(codegen-units = 1)
  • 建连日志降噪(每站冷启动 4-6 行 → 3 行);浏览器自我校验的 304 不再刷日志
  • 双通道正确性核心补齐单元测试(认领互斥/槽位过滤/骨架三态)

验证:81 项测试通过;api 上游 2.4× 提速与双通道竞速均为同机交替实测数据。
升级提示:settings.json 的 lastIp 键位从 10 → 20(双通道游标),旧配置自动补空,无需手动处理。

GitPort GitHub v0.4.2

Choose a tag to compare

@zhidian-cmd zhidian-cmd released this 26 Oct 17:13

本次更新

修复:一批 GitHub 子域打不开

docs.github.com 会白屏并显示「Whoa there! invalid request」,同类的还有 support / resources / desktop / pages / skills / archiveprogram / socialimpact / raw.github.com / copilot-proxy。

原因:这些域名被 *.github.com 通配一把抓进了主站池,于是用主站 IP 加伪装域名去连,对方一眼判定非法请求。

现在它们走自己的路:

  • 按段选正确的边缘 IP(.154 / .153 / .133 / Azure)
  • 握手报真名,拿到对的证书
  • 首包拆成 3 段、每段间隔 100ms 发出,防火墙拼不齐完整域名

这批域名同时并入 edge 池:一个 IP 连不上会自动换下一个候选,全都不行才退回系统 DNS。

安全

  • 镜像站不再收到 Proxy-Authorization(原先凭据剥离漏了这一项)
  • 根证书只签发受管域名:堵住「先 CONNECT github.com、再报 SNI=bank.com」借证书的路
  • 管理界面的写操作需要 X-GitPort-Request: 1 头

其它

  • 页面缓存的容量记账口径修正,200MB 上限与磁盘实际用量一致
  • 工作台 /api/status 新增 splitAttempt / splitDone,两个数对不上就说明分片没生效
  • 补了白名单路由测试与 Ctrl+F5 直通测试

注意

管理界面的写接口现在要求额外请求头。如果用 curl 调:

curl -X POST -H "X-GitPort-Request: 1" http://127.0.0.1:7811/api/mitm -d '{"on":true}'

浏览器工作台不受影响。

建议所有用户升级。

GitPort GitHub v0.4.1

Choose a tag to compare

@zhidian-cmd zhidian-cmd released this 24 Oct 08:35

GitPort GitHub v0.4.1

页面缓存重写 + 两轮全仓审计修复。单文件直接替换,重启实例后生效。

页面缓存:从「全站缓存 + 按网址定寿命」改成「只缓存列表页 + 按会话定寿命」

原来三个域的文档页一视同仁,寿命按网址分(仓库页 24 小时、列表页 5 分钟)。实际用下来两个问题:浏览型用法(搜索 → 点仓库 → 退回列表 → 再点)几乎全是新网址,缓存很少命中;而页面里最易变的那块数据决定整页寿命,按网址分档天生是钝器。

现在的规则:

  • 只缓存 github.com 的列表页:搜索、issue/PR/commit/release 列表、通知、趋势、星标列表。仓库首页、文件浏览、单条 issue/PR/commit、设置页、raw/gist 一律不缓存——宁可每次回源,也不拿旧副本顶替。
  • 寿命按会话算:连续浏览(导航间隔 ≤ 15 分钟)一直有效;离开超过 15 分钟,下一次进入整盘清空、从零开始。没有后台静默刷新:GitHub 的会话 cookie 每个响应都轮换,拿旧 cookie 去刷会被判成凭据泄露。
  • 新建/编辑表单页不缓存(里面的防伪 token 会被轮换踢掉);验证页、未登录页一律不缓存——2FA 验证页是按你请求的网址回 200 的,不拦就会占住那个网址。

保留的边界:按账号分键(同机两个 GitHub 账号不串页)、按编码分键(gzip 页不会发给没声明 gzip 的客户端)、写完即删(评论/star 后相关页面立即失效)、F5 直通、手删缓存目录不报错、单页 2MB / 总量 200MB 上限。

审计修复

  • 串发重试引擎补上测试(此前零覆盖);删掉隧道模式「双向都 <8KB 当风控」的启发式(304 与小响应都被误判,白挪游标还触发一次落盘);三处重复的「发送+记账」合并;连接池锁改自愈(一次 panic 不再让此后每次拨号都 panic)。
  • 明文 HTTP 分块请求体回 501(原来剥掉 transfer-encoding,把块长度行当正文转发)。
  • 校准日志措辞分级:镜像以 3xx/4xx 明确拒绝记「不支持」,超时/连接错误才叫「失败」。
  • 校准模板样本换成实测有效资源:user-images 原样本已 403、media 指向非 LFS 文件 404,导致所有镜像(含自建 Cloudflare)在这两个域被误判「不支持」。

测试

66 个用例(v0.4.0 时 59 个)。新补:串发重试引擎、上行泵(2MB 请求体)、列表页判定的正反例、闸门页的写入侧与读侧、手删缓存目录自愈、gzip 条目读回链路、会话边界与换会话后键变化。

升级

单文件直接替换,重启实例。第一次进入会重建缓存(旧目录结构不兼容,自动清空);无需重新校准,但若设置页里这两个域此前显示「不支持」,重跑一次校准即可看到真实成绩。

下载:Assets 里的 gitport-github.exe(9.31MB,md5 fcd9ecc96e55530748b9c3daadf55643,2026-10-25 构建)。

GitPort GitHub v0.4.0

Choose a tag to compare

@zhidian-cmd zhidian-cmd released this 24 Oct 06:07

GitPort GitHub v0.4.0 —— 页面缓存完整架构 · 镜像工作区 · 两轮全仓审计

v0.3.0(2026-10-19 发布)之后 71 个提交。连接复用 2.0、前端遥测拦截、隧道握手分片等 v0.3.0 说明已述的内容本版持续演进,不在此重复;以下为全部新增主题。

资产随代码更新(仍为 v0.4.0):搜索/列表页 5 分钟短 TTL、注释精简、README 动机叙事均已包含在本次构建内。

一、页面缓存完整架构(本版最大主题,从零建成)

v0.3.0 时页面缓存刚被移除(“浏览器原生缓存是更正确的层”的结论被实测推翻后重建)。本版建成完整体系:

  • 命中即秒回:GitHub 三个站(主站 / gist / raw)的“打开网页正文”请求,本地有存且没过保质期就直接回,对 GitHub 零请求
  • 保质期按站分治:主站 24 小时(HTML 文档实证 97% 是框架壳子,可见文本仅占 3%,动态数据走 XHR 实时拉)/ gist 30 分钟 / raw 文件 10 分钟
  • 动态页短保质期:搜索、issue / PR / 提交 / 发布列表、通知、动态流、探索页,以及任何带 query 参数的页面,只缓存 5 分钟——搜索结果会变,过时比慢更伤信任(用户反复刷新重搜,反而多打 GitHub);主站其余框架页仍 24 小时
  • 两层分工不重叠:静态资源(JS/CSS/图片)归浏览器缓存,代理只接网页正文——代理补的正是浏览器“存了不敢用”(GitHub 响应头逼其每次重新验证)的那层
  • 自研单文件存储:弃 cacache——内容寻址去重 / 完整性校验 / 双树索引在单用户页面缓存场景零收益,却带来每次写入全表扫描的常驻成本。现在一页一文件(4 字节头长 + 说明区 + 正文)、临时文件改名原子落盘(永远存不出半页)、文件名散列读时对账(防串页)
  • 容量三档:增量记账(累计写 8MB 才查一次)/ 软顶 200MB 按最后使用时间淘汰最旧 / 硬顶 250MB 整个清空重来——网页缓存而已,清了重拉
  • 新鲜度模型:保质期绝对时钟(命中不续期)+ 写后即删(发帖 / 改设置成功,同路径缓存立即失效)+ F5 出口(强制刷新故意绕过缓存直连上游,随时能看最新)
  • SWR / 后台 ETag 验证明确否决:_gh_sess 每请求轮换,后台验证只能带上一时刻的旧 cookie,GitHub 侧将废弃会话重用判定为账号泄露——这是红线
  • 安全边界全套:登录 / 登出 / 会话页排除(防锁死登录、防假登出);登录态二态指纹分键(user_session 值轮换不打散缓存);会话死亡防护(带登录凭证却拿到未登录页,不存不当命中);下发 cookie 永不入缓存;缓存目录 ACL 仅当前用户与 SYSTEM 可读
  • 删内存热点表:系统 Page Cache 兜底下缓存读盘 <1ms(上游请求 100–500ms 级),自建 8MB 内存表 + 锁 + 淘汰逻辑不划算
  • 演进史可追:cacache 管理 → 管家线程 + 孤儿回收 → 写盘后台化 → 写失效 → 缓存全量化(通知页 / 仪表盘首页 / 设置页纳入)→ SWR 三度反复后定案时钟路由 → 单文件存储 → 动态页短 TTL

二、自定义镜像独立工作区(全新)

  • 设置页 Worker 面板完整结构:地址 + 开关双键语义,增 / 删 / 停用逐条管理,列表实时反映链成员
  • 注册表模型:自定义镜像与内置镜像链彻底分离——注入改链尾追加(不再插头部打乱校准序),注册表顺序 = 添加先后
  • 收编机制:手改 plans.json 塞进来的自建镜像,重启自动进注册表可见可管(幂等)
  • 新增 Cloudflare 自建节点教程(全域名名单 + follow 修复的完整原文)
  • 修面板列表清空 bug;seeds 去内置镜像链(纯数据驱动,免责设计);README 补镜像站致谢与自建倡议

三、网络层增量

  • TLS 会话恢复:重拨注入 session ticket 走 1-RTT PSK,不再重传验整条证书链
  • api.mcp.github.com 挪出 core 池进直连白名单:证书 SAN 不覆盖致 27 连败全灭
  • 镜像腿统一浏览器 UA
  • 文档对齐:双连接 / EWMA / 遥测拦截 / mcp 白名单补进 README

四、两轮全仓审计修复(23 项)

第一轮(10 项):TTL 与 Touch 时钟分离、写防污染、管家线程 panic 护栏、写盘 fsync、测试补全
第二轮(13 项):

安全与正确性:

  • WebUI 镜像 URL HTML 注入:转义函数五个危险字符全部处理
  • 风控拦截页(403/400)被缓存:只收成功响应,旧脏条目读时自愈
  • 304 空体响应被缓存回放:同一白名单解决
  • 全新安装镜像链为空导致下载 502:空链自动回落直连串发
  • settings.json 保存竞态丢更新:全程互斥锁
  • plans.json 单池写坏整表重建:容错解析,哪段坏只丢哪段,原文件备份 .bak
  • 剪贴板写入失败泄漏全局堆块:两个失败分支都补释放
  • 非 Windows 死代码桩:删除

性能与语义:

  • 写失效阻塞 POST 响应路径:拆成内存同步清 + 磁盘异步删
  • 首圈串发最坏数分钟无预算:20 秒耗时预算,到期快速失败
  • 熔断表只进不出:过期条目惰性清除 + 4096 硬顶
  • 明文 HTTP 漏过滤逐跳头:按头名切分,与 MITM 路径同款名单

五、WebUI 与交互变化

  • 砍掉 IP 池页(IP 死活全凭串发实测,代码零 IP 名单,面板无信息量)
  • MITM 断开噪音不显示;侧栏收窄
  • Worker 面板见主题二

六、代码健康与文档

  • mitm.rs 拆分为 mitm/ 模块文件夹(按职责分四个文件)
  • 注释精简:模块头 37 行压到 10 行,全仓注释净删近百行——决策只留一处,历史叙事去掉,安全红线与踩坑记录保留
  • 删 WebSocket 升级支持(确认无使用场景);删 ourPAC / ProxyGuard / CountingBody / image 依赖;熔断器去 6 个纯转发函数;权限收紧走 icacls;删自建系统调用与重复包装层;settings 单一解析路径
  • seeds.json 同步为 plans.json 全量快照(池 27/6/22 + 镜像链 9×6)
  • 退出 / 收托盘即清 WebView2 数据目录,启动兜底——绿色零残留
  • README 新增「它为什么对 GitHub 友好」(遥测拦截 / 强制 gzip / 页面缓存 / 数据层验活)与「选哪个镜像」(只给作者实测最慢的一个)两节
  • 全轮净变化:+751 / −797 行(砍的比加的多)

七、测试

自动化测试 46 → 59 个(新增:plans 容错、熔断惰性清除、per-host TTL、动态页短 TTL、正文类型闸门、单文件存储覆盖写 / 截断自愈 / 防串页、明文 hop-by-hop 剥除等)

升级注意

  • 单文件直接替换旧版即可;首次启动自动清理旧版 cacache 格式缓存(.cache 里的旧数据作废重拉,属预期)
  • 页面缓存随 MITM 开关走:不开 MITM 则无缓存(与旧版一致)
  • plans.json 格式未变;单池写坏不再连坐整表,坏段可从 plans.json.bak 捡回
  • 自定义镜像若此前手改在 plans.json 里,重启后自动收编进 Worker 面板管理

下载:Assets 里的 gitport-github.exe(9.33MB,md5 bc6c3341c529b9575fae5df220e0d944,2026-10-24 构建)。

GitPort GitHub v0.3.0

Choose a tag to compare

@zhidian-cmd zhidian-cmd released this 19 Oct 16:10

GitPort GitHub v0.3.0 —— sni 纯透传 · 镜像链全数据驱动

v0.2.0 之后的第三个公开版本:这一版把"文件里写什么,代理就跑什么"落到了底。

2026-10-22 资产随代码更新(仍为 v0.3.0,75 个提交),以下补全发布后的全部改动。

sni 纯透传

  • plans.json 的 sni 原样进 TLS 握手,写什么传什么:写域名 = 伪装,写 host 真名 = 真名,写 "" = 无 SNI
  • 删掉全部形态解释层(MODE/plan_mode/shape_for_ip),试不同 SNI 形态 = 改一行文件重启,没有隐藏规则
  • ⚠️ 升级注意:旧写法 sni/real/nosni/fake: 关键字不再有特殊含义,请改写成实际域名或空串

镜像链全数据驱动

  • 删内置镜像白名单与默认链表:任何支持拼接的 https 镜像都能用,自部署的一样,坏镜像运行期自然失败沉底
  • 缺链 host 无镜像腿,数据说了算
  • 全新安装的引导快照自带校准过的镜像链序,开箱即当前最优

内容边缘复活

  • 185.199.108/109/111.133 判死属封锁窗口假死,回归内容族(纵深 +3)

连接复用 2.0

  • 高频 host(github.com / api / raw / avatars / githubassets)每 host 最多开 两条 h2 连接:单连接 24 并发被服务端按连接限流(p50 1036ms),两条压到 332ms,四条不再改善
  • 第二条连接自动落到不同 IP,避开边缘对同 IP 复用的降权
  • 按每条连接的 EWMA 实测耗时择优取用,每 8 次留一次探索——两条连接质量差 3.6 倍时不再把一半请求喂给慢连接
  • 修三个回归:GOAWAY 后在途请求排队拨号 10s+(恢复锁内连接重查);keepalive 失败摘错连接(按连接 id 精确摘除);响应预算被烧两遍
  • 实测:github.com p90 3591→530ms、max 5860→920ms

前端遥测拦截

  • api.github.com 75% 的请求是 /_private/browser/* 前端遥测(Datadog RUM),外加 alive / collector 心跳——全部本地读掉回 204,一个字节不发往 GitHub(作用域:MITM 模式;透传模式下这些域名照常走隧道)
  • 拦截后搜索历史等真 API 不再被遥测挤队列(搜索 count 请求 300~450ms)

配置与状态收敛

  • 拨号轮换改游标制:IP 表顺序固定零写盘,驻留记号入 settings.json
  • settings.json 固定 6 键 schema:缺键/坏字段按默认补齐,不再整份作废;原子写(tmp+rename)+ 每次落盘重收紧 ACL
  • 删 IP 退役名单:IP 死活全凭串发实测,代码零 IP 名单
  • 修 TTFB 镜像校准排序 bug:旧版会把最慢镜像排到链头写回 plans.json

绿化与瘦身

  • 退出/收托盘即清 WebView2 数据目录,启动兜底——绿色零残留
  • 整轮审计净删数百行:ourPAC 持久化、ProxyGuard、交付字节计数、image 依赖(lockfile -42 行)、自建系统调用、重复包装层;托盘图标改 exe 内嵌资源
  • MITM 下不做 WebSocket(确认无使用场景后删除):ws 请求按普通 GET 走上游,浏览器快速失败
  • 自动化测试 46 → 51 个

稳健性与隧道分片

  • 整轮审计修复:明文 http 转发头/体切分(请求体不再被当头转发)、h2 SETTINGS 握手限时 5s(防"TLS 通但装死"的 IP 持锁拖死整域)、WebUI 启动失败留痕、accept 错误退避
  • 隧道握手分片(随机化):CONNECT 透传把 ClientHello 拆成 2~3 段(切点/间隔每连接随机)再发,DPI 拼不齐 SNI——真名腿免于 RST 的掩体(纯用户态,不装证书)
  • 已知边界:透传遇会话级风控页时,垫底轮换会加速"会话-IP 漂移"放大风控信号——此时切 MITM(连接池驻留)或等风控过期
  • 自动化测试 51 个

下载:Assets 里的 gitport-github.exe(8.9MB,2026-10-22 构建,v0.3.0 代码线),单文件,直接替换旧版即可。