网络协议

网络协议

网络协议是计算机网络通信的规则集合,定义了数据如何封装、传输、路由与解析。从浏览网页(HTTP)到收发邮件(SMTP),从文件传输(FTP)到远程登录(SSH),一切网络应用都建立在协议之上。

为什么学习网络协议

  • 理解网络故障排查(抓包、ping、traceroute)
  • 开发网络应用(HTTP API、WebSocket、Socket 编程)
  • 网络安全(HTTPS、TLS 加密、协议攻击)
  • 面试必考(OSI/TCP/IP 模型、三次握手)

协议分类

应用层: HTTP、HTTPS、FTP、SSH、SMTP、DNS、DHCP
传输层: TCP、UDP
网络层: IP、ICMP、ARP、IGMP
链路层: PPP、以太网、Wi-Fi

常用组合:
Web:    TCP + HTTP/HTTPS
邮件:   TCP + SMTP/POP3/IMAP
文件:   TCP + FTP/SFTP
远程:   TCP + SSH/RDP/Telnet
域名:   UDP(主要) + DNS

核心概念

IP 地址: 网络设备标识(IPv4/IPv6)
端口:    进程标识(80=HTTP, 443=HTTPS, 22=SSH)
协议栈: 各层协议协同工作(分层模型)
封装:    每层添加头部信息
抓包:    Wireshark / tcpdump 观察协议细节

网络协议简介

网络协议简介

网络协议确保异构设备(不同厂商、系统)之间能够正常通信。

什么是协议

协议 = 通信双方约定的规则:
- 数据格式(如何封装)
- 传输方式(如何发送)
- 时序(谁先谁后)
- 错误处理(失败怎么办)

类似人与人之间的语言规则

OSI 七层模型

7 应用层    HTTP/FTP/SMTP(用户接口)
6 表示层    加密、压缩、编码
5 会话层    建立/管理会话
4 传输层    TCP/UDP(端到端)
3 网络层    IP(路由寻址)
2 数据链路层 以太网(帧)
1 物理层    比特流

实际使用: TCP/IP 四层模型(简化)

TCP/IP 四层模型

应用层  HTTP/FTP/SSH/DNS...
传输层  TCP / UDP
网络层  IP / ICMP
网络接口 以太网/Wi-Fi

数据封装过程(发送):
应用数据 → TCP 加头 → IP 加头 → 帧 → 比特流

解封装过程(接收):
比特流 → 帧 → IP → TCP → 应用数据

IP 地址与端口

IPv4: 192.168.1.1(32 位)
IPv6: 2001:db8::1(128 位)

端口: 0-65535
知名端口: 80(HTTP) 443(HTTPS) 22(SSH)
         21(FTP) 25(SMTP) 53(DNS) 3306(MySQL)

IP + 端口 = 网络中的唯一进程地址

网络术语

带宽: 每秒传输的数据量(如 100Mbps)
延迟: 数据往返时间(ms)
吞吐: 实际传输速率
丢包: 数据包丢失(网络质量差)
MTU:  最大传输单元(1500 字节常见)

网络通信基础

网络通信基础

理解数据从一台设备到另一台设备的完整旅程。

1. 通信基本过程

发送方:
应用生成数据 → 协议栈封装 → 网卡发送

网络传输:
交换机(局域网) → 路由器(跨网络) → ...

接收方:
网卡接收 → 协议栈解封装 → 应用处理

2. 客户端-服务器模型

服务器: 提供服务,监听端口(如 80)
客户端: 主动连接服务器

浏览器(客户端) → 请求 → Web服务器(80端口)
Web服务器 ← 响应 ←

P2P: 每个节点既是客户端也是服务器(下载等)

3. 域名与 DNS

域名: 人类易记的名字(www.example.com)
DNS:  把域名解析为 IP 地址

访问 www.example.com:
1. 查询本地缓存
2. 请求本地 DNS 服务器
3. 逐级解析 → 得到 IP
4. 用 IP 发起请求

4. 数据包路由

路由: 路由器根据 IP 地址选择转发路径
- 同一网段: 直接通信(ARP 找 MAC)
- 跨网段: 发给默认网关(路由器)

traceroute 显示经过的路由器路径
ping 测试连通性与延迟

5. 连接与数据流

TCP: 面向连接(可靠,按序)
  三次握手建立 → 传输 → 四次挥手断开

UDP: 无连接(快,不保证到达)
  直接发数据报(视频/语音/游戏常用)

Socket: 网络编程接口
  服务器: bind → listen → accept
  客户端: connect → 收发数据

常见网络设备

常见网络设备

了解网络设备的职责,有助于排查网络问题与设计网络架构。

1. 集线器(Hub)

- 物理层设备
- 广播所有数据到所有端口(低效)
- 共享带宽
- 已被交换机取代

2. 交换机(Switch)

- 数据链路层设备
- 根据 MAC 地址转发到目标端口
- 独享带宽,高效
- 局域网(LAN)核心设备

# 命令示例
ip link show          # 查看端口
brctl show            # 查看网桥

3. 路由器(Router)

- 网络层设备
- 根据 IP 地址路由转发
- 连接不同网络(局域网↔互联网)
- 家庭/企业网络出口

# 命令
ip route              # 查看路由表
route -n
traceroute 8.8.8.8    # 查看路径

4. 无线接入点(AP)

- 提供 Wi-Fi 接入
- 连接无线设备到有线网络
- 家用路由器内置 AP 功能

5. 防火墙(Firewall)

- 安全设备,过滤进出流量
- 规则: 源/目的 IP、端口、协议
- 状态检测、应用识别
- 软件(iptables/ufw)与硬件设备

# iptables 示例
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
ufw allow 443/tcp

6. 其他设备

网关(Gateway): 协议转换(如 VoIP 网关)
负载均衡(LB):  分发流量到多台服务器
VPN 设备:      加密隧道
代理服务器:    中转请求(缓存/过滤/匿名)
DNS 服务器:    域名解析
DHCP 服务器:   自动分配 IP

FTP 协议

FTP 协议(文件传输)

FTP(File Transfer Protocol)用于客户端与服务器之间传输文件,是经典的文件传输协议。

1. 基本概念

端口: 21(控制连接), 20(数据连接,主动模式)
模式:
  主动模式(Active): 服务器主动连客户端
  被动模式(Passive): 客户端主动连服务器(推荐,过 NAT 友好)

传输模式:
  二进制: 原样传输文件
  ASCII:  文本格式转换

2. 常用 FTP 命令

# 命令行连接
ftp ftp.example.com

# 常用命令
ls / dir        列出目录
cd         切换目录
get       下载文件
put       上传文件
mget *.txt      批量下载
mput *.txt      批量上传
delete    删除
mkdir      创建目录
binary / ascii  切换模式
pwd             当前目录
quit / bye      退出

3. 使用 curl 操作 FTP

# 下载
curl ftp://ftp.example.com/file.zip -u user:pass -O

# 上传
curl -T local.txt ftp://ftp.example.com/ -u user:pass

# 列出
curl ftp://ftp.example.com/ -u user:pass

