02 · 网络基础¶
官方文档:https://www.ietf.org/rfc/ · https://developer.mozilla.org/en-US/docs/Web/HTTP iGaming 重点:WebSocket 实时赔率推送 · CDN 加速 · DDoS 防护 · 地理路由
1. TCP/IP 基础¶
分层模型¶
应用层 HTTP / HTTPS / WebSocket / DNS
传输层 TCP(可靠) / UDP(低延迟)
网络层 IP / ICMP / 路由
链路层 Ethernet / ARP
TCP 三次握手 & 四次挥手¶
建立连接:Client SYN → Server SYN-ACK → Client ACK
关闭连接:Client FIN → Server ACK → Server FIN → Client ACK
博彩场景关键:高并发下大量 TIME_WAIT 会耗尽端口,需调整内核参数。
# 查看 TCP 状态分布
ss -ant | awk '{print $1}' | sort | uniq -c | sort -rn
CIDR & 子网划分(AWS VPC 设计基础)¶
10.0.0.0/16 = 65536 个 IP(VPC 常用范围)
10.0.1.0/24 = 256 个 IP(子网常用大小)
10.0.0.0/8 = 16M 个 IP(内网保留)
192.168.0.0/16 = 65536 个 IP(内网保留)
计算工具:ipcalc 10.0.1.0/24
2. DNS 解析¶
解析链路¶
客户端 → 本地 DNS 缓存 → 递归解析器(ISP/8.8.8.8)
→ 根域名服务器 → TLD 服务器(.com)
→ 权威 DNS(Cloudflare/Route 53) → 返回 IP
常用记录类型¶
| 类型 | 说明 | 示例 |
|---|---|---|
| A | 域名 → IPv4 | example.com → 1.2.3.4 |
| AAAA | 域名 → IPv6 | example.com → 2001:db8::1 |
| CNAME | 域名 → 域名 | www → example.com |
| MX | 邮件服务器 | 10 mail.example.com |
| TXT | 文本(SPF/验证) | "v=spf1 include:..." |
| NS | 域名服务器 | ns1.cloudflare.com |
| CAA | 证书签发授权 | 0 issue "letsencrypt.org" |
诊断命令¶
# 标准查询
dig example.com A
dig @1.1.1.1 example.com A # 指定 DNS 服务器
dig example.com +trace # 完整解析链路追踪
dig example.com +short # 只显示结果
# 反向解析
dig -x 1.2.3.4
# 批量检测(博彩多域名场景)
for domain in site1.com site2.com site3.com; do
echo "$domain: $(dig +short $domain A)"
done
3. HTTP/HTTPS¶
HTTP 状态码速查¶
2xx 成功:200 OK · 201 Created · 204 No Content
3xx 重定向:301 永久 · 302 临时 · 304 Not Modified
4xx 客户端错误:400 Bad Request · 401 未认证 · 403 禁止 · 404 Not Found · 429 Too Many Requests
5xx 服务端错误:500 Internal Error · 502 Bad Gateway · 503 Service Unavailable · 504 Gateway Timeout
HTTP/2 关键特性(博彩平台必用)¶
- 多路复用:一个 TCP 连接并发多个请求,解决 HTTP/1.1 队头阻塞
- 头部压缩(HPACK):减少重复 header 传输
- 服务器推送:主动推送资源(现已较少使用)
- 二进制分帧:传输效率更高
# Nginx 启用 HTTP/2
listen 443 ssl http2;
HTTP/3 (QUIC) — 未来趋势¶
- 基于 UDP 而非 TCP,解决 TCP 队头阻塞
- Cloudflare 已全面支持
- 适合移动网络弱网环境(博彩移动端核心需求)
4. WebSocket(实时赔率核心)¶
工作原理¶
1. 客户端发起 HTTP Upgrade 请求:
GET /odds HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
2. 服务端返回 101 Switching Protocols
3. 持久双向全双工连接建立,赔率变化服务端主动推送
Nginx 反代 WebSocket 配置¶
location /ws {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 3600s; # 长连接超时
proxy_send_timeout 3600s;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
连接数监控¶
# 当前 WebSocket 连接数(Nginx upstream)
ss -ant | grep ESTABLISHED | grep :8080 | wc -l
# 监控 WebSocket 升级请求
grep "websocket" /var/log/nginx/access.log | wc -l
5. TLS/SSL¶
TLS 1.2 vs TLS 1.3¶
| 特性 | TLS 1.2 | TLS 1.3 |
|---|---|---|
| 握手往返次数 | 2-RTT | 1-RTT(0-RTT 恢复) |
| 支持的加密套件 | 多(含弱算法) | 精简(仅强算法) |
| 前向保密 | 可选 | 强制 |
| 性能 | 较慢 | 更快 |
证书链验证¶
根证书(CA Root)→ 中间证书(Intermediate)→ 域名证书(Leaf)
诊断:
openssl s_client -connect example.com:443 -showcerts
openssl x509 -in cert.pem -text -noout # 查看证书详情
常见 TLS 错误¶
SSL_ERROR_HANDSHAKE_FAILURE → 加密套件不匹配
CERTIFICATE_VERIFY_FAILED → 证书链不完整 / 已过期
ERR_CERT_COMMON_NAME_INVALID → 证书域名不匹配
6. 防火墙(UFW / iptables)¶
UFW(Ubuntu 简化防火墙)¶
ufw enable
ufw allow 22/tcp comment "SSH"
ufw allow 80/tcp comment "HTTP"
ufw allow 443/tcp comment "HTTPS"
ufw allow from 10.0.0.0/8 to any port 5432 comment "PG internal only"
ufw deny from 1.2.3.4 # 封锁单个 IP
ufw status numbered
ufw delete 3 # 删除第3条规则
iptables(精细控制)¶
# 查看规则
iptables -L -n -v
# 限制连接速率(防 DDoS)
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 100 -j REJECT
# 仅允许内网访问 Redis
iptables -A INPUT -p tcp --dport 6379 ! -s 10.0.0.0/8 -j DROP
7. CDN 工作原理¶
用户请求 → DNS 返回最近边缘节点 IP → 边缘节点
↓ 有缓存 ↓ 无缓存(Cache MISS)
直接返回 回源到 Origin 服务器 → 缓存 → 返回
关键指标:
- 命中率(Cache Hit Rate):越高越好(>90%)
- 边缘节点延迟:通常 < 20ms
- 回源流量:命中率高则回源少,节省成本
Cloudflare 缓存控制¶
# 通过 Cache-Control 头控制
add_header Cache-Control "public, max-age=86400"; # 缓存1天
add_header Cache-Control "no-store, no-cache"; # 不缓存(API/动态内容)
# 博彩赔率接口:不缓存
location /api/odds {
add_header Cache-Control "no-store";
add_header CF-Cache-Status "BYPASS";
}
# 静态资源:长期缓存
location ~* \.(js|css|png|jpg|woff2)$ {
add_header Cache-Control "public, max-age=31536000, immutable";
}
8. 负载均衡算法¶
| 算法 | 适用场景 | 说明 |
|---|---|---|
| Round Robin | 无状态服务 | 轮流分配,简单均匀 |
| Least Connections | 长连接(WebSocket) | 分给当前连接最少的节点 |
| IP Hash | 需要 Session 粘性 | 同一 IP 总是到同一节点 |
| Weighted | 节点性能不同 | 按权重分配流量 |
| 一致性哈希 | 缓存服务 | 节点变化时缓存失效最少 |
官方文档 & 学习资源¶
| 资源 | 链接 |
|---|---|
| HTTP RFC 7230-7235 | https://httpwg.org/specs/ |
| WebSocket RFC 6455 | https://datatracker.ietf.org/doc/html/rfc6455 |
| TLS 1.3 RFC 8446 | https://datatracker.ietf.org/doc/html/rfc8446 |
| Cloudflare 学习中心 | https://www.cloudflare.com/learning/ |
| MDN HTTP 文档 | https://developer.mozilla.org/en-US/docs/Web/HTTP |
| 《高性能浏览器网络》(免费) | https://hpbn.co/ |
| Wireshark 用户指南 | https://www.wireshark.org/docs/wsug_html/ |
常见问题 & 坑¶
Q: WebSocket 连接频繁断开?
A: 检查中间件(Nginx/LB)的 proxy_read_timeout,默认60s会断开空闲长连接;客户端需实现心跳(ping/pong)
Q: CDN 更新了代码但用户看到旧版?
A: 使用文件名带 hash 版本号(app.abc123.js),或通过 Cloudflare API 清除缓存:
curl -X POST "https://api.cloudflare.com/client/v4/zones/{zone_id}/purge_cache" \
-H "Authorization: Bearer {token}" \
-d '{"purge_everything":true}'
Q: 跨地区延迟高? A: 优先使用 Cloudflare Argo Smart Routing(智能选路);AWS 多 Region 部署配合 Route 53 延迟路由
最后更新:2025-04