2025年1月9日

Network Programming With Go

Go语言网络编程
书籍封面

Network Programming With Go

作者:Adam Woodbeck 出版日期:2021-03-25 出版社:No Starch Press
本书《Go语言网络编程》是一本教你如何使用Go语言编写现代网络软件的教程。它涵盖了网络编程的基础知识,包括TCP、UDP和Unix套接字编程,以及HTTP、HTTP/2和TLS协议的使用。书中包含大量的代码示例,帮助读者学习如何构建健壮、安全且可读的网络应用程序,并讨论了网络性能、安全性和可扩展性等重要主题,以及如何在云环境(AWS Lambda,Google Cloud Functions和Azure Functions)中部署Go网络应用。

第一部分:网络架构

* 第一章:网络基础

*   网络拓扑结构:
    *   点对点连接
    *   菊花链
    *   总线型拓扑 (常见于无线网络)
    *   环形拓扑 (数据单向流动,速度受限于最慢节点)
    *   星型拓扑
    *   网状拓扑
    *   混合拓扑 (例如星型-环形、星型-总线)
*   **OSI 参考模型**的分层结构
*   **TCP/IP 模型**的分层结构:应用层、传输层、网络层(互联网层)、链路层
*   数据封装
*   单播、组播和广播:
    *   **单播**:一对一通信
    *   **组播**:将消息发送到一组节点,类似于订阅列表
    *   **广播**:将消息发送到网络上的所有节点(IPv4)
    *   **任播**:将消息发送到监听同一地址的最近节点 (IPv6)
*   Go 标准库和生态系统适合编写安全可靠的网络应用

* 第二章:IP寻址

*   IPv4 地址的结构:主机 ID 和网络 ID
*   IPv4 地址的子网划分
*   IPv4 的私有地址范围
*   IPv6 地址的结构:
    *   全球路由前缀 (GRP)
    *   子网 ID
    *   接口 ID
    *   链路本地地址
*   IPv6 的任播地址

第二部分:套接字级编程

* 第三章:TCP协议

*   TCP 三次握手过程:SYN,SYN/ACK,ACK
*   使用 Go 的 `net` 包创建 TCP 服务器和客户端
*   监听 (net.Listen) 和接受连接 (net.Accept)
*   **绑定 (binding)**:操作系统独占分配端口
*   客户端拨号连接 (net.Dial)
*   优雅地关闭连接
*   使用 `net.Error` 类型来检查临时错误
*   使用 `net.OpError` 获取更多错误信息
*   使用 `context` 包进行超时和取消操作
*   **处理临时错误和超时**

* 第四章:发送TCP数据

*   `net.Conn` 接口实现了 `io.ReadWriteCloser` 接口
*   从固定大小的缓冲区读取数据
*   使用 `bufio.Scanner` 按分隔符读取数据
*   **TLV (Type-Length-Value) 编码**:一种动态分配缓冲区大小的方法
*   处理读取和写入数据时的错误
*  **使用 `io.Copy` 在连接之间代理数据**
*   使用 `io.TeeReader` 和 `io.MultiWriter` 监控网络连接
*   `TCPConn` 对象:控制 Keepalive 消息、处理关闭时的挂起数据、覆盖默认的发送和接收缓冲区

* 第五章:不可靠的UDP通信

*   UDP 协议的特点:无连接,不可靠
*   UDP 数据包的结构:源端口、目标端口、数据包长度、校验和、有效负载
*   使用 `net.ListenPacket` 创建 UDP 连接
*  使用`ReadFrom` 和 `WriteTo` 发送和接收UDP数据包
*   **一个 UDP 连接对象可以接收来自多个发送者的数据包**
*   `net.Conn` 用于管理 UDP 通信时,只从 `net.Dial` 指定的地址读取数据

* 第六章:确保UDP可靠性

*   TFTP (Trivial File Transfer Protocol) 协议用于可靠的文件传输
*   TFTP 数据包类型:读取请求、数据包、确认包、错误包
*  **使用`encoding.BinaryMarshaler` 和 `encoding.BinaryUnmarshaler` 进行二进制数据的序列化和反序列化**
*   数据包重传和超时
*   避免分片

* 第七章:Unix 域套接字

*   Unix 域套接字的三种类型:`unix` (流式)、`unixgram` (数据报式)、`unixpacket` (会话式)
*   控制 Unix 域套接字的读写权限
*   使用 `net.Listen` 创建 `unix` 套接字服务器
*   使用 `net.ListenPacket` 创建 `unixgram` 套接字服务器
*  使用 `net.Dial` 创建 `unixpacket` 套接字客户端
*   使用 `os.Chmod` 设置套接字文件权限
*   使用 `net.AcceptUnix` 获取 `net.UnixConn` 对象
*   基于用户和组 ID 验证客户端

第三部分:应用级编程

* 第八章:HTTP客户端

*   HTTP 协议:客户端发送 URL,服务器返回资源
*   **HTTP 请求**:方法(GET, POST等)、URL、头部、主体 
*   **HTTP 响应**:状态码、头部、主体 
*   使用 `net/http` 包创建 HTTP 客户端 
*   设置请求头
*   使用 `multipart/form-data` 上传文件
*  `http.NewRequestWithContext` 函数

* 第九章:构建HTTP服务

*   Go HTTP 服务器的组成部分:多路复用器、中间件、处理器
*  `http.ServeMux`:请求多路复用器
*   **中间件**:在处理器之前或之后执行的函数,用于身份验证、日志记录等
*  `http.Handler` 接口
*  `http.HandlerFunc` 类型,简化处理器的定义 
*  `http.ResponseWriter`:用于写响应
*  `http.Request`:请求对象
*   处理客户端输入时需要进行转义
*   提供静态文件服务 
*   使用 `http.TimeoutHandler` 设置超时
*   `Methods`处理器
  • html/template 包用于HTML转义

* 第十章:Caddy:一个现代的Web服务器

*   Caddy 的特性:自动 HTTPS、配置简单
*   Caddy 的配置方法:JSON 文件
*   **Caddy 的配置适配器**:将 TOML 等格式转换为 Caddy 的原生 JSON 格式
*   **Caddy 的中间件**:实现 `caddyhttp.MiddlewareHandler` 接口
*   实现自定义中间件
*   使用 Caddy 作为反向代理

* 第十一章:TLS

*   TLS (Transport Layer Security) 协议:用于加密网络通信
*   使用 `crypto/tls` 包创建 TLS 连接
*   **TLS 配置**:证书、密钥、协议版本、密码套件
*   客户端身份验证:**双向 TLS**
*   使用 `crypto/x509` 包加载和解析证书

* 第十二章:命令行工具

*   使用 `flag` 包解析命令行参数
*   使用 `os` 包读取和写入文件
*   **Protocol Buffer** (protobuf):用于序列化结构化数据
*   **gRPC**:使用 protobuf 的远程过程调用框架

* 第十三章:可观察性

*   **日志记录**:使用 `log` 包
*   使用 `io.MultiWriter` 将日志写入多个目标
*   **结构化日志**:使用 `go.uber.org/zap` 包
    *   Zap 的编码器配置和使用
    *   Zap 的日志轮换
*   **度量**:使用 `github.com/go-kit/kit/metrics` 包
*   使用中间件进行广泛的事件日志记录
*   使用 `net/http` 的 `ConnState` 字段来监控连接状态

* 第十四章:云

*   在云上部署 Go 应用
*   **AWS Lambda**:无服务器计算平台
*   使用 `github.com/aws/aws-lambda-go/lambda` 包
*   从 RSS feed 获取数据