4. Python ftplib

from ftplib import FTP

ftp = FTP("ftp.example.com")
ftp.login("user", "pass")
ftp.cwd("/pub")

# 下载
with open("local.txt", "wb") as f:
    ftp.retrbinary("RETR remote.txt", f.write)

# 上传
with open("local.txt", "rb") as f:
    ftp.storbinary("STOR remote.txt", f)

ftp.quit()

5. FTP vs SFTP

FTP:  明文传输(不安全),端口 21
SFTP: SSH 加密传输(安全),端口 22
     推荐用 SFTP 替代 FTP

FTP(S) 显式加密: 端口 21 可升级 TLS
FTPS 隐式加密: 端口 990

6. 安全建议

1. 尽量用 SFTP 而非 FTP
2. 强密码 + 限 IP
3. 匿名 FTP 只放公开文件
4. 日志监控异常传输
5. 配置文件下载限速

SSH 协议

SSH 协议(安全远程登录)

SSH(Secure Shell)通过加密通道提供安全的远程登录与命令执行,是服务器管理的标配。

1. 基本概念

端口: 22
作用: 加密的远程 Shell、文件传输(SFTP/SCP)、隧道
对比 Telnet: SSH 加密,Telnet 明文

# 连接
ssh user@server
ssh -p 2222 user@server    # 指定端口
ssh user@192.168.1.10      # IP 连接

2. 密钥认证(推荐)

# 生成密钥对
ssh-keygen -t ed25519 -C "your@email.com"
# 生成 ~/.ssh/id_ed25519(私钥)与 id_ed25519.pub(公钥)

# 复制公钥到服务器
ssh-copy-id user@server
# 或手动
cat ~/.ssh/id_ed25519.pub | ssh user@server "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

# 之后免密登录
ssh user@server

3. 配置文件 ~/.ssh/config

Host myserver
    HostName 192.168.1.10
    User root
    Port 22
    IdentityFile ~/.ssh/id_ed25519

# 连接简化
ssh myserver

4. SCP 文件传输

# 上传
scp local.txt user@server:/remote/path/

# 下载
scp user@server:/remote/path/file.txt .

# 目录递归
scp -r ./dir user@server:/remote/

5. SSH 隧道(端口转发)

# 本地转发: 访问远程内网服务
ssh -L 8080:internal-server:80 user@server
# 访问 http://localhost:8080 即访问 internal-server:80

# 动态转发(SOCKS 代理)
ssh -D 1080 user@server
# 浏览器配置 SOCKS5 127.0.0.1:1080

# 远程转发
ssh -R 8080:localhost:80 user@server

6. 安全加固

# /etc/ssh/sshd_config
PermitRootLogin no          # 禁止 root 直接登录
PasswordAuthentication no   # 禁用密码认证
Port 2222                   # 修改默认端口(减少扫描)
AllowUsers alice bob        # 白名单用户
MaxAuthTries 3              # 限制尝试次数

# 重启服务
sudo systemctl restart sshd

Telnet 协议

Telnet 协议

Telnet 是最早的远程登录协议,因明文传输已被 SSH 取代,但在一些设备(路由器/嵌入式)调试中仍可见。

1. 基本概念

端口: 23
特点: 远程终端,明文传输(用户名/密码可见!)
劣势: 不安全,易被嗅探

# 连接
telnet 192.168.1.1
telnet server 23

2. Telnet 测试端口(常用技巧)

# 用 telnet 测试端口连通性(实用)
telnet 192.168.1.10 22     # 测试 SSH 端口
telnet example.com 80      # 测试 HTTP
telnet example.com 443     # HTTPS(显示乱码正常)

# 连接成功: 黑屏或提示
# 失败: Connection refused / timeout

3. 手动 HTTP 请求

# 用 telnet 发送 HTTP 请求(观察协议)
telnet example.com 80

GET / HTTP/1.1
Host: example.com
(空行)

# 服务器返回 HTTP 响应头与内容

4. Telnet 客户端替代

# nc(netcat)更现代
nc -zv 192.168.1.10 22     # 端口测试
nc example.com 80          # 建立连接

# 查看监听端口
ss -tlnp
netstat -tlnp

5. 设备调试场景

部分老设备(打印机、网络设备、嵌入式)仍开放 Telnet:
- 仅内网使用
- 尽快关闭或升级
- 无法升级时用 SSH 隧道保护

# 关闭 Telnet(Linux)
sudo systemctl stop telnet.socket
sudo systemctl disable telnet.socket

6. 安全警示

1. 明文密码可被抓包获取(一定不用公网)
2. 生产环境禁用 Telnet
3. 用 SSH 替代远程管理
4. 定期扫描开放端口(ss -tlnp)

TCP 协议

TCP 协议(传输控制)

TCP(Transmission Control Protocol)是面向连接、可靠的传输协议,支撑着绝大多数互联网应用(HTTP、邮件、文件传输)。

1. TCP 的特点

- 面向连接: 先建立连接再传输
- 可靠: 确认、重传、按序
- 流量控制: 滑动窗口
- 拥塞控制: 慢启动、拥塞避免
- 全双工: 双向同时传输
- 字节流: 无消息边界

端口: 应用标识(80、443、22...)

2. 三次握手(建立连接)

客户端          服务器
  |-- SYN --------->|  1. 客户端请求连接
  |<-- SYN+ACK -----|  2. 服务器确认并应答
  |-- ACK --------->|  3. 客户端确认,建立连接

为什么三次?
- 确认双方收发能力
- 防止历史连接残留

# 抓包验证
tcpdump -i any port 80 'tcp[tcpflags] & tcp-syn != 0'

3. 四次挥手(断开连接)

客户端           服务器
  |-- FIN -------->|  1. 客户端请求断开
  |<-- ACK --------|  2. 服务器确认
  |<-- FIN --------|  3. 服务器也断开
  |-- ACK -------->|  4. 客户端确认,关闭

TIME_WAIT: 客户端等待 2MSL 确保最后 ACK 到达

4. 可靠传输机制

1. 确认(ACK): 收到数据回 ACK
2. 超时重传: 未收到 ACK 重发
3. 序号(SEQ): 数据按序编号
4. 校验和: 检测损坏
5. 滑动窗口: 流量控制
6. 拥塞控制: 避免网络过载

# 查看 TCP 状态
ss -tn
netstat -tn

5. TCP 状态

LISTEN      监听(服务器)
SYN_SENT    发送 SYN(客户端)
ESTABLISHED 已建立
FIN_WAIT_1/2 断开中
TIME_WAIT   等待关闭
CLOSE_WAIT  对方已断,等待本地关闭

# 常见问题
大量 TIME_WAIT: 短连接多(调优 keepalive)
大量 CLOSE_WAIT: 应用未关闭连接(BUG)

6. 常用调试命令

ss -tlnp               # 监听端口
ss -tn state established  # 已建立连接
tcpdump -i eth0 port 80  # 抓包
netstat -s              # TCP 统计

