系统知识 · 网络协议栈

从网线到浏览器:OSI 七层、TCP 三次握手/四次挥手、HTTP 演进与 DNS 解析全链路。

系统知识 技术栈:TCP/IP / HTTP / DNS 来源:GitHub 参考

知识简介

网络协议栈 是分层协作的典范。数据从应用层逐层封装(加头部)到物理层发送,接收端逐层解封。理解分层与关键协议,是排查一切网络问题的基础。

核心概念

  • OSI 七层:物理/数据链路/网络/传输/会话/表示/应用;TCP/IP 简化为四层。
  • TCP 三次握手:SYN → SYN+ACK → ACK,建立可靠连接并协商序列号。
  • TCP 四次挥手:FIN → ACK → FIN → ACK;TIME_WAIT 等待 2MSL 防旧包。
  • HTTP:无状态文本协议;1.1 长连接、2.0 多路复用、3.0 QUIC 基于 UDP。
  • DNS:域名→IP 的分层查询:本地缓存 → 根 → TLD → 权威服务器。

代码示例:TCP 握手模拟(Python socket)

py
import socket

def server():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.bind(("127.0.0.1", 9000))
    s.listen(1)
    conn, addr = s.accept()           # 完成三次握手后才返回
    data = conn.recv(1024)
    print("recv:", data.decode())
    conn.sendall(b"pong")
    conn.close()                      # 四次挥手开始

def client():
    c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    c.connect(("127.0.0.1", 9000))    # 触发三次握手
    c.sendall(b"ping")
    print("recv:", c.recv(1024).decode())
    c.close()

# 抓包验证:tcpdump -i lo port 9000 可看到 SYN/SYN-ACK/ACK

代码示例:HTTP 请求最小实现

py
import socket

def http_get(host: str, path: str = "/") -> str:
    s = socket.create_connection((host, 80), timeout=5)
    req = f"GET {path} HTTP/1.1\r\nHost: {host}\r\nConnection: close\r\n\r\n"
    s.sendall(req.encode())
    buf = b""
    while True:
        chunk = s.recv(4096)
        if not chunk:
            break
        buf += chunk
    s.close()
    return buf.decode("utf-8", "ignore")

# print(http_get("example.com")[:500])

学习路径

  1. 用 Wireshark 抓本地 HTTP 包,对照三次握手与四次挥手过程。
  2. 写一个 Python 原始 HTTP 请求(见上),理解报文结构。
  3. 读《计算机网络:自顶向下方法》TCP 与 HTTP 章节。
  4. 动手配一次 DNS:nslookup 查询并观察 TTL 缓存。

来源参考

GitHub 关键词:tcp-ip-noteswireshark-labsmini-http-server(链接可替换为实际仓库地址)。