<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>《Java 网络编程基础》 · 全书目录与章节索引（50 篇） on PlumePHP</title><link>https://plumephp.com/posts/books/java%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E5%9F%BA%E7%A1%80/</link><description>Recent content in 《Java 网络编程基础》 · 全书目录与章节索引（50 篇） on PlumePHP</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Wed, 28 Oct 2026 17:15:00 +0800</lastBuildDate><atom:link href="https://plumephp.com/posts/books/java%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E5%9F%BA%E7%A1%80/index.xml" rel="self" type="application/rss+xml"/><item><title>《Java 网络编程基础》附录 B 网络诊断命令清单</title><link>https://plumephp.com/java-netbasic-appendix-b-diagnostics/</link><pubDate>Wed, 28 Oct 2026 17:15:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-appendix-b-diagnostics/</guid><description>《Java 网络编程基础》附录 B：macOS 26.3 上可直接复制的网络诊断命令，覆盖 netstat -anv -p tcp、lsof -nP -iTCP:9090、sudo tcpdump -i lo0、nc、curl -v、ab、jcmd Thread.print 与 VM.native_memory，每条给用途、关键列读法与常见误判。</description></item><item><title>《Java 网络编程基础》附录 A Socket 与 NIO API 速查</title><link>https://plumephp.com/java-netbasic-appendix-a-socket-api/</link><pubDate>Wed, 28 Oct 2026 17:10:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-appendix-a-socket-api/</guid><description>《Java 网络编程基础》附录 A：把 InetAddress、Socket、ServerSocket、SocketChannel、ServerSocketChannel、Selector、ByteBuffer、FileChannel 八组 API 压成速查表，逐条给签名、作用、易错点与最小示例，按 JDK 25 核对，并附 linkd 类映射与异常对照表。</description></item><item><title>《Java 网络编程基础》15.3 linkd v1 验收与故障复盘</title><link>https://plumephp.com/java-netbasic-15-3-v1-acceptance/</link><pubDate>Wed, 28 Oct 2026 17:05:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-15-3-v1-acceptance/</guid><description>v1 能跑通不等于能交付。本节把前 14 章收成一张 linkd v1 验收清单：健康检查、keep-alive、HTTP/2 preface、WebSocket 升级、TLS、优雅关闭逐条给命令与判据，再用 AcceptanceChecklist 自动跑可自动化的部分，最后给出故障注入项与复盘模板，形成可复现的发布记录。</description></item><item><title>《Java 网络编程基础》15.2 压测工具与指标口径</title><link>https://plumephp.com/java-netbasic-15-2-load-testing/</link><pubDate>Wed, 28 Oct 2026 17:00:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-15-2-load-testing/</guid><description>ab 能跑出数字，但吞吐、p50/p95/p99、错误数和连接数必须一起读，单看 QPS 会得出相反结论。本节确认本机 ab 可用、wrk 不在，用三次 keep-alive 与一次非 keep-alive 实测 /healthz，给出 LoadTestPlan 的 Little 定律并发估算、分位算法与验收判定。</description></item><item><title>《Java 网络编程基础》15.1 tcpdump、netstat 与连接诊断</title><link>https://plumephp.com/java-netbasic-15-1-tcpdump-netstat/</link><pubDate>Wed, 28 Oct 2026 16:55:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-15-1-tcpdump-netstat/</guid><description>连接卡住时线程栈只说它在等，netstat 才说等到哪一步。本节用 macOS 的 netstat -anv -p tcp、lsof -nP -iTCP 实测 CLOSE_WAIT、TIME_WAIT、SYN_SENT 三种状态，讲 sudo tcpdump -i lo0 的读法与权限边界，把 linkd 的 ConnectionDiagnostics 接进排查链并给出误判边界。</description></item><item><title>《Java 网络编程基础》14.3 优雅关闭与连接排空</title><link>https://plumephp.com/java-netbasic-14-3-graceful-shutdown/</link><pubDate>Wed, 28 Oct 2026 16:50:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-14-3-graceful-shutdown/</guid><description>停掉 accept 不等于优雅关闭：写队列没排空就退出，客户端会看到响应被截断。本节用 linkd 的 GracefulShutdown 接住 SIGINT，停止接收新连接、按连接半关闭、在期限内排空，超时后强制关闭，并给出可复现的阶段输出。</description></item><item><title>《Java 网络编程基础》14.2 超时、重试与幂等边界</title><link>https://plumephp.com/java-netbasic-14-2-timeout-retry/</link><pubDate>Wed, 28 Oct 2026 16:45:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-14-2-timeout-retry/</guid><description>连接超时、读超时和请求期限常被混成一个数字，重试又会把一次失败放大成多倍流量。本节用 linkd 的 RetryPolicy 区分失败阶段、计算带抖动的退避、约束总期限，并在 libraryd 上游调用中给出幂等键复用与只对安全操作重试的判断表。</description></item><item><title>《Java 网络编程基础》14.1 读写水位与背压信号</title><link>https://plumephp.com/java-netbasic-14-1-watermark-backpressure/</link><pubDate>Wed, 28 Oct 2026 16:40:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-14-1-watermark-backpressure/</guid><description>写队列只设一个阈值，暂停与恢复会在事件循环里反复抖动。本节用 linkd 的 WatermarkHandler 实现高低水位滞回、写队列硬上限、暂停与恢复 OP_READ、令牌桶读限速和帧边界丢弃，并给出可复现的水位迁移、令牌桶配额与硬上限关闭输出。</description></item><item><title>《Java 网络编程基础》13.3 内存映射与文件传输</title><link>https://plumephp.com/java-netbasic-13-3-mmap-transfer/</link><pubDate>Wed, 28 Oct 2026 16:35:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-13-3-mmap-transfer/</guid><description>MappedByteBuffer 的映射、刷盘与取消映射各有边界。本节用 MapProbe 验证只读 force 为空操作、通道关闭不解除映射与 Arena 关闭后的 IllegalStateException，再用 MappedFileServer 对比 mmap 与 transferTo，给出静态文件发送的选择依据与 linkd 落地方式。</description></item><item><title>《Java 网络编程基础》13.2 DirectByteBuffer 分配与回收</title><link>https://plumephp.com/java-netbasic-13-2-direct-memory-lifecycle/</link><pubDate>Wed, 28 Oct 2026 16:30:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-13-2-direct-memory-lifecycle/</guid><description>DirectByteBuffer 的分配与回收不在一条时间线上。本节拆开 Cleaner、MaxDirectMemorySize 与 NMT 三本账，用 DirectMemoryBudget 复现预算拒绝、切片共享、可达泄漏与不可达回收，并给出 linkd 中 BufferPool 的所有权规则与泄漏判定顺序。</description></item><item><title>《Java 网络编程基础》13.1 零拷贝的系统调用边界</title><link>https://plumephp.com/java-netbasic-13-1-zero-copy-syscalls/</link><pubDate>Wed, 28 Oct 2026 16:25:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-13-1-zero-copy-syscalls/</guid><description>零拷贝不是一个系统调用的别名。本节用 8 MiB 文件在 loopback 上拆开 JDK 25 的 transferTo 三级分派，解释返回值 0 的三种来源，并用包裹通道与 JFR 证明：一次返回 8 MiB 也可能只是 1024 次 8 KB 拷贝，macOS 上不要照搬 Linux sendfile/epoll 的结论。</description></item><item><title>《Java 网络编程基础》12.3 上下文传播与线程安全</title><link>https://plumephp.com/java-netbasic-12-3-context-propagation/</link><pubDate>Wed, 28 Oct 2026 16:20:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-12-3-context-propagation/</guid><description>本节处理跨线程的请求上下文：ThreadLocal 在线程池中的残留与泄漏、ScopedValue 在 JDK 25 的绑定与恢复、事件循环到业务线程的显式传播，以及不可变消息与 happens-before 如何建立可见性；给出可运行的 RequestContext 与本机输出。</description></item><item><title>《Java 网络编程基础》12.2 业务线程池与阻塞隔离</title><link>https://plumephp.com/java-netbasic-12-2-business-pool/</link><pubDate>Wed, 28 Oct 2026 16:15:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-12-2-business-pool/</guid><description>本节给 linkd 补业务线程池：用有界队列和命名线程隔离阻塞任务，按 CPU 与等待比估算线程数，解释 CallerRunsPolicy 为何会把阻塞带回事件循环，并给出指标与拒绝路径；最后用 JDK 25 虚拟线程做同负载对照，附可复现命令与本机单次数据。</description></item><item><title>《Java 网络编程基础》12.1 事件循环与任务队列</title><link>https://plumephp.com/java-netbasic-12-1-event-loop/</link><pubDate>Wed, 28 Oct 2026 16:10:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-12-1-event-loop/</guid><description>本节拆开 linkd 事件循环的调度层：任务队列为什么必须是多生产者单消费者、execute 的线程归属与重入边界、selector.wakeup 的合并条件、定时任务的最小堆与 select 超时算法，以及一次 500 毫秒阻塞如何让心跳延迟到任务结束；给出可运行的 EventLoopImpl 与本机输出。</description></item><item><title>《Java 网络编程基础》11.3 心跳、关闭与广播</title><link>https://plumephp.com/java-netbasic-11-3-heartbeat-broadcast/</link><pubDate>Wed, 28 Oct 2026 16:05:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-11-3-heartbeat-broadcast/</guid><description>在帧编解码之上补齐连接生命周期：用 ping/pong 检测半开连接，按 1000、1001、1002 等关闭码完成关闭握手，并用 ConcurrentHashMap 会话表与每会话有界发送队列实现线程安全广播，给出 WebSocketSessionImpl 与 WebSocketHub。</description></item><item><title>《Java 网络编程基础》11.2 帧格式、掩码与分片</title><link>https://plumephp.com/java-netbasic-11-2-frames/</link><pubDate>Wed, 28 Oct 2026 16:00:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-11-2-frames/</guid><description>从 101 之后的第一段字节开始，拆开 WebSocket 的两字节帧头：FIN、RSV、opcode、MASK 与 7/16/64 位长度编码，讲清客户端掩码的 XOR 算法和控制帧的 125 字节上限，并用 WebSocketFrameCodec 处理半帧、continuation 分片与 UTF-8 校验。</description></item><item><title>《Java 网络编程基础》11.1 WebSocket 握手与 Upgrade</title><link>https://plumephp.com/java-netbasic-11-1-handshake/</link><pubDate>Wed, 28 Oct 2026 15:55:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-11-1-handshake/</guid><description>从 linkd-ws 的 /ws/echo 升级请求出发，逐条校验 Upgrade、Connection、Sec-WebSocket-Version 与 Sec-WebSocket-Key，手写 SHA-1 加 GUID 再 Base64 的 Accept 计算，讲清 101 响应写完后协议切换点在哪里，并给出 WebSocketHandshake 的完整实现。</description></item><item><title>《Java 网络编程基础》10.3 会话复用、ALPN 与证书校验</title><link>https://plumephp.com/java-netbasic-10-3-session-alpn/</link><pubDate>Wed, 28 Oct 2026 15:50:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-10-3-session-alpn/</guid><description>完整握手之后，linkd 还要决定复用哪条会话、用 h2 还是 http/1.1、以及证书到底属于谁。本节讲 TLS 1.3 session ticket 的复用口径、ALPN 协商与主机名校验，给出 TlsSessionPolicy，并用 PKIXParameters 校验证书链。</description></item><item><title>《Java 网络编程基础》10.2 SSLEngine 非阻塞握手</title><link>https://plumephp.com/java-netbasic-10-2-sslengine/</link><pubDate>Wed, 28 Oct 2026 15:45:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-10-2-sslengine/</guid><description>阻塞式 SSLSocket 会把握手绑在一条线程上，linkd 的 EventLoop 不能这样等。本节把 SSLEngine 封装成 NonBlockingTlsHandshake：逐轮驱动 wrap/unwrap，处理 BUFFER_OVERFLOW、BUFFER_UNDERFLOW 与 NEED_TASK，最后用 TlsHandshakeHandler 接进 6.2 的事件循环。</description></item><item><title>《Java 网络编程基础》10.1 TLS 1.3 握手与证书链</title><link>https://plumephp.com/java-netbasic-10-1-tls-handshake/</link><pubDate>Wed, 28 Oct 2026 15:40:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-10-1-tls-handshake/</guid><description>从 linkd 明文代理必须加密的约束出发，拆解 TLS 1.3 的 1-RTT 握手、ClientHello/ServerHello 与证书链；用 keytool 生成带 SAN 的 PKCS12 自签证书，再用 TlsHandshakeInspector 打印协议、套件、证书链与 SAN，并给出证书不匹配的排查顺序。</description></item><item><title>《Java 网络编程基础》9.3 多路复用、流量控制与优先级</title><link>https://plumephp.com/java-netbasic-09-3-multiplex-flow-control/</link><pubDate>Wed, 28 Oct 2026 15:35:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-09-3-multiplex-flow-control/</guid><description>从 linkd 一条连接上 6 个并发请求抢 65535 字节窗口出发，讲清 stream id 分配、WINDOW_UPDATE、连接级与流级窗口的区别，给出 Http2Connection 的写数据、窗口回收与轮转调度骨架，并说明 RFC 9113 弃用优先树后的取舍。</description></item><item><title>《Java 网络编程基础》9.2 HPACK 与头部压缩</title><link>https://plumephp.com/java-netbasic-09-2-hpack/</link><pubDate>Wed, 28 Oct 2026 15:30:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-09-2-hpack/</guid><description>手写 HPACK 的最小可用实现：静态表、动态表、整数编码与 Huffman 解码，用 RFC 7541 的 C.4.1、C.6.1 测试向量逐字节验证解码结果，并说明编码端不支持 Huffman 时如何通过 H=0 字面量合法降级、解码端为何仍必须支持。</description></item><item><title>《Java 网络编程基础》9.1 HTTP/2 帧类型与流状态</title><link>https://plumephp.com/java-netbasic-09-1-http2-frames/</link><pubDate>Wed, 28 Oct 2026 15:25:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-09-1-http2-frames/</guid><description>从 linkd 一条连接只能串行处理请求的瓶颈出发，拆开 HTTP/2 的 9 字节帧头，逐字节解析 SETTINGS、HEADERS、DATA、RST_STREAM 与 GOAWAY，给出 Http2Frame、Http2FrameCodec 的编解码实现，并用 preface 握手把帧接进 9090 的读循环。</description></item><item><title>《Java 网络编程基础》8.3 路由、静态文件与错误响应</title><link>https://plumephp.com/java-netbasic-08-3-http-router/</link><pubDate>Wed, 28 Oct 2026 15:20:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-08-3-http-router/</guid><description>路由决定一个 HttpRequest 最终由谁处理。本节实现 HttpRouter 与 HttpRouterImpl，注册 /healthz 与 /books/{id}，区分 404、405 与 500，并在静态文件服务里做百分号解码、路径规范化与根目录前缀校验，挡住 ../、%2e%2e、符号链接与编码斜杠。</description></item><item><title>《Java 网络编程基础》8.2 keep-alive、chunked 与管线化</title><link>https://plumephp.com/java-netbasic-08-2-keepalive-chunked/</link><pubDate>Wed, 28 Oct 2026 15:15:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-08-2-keepalive-chunked/</guid><description>HTTP/1.1 的连接复用依赖消息边界。本节实现 ChunkedCodec 的 chunk 解码与响应编码，用 KeepAliveHandler 处理 Connection: keep-alive/close、HTTP/1.0 兼容、分块请求与按序回写，并在 loopback 的真实 SocketChannel 上验证两个请求的响应顺序。</description></item><item><title>《Java 网络编程基础》8.1 请求行、头部与消息体</title><link>https://plumephp.com/java-netbasic-08-1-http-message/</link><pubDate>Wed, 28 Oct 2026 15:10:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-08-1-http-message/</guid><description>HTTP/1.1 的第一层是字节到消息的边界。本节实现 HttpRequest、HttpResponse 与 HttpParser，解析请求行和头部，给请求行、头部总字节与消息体设上限，用 400、413、431、414 区分格式错误与超限，并用分片读取、管线化输入验证解析器的增量行为。</description></item><item><title>《Java 网络编程基础》7.3 连接状态机与空闲检测</title><link>https://plumephp.com/java-netbasic-07-3-connection-state/</link><pubDate>Wed, 28 Oct 2026 15:05:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-07-3-connection-state/</guid><description>连接卡在 CLOSE_WAIT、空闲连接占着内存，靠 if-else 堆状态迟早漏分支。本节用 linkd 的 ConnectionStateMachine 枚举 CONNECTED、READING、CLOSING、CLOSED 四种状态，配合 lastReadNanos 与 IdleTimeoutHandler 定时扫描，给出半关闭与资源释放顺序。</description></item><item><title>《Java 网络编程基础》7.2 半包、粘包与缓冲区增长</title><link>https://plumephp.com/java-netbasic-07-2-partial-read-write/</link><pubDate>Wed, 28 Oct 2026 15:00:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-07-2-partial-read-write/</guid><description>一次 read 可能只拿到半个帧，一次 write 也可能只写出一部分。本节用 linkd 的 AccumulatingReader 累积字节、compact 保留残余、按帧上限扩容，并用 WriteQueue 暂存未写完的 ByteBuffer，给出半包、粘包与背压的可编译实现和实测输出。</description></item><item><title>《Java 网络编程基础》7.1 非阻塞 accept、read 与 write</title><link>https://plumephp.com/java-netbasic-07-1-nonblocking-server/</link><pubDate>Wed, 28 Oct 2026 14:55:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-07-1-nonblocking-server/</guid><description>非阻塞通道上的 accept、read、write 不再阻塞，返回值变成 null、0 和 -1 三种信号。本节用 linkd 的 NonBlockingEchoServer 实测这三种返回值，讲清读循环、写队列与 OP_WRITE 开关，以及漏摘 OP_WRITE 导致 CPU 空转的排查方法。</description></item><item><title>《Java 网络编程基础》6.3 多线程 Reactor 与主从模型</title><link>https://plumephp.com/java-netbasic-06-3-multi-reactor/</link><pubDate>Wed, 28 Oct 2026 14:50:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-06-3-multi-reactor/</guid><description>本节把单线程 Reactor 扩成 accept 线程加多个 I/O 线程的主从模型：round-robin 分配连接、跨线程 execute 提交注册任务、ConcurrentLinkedQueue 与 volatile 的可见性边界。给出与单线程版同一压测脚本的对照实验和真实耗时。</description></item><item><title>《Java 网络编程基础》6.2 单线程 Reactor 实现</title><link>https://plumephp.com/java-netbasic-06-2-single-reactor/</link><pubDate>Wed, 28 Oct 2026 14:45:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-06-2-single-reactor/</guid><description>本节用 JDK 25 手写 linkd 的单线程 Reactor：BufferPool、Handler、Connection、EventLoop 四个共享类型，完整实现 accept、read、写队列与 interestOps 开关。给出可运行的 Echo 服务、真实往返输出，并说明线程归属、阻塞 handler 的代价与常见错误。</description></item><item><title>《Java 网络编程基础》6.1 Selector 就绪事件与 interestOps</title><link>https://plumephp.com/java-netbasic-06-1-selector-events/</link><pubDate>Wed, 28 Oct 2026 14:40:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-06-1-selector-events/</guid><description>《Java 网络编程基础》6.1 讲 Selector 的 OP_ACCEPT、OP_READ、OP_WRITE 与 interestOps/readyOps 的区别。用 linkd 的真实探针演示 selectedKeys 不 remove 导致就绪位残留、CancelledKeyException、wakeup 唤醒与 macOS kqueue 空轮询防御，给出单线程事件循环的骨架。</description></item><item><title>《Java 网络编程基础》5.3 FileChannel、Scatter/Gather 与零拷贝</title><link>https://plumephp.com/java-netbasic-05-3-filechannel-zero-copy/</link><pubDate>Wed, 28 Oct 2026 14:35:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-05-3-filechannel-zero-copy/</guid><description>FileChannel 能把文件字节送到 socket，但 transferTo 可能只传一部分，非阻塞 channel 还会返回 0。本节用 64 MB 文件在本机 loopback 对比 transferTo 与 64 KB 拷贝循环，讲清 Scatter/Gather、mmap、sendfile 的平台差异，并给出 linkd 静态文件发送的边界。</description></item><item><title>《Java 网络编程基础》5.2 DirectBuffer 与堆外内存</title><link>https://plumephp.com/java-netbasic-05-2-direct-buffer/</link><pubDate>Wed, 28 Oct 2026 14:30:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-05-2-direct-buffer/</guid><description>allocateDirect 把字节放到堆外，不受 -Xmx 管，回收却依赖 Cleaner。本节在 32 MB MaxDirectMemorySize 下复现 Cannot reserve 报错，用 BufferPoolMXBean 观察 10000 个短命缓冲区的延迟释放，并说明 linkd 的 BufferPool 何时该用堆外、何时不该用。</description></item><item><title>《Java 网络编程基础》5.1 Buffer 的 position、limit 与 flip</title><link>https://plumephp.com/java-netbasic-05-1-buffer-state/</link><pubDate>Wed, 28 Oct 2026 14:25:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-05-1-buffer-state/</guid><description>一次 read 之后 position 落在末尾，直接 get 什么也读不到；flip 早了丢数据，flip 两次会重放旧数据。本节用 16 字节缓冲区画出 position、limit、capacity 的每次变化，讲清 flip/clear/compact/rewind 与 slice、只读视图，并给出 linkd 读写切换的排错清单。</description></item><item><title>《Java 网络编程基础》4.3 编解码器设计与错误处理</title><link>https://plumephp.com/java-netbasic-04-3-codec-design/</link><pubDate>Wed, 28 Oct 2026 14:20:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-04-3-codec-design/</guid><description>帧切出来只是 byte[]，还不能说明协议是否正确。本节把 linkd 的 4 字节信封拆成 magic、version、type，再解析后续 payload，用 ProtocolException 区分可恢复与致命错误，给出错误帧、关闭策略和编码解码分离的 FrameEncoder，并完成每连接一份 carry 的 LinkdFrameHandler。</description></item><item><title>《Java 网络编程基础》4.2 定长、分隔符与长度域帧</title><link>https://plumephp.com/java-netbasic-04-2-framing/</link><pubDate>Wed, 28 Oct 2026 14:15:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-04-2-framing/</guid><description>TCP 只保证字节有序，不保证一次 read 等于一条消息。本节实现可运行的定长、分隔符、长度域三种 FrameDecoder，用每 3 字节喂一次的实验复现半包与粘包，讲清长度字段越界、负长度、最大帧限制和返回切片被复用的坑，最后落到 linkd-core 的装配。</description></item><item><title>《Java 网络编程基础》4.1 字节序、字符集与边界</title><link>https://plumephp.com/java-netbasic-04-1-endian-charset/</link><pubDate>Wed, 28 Oct 2026 14:10:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-04-1-endian-charset/</guid><description>字节序与字符集是 linkd 协议的第一道边界。本节用 ByteBuffer 对比大端与小端的真实字节，拆开 UTF-8 和 UTF-16 对汉字、ASCII、emoji 的编码差异，用 CharsetDecoder 的 REPORT 抓住被截断的 3 字节汉字，并给出每连接独占的 Utf8StreamDecoder 与固定大端的 WireInt。</description></item><item><title>《Java 网络编程基础》3.3 半关闭、RST 与优雅关闭</title><link>https://plumephp.com/java-netbasic-03-3-half-close-and-rst/</link><pubDate>Wed, 28 Oct 2026 14:05:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-03-3-half-close-and-rst/</guid><description>客户端发完请求只是半关闭，服务端要读到 EOF 才能回响应。本节用 linkd 的 Echo 连接实测 shutdownOutput、SO_LINGER(0) 触发的 RST、Connection reset 与 Broken pipe 的差异，并给出停止 accept、排空写队列、半关闭再 close 的优雅关闭顺序。</description></item><item><title>《Java 网络编程基础》3.2 连接、读、写超时</title><link>https://plumephp.com/java-netbasic-03-2-timeouts/</link><pubDate>Wed, 28 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-03-2-timeouts/</guid><description>connect 超时、SO_TIMEOUT 与写阻塞是三件不同的事。本节用 linkd 访问 libraryd 的真实调用，实测 connect 1000ms 超时、read 超时后连接仍可继续读、发送缓冲区写满后线程卡在 SocketDispatcher.write0，并给出 Deadline 总预算与「超时不是重试」的边界。</description></item><item><title>《Java 网络编程基础》3.1 Socket 与 ServerSocket 基本用法</title><link>https://plumephp.com/java-netbasic-03-1-socket-basics/</link><pubDate>Wed, 28 Oct 2026 13:55:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-03-1-socket-basics/</guid><description>从 linkd 的最小阻塞 Echo 入口出发，拆开 ServerSocket 的 bind、listen、accept 与 Socket 的读写阻塞点，用本机实测说明 backlog、SO_REUSEADDR 与 TIME_WAIT 重绑行为，给出可停止的 Echo 服务器、半包边界和 netstat 诊断命令。</description></item><item><title>《Java 网络编程基础》2.3 InetAddress、端口与网络接口</title><link>https://plumephp.com/java-netbasic-02-3-address-and-interface/</link><pubDate>Wed, 28 Oct 2026 13:50:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-02-3-address-and-interface/</guid><description>InetAddress 解析可能返回多个地址，localhost 同时是 127.0.0.1 和 ::1。本节观察 getAllByName、IPv4/IPv6 回环、端口 0 的临时端口分配、重复绑定的 BindException 原文，以及 lo0 MTU 16384 与 en0 MTU 1500，并用 netstat/lsof 验证，最后落到 LinkdMain 的绑定日志。</description></item><item><title>《Java 网络编程基础》2.2 UDP 数据报、MTU 与丢包</title><link>https://plumephp.com/java-netbasic-02-2-udp-datagrams/</link><pubDate>Wed, 28 Oct 2026 13:45:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-02-2-udp-datagrams/</guid><description>UDP 一次 send 就是一条消息，但消息可能丢、可能被截断。本节用 DatagramSocket/DatagramPacket 实测数据报边界、100 字节缓冲接收 2000 字节报文时的静默截断、70000 字节报文的 Message too long，以及 4096 字节接收缓冲下 5000 个包只收到 3 个的丢包结果，并给出 linkd 指标上报的 UDP 边界。</description></item><item><title>《Java 网络编程基础》2.1 TCP 连接、字节流与可靠性边界</title><link>https://plumephp.com/java-netbasic-02-1-tcp-semantics/</link><pubDate>Wed, 28 Oct 2026 13:40:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-02-1-tcp-semantics/</guid><description>linkd 的 HTTP 响应在 loopback 上被拆成多次 read。本节用最小程序观察三次握手在 Java 里的可见时刻、两次 write 被合并或拆开的真实输出、Nagle 与 setTcpNoDelay 的测量，以及 SO_LINGER(0) 触发 RST 和 TIME_WAIT 的 netstat 证据，最后落到 Connection 与 FrameDecoder 的边界处理。</description></item><item><title>《Java 网络编程基础》1.3 linkd 项目与实验环境</title><link>https://plumephp.com/java-netbasic-01-3-project-and-env/</link><pubDate>Wed, 28 Oct 2026 13:35:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-01-3-project-and-env/</guid><description>把 linkd 拆成 core、http、ws、app 四个 Maven 模块，固定 JDK 25.0.5 与 9090/8080 端口约定；给出 JAVA_HOME 设置、父 POM、启动与 curl/lsof/netstat 验证步骤，并记录 macOS 没有 ss/epoll 时的替代诊断命令。</description></item><item><title>《Java 网络编程基础》1.2 BIO、NIO、AIO 与 Reactor 模型</title><link>https://plumephp.com/java-netbasic-01-2-io-models/</link><pubDate>Wed, 28 Oct 2026 13:30:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-01-2-io-models/</guid><description>阻塞 Echo 与非阻塞 Selector Echo 各跑一遍，用线程栈、read 返回值和事件日志对比两种模型；再拆开 BIO、NIO、AIO 与 Reactor 的边界，说明 linkd 为什么用单线程事件循环加业务线程池，而不是给每个连接开一个线程。</description></item><item><title>《Java 网络编程基础》1.1 从一次 HTTP 请求看 Java 网络栈</title><link>https://plumephp.com/java-netbasic-01-1-request-path/</link><pubDate>Wed, 28 Oct 2026 13:25:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-01-1-request-path/</guid><description>一次 curl 请求打到 127.0.0.1:9090/healthz，中间经过内核监听队列、收发缓冲区、Selector 就绪事件、业务线程和响应写回。本节用 curl -v、lsof、netstat 与本机服务日志把这条路径逐层标出来，并说明 linkd 的 EventLoop、Handler 和 Connection 分别落在哪一层。</description></item><item><title>《Java 网络编程基础》目录与学习路径</title><link>https://plumephp.com/java-netbasic-toc/</link><pubDate>Wed, 28 Oct 2026 13:10:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-toc/</guid><description>《Java 网络编程基础》全 50 篇的目录与学习路径：15 章 45 节，从请求路径、Socket、NIO Buffer 与 Selector，到手写 HTTP/1.1、HTTP/2、TLS 与 WebSocket，最后以 linkd v1 验收收口；给出按目标、按症状、按项目三条路线，以及各卷衔接、项目状态与实验口径。</description></item><item><title>《Java 网络编程基础》前言</title><link>https://plumephp.com/java-netbasic-preface/</link><pubDate>Wed, 28 Oct 2026 13:05:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-preface/</guid><description>交代本书的读者对象与前置知识，列明 JDK 25.0.5+8、Maven 3.9.12 与 macOS 实验环境，说明卷一不引入第三方网络库的约束、代码与输出标注约定、四层验证方法，以及与 network 专题、MMO 网络卷、Spring Boot 三部曲和 JVM 卷的内容边界。</description></item><item><title>《Java 网络编程基础》序：为什么要从 Socket 写到网关</title><link>https://plumephp.com/java-netbasic-foreword/</link><pubDate>Wed, 28 Oct 2026 13:00:00 +0800</pubDate><guid>https://plumephp.com/java-netbasic-foreword/</guid><description>说明 Java 四卷本之后为什么还要单独写网络栈：从一次请求的真实路径讲到 linkd 网关，交代读者画像、三卷路线、与站内 network 专题和 MMO 网络卷的边界，以及先跑后改、每节落到 linkd 具体类的学习方式与实验纪律，并说明本书不写什么。</description></item></channel></rss>