# 调优示例(高并发服务器)
sysctl net.ipv4.tcp_tw_reuse=1
sysctl net.ipv4.ip_local_port_range="1024 65535"

SMTP 协议

SMTP 协议(邮件发送)

SMTP(Simple Mail Transfer Protocol)用于邮件的发送与中继,是邮件系统的基石。

1. 基本概念

端口: 25(明文)、465(SMTPS 隐式 SSL)、587(提交,STARTTLS)
作用: 客户端 → 服务器(发送),服务器 → 服务器(中继)
配合: POP3/IMAP 负责收件

# 连接测试
telnet smtp.example.com 25

2. 手动发送邮件(演示)

telnet smtp.example.com 25
EHLO example.com
MAIL FROM: 
RCPT TO: 
DATA
Subject: Test
From: sender@example.com
To: receiver@example.com

邮件正文内容
.
QUIT

3. Python 发送(smtplib)

import smtplib
from email.mime.text import MIMEText

msg = MIMEText("邮件正文", "plain", "utf-8")
msg["Subject"] = "测试邮件"
msg["From"] = "sender@example.com"
msg["To"] = "receiver@example.com"

with smtplib.SMTP_SSL("smtp.example.com", 465) as smtp:
    smtp.login("user", "password")   # 授权码
    smtp.send_message(msg)

4. SMTP 认证

现代 SMTP 要求认证:
- 用户名 + 授权码(非登录密码)
- 常见端口 465(SSL) / 587(STARTTLS)
- 禁止开放中继(防垃圾邮件)

# 发送流程
连接 → EHLO → STARTTLS → AUTH → MAIL → RCPT → DATA → QUIT

5. 邮件中继与 DKIM/SPF

SPF: 域名声明哪些服务器可发信
DKIM: 邮件签名验真
DMARC: 策略(拒收/隔离)

# DNS 配置
example.com TXT "v=spf1 include:mailserver.example.com ~all"

防止: 冒名发送、垃圾邮件、伪造

6. 常见问题

1. 认证失败: 用授权码,检查端口
2. 550 拒绝: SPF/DKIM 配置问题
3. 进垃圾箱: 提高信誉,验签
4. 中继拒绝: 不要用邮件服务器做开放中继
5. 频率限制: 避免大量发送被封

DNS 协议

DNS 协议(域名解析)

DNS(Domain Name System)把人类易记的域名解析为 IP 地址,是互联网的"电话簿"。

1. 基本概念

端口: 53(UDP 为主,TCP 用于大响应/区域传送)
作用: 域名 ↔ IP 地址映射
层级: 根服务器 → 顶级域(.com) → 权威服务器

记录类型:
A     域名→IPv4
AAAA  域名→IPv6
CNAME 别名→另一域名
MX    邮件服务器
TXT   文本(SPF/DKIM 验证)
NS    域名服务器

2. 解析过程

输入 www.example.com:
1. 浏览器缓存 → 系统缓存
2. 本地 DNS 服务器
3. 根服务器 → .com 服务器 → example.com 权威服务器
4. 返回 IP → 缓存

# 查询命令
nslookup www.example.com
dig www.example.com
dig +trace example.com     # 查看完整解析路径

3. 常用 DNS 工具

# 查询 A 记录
dig example.com A

# 查询 MX
dig example.com MX

# 反向解析
dig -x 8.8.8.8

# 指定 DNS 服务器
dig @8.8.8.8 example.com

# 快速查询
nslookup example.com 223.5.5.5   # 阿里 DNS

4. 常见 DNS 服务器

公共 DNS:
- 114.114.114.114(国内)
- 223.5.5.5 / 223.6.6.6(阿里)
- 119.29.29.29(腾讯)
- 8.8.8.8 / 8.8.4.4(Google)
- 1.1.1.1(Cloudflare)

# 修改
# 系统网络设置或 /etc/resolv.conf

5. 本地 hosts 与缓存

# /etc/hosts 手动映射
127.0.0.1  localhost
192.168.1.10  dev-server

# 刷新缓存
# macOS/Linux(部分)
sudo dscacheutil -flushcache   # macOS
sudo systemd-resolve --flush-caches  # systemd
# Windows
ipconfig /flushdns

6. 常见问题

1. 域名解析失败: dig 排查,换 DNS
2. DNS 污染: 用可靠公共 DNS/DoH
3. 缓存陈旧: 等待 TTL 或刷新
4. 内部域名: 配置内网 DNS
5. 安全: 用 DNS over HTTPS(DoH)防窥探

HTTP 协议

HTTP 协议(超文本传输)

HTTP(HyperText Transfer Protocol)是 Web 的基石,浏览器与服务器通过它通信。

1. 基本概念

端口: 80
特点: 请求-响应模型、无状态(可用 Cookie/Session 维持)
版本: HTTP/1.1(主流)、HTTP/2、HTTP/3(QUIC)

# 一个请求
GET /index.html HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Accept: text/html

2. 请求方法

GET    获取资源(无副作用)
POST   创建资源(提交数据)
PUT    整体更新
PATCH  部分更新
DELETE 删除
HEAD   只取响应头
OPTIONS 预检/能力查询

# curl 示例
curl -X GET https://example.com
curl -X POST -d "name=张三" https://example.com/api

3. 状态码

2xx 成功
  200 OK
  201 Created
  204 No Content

3xx 重定向
  301 永久移动
  302 临时重定向
  304 Not Modified(缓存)

4xx 客户端错误
  400 请求错误
  401 未认证
  403 禁止访问
  404 未找到
  429 限流

5xx 服务器错误
  500 服务器内部错误
  502 网关错误
  503 服务不可用
  504 网关超时

4. 请求头与响应头

请求头:
Host / User-Agent / Accept / Cookie
Authorization / Content-Type / Referer

响应头:
Content-Type / Content-Length / Set-Cookie
Cache-Control / Location / Server

# 查看
curl -v https://example.com
curl -I https://example.com   # 只取头

5. Cookie 与 Session

HTTP 无状态 → 用 Cookie 维持状态

流程:
1. 服务器 Set-Cookie: sessionid=xxx
2. 浏览器保存
3. 下次请求自动带 Cookie
4. 服务器识别会话

# curl 使用
curl -c cookies.txt -b cookies.txt https://example.com/login
curl -H "Cookie: sessionid=abc" https://example.com

6. 调试与安全

# 调试工具
curl -v / httpie / Postman / 浏览器开发者工具

# 安全要点
- HTTPS 加密(防窃听)
- 输入校验(防注入/XSS)
- 认证授权(401/403)
- 限流(429 防刷)
- 敏感信息勿放 URL

HTTPS 协议

HTTPS 协议(安全 HTTP)

HTTPS = HTTP + TLS/SSL 加密,保护数据传输的机密性、完整性与身份认证。

1. 为什么需要 HTTPS

HTTP 明文风险:
- 窃听: 密码/数据被截获
- 篡改: 内容被中间人修改
- 伪装: 冒充真实网站

HTTPS 解决:
- 加密: 数据不可读
- 完整性: 防篡改
- 认证: 证书验证身份

端口: 443

2. 工作原理(TLS 握手)

