[{"data":1,"prerenderedAt":448},["ShallowReactive",2],{"blog-posts":3},[4,253,336],{"id":5,"title":6,"body":7,"cover":238,"description":239,"draft":240,"extension":241,"lang":242,"meta":243,"navigation":244,"path":245,"publishedAt":246,"seo":247,"stem":248,"tags":249,"updatedAt":238,"__hash__":252},"blog\u002Fblog\u002Fethernet.md","Ethernet 的学习笔记",{"type":8,"value":9,"toc":230},"minimark",[10,19,23,35,38,45,48,53,56,66,69,73,85,108,113,119,126,130,144,160,164,170,175,179,185,199,202,210,214,220,225,227],[11,12,13,14,18],"p",{},"本文在涉及到 AI 生成内容的时候，会使用 ",[15,16,17],"span",{},"AIGC"," 标签。",[20,21,22],"h2",{"id":22},"以太网帧",[11,24,25,26,30,31,34],{},"我在研究以太网帧过后发现，每个标准的以太网帧都包含一个 ",[27,28,29],"code",{},"Header"," 以及一个长度可以为 0 的 ",[27,32,33],{},"Payload","，",[11,36,37],{},"Header 中又包含：",[39,40,41],"ul",{},[42,43,44],"li",{},"源 Mac 地址、目标 Mac 地址（也是判断是否为广播的依据）以及帧的类型（IPV4、IPV6、ARP 等）",[11,46,47],{},"Payload 中包含：",[39,49,50],{},[42,51,52],{},"各个协议(IPV4、IPV6 等)的包",[11,54,55],{},"以下为图解",[57,58,63],"pre",{"className":59,"code":61,"language":62},[60],"language-text","[ Ethernet Frame ]\n    ├── Ethernet Header\n    └── Payload\n            ├── IPv4 Packet\n            |       ├── IPv4 Header\n            |       └── Payload\n            ├── IPv6 Packet\n            |       ├── IPv6 Header\n            |       └── Payload\n            └── ARP Packet\n","text",[27,64,61],{"__ignoreMap":65},"",[67,68],"hr",{},[20,70,72],{"id":71},"ipv4-包","IPv4 包",[11,74,75,76,78,79,81,82,84],{},"IPv4 包中含一个 ",[27,77,29],{}," 和一个 ",[27,80,33],{},"，\n",[27,83,29],{}," 是整个包的前 20 个字节，其中包含了：",[39,86,87,90,93,96,99,102,105],{},[42,88,89],{},"Version(版本)、Type of Service(服务类型)、IHL(头长度)、Total Length(总长度)、",[42,91,92],{},"Identification(分片 ID)、Flags(分片控制位)、Fragment Offset(当前分片在原始数据中的位置)、",[42,94,95],{},"TTL(存活时间)、Protocol(协议类型)、Header Checksum(校验和)、",[42,97,98],{},"Source IP Address(源 IP 地址)、",[42,100,101],{},"Destination IP Address(目标 IP 地址)、",[42,103,104],{},"Options(选项，此为可选)、",[42,106,107],{},"Payload(载荷)",[11,109,110,111],{},"以下为图解 ",[15,112,17],{},[57,114,117],{"className":115,"code":116,"language":62},[60],"0                   1                   2                   3\n0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n|Version|  IHL  |Type of Service|        Total Length         |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n|       Identification          |Flags|    Fragment Offset    |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n|   TTL   |    Protocol         |       Header Checksum       |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n|                       Source IP Address                     |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n|                    Destination IP Address                   |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n|                    Options (optional)                       |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n|                           Payload                           |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n",[27,118,116],{"__ignoreMap":65},[11,120,121,122,125],{},"在本项目里，我们只关注 ",[27,123,124],{},"Version、IHL、Total Length、TTL、Protocol、Source IP、Destination IP、Payload"," 这几个字段",[20,127,129],{"id":128},"ipv6-包","IPv6 包",[11,131,132,133,78,135,137,138,141,143],{},"IPv6 包中同样包含一个 ",[27,134,29],{},[27,136,33],{},"。",[139,140],"br",{},[27,142,29],{}," 固定为 40 字节，常见字段包含：",[39,145,146,149,152,155,158],{},[42,147,148],{},"Version(版本)、Traffic Class(流量类别)、Flow Label(流标签)、Payload Length(载荷长度)、",[42,150,151],{},"Next Header(下一头部\u002F上层协议类型)、Hop Limit(跳数限制)、",[42,153,154],{},"Source Address(源 IPv6 地址)、",[42,156,157],{},"Destination Address(目标 IPv6 地址)、",[42,159,107],{},[11,161,110,162],{},[15,163,17],{},[57,165,168],{"className":166,"code":167,"language":62},[60],"0                   1                   2                   3\n0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n|Version| Traffic Class |           Flow Label                |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n|         Payload Length        | Next Header  |  Hop Limit   |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n|                                                             |\n+                                                             +\n|                                                             |\n+                       Source Address                        +\n|                                                             |\n+                                                             +\n|                                                             |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n|                                                             |\n+                                                             +\n|                                                             |\n+                    Destination Address                      +\n|                                                             |\n+                                                             +\n|                                                             |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n|                           Payload                           |\n+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n",[27,169,167],{"__ignoreMap":65},[11,171,121,172,125],{},[27,173,174],{},"Version、Payload Length、Next Header、Hop Limit、Source Address、Destination Address、Payload",[20,176,178],{"id":177},"arp-包","Arp 包",[11,180,181,182,184],{},"ARP 包用于在局域网中根据 IP 地址查询对应的 MAC 地址。",[139,183],{},"\nARP 报文由固定格式字段组成（无复杂可变头部），常见字段包含：",[39,186,187,190,193,196],{},[42,188,189],{},"Hardware Type(硬件类型)、Protocol Type(协议类型)、",[42,191,192],{},"HLen(硬件地址长度)、PLen(协议地址长度)、Operation(操作码：请求\u002F响应)、",[42,194,195],{},"Sender Hardware Address(发送方 MAC)、Sender Protocol Address(发送方 IP)、",[42,197,198],{},"Target Hardware Address(目标 MAC)、Target Protocol Address(目标 IP)",[11,200,201],{},"其中：",[39,203,204,207],{},[42,205,206],{},"ARP Request：通常已知目标 IP，不知道目标 MAC（THA 常为全 0）",[42,208,209],{},"ARP Reply：返回目标 IP 对应的目标 MAC",[11,211,110,212],{},[15,213,17],{},[57,215,218],{"className":216,"code":217,"language":62},[60],"0                   15 16                  31\n+---------------------+---------------------+\n| Hardware Type       | Protocol Type       |\n+---------------------+---------------------+\n| HLen | PLen |       Operation             |\n+---------------------+---------------------+\n| Sender Hardware Address (SHA)             |\n+-------------------------------------------+\n| Sender Protocol Address (SPA)             |\n+-------------------------------------------+\n| Target Hardware Address (THA)             |\n+-------------------------------------------+\n| Target Protocol Address (TPA)             |\n+-------------------------------------------+\n",[27,219,217],{"__ignoreMap":65},[11,221,121,222,125],{},[27,223,224],{},"Hardware Type、Protocol Type、Operation、Sender Hardware Address、Sender Protocol Address、Target Hardware Address、Target Protocol Address",[67,226],{},[11,228,229],{},"未完待续...",{"title":65,"searchDepth":231,"depth":231,"links":232},3,[233,235,236,237],{"id":22,"depth":234,"text":22},2,{"id":71,"depth":234,"text":72},{"id":128,"depth":234,"text":129},{"id":177,"depth":234,"text":178},null,"本文在涉及到 AI 生成内容的时候，会使用 [AIGC] 标签。",false,"md","zh-CN",{},true,"\u002Fblog\u002Fethernet","2026-06-19",{"title":6,"description":239},"blog\u002Fethernet",[250,251],"Ethernet","Rust","eUnKCHMOuiM1X3FUzqzyNzyPiNp7OXSA6ziC2uL8GeU",{"id":254,"title":255,"body":256,"cover":238,"description":327,"draft":240,"extension":241,"lang":242,"meta":328,"navigation":244,"path":329,"publishedAt":330,"seo":331,"stem":332,"tags":333,"updatedAt":238,"__hash__":335},"blog\u002Fblog\u002Fdx-stream.md","舞萌 DX 比赛直播 GUI 的一个写",{"type":8,"value":257,"toc":322},[258,261,276,279,282,291,298,301,304,307,310,313,316],[20,259,260],{"id":260},"起因",[11,262,263,264,268,269,137],{},"看到本地音游群打算在 5.1 期间举办",[265,266,267],"del",{},"乌蒙","舞萌 DX 比赛，\n又看到了历年比赛简陋的 GUI，\n所以写了这个项目————",[270,271,275],"a",{"href":272,"rel":273},"https:\u002F\u002Fdx.yatori.cc",[274],"nofollow","DX Stream",[20,277,278],{"id":278},"经历",[11,280,281],{},"这次第一次尝试全程 vibe coding，原因有两个：",[283,284,285,288],"ol",{},[42,286,287],{},"懒",[42,289,290],{},"想试试 deepseek-v4 的威力",[11,292,293,294,297],{},"初始的设想是有一个控制端，一个观众端，想用 websocket 进行两个端之间的交互。\n使用 Serverless 架构，这样就不用花那个 ",[265,295,296],{},"b"," 钱维护这一套系统了。\n但是发现腾讯云的 Serverless 相关服务，并不是很能满足 websocket 需求，于是便修改了为 HTTP 轮询的方式。\n测试后发现，隔房间脏数据的传入，一些功能的糟糕实现，以及巨大无比的延迟，让我很崩溃。",[11,299,300],{},"最终选择整体迁移至 Cloudflare。（感恩大慈善家）",[11,302,303],{},"Update 6\u002F18: 太久没写导致忘完了。\n但是没关系，我会动用的我的大脑回想。👽",[11,305,306],{},"因为毕竟是舞萌 DX，需要给观看直播的观众提示现在是什么曲子，双方 Rating 多少，准确度又是多少。\n所以会涉及到数据同步，以及调用网易云解析 API 的部分。\n又是因为所有都由 AI 进行决策，所以他选择了使用 Durable Objects 来进行数据存储。\n以 Websocket 来保证后台与用户端数据同步，但是实际使用下来还是有不同房间数据污染的问题。\n毕竟是 AI 写的，我就不做太高要求了。",[11,308,309],{},"结果这个项目在最终实践里显得很无用，\n还是用 obs 的场景解决。",[20,311,312],{"id":312},"总结",[11,314,315],{},"整体体验下来，我对于全程 Vibe 还是持一个👎的想法。\n因为 Deepseek-V4 还是很难用的，花了几十块产出了个这玩意。\n也有可能是我的 Vibe 水平太差，总之都无所谓了。",[11,317,318,319],{},"有了实际体验过后，我就不打算继续这个项目了。\n",[265,320,321],{},"不如 obs 好用。",{"title":65,"searchDepth":231,"depth":231,"links":323},[324,325,326],{"id":260,"depth":234,"text":260},{"id":278,"depth":234,"text":278},{"id":312,"depth":234,"text":312},"起因 看到本地音游群打算在 5.1 期间举办乌蒙舞萌 DX 比赛， 又看到了历年比赛简陋的 GUI， 所以写了这个项目————DX Stream。",{},"\u002Fblog\u002Fdx-stream","2026-04-28",{"title":255,"description":327},"blog\u002Fdx-stream",[334],"Vue","YPZS2NjlKgRFFahfQzWNqux7wZNxzCT9n1sPEtQSVHk",{"id":337,"title":338,"body":339,"cover":238,"description":439,"draft":240,"extension":241,"lang":242,"meta":440,"navigation":244,"path":441,"publishedAt":442,"seo":443,"stem":444,"tags":445,"updatedAt":238,"__hash__":447},"blog\u002Fblog\u002Fhello-world.md","Hello Toriog",{"type":8,"value":340,"toc":434},[341,346,349,352,365,368,371,424,427,430],[342,343,345],"h1",{"id":344},"你好","你好👋！",[20,347,348],{"id":348},"前言",[11,350,351],{},"这是我博客的第一篇文章，也是这个新域名启用的第一个站点。\n这个网站叫 Toriog 意是 Tori + Blog。\n搞笑艺人在此。",[11,353,354,355,359,360,364],{},"写这篇文章的时候域名在备案，所以 ",[270,356,357],{"href":357,"rel":358},"https:\u002F\u002Fyatori.cc",[274]," 和 ",[270,361,362],{"href":362,"rel":363},"https:\u002F\u002Fwww.yatori.cc",[274]," 不能有解析。\n非常悲伤的一件事情啊————",[20,366,367],{"id":367},"部署",[11,369,370],{},"简单记录一下部署过程。",[57,372,376],{"className":373,"code":374,"language":375,"meta":65,"style":65},"language-bash shiki shiki-themes github-light github-dark","npm install hexo-cli -g\nhexo init Toriog\ncd Toriog\nbun i\n","bash",[27,377,378,397,408,415],{"__ignoreMap":65},[15,379,382,386,390,393],{"class":380,"line":381},"line",1,[15,383,385],{"class":384},"sScJk","npm",[15,387,389],{"class":388},"sZZnC"," install",[15,391,392],{"class":388}," hexo-cli",[15,394,396],{"class":395},"sj4cs"," -g\n",[15,398,399,402,405],{"class":380,"line":234},[15,400,401],{"class":384},"hexo",[15,403,404],{"class":388}," init",[15,406,407],{"class":388}," Toriog\n",[15,409,410,413],{"class":380,"line":231},[15,411,412],{"class":395},"cd",[15,414,407],{"class":388},[15,416,418,421],{"class":380,"line":417},4,[15,419,420],{"class":384},"bun",[15,422,423],{"class":388}," i\n",[20,425,426],{"id":426},"结尾",[11,428,429],{},"似乎没什么想写了，就这样结束吧。",[431,432,433],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":65,"searchDepth":231,"depth":231,"links":435},[436,437,438],{"id":348,"depth":234,"text":348},{"id":367,"depth":234,"text":367},{"id":426,"depth":234,"text":426},"前言 这是我博客的第一篇文章，也是这个新域名启用的第一个站点。 这个网站叫 Toriog 意是 Tori + Blog。 搞笑艺人在此。",{},"\u002Fblog\u002Fhello-world","2026-03-21",{"title":338,"description":439},"blog\u002Fhello-world",[446],"new","g2kS4vT-NSt8w_QwwLvR5ZD9GYU_mUDYya0G24Rnitc",1789620384793]