系统知识 · 网络协议栈
从网线到浏览器:OSI 七层、TCP 三次握手/四次挥手、HTTP 演进与 DNS 解析全链路。
知识简介
网络协议栈 是分层协作的典范。数据从应用层逐层封装(加头部)到物理层发送,接收端逐层解封。理解分层与关键协议,是排查一切网络问题的基础。
核心概念
- 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])学习路径
- 用 Wireshark 抓本地 HTTP 包,对照三次握手与四次挥手过程。
- 写一个 Python 原始 HTTP 请求(见上),理解报文结构。
- 读《计算机网络:自顶向下方法》TCP 与 HTTP 章节。
- 动手配一次 DNS:nslookup 查询并观察 TTL 缓存。
来源参考
GitHub 关键词:tcp-ip-notes、wireshark-labs、mini-http-server(链接可替换为实际仓库地址)。