1. 客户端发起 hello(支持的加密套件)
2. 服务器返回证书(含公钥)+ 选择套件
3. 客户端验证证书(CA 信任链)
4. 客户端生成会话密钥(用公钥加密发送)
5. 双方用会话密钥对称加密通信

# 验证
openssl s_client -connect example.com:443

3. 证书与 CA

证书: 绑定域名与公钥,由 CA 签名
CA:   证书颁发机构(信任根)

# 申请免费证书(Let's Encrypt)
sudo apt install certbot
certbot certonly --standalone -d example.com

# 查看证书
openssl x509 -in cert.pem -text -noout

4. HTTPS 配置(nginx)

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;

    location / {
        proxy_pass http://127.0.0.1:8080;
    }
}

# HTTP 跳转 HTTPS
server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

5. 验证 HTTPS

curl -v https://example.com     # 看 TLS 握手
curl -I https://example.com

# 在线检测
https://www.ssllabs.com/ssltest/

# 检查证书到期
openssl x509 -enddate -noout -in cert.pem

6. 常见问题

1. 证书无效: 域名不匹配/过期/自签
2. 混合内容: 页面含 HTTP 资源被拦
3. 握手慢: 开 TLS 1.3 + 会话复用
4. 双向 TLS(mTLS): 企业级身份认证
5. 证书自动续期: certbot renew

POP3 协议

POP3 协议(收邮件)

POP3(Post Office Protocol v3)用于从邮件服务器下载邮件到本地,下载后通常从服务器删除。

1. 基本概念

端口: 110(明文)、995(POP3S SSL)
特点: 下载后邮件移到本地(默认删除服务器副本)
适合: 单设备使用,离线阅读
对比 IMAP: POP3 不同步,IMAP 多设备同步

# 连接
telnet pop.example.com 110

2. 常用命令

USER user@example.com   用户名
PASS password           密码
STAT                    统计(封数/字节)
LIST                    列出邮件
RETR 1                  读取第 1 封
DELE 1                  标记删除第 1 封
NOOP                    心跳
QUIT                    退出(应用删除)

3. Python 收邮件(poplib)

import poplib
from email import parser

conn = poplib.POP3_SSL("pop.example.com", 995)
conn.user("user@example.com")
conn.pass_("password")

count, total = conn.stat()
print(f"{count} 封邮件")

# 读最新一封
resp, lines, octets = conn.retr(count)
msg = parser.Parser().parsestr("\n".join(line.decode() for line in lines))
print("主题:", msg["Subject"])

conn.quit()

4. POP3 vs IMAP 选择

POP3:
+ 简单,离线方便
+ 服务器占用小
- 多设备不同步
- 误删难恢复

IMAP:
+ 多设备同步(收件箱状态一致)
+ 服务器管理文件夹
+ 部分下载按需
- 需保持服务器空间

现代建议: 多设备用 IMAP,单设备离线可选 POP3

5. 客户端配置

通用设置:
- 收件服务器: pop.example.com
- 端口: 995(POP3S)或 110(需 TLS)
- 认证: 用户名/授权码
- 服务器保留副本(可选,防丢失)

Outlook / Thunderbird / 手机邮件 App 均支持

6. 安全注意

1. 用加密端口(995/STARTTLS)
2. 授权码代替密码
3. 定期清理服务器邮件
4. 不用明文 110 端口公网
5. 邮件加密(PGP)可选

IMAP 协议

IMAP 协议(同步收邮件)

IMAP(Internet Message Access Protocol)是现代的收件协议,支持多设备同步与服务器端文件夹管理。

1. 基本概念

端口: 143(明文)、993(IMAPS SSL)
特点:
- 邮件留在服务器(可同步)
- 多设备状态一致(已读/删除/文件夹)
- 按需下载(部分内容)

适合: 多设备(手机+电脑+平板)使用

2. 常用命令

# 登录
A1 LOGIN user password

# 选择邮箱
A2 SELECT INBOX
# 返回: EXISTS 25(25 封), UNSEEN 3(3 未读)

# 列出邮件
A3 FETCH 1 BODY[HEADER.FIELDS (FROM SUBJECT DATE)]

# 标记已读
A4 STORE 1 +FLAGS \Seen

# 搜索
A5 SEARCH FROM "boss"

# 删除
A6 STORE 1 +FLAGS \Deleted
A7 EXPUNGE

# 退出
A8 LOGOUT

3. Python 使用(imaplib)

import imaplib

conn = imaplib.IMAP4_SSL("imap.example.com", 993)
conn.login("user@example.com", "授权码")
conn.select("INBOX")

# 搜索未读
status, data = conn.search(None, "UNSEEN")
for num in data[0].split():
    status, msg_data = conn.fetch(num, "(RFC822)")
    print(f"邮件 {num.decode()}: {msg_data[0][1][:200]}")

conn.logout()

4. 文件夹与标签

标准文件夹: INBOX、Sent、Drafts、Trash、Junk
IMAP 可创建自定义文件夹(服务器端)

# 创建
A1 CREATE Projects

# 移动(标记+复制+删除)
A2 COPY 1 "Projects"
A3 STORE 1 +FLAGS \Deleted
A4 EXPUNGE

5. IMAP IDLE(实时推送)

IMAP IDLE: 客户端保持连接,服务器有新邮件立即通知
- 手机邮件实时通知的基础
- 替代频繁轮询

# 客户端设置
- 多数现代客户端自动使用 IDLE

6. 常见问题

1. 同步慢: 网络/服务器性能
2. 空间满: 清理或归档
3. 文件夹不显示: 客户端订阅问题
4. 与 POP3 混用: 可能重复或状态混乱
5. 安全: 用 993/STARTTLS 加密

RDP 协议

RDP 协议(远程桌面)

RDP(Remote Desktop Protocol)是微软的远程桌面协议,允许远程操作 Windows 桌面。

1. 基本概念

端口: 3389(TCP)
作用: 远程操作 Windows 桌面(图形界面)
使用: Windows 远程桌面连接(mstsc)

# 连接
mstsc          # 输入 IP/主机名
# 或命令行
mstsc /v:192.168.1.10

2. 启用远程桌面

Windows:
设置 → 系统 → 远程桌面 → 启用
或 PowerShell:
Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server' -Name fDenyTSConnections -Value 0

允许的用户: 管理员默认,可添加
限制: 网络级别认证(NLA)建议开启

3. 其他平台连接

# macOS
Microsoft Remote Desktop(App Store)

# Linux
rdesktop -u user 192.168.1.10
xfreerdp /u:user /v:192.168.1.10 /cert:ignore

# 手机
Microsoft Remote Desktop(Android/iOS)

4. 进阶配置

# 修改端口(注册表)
HKLM\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp
PortNumber → 3390
# 重启后生效

# 网关(RD Gateway)
企业通过网关安全访问内网 RDP
- HTTPS 443 加密
- 无需暴露 3389

5. 安全加固

