ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Git Push(TODO)

Git Push(TODO) 最近经常碰到GIT push不上去的问题。到处求人解决也真是尴尬想自己看看所以刚刚在github上建了一个仓试了下。结果如下暂时可能还不行因为数据都是加密的没法看到具体GIT的交互信息。。。后面再想办法。-----------------------------------------------------------------------| 应用层 (Application) : Git Protocol (receive-pack / send-pack) |-----------------------------------------------------------------------| 表示/会话层 (Session) : SSH Tunnel (Encrypted Authenticated) |-----------------------------------------------------------------------| 传输层 (Transport) : TCP (Port 22, 3-Way Handshake, Windowing) |-----------------------------------------------------------------------| 网络层 (Network) : IP (Routing, Fragmentation, ICMP) |-----------------------------------------------------------------------| 链路层 (Link) : Ethernet / Wi-Fi (MAC Framing, ARP) |-----------------------------------------------------------------------Git 业务握手与 Refs 发现 (Git / SSH 应用层)SSH 建立后客户端在远程服务器上启动 git-receive-pack 进程命令触发客户端通过 SSH 频道发送请求git-receive-pack /path/to/repo.git。服务器响应 Refs 列表远程 git-receive-pack 读取自身的 .git/refs向客户端按 Pkt-line 格式 输出当前服务器拥有的所有分支和 Commit Hash包括 HEAD。格式形如003f4a3b... refs/heads/main\n00000000 为 Flush 包标志。客户端计算增量Delta Computation客户端对比本地 main 分支的提交点与服务器返回的 Commit Hash找出远程缺失的 Commit、Tree 和 Blob 对象。打包与数据传输 (Packfile Sliding Window)构建 Packfile应用层客户端将所有需要推送到远程的本地对象打成增量包.pack并生成索引文件.idx。数据在打包时会使用 zlib 进行压缩并经过 Delta 算法去重。数据打包发送客户端向服务器发送 want/have 及更新命令例如将 main 指针从 A 更新为 B。发送包含 .pack 数据的 Pkt-line 流。TCP 层分段与传输控制传输/网络层TCP 分段MSSPackfile 巨型数据块被拆分为多个不超过 MSS通常 1460 字节的 TCP 报文段。滑动窗口与拥塞控制TCP 采用 Slow Start慢启动、Congestion Avoidance拥塞避免调整发送窗口大小并通过 ACK 机制确认接收。若发生丢包触发重传机制Fast Retransmit/Timeout。IP 分片MTU若上层数据报超过链路层 MTU通常 1500 字节网络层执行 IP 分片设置 DF/MF 标志与 Fragment Offset。方案一强制 Git 使用无加密的 HTTP 协议最简单如果只是为了在 Wireshark 中学习和分析 Git 的底层通信最快的方法是在本地搭建或使用纯 HTTP不带 S的 Git 服务例如本地部署一个 Gitea/GitLab或使用局域网 git daemon。搭建/配置 HTTP 访问地址http://localhost:3000/user/repo.git在本地推送git push origin mainWireshark 过滤条件http || git效果你可以直接在 Wireshark 的 HTTP POST 请求体中看到明文的 git-receive-pack 数据流以及 Pkt-line 格式的原始报文。方案二HTTPS 模式下通过 TLS 日志解密最推荐如果你推送到 GitHub/GitLab 的地址是 https://...可以让 Git 使用的 OpenSSL/GnuTLS 导出对称加密密钥SSLKEYLOGFILE然后导入 Wireshark 解密。1. 配置环境变量并启动抓包Linux / macOS:Bashexport SSLKEYLOGFILE~/git_sslkeys.logwireshark Windows (PowerShell):PowerShell$env:SSLKEYLOGFILEC:\Users\YourName\git_sslkeys.log2. 执行 Git PushBashgit push origin main此时 git_sslkeys.log 文件中会写入当前 TLS 会话的协商密钥。3. 在 Wireshark 中导入密钥解密打开 Wireshark 主界面进入菜单 Edit $\rightarrow$ Preferences。展开左侧 Protocols $\rightarrow$ TLS旧版本为 SSL。找到 (Pre)-Master-Secret log filename 项浏览并选择你的 git_sslkeys.log 文件。点击 OK。原本加密的 Application Data 报文下方会自动多出一个 Decrypted TLS 标签页直接展示明文数据
返回列表