1. 不暴露 3389 到公网
2. 用 VPN 或 RD Gateway 访问
3. 强密码 + 账户锁定策略
4. 启用 NLA(网络级别认证)
5. 限制允许的用户
6. 开启 Windows 防火墙
7. 日志审计登录记录

# 防火墙放行(如需要)
netsh advfirewall firewall add rule name="RDP" dir=in action=allow protocol=TCP localport=3389

6. 替代方案

VNC: 跨平台远程桌面(RFB 协议,5900)
TeamViewer/向日葵: 第三方远程控制(穿透 NAT)
X2Go: Linux 桌面远程
SSH + X11: Unix 环境

SFTP 协议

SFTP 协议(安全文件传输)

SFTP(SSH File Transfer Protocol)基于 SSH 提供加密的文件传输,是 FTP 的安全替代。

1. 基本概念

端口: 22(SSH)
特点: 加密传输、支持断点续传、目录操作
对比: FTP(明文/21) vs SFTP(加密/22)
注意: SFTP ≠ FTPS(FTP+TLS)

# 命令行
sftp user@server
sftp -P 2222 user@server   # 指定端口

2. sftp 常用命令

# 交互模式
ls          远程列表
lls         本地列表
cd /remote   切换远程目录
lcd /local  切换本地目录
get file    下载
put file    上传
get -r dir  递归下载
put -r dir  递归上传
rm file     删除远程
mkdir dir   创建目录
bye/quit    退出

3. 非交互传输

# 单文件
sftp user@server:/remote/path/file.txt .
sftp user@server <<'EOF'
get /remote/file.txt /local/
put /local/file.txt /remote/
EOF

# 或用 scp(更简洁)
scp file.txt user@server:/remote/
scp -r dir/ user@server:/remote/

4. Python 使用(paramiko)

pip install paramiko

import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect("server", username="user", password="pass")

sftp = ssh.open_sftp()

# 上传
sftp.put("local.txt", "/remote/local.txt")

# 下载
sftp.get("/remote/file.txt", "local.txt")

# 列目录
for item in sftp.listdir("/remote"):
    print(item)

sftp.close()
ssh.close()

5. 密钥认证

# 生成密钥(如无)
ssh-keygen -t ed25519
ssh-copy-id user@server

# sftp 自动使用 ~/.ssh/config 或密钥
# 更安全: 禁用密码认证

# 服务器配置 /etc/ssh/sshd_config
PasswordAuthentication no

6. 常见问题

1. 连接被拒: 检查端口/防火墙/sshd 服务
2. 认证失败: 密钥/密码/授权
3. 大文件中断: 用 rsync(支持断点)
   rsync -avz --partial file user@server:/remote/
4. 权限: 上传目标目录写权限
5. 批量: 用 rsync 更高效

UDP 协议

UDP 协议(用户数据报)

UDP(User Datagram Protocol)是无连接的传输协议,追求速度与低延迟,不保证可靠性。

1. UDP 的特点

- 无连接: 不握手,直接发
- 不可靠: 不确认、不重传、可能乱序
- 数据报: 有消息边界(每次发送完整)
- 低开销: 头部仅 8 字节(比 TCP 20 字节小)
- 支持广播/多播

适合: 实时性优先(视频/语音/游戏)、DNS

2. TCP vs UDP

项目      TCP              UDP
连接      面向连接          无连接
可靠性    可靠(重传)        不可靠
顺序      保证              不保证
头部      20+ 字节          8 字节
速度      较慢              快
流量控制  有                无
适用      Web/文件/邮件     音视频/游戏/DNS

3. 常见 UDP 应用

DNS       53(查询)
DHCP      67/68(地址分配)
NTP       123(时间同步)
SNMP      161(网络管理)
VoIP/RTP  语音视频
游戏      实时对战(如 FPS)
QUIC/HTTP3 UDP 之上(Google)

# 查看 UDP 端口
ss -ulnp
netstat -ulnp

4. Python UDP 编程

import socket

# 客户端
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client.sendto(b"Hello UDP", ("127.0.0.1", 8888))
data, addr = client.recvfrom(1024)
print(data)
client.close()

# 服务器
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(("0.0.0.0", 8888))
while True:
    data, addr = server.recvfrom(1024)
    print(f"收到 {addr}: {data}")
    server.sendto(b"ACK", addr)

5. UDP 可靠性增强

应用层实现可靠 UDP(游戏/直播):
1. 序列号(排序)
2. 确认与重传(选择性)
3. 心跳检测
4. 前向纠错(FEC)

或直接用:
- QUIC(可靠 UDP,HTTP/3)
- WebRTC(音视频实时通信)
- KCP(游戏可靠 UDP 协议)

6. 故障排查

1. 收不到 UDP: 防火墙(无连接难排查)
2. 丢包高: 网络拥塞/无拥塞控制
3. 乱序: 应用层处理
4. 大包分片: MTU 问题,注意包大小
5. 测试: nc -u / netcat

SSL 协议

SSL 协议(安全套接层)

SSL(Secure Sockets Layer)是 TLS 的前身,为网络通信提供加密与认证。SSL 已被 TLS 取代,但"SSL 证书"的说法沿用至今。

1. 历史与现状

SSL 1.0: 未发布
SSL 2.0: 1995,有漏洞
SSL 3.0: 1996,仍不安全(POODLE 攻击)
TLS 1.0: 1999(SSL 3.1)
TLS 1.1: 2006
TLS 1.2: 2008(广泛使用)
TLS 1.3: 2018(当前推荐)

结论: SSL 已废弃,现代用 TLS 1.2/1.3
但"SSL 证书"名称沿用

2. SSL/TLS 提供什么

1. 机密性: 对称加密(数据不可读)
2. 完整性: MAC/摘要(防篡改)
3. 认证: 证书验证(防冒充)
4. 前向保密: 会话密钥交换(泄露历史密钥不威胁)

# 支持的加密
AES-GCM、ChaCha20(对称)
ECDHE、RSA(密钥交换)
SHA-256/384(哈希)

3. 证书链

信任链:
根 CA(内置信任) → 中间 CA → 服务器证书

验证:
1. 检查证书链完整
2. 域名匹配
3. 有效期
4. 吊销状态(CRL/OCSP)

# 查看证书链
openssl s_client -connect example.com:443 -showcerts

4. 生成自签名证书(测试用)

openssl req -x509 -newkey rsa:2048 \
  -keyout key.pem -out cert.pem \
  -days 365 -nodes \
  -subj "/CN=example.com"

# 生产用 Let's Encrypt(certbot)免费可信证书

5. 安全配置检查

# 查看支持协议与套件
openssl s_client -connect example.com:443

# 禁用旧版本(nginx)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:...';

# 在线检测
ssllabs.com/ssltest
myssl.com(国内)

6. 常见问题

1. "证书不受信任": 自签/链不完整
2. "证书已过期": 续期(certbot renew)
3. 旧客户端兼容: 平衡安全与兼容
4. 双向认证(mTLS): 客户端证书
5. 性能: TLS 1.3 + 会话恢复 + 硬件加速

TLS 协议

TLS 协议(传输层安全)

TLS(Transport Layer Security)是 SSL 的继任者,是当前 Web 加密通信的标准。

1. TLS 1.3 新特性

1. 更快的握手(1-RTT,可 0-RTT)
2. 移除不安全算法(RC4、MD5、SHA-1...)
3. 前向保密成为默认(ECDHE)
4. 简化套件列表
5. 会话恢复改进

# 版本对比
TLS 1.2: 2-RTT 握手
TLS 1.3: 1-RTT 握手(性能提升明显)

2. TLS 握手(1.3 简化)

客户端                         服务器
  |-- ClientHello ------->|  支持的套件、随机数
  |<-- ServerHello ------|  选择套件、证书、密钥参数
  |<-- 证书 ------------|
  |<-- Finished --------|
  |-- Finished ------->|
  |======= 应用数据(加密)======|

# 验证
openssl s_client -tls1_3 -connect example.com:443

3. 关键机制

密钥交换: ECDHE(前向保密)
证书验证: X.509 + 信任链
会话密钥: 双方派生(密钥派生函数 HKDF)
记录协议: 加密应用数据(分块+MAC)

# 查看实际握手
curl -v https://example.com 2>&1 | grep -i tls

4. 配置最佳实践

# nginx 推荐配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;

# 优先 TLS 1.3,至少 TLS 1.2

5. 部署检查清单

□ 只启用 TLS 1.2+ 1.3
□ 证书自动续期(certbot)
□ 关闭 TLS 1.0/1.1(PCI 合规要求)
□ 使用 ECDHE 套件
□ 检查 HSTS 头
□ 定期安全扫描(ssllabs)
□ 监控证书到期

6. 常见问题

1. 握手失败: 协议/套件不匹配
2. 老设备访问不了: 兼容 TLS 1.2
3. 0-RTT 风险: 重放攻击(谨慎启用)
4. 性能: TLS 1.3 + 会话复用 + OCSP stapling
5. mTLS: 客户端证书认证(企业场景)

ARP 协议

ARP 协议(地址解析)

ARP(Address Resolution Protocol)把 IP 地址解析为 MAC 地址,是局域网通信的基础。

1. 为什么需要 ARP

局域网内设备通信需要知道 MAC 地址:
- IP 地址: 逻辑寻址(网络层)
- MAC 地址: 物理寻址(链路层)

发送数据前: 需要目标 IP 对应的 MAC
ARP 解决: IP → MAC 的映射

# 查看 ARP 表
arp -a
ip neigh

2. ARP 工作过程

1. 设备 A 要发数据给 B(IP 已知,MAC 未知)
2. A 广播 ARP 请求:"谁的 IP 是 192.168.1.2?"
3. B 收到后单播 ARP 应答:"我是,我的 MAC 是 xx"
4. A 缓存映射(几分钟)
5. 下次直接查缓存

# 抓包
tcpdump -i eth0 arp

3. ARP 报文格式

硬件类型(1=以太网) + 协议类型(0x0800=IP)
硬件地址长度(6) + 协议地址长度(4)
操作码(1=请求, 2=应答)
发送方 MAC + 发送方 IP
目标 MAC + 目标 IP

4. ARP 欺骗攻击

攻击者伪造 ARP 应答,冒充网关/主机:
- 截获流量(中间人)
- 会话劫持
- 断网(网关 MAC 被篡改)

防御:
1. 静态 ARP 绑定
   ip neigh add 192.168.1.1 lladdr xx:xx:xx dev eth0 nud permanent
2. 交换机端口安全
3. DAI(动态 ARP 检测)
4. 网络监控告警

# 检测异常
arp -a | awk '{print $2}' | sort | uniq -c | sort -rn

5. 相关协议

RARP: 反向(MAC → IP,已废弃,被 DHCP 取代)
NDP: IPv6 的地址解析(ICMPv6 替代 ARP)

# IPv6 邻居发现
ip -6 neigh

6. 排查与维护

1. 通信失败: arp -a 看是否解析到
2. 清除缓存: ip neigh flush all
3. 静态绑定: 关键设备(网关)防欺骗
4. 多网段: ARP 只在本网段(跨网段靠路由器)

RARP 协议

RARP 协议(反向地址解析)

RARP(Reverse ARP)与 ARP 相反,通过 MAC 地址查询 IP 地址,已被 BOOTP/DHCP 取代。

1. 基本概念

作用: MAC → IP(与 ARP 相反)
场景: 无盘工作站启动时需要 IP
缺陷: 需要配置 RARP 服务器,无法跨网段
现状: 已被 BOOTP → DHCP 取代

# 报文格式与 ARP 类似,操作码=3(请求)/4(应答)

2. 为什么被取代

RARP 问题:
1. 只能返回 IP,不能给其他配置(网关/掩码/DNS)
2. 服务器需逐台维护 MAC-IP 表
3. 数据链路层协议,不能跨路由器

DHCP 优势:
1. 自动分配 IP + 掩码 + 网关 + DNS
2. 动态/静态租约
3. 跨网段中继(通过路由器转发)
4. 集中管理

3. 类似协议

BOOTP: RARP 的改进(应用层,UDP 67/68)
DHCP:  BOOTP 的扩展(现在标准)

# 查看 DHCP 客户端状态
dhclient -v
cat /var/lib/dhcp/dhclient.leases  # 租约文件

4. 现代用途

基本只在教科书/历史系统出现
学习价值:
- 理解协议演进(RARP→BOOTP→DHCP)
- 网络原理教学

实际排查不需要关注 RARP

DHCP 协议

DHCP 协议(动态主机配置)

DHCP(Dynamic Host Configuration Protocol)自动分配 IP 地址与网络配置,让设备即插即用。

1. 基本概念

端口: 67(服务器)、68(客户端)
作用: 自动分配 IP、掩码、网关、DNS
对比静态 IP: 免手动配置、避免冲突

分配内容:
- IP 地址 + 子网掩码
- 默认网关
- DNS 服务器
- 租约时间

2. 工作过程(DORA)

1. Discover: 客户端广播"谁有 IP?"
2. Offer:    服务器提供 IP(提议)
3. Request:  客户端请求该 IP
4. Ack:      服务器确认,分配完成

DHCP Discover (广播)
   ↓
DHCP Offer (单播/广播)
   ↓
DHCP Request (广播)
   ↓
DHCP Ack (单播/广播)

# 抓包
tcpdump -i eth0 port 67 or port 68

3. 租约与续租

租约(默认 24h):
- 50% 时: 单播续租
- 87.5% 时: 广播续租
- 过期: 重新 DORA

# 查看/操作租约
ip addr show
# Linux 续租
dhclient -r; dhclient
# Windows
ipconfig /release; ipconfig /renew

4. 配置 DHCP 服务器(isc-dhcp)

# /etc/dhcp/dhcpd.conf
subnet 192.168.1.0 netmask 255.255.255.0 {
  range 192.168.1.100 192.168.1.200;
  option routers 192.168.1.1;
  option domain-name-servers 223.5.5.5, 119.29.29.29;
  default-lease-time 600;
  max-lease-time 7200;
}

# 静态绑定(按 MAC 固定 IP)
host printer {
  hardware ethernet 00:11:22:33:44:55;
  fixed-address 192.168.1.50;
}

5. 常见问题

1. 获取不到 IP: 服务未启/地址池满/网线
2. IP 冲突: 静态与 DHCP 重叠
3. 网关/DNS 错: 检查 option 配置
4. 频繁掉线: 租约短/中继问题
5. 排查: 看系统日志(daemon.log)/抓包

6. 安全注意

1. 非法 DHCP 服务器(仿冒)可劫持网络
   → 交换机 DHCP Snooping
2. 地址池监控
3. 静态绑定关键设备
4. 内网隔离(guest Wi-Fi 独立网段)

MTP 协议

MTP 协议

MTP(Media Transfer Protocol)用于在设备之间传输媒体文件,常见于手机、相机连接电脑。

1. 基本概念

作用: 管理/传输媒体文件(照片、视频、音乐)
场景: 手机 ↔ 电脑、相机 ↔ 电脑
特点: 基于 USB 的协议栈,也可走网络

对比 UMS(U盘模式):
- UMS: 设备作为存储暴露,独占冲突
- MTP: 设备管理文件,同时可用(推荐)

2. MTP 工作方式

协议对象:
- Device: 设备
- Store: 存储(内置/外置)
- Object: 文件对象(含元数据)
- Property: 文件属性(时间/类型/尺寸)

命令示例:
GetDeviceInfo
GetStorageIDs
GetObjectHandles
GetObject(下载)
SendObject(上传)

# 命令行访问(Android)
adb shell
# Linux 挂载 MTP
jmtpfs /mnt/mtp

3. 使用场景

1. 手机导出照片/视频
2. 相机传输 RAW 文件
3. 车载系统媒体管理
4. 数字相框/便携播放器

# Windows 资源管理器自动识别
# macOS 用 Android File Transfer
# Linux: gvfs-mtp / jmtpfs

4. 常见问题

1. 连接不上: 换数据线(只充电线不行)
2. 设备未解锁: 手机需解锁屏幕
3. 大文件传输慢: MTP 有开销
4. 权限: 部分设备需授权
5. 稳定性: 传大量文件偶发断开(重试)

5. 替代方案

无线: 局域网共享/云盘/AirDrop
ADB: adb pull / adb push(开发者)
FTP: 手机开 FTP 服务器
现代: 手机端可配置 USB 模式(UMS/传输文件)

NTP 协议

NTP 协议(网络时间协议)

NTP(Network Time Protocol)通过网络同步设备时间,保证分布式系统时间一致。

1. 基本概念

端口: 123(UDP)
精度: 局域网毫秒级,互联网几十毫秒
层级: Stratum 0(原子钟) → 1 → 2 → ... → 15
作用: 日志时间戳、证书验证、分布式一致性、调度任务

# 查看当前时间与源
timedatectl
timedatectl status

2. 工作原理

1. 客户端发送带时间戳的请求
2. 服务器返回时间
3. 计算往返延迟与时钟偏移
4. 多次采样取最可靠源
5. 平滑调整本地时钟

# 查询时间服务器
ntpdate -q ntp.aliyun.com
ntpq -p              # 查看同步状态

3. 常用时间服务器

国内:
- ntp.aliyun.com
- ntp.tencent.com
- ntp1.aliyun.com / ntp2.aliyun.com
- cn.pool.ntp.org

国际:
- pool.ntp.org
- time.google.com
- time.apple.com

# 设置时区
timedatectl set-timezone Asia/Shanghai

4. 配置 chrony(现代替代)

# /etc/chrony/chrony.conf
server ntp.aliyun.com iburst
server ntp.tencent.com iburst
pool cn.pool.ntp.org iburst

# 启用
sudo systemctl enable --now chrony

# 查看
chronyc sources -v
chronyc tracking

5. 为什么时间同步重要

1. 日志分析: 多机日志时间线一致
2. 证书: TLS 证书验证依赖时间
3. 分布式数据库: 事务/时钟协调
4. 定时任务: 全局统一触发
5. 安全: 时间戳防重放
6. 监控告警: 时间对齐

# 验证
date
timedatectl status

6. 常见问题

1. 时间不准: 检查源可达/防火墙 123
2. 大偏差: chrony 会自动步进(或 makestep)
3. 虚拟机关机漂移: 配置开机同步
4. 防火墙: 放行 UDP 123
5. 容器: 挂载宿主时间或配置 NTP

PPP 协议

PPP 协议(点对点协议)

PPP(Point-to-Point Protocol)用于两个节点之间的直接连接,曾是拨号上网、DSL 的标准协议。

1. 基本概念

用途: 点对点链路(拨号、专线、DSL、移动回程)
组成:
- 帧格式(封装)
- LCP(链路控制协议: 建立/配置/测试)
- NCP(网络控制协议: 配置 IP 等)

# 当前应用
- 运营商 DSL(PPPoE)
- 拨号(PPPoE over 以太网)
- 串行链路(老设备)

# 查看 PPP 接口
ip link show ppp0
ifconfig ppp0

2. PPP 工作过程

1. LCP 协商: 链路建立(MTU、认证方式)
2. 认证(可选): PAP / CHAP
3. NCP 配置: 分配 IP(IPCP)
4. 数据传输
5. LCP 终止: 断开

# 认证方式
PAP: 明文用户名密码(不安全)
CHAP: 挑战-应答(安全)

3. PPPoE(以太网上的 PPP)

PPPoE: PPP over Ethernet
- 宽带拨号上网的标准(ADSL/光纤)
- 运营商账号认证

# Linux 拨号
sudo apt install pppoeconf
sudo pppoeconf
# 或手动
sudo pppoe-connect

# 查看连接
plog
ip addr show ppp0

4. 配置文件(pppd)

# /etc/ppp/peers/dsl
user "your-account"
password "your-pass"
plugin pppoe.so
eth0
persist
maxfail 0

# 连接
sudo pppd call dsl

5. 常见问题

1. 拨号失败: 账号密码/线路/设备
2. 频繁掉线: 线路质量/协商问题
3. MTU 问题: PPPoE MTU 1492(避免大包分片)
4. 认证失败: CHAP/PAP 配置
5. 现在家用路由自动拨号,基本无需手动

ICMP 协议

ICMP 协议(互联网控制报文)

ICMP(Internet Control Message Protocol)用于网络诊断与错误报告,ping 和 traceroute 都基于它。

1. 基本概念

作用: 传输错误信息与诊断消息
承载: 封装在 IP 数据包中(协议号 1)
常见工具: ping、traceroute

类型:
0  Echo Reply(ping 响应)
8  Echo Request(ping 请求)
3  Destination Unreachable(不可达)
5  Redirect(重定向)
11 Time Exceeded(TTL 超时,traceroute 用)

2. ping 详解

# 基本
ping 8.8.8.8
ping example.com

# 常用参数
ping -c 4 8.8.8.8        # 4 个包
ping -i 1 8.8.8.8        # 间隔 1 秒
ping -s 1400 8.8.8.8     # 指定包大小
ping -f 8.8.8.8          # 洪泛(勿滥用)
ping6 ::1                # IPv6

# 输出解读
64 bytes from 8.8.8.8: icmp_seq=1 ttl=117 time=23.1 ms
- time: 往返延迟(RTT)
- ttl: 剩余跳数(可推测距离)
- 丢包率: 网络质量

3. traceroute 详解

# 显示到目标经过的路由器
traceroute 8.8.8.8
traceroute -I 8.8.8.8     # ICMP 模式
traceroute -n 8.8.8.8     # 不解析域名
mtr 8.8.8.8               # 持续监测(推荐)

原理: 逐跳增加 TTL,利用 ICMP Time Exceeded
1  192.168.1.1  1ms
2  10.0.0.1     5ms
3  61.144.x.x   8ms
...

4. 常见错误消息

Destination Host Unreachable: 目标不可达(路由/ARP)
Destination Net Unreachable:  网络不可达
Request Timed Out:            超时(可能被防火墙屏蔽)
TTL Expired:                  TTL 超时(环路/跳数过多)
Fragmentation Needed:         MTU 问题

# 排查示例
ping 192.168.1.1    # 网关是否通
ping 8.8.8.8        # 外网是否通
ping example.com    # DNS 是否通

5. 安全与屏蔽

攻击: ICMP 洪泛(Smurf)、ping of death
防御: 限制/屏蔽 ICMP(但会影响诊断)

# 防火墙示例
# 允许 ping 入
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

# 或屏蔽
iptables -A INPUT -p icmp -j DROP

6. 相关协议

ICMPv6: IPv6 的 ICMP(含邻居发现功能)
IGMP:   组播管理(区别于 ICMP)
# 查看 ICMP 统计
netstat -s | grep ICMP

IGMP 协议

IGMP 协议(组播管理)

IGMP(Internet Group Management Protocol)管理主机加入/离开组播组,支撑 IPTV、视频会议等组播应用。

1. 基本概念

端口/协议: IP 协议号 2
作用: 主机与路由器之间管理组播组成员
场景: IPTV、在线直播、视频会议、游戏同步

单播: 一对一
广播: 一对所有(全网段)
组播: 一对一组(加入该组的人)

# 组播地址
224.0.0.0/4(224.0.0.0 - 239.255.255.255)
224.0.0.1: 所有主机
224.0.0.2: 所有路由器

2. 工作过程

1. 主机发 IGMP 报告: 加入组播组
2. 路由器记录组成员(查询器)
3. 路由器周期性查询成员
4. 无响应则移除成员(超时)

# 查看组播
ip maddr
ip mroute
ss -g

3. IGMP 版本

IGMPv1: 基础(离开不通知)
IGMPv2: 添加离开消息(更快)
IGMPv3: 源过滤(指定接收/拒绝某源,安全)

# 路由器上配置
# 启用组播路由
sysctl net.ipv4.conf.all.mc_forwarding=1

# 查看
cat /proc/net/igmp

4. 组播应用

1. IPTV: 组播承载直播频道(带宽高效)
2. 视频会议: 多方共享媒体流
3. 金融行情: 实时行情组播分发
4. 游戏: 多人同步
5. 网络管理: SNMP 通知

# 测试组播接收
# 使用 mcast 工具或 vlc 打开组播流

5. 常见问题

1. 收不到组播: 检查 IGMP snooping(交换机)/防火墙
2. 组播泛洪: 交换机未启用 IGMP Snooping
3. 跨网段: 需要组播路由协议(PIM)
4. 干扰: 组播风暴(环路)
5. 排查: tcpdump igmp / ip maddr

GGP 协议

GGP 协议

GGP(Gateway-to-Gateway Protocol)是早期的网关间路由协议,已被现代路由协议取代。

1. 基本概念

时期: 1970-80 年代(ARPANET)
作用: 网关(路由器)之间交换路由信息
地位: 最早的动态路由协议之一
现状: 已废弃,仅教学意义

# 现代替代
RIP / OSPF / BGP

2. 现代路由协议

RIP: 距离向量(跳数,小网络)
OSPF: 链路状态(大企业网,快速收敛)
BGP: 路径向量(互联网骨干/跨域)

EIGRP: Cisco 私有
IS-IS: 运营商网络

# 查看路由协议
# Linux 查看路由
ip route
# 常见路由软件
bird / frr / quagga

3. 学习意义

了解协议演进:
- 集中式 → 分布式
- 简单距离向量 → 链路状态 → 路径向量
- GGP 是理解动态路由历史的起点

排查网络问题不用关注 GGP

MCP 协议

MCP 协议(模型上下文协议)

MCP(Model Context Protocol)是 Anthropic 提出的开放协议,统一 AI 模型与外部工具、数据源的连接方式,被称为"AI 应用的 USB-C"。

1. 基本概念

作用: 让 AI 应用标准化地连接外部系统
类比: USB 统一硬件连接 → MCP 统一 AI 工具连接

角色:
- Host(宿主): AI 应用(Claude/IDE/Agent)
- Client(客户端): 宿主内发起连接
- Server(服务端): 提供工具/资源/提示

# 支持方
Anthropic、OpenAI(兼容)、各类 Agent 工具
常见 MCP 服务器: GitHub、数据库、浏览器、文件系统

2. 核心能力

1. Tools(工具): 可调用的函数(查库/建 issue)
2. Resources(资源): 可读取的数据(文档/文件)
3. Prompts(提示): 可复用的提示词模板

传输方式:
- stdio(本地进程)
- HTTP/SSE(远程服务)

# 简单示例(服务器定义)
服务器: filesystem
工具:   read_file / write_file / list_dir
资源:   /config 配置数据

3. 配置 MCP 服务器

# 配置文件示例(Claude/OpenCode 等)
{
  "mcpServers": {
    "github": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": { "GITHUB_TOKEN": "ghp_xxx" }
    },
    "postgres": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-postgres"],
      "env": { "DATABASE_URL": "postgresql://..." }
    }
  }
}

4. 开发 MCP 服务器(Python)

pip install mcp

from mcp.server import Server
from mcp.server.stdio import stdio_server

server = Server("example")

@server.list_tools()
async def list_tools():
    return [{
        "name": "get_time",
        "description": "获取当前时间",
        "inputSchema": {"type": "object", "properties": {}}
    }]

@server.call_tool()
async def call_tool(name, arguments):
    if name == "get_time":
        import datetime
        return {"result": str(datetime.datetime.now())}

async def main():
    async with stdio_server() as (read, write):
        await server.run(read, write)

import asyncio
asyncio.run(main())

5. 使用场景

1. AI 助手连数据库查询
2. Agent 操作 GitHub/内部系统
3. IDE 中 AI 读项目文件
4. 知识库检索
5. 浏览器自动化
6. 公司内部工具接入

# 安全注意
- MCP 工具 = AI 的能力,权限最小化
- 敏感服务器用只读账号
- 密钥放环境变量
- 审计工具调用
第 1 / 29 节