02-网络基础知识

49 阅读15分钟

网络基础知识面试手册

文档类型: 计算机网络核心知识
更新时间: 2025-10-28


目录

  1. TCP/IP协议
  2. TCP三次握手与四次挥手
  3. UDP协议
  4. IP地址与子网
  5. DNS域名解析
  6. 网络性能优化
  7. 常见网络问题排查
  8. 面试高频题

1. TCP/IP协议

1.1 TCP协议特点

TCP (Transmission Control Protocol) - 传输控制协议

核心特性:
✅ 面向连接      - 需要建立连接
✅ 可靠传输      - 保证数据完整性
✅ 有序传输      - 按顺序交付数据
✅ 流量控制      - 滑动窗口
✅ 拥塞控制      - 慢启动、拥塞避免
✅ 全双工通信    - 双向同时传输

1.2 TCP报文结构

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          源端口(16bit)         |        目标端口(16bit)         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        序列号(32bit)                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        确认号(32bit)                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  数据偏移 |保留|U|A|P|R|S|F|            窗口大小(16bit)         |
|   (4bit)  |(6)|R|C|S|S|Y|I|                                   |
|           | |G|K|H|T|N|N|                                     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           校验和(16bit)        |        紧急指针(16bit)         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    选项 (可变长度)                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         数据部分                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

重要字段:

  • 序列号(Seq): 数据字节流的编号
  • 确认号(Ack): 期望收到的下一个字节
  • 标志位:
    • SYN: 同步,建立连接
    • ACK: 确认
    • FIN: 结束,关闭连接
    • RST: 重置连接
    • PSH: 推送数据
    • URG: 紧急数据
  • 窗口大小: 接收缓冲区大小,用于流量控制

2. TCP三次握手与四次挥手

2.1 三次握手(建立连接)

客户端                                    服务器
  │                                        │
  │     状态: CLOSED                        │ 状态: LISTEN
  │                                        │
  ├────── 1. SYN (seq=x) ────────────────► │
  │     状态: SYN_SENT                      │ 状态: SYN_RCVD
  │                                        │
  │◄─── 2. SYN+ACK (seq=y, ack=x+1) ──────┤
  │     状态: ESTABLISHED                   │
  │                                        │
  ├────── 3. ACK (ack=y+1) ──────────────► │
  │                                        │ 状态: ESTABLISHED
  │                                        │
  │════════ 连接建立,可以传输数据 ═════════│

为什么需要三次握手?

  1. 两次不够:无法确认客户端的接收能力

    场景:旧的SYN请求延迟到达
    客户端发送SYN1 → 超时
    客户端发送SYN2 → 成功建立连接
    延迟的SYN1到达 → 服务器建立连接 → 资源浪费
    
    三次握手可以避免:客户端不会响应旧SYN的SYN+ACK
    
  2. 防止已失效的连接请求到达服务器

  3. 同步双方初始序列号

2.2 四次挥手(关闭连接)

客户端                                    服务器
  │                                        │
  │     状态: ESTABLISHED                   │ 状态: ESTABLISHED
  │                                        │
  ├────── 1. FIN (seq=u) ────────────────► │
  │     状态: FIN_WAIT_1                    │ 状态: CLOSE_WAIT
  │                                        │
  │◄────── 2. ACK (ack=u+1) ──────────────┤
  │     状态: FIN_WAIT_2                    │
  │                                        │
  │        (服务器继续发送剩余数据)          │
  │                                        │
  │◄────── 3. FIN (seq=v) ────────────────┤
  │     状态: TIME_WAIT                     │ 状态: LAST_ACK
  │                                        │
  ├────── 4. ACK (ack=v+1) ──────────────► │
  │                                        │ 状态: CLOSED
  │                                        │
  │  等待2MSL (Maximum Segment Lifetime)   │
  │     状态: CLOSED                        │

为什么需要四次挥手?

TCP是全双工通信:

  • 第1次:客户端告诉服务器"我不再发送数据了"
  • 第2次:服务器确认"收到,但我可能还有数据要发"
  • 第3次:服务器告诉客户端"我也发送完了"
  • 第4次:客户端确认"收到"

TIME_WAIT状态(2MSL)

  • MSL: 报文最大生存时间(通常2分钟)
  • 作用:
    1. 确保最后的ACK被接收(否则服务器会重发FIN)
    2. 确保旧连接的所有报文都消失

2.3 TCP状态转换图

                        主动打开
         CLOSED ──────────────────► SYN_SENT
            │                          │
            │ 被动打开                  │ 收到SYN+ACK
            │                          │ 发送ACK
            ▼                          ▼
         LISTEN ───收到SYN───► SYN_RCVD
            │      发送SYN+ACK           │
            │                          │ 收到ACK
            │                          │
            └──────────────────────────┴──► ESTABLISHED
                                            │      │
                                            │      │
                   主动关闭                  │      │ 被动关闭
                   发送FIN                   │      │ 收到FIN
                    ▼                       │      ▼
                 FIN_WAIT_1                 │   CLOSE_WAIT
                    │                       │      │
                    │ 收到ACK                │      │ 发送FIN
                    ▼                       │      ▼
                 FIN_WAIT_2                 │   LAST_ACK
                    │                       │      │
                    │ 收到FIN                │      │ 收到ACK
                    │ 发送ACK                │      ▼
                    ▼                       │   CLOSED
                 TIME_WAIT                  │
                    │                       │
                    │ 等待2MSL               │
                    ▼                       │
                 CLOSED ◄───────────────────┘

3. UDP协议

3.1 UDP vs TCP

特性TCPUDP
连接面向连接无连接
可靠性可靠(重传、确认)不可靠(无重传)
有序性保证顺序不保证顺序
速度慢(开销大)快(开销小)
头部大小20字节8字节
流量控制
拥塞控制
应用场景HTTP、FTP、邮件DNS、视频、游戏

3.2 UDP报文结构

 0      7 8     15 16    23 24    31
+--------+--------+--------+--------+
|     源端口      |    目标端口     |
+--------+--------+--------+--------+
|   UDP长度       |     校验和      |
+--------+--------+--------+--------+
|                                   |
|            数据部分                |
|                                   |
+-----------------------------------+

总大小: 8字节头部 + 数据

3.3 UDP应用场景

✅ 适合UDP的场景:

1. 实时性要求高
   - 视频直播(丢几帧无所谓)
   - 语音通话(偶尔断音可接受)
   - 在线游戏(实时位置同步)

2. 数据量小、简单查询
   - DNS查询(一问一答)
   - DHCP(分配IP地址)
   - NTP(时间同步)

3. 广播/组播
   - 局域网设备发现
   - IPTV
   - 股票行情推送

❌ 不适合UDP的场景:

1. 需要可靠传输
   - 文件下载
   - 网页浏览
   - 邮件发送

2. 大数据传输
   - 数据库同步
   - 大文件传输

4. IP地址与子网

4.1 IP地址分类

IPv4地址(32位)
A类: 0.0.0.0    - 127.255.255.255
     网络号(8位) + 主机号(24位)
     可用: 1.0.0.0 - 126.255.255.255
     用途: 大型网络
     
B类: 128.0.0.0  - 191.255.255.255
     网络号(16位) + 主机号(16位)
     用途: 中型网络
     
C类: 192.0.0.0  - 223.255.255.255
     网络号(24位) + 主机号(8位)
     用途: 小型网络
     
D类: 224.0.0.0  - 239.255.255.255
     组播地址
     
E类: 240.0.0.0  - 255.255.255.255
     保留地址
私有IP地址
A类: 10.0.0.0      - 10.255.255.255    (1个A类网络)
B类: 172.16.0.0    - 172.31.255.255    (16个B类网络)
C类: 192.168.0.0   - 192.168.255.255   (256个C类网络)

特殊地址:
127.0.0.1      - 本地回环地址
0.0.0.0        - 本机所有IP
255.255.255.255 - 广播地址

4.2 子网掩码与CIDR

IP地址: 192.168.1.100
子网掩码: 255.255.255.0

二进制表示:
IP:   11000000.10101000.00000001.01100100
掩码: 11111111.11111111.11111111.00000000
      ↑────────网络部分────────↑ ↑主机部分↑

网络地址 = IP & 掩码 = 192.168.1.0
广播地址 = 网络地址 | ~掩码 = 192.168.1.255
可用主机: 192.168.1.1 - 192.168.1.254 (254个)
CIDR表示法
192.168.1.0/24  = 192.168.1.0 + 255.255.255.0
                  24位网络号,8位主机号
                  
常见CIDR:
/32 = 255.255.255.255  (1个地址,单主机)
/30 = 255.255.255.252  (4个地址,点对点链路)
/24 = 255.255.255.0    (256个地址,C类网络)
/16 = 255.255.0.0      (65536个地址,B类网络)
/8  = 255.0.0.0        (16777216个地址,A类网络)
子网划分示例
原网络: 192.168.1.0/24 (256个地址)

需求: 划分为4个子网

计算:
256 ÷ 4 = 64 (每个子网64个地址)
新掩码: /26 (11111111.11111111.11111111.11000000)

子网1: 192.168.1.0/26    (192.168.1.0   - 192.168.1.63)
子网2: 192.168.1.64/26   (192.168.1.64  - 192.168.1.127)
子网3: 192.168.1.128/26  (192.168.1.128 - 192.168.1.191)
子网4: 192.168.1.192/26  (192.168.1.192 - 192.168.1.255)

每个子网:
- 网络地址: 第1个 (不可用)
- 可用地址: 62个
- 广播地址: 最后1个 (不可用)

4.3 IPv6

IPv6地址: 128位,16进制表示

格式: 2001:0db8:85a3:0000:0000:8a2e:0370:7334

简写规则:
1. 省略前导0
   2001:db8:85a3:0:0:8a2e:370:7334

2. 连续的0可用::替代(只能用一次)
   2001:db8:85a3::8a2e:370:7334

特殊地址:
::1            - 本地回环 (等同IPv4的127.0.0.1)
::             - 未指定地址 (等同IPv4的0.0.0.0)
fe80::/10      - 链路本地地址
fc00::/7       - 唯一本地地址(私有)
2000::/3       - 全局单播地址(公网)

5. DNS域名解析

5.1 DNS解析流程

用户输入: www.example.com

1. 浏览器缓存
   ├─ 命中 → 返回IP
   └─ 未命中 ↓

2. 操作系统缓存
   ├─ Windows: ipconfig /displaydns
   ├─ Linux: /etc/hosts
   └─ 未命中 ↓

3. 本地DNS服务器(ISP提供)
   ├─ 缓存命中 → 返回IP
   └─ 未命中 → 递归查询 ↓

4. 根DNS服务器 (.)
   └─ 返回: .com的DNS服务器地址

5. 顶级域DNS服务器 (.com)
   └─ 返回: example.com的DNS服务器地址

6. 权威DNS服务器 (example.com)
   └─ 返回: www.example.com的IP地址

7. 返回给客户端并缓存
客户端                本地DNS      根DNS   .com DNS   example.com DNS
  │                    │           │        │            │
  ├─ 查询www.example.com─►│           │        │            │
  │                    │           │        │            │
  │                    ├─查询.com的NS─►│        │            │
  │                    │◄───返回.com NS─┤        │            │
  │                    │           │        │            │
  │                    ├─查询example.com─►│        │            │
  │                    │◄───返回example NS─┤        │            │
  │                    │           │        │            │
  │                    ├─查询www记录────────────────────►│
  │                    │◄────返回IP地址───────────────────┤
  │                    │           │        │            │
  │◄────返回IP地址──────┤           │        │            │

5.2 DNS记录类型

A记录 (Address)
example.com  IN  A  192.168.1.1
- 域名 → IPv4地址

AAAA记录
example.com  IN  AAAA  2001:db8::1
- 域名 → IPv6地址

CNAME记录 (Canonical Name)
www.example.com  IN  CNAME  example.com
- 别名 → 真实域名

MX记录 (Mail Exchange)
example.com  IN  MX  10  mail.example.com
- 邮件服务器(数字是优先级)

TXT记录
example.com  IN  TXT  "v=spf1 include:_spf.example.com ~all"
- 文本信息(SPF、域名验证等)

NS记录 (Name Server)
example.com  IN  NS  ns1.example.com
- 域名服务器

PTR记录 (Pointer)
1.1.168.192.in-addr.arpa  IN  PTR  example.com
- IP → 域名(反向解析)

SOA记录 (Start of Authority)
- 域名授权信息

5.3 DNS优化

// 1. 减少DNS查询
// 使用CDN(同一域名)
<script src="https://cdn.example.com/jquery.js"></script>
<img src="https://cdn.example.com/logo.png">

// 2. DNS预解析
<link rel="dns-prefetch" href="//api.example.com">
<link rel="dns-prefetch" href="//cdn.example.com">

// 3. DNS缓存
// 设置TTL(Time To Live)
example.com  IN  A  3600  192.168.1.1
                  ↑ TTL=1小时

// 4. 使用多个DNS服务器
nameserver 8.8.8.8        # Google DNS
nameserver 1.1.1.1        # Cloudflare DNS
nameserver 114.114.114.114 # 国内DNS

6. 网络性能优化

6.1 TCP优化

慢启动与拥塞控制
慢启动 (Slow Start):
拥塞窗口 cwnd 指数增长

RTT 1: cwnd = 1  MSS → 发送1个数据包
RTT 2: cwnd = 2  MSS → 发送2个数据包
RTT 3: cwnd = 4  MSS → 发送4个数据包
RTT 4: cwnd = 8  MSS → 发送8个数据包
...
直到达到慢启动阈值 ssthresh

拥塞避免 (Congestion Avoidance):
cwnd 线性增长

RTT 5: cwnd = 9  MSS
RTT 6: cwnd = 10 MSS
RTT 7: cwnd = 11 MSS
...

发生丢包:
1. 超时重传 → ssthresh = cwnd/2, cwnd = 1
2. 快速重传 → ssthresh = cwnd/2, cwnd = ssthresh
TCP优化参数
# Linux系统优化

# 1. 增大TCP缓冲区
sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.wmem_max=16777216
sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216"
sysctl -w net.ipv4.tcp_wmem="4096 65536 16777216"

# 2. 启用TCP窗口缩放
sysctl -w net.ipv4.tcp_window_scaling=1

# 3. 增大连接队列
sysctl -w net.core.somaxconn=65535
sysctl -w net.ipv4.tcp_max_syn_backlog=8192

# 4. 减少TIME_WAIT
sysctl -w net.ipv4.tcp_fin_timeout=30
sysctl -w net.ipv4.tcp_tw_reuse=1

# 5. 启用TCP Fast Open
sysctl -w net.ipv4.tcp_fastopen=3

# 6. 调整keepalive
sysctl -w net.ipv4.tcp_keepalive_time=600
sysctl -w net.ipv4.tcp_keepalive_intvl=30
sysctl -w net.ipv4.tcp_keepalive_probes=3

6.2 应用层优化

HTTP优化
1. 启用HTTP/2
   - 多路复用
   - 头部压缩
   - 服务器推送

2. 启用GZIP压缩
   Content-Encoding: gzip
   压缩比: 70-90%

3. 使用CDN
   - 就近访问
   - 减轻源站压力

4. 启用浏览器缓存
   Cache-Control: max-age=31536000
   ETag: "abc123"

5. 减少请求数
   - 合并JS/CSS文件
   - 使用CSS Sprites
   - 内联小图片(Base64)

6. 使用HTTP缓存
   - 强缓存: Cache-Control, Expires
   - 协商缓存: Last-Modified, ETag
数据库查询优化
-- 1. 使用索引
CREATE INDEX idx_user_email ON users(email);

-- 2. 避免SELECT *
SELECT id, name, email FROM users;  -- ✅
SELECT * FROM users;                -- ❌

-- 3. 使用LIMIT
SELECT * FROM orders LIMIT 100;

-- 4. 避免子查询(使用JOIN)
SELECT u.* FROM users u
JOIN orders o ON u.id = o.user_id;  -- ✅

SELECT * FROM users 
WHERE id IN (SELECT user_id FROM orders);  -- ❌

-- 5. 使用批量操作
INSERT INTO users (name, email) VALUES
('User1', 'email1@test.com'),
('User2', 'email2@test.com');  -- ✅

-- 多次单条插入  -- ❌

7. 常见网络问题排查

7.1 网络诊断命令

ping - 测试连通性
# 基本用法
ping www.google.com

# 指定次数
ping -c 4 www.google.com

# 结果分析
PING www.google.com (172.217.160.100): 56 data bytes
64 bytes from 172.217.160.100: icmp_seq=0 ttl=118 time=2.345 ms
                                              ↑      ↑
                                           生存时间  往返时延

--- www.google.com ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 2.123/2.345/2.567/0.123 ms

问题诊断:
- 100% 丢包 → 网络不通或防火墙阻止
- 部分丢包 → 网络不稳定
- TTL很小 → 路由跳数太多
- 时延很大 → 网络拥塞或距离远
traceroute - 追踪路由
# Linux
traceroute www.google.com

# Windows
tracert www.google.com

# 结果
 1  192.168.1.1 (192.168.1.1)  1.234 ms  0.987 ms  1.123 ms
 2  10.0.0.1 (10.0.0.1)  5.678 ms  5.432 ms  5.890 ms
 3  * * *  (超时)
 4  172.217.160.100  12.345 ms  12.123 ms  12.567 ms

分析:
- 显示数据包经过的每个路由器
- * * * 表示该跳不响应或被防火墙阻止
- 可以定位网络瓶颈
netstat - 网络连接状态
# 查看所有连接
netstat -an

# 查看TCP连接
netstat -ant

# 查看监听端口
netstat -tln

# 查看进程
netstat -tnlp

# 结果
Proto Recv-Q Send-Q Local Address    Foreign Address  State       PID/Program
tcp        0      0 0.0.0.0:80       0.0.0.0:*        LISTEN      1234/nginx
tcp        0      0 192.168.1.100:80 203.0.113.5:54321 ESTABLISHED 5678/nginx
tcp        0      0 192.168.1.100:80 203.0.113.6:54322 TIME_WAIT   -

状态说明:
LISTEN       - 监听状态
ESTABLISHED  - 已建立连接
TIME_WAIT    - 等待关闭
CLOSE_WAIT   - 等待关闭(对方关闭)
FIN_WAIT_1/2 - 主动关闭
tcpdump - 抓包分析
# 抓取指定端口
tcpdump -i eth0 port 80

# 抓取指定主机
tcpdump -i eth0 host 192.168.1.100

# 保存到文件
tcpdump -i eth0 -w capture.pcap

# 读取文件
tcpdump -r capture.pcap

# 过滤HTTP GET请求
tcpdump -i eth0 -A 'tcp port 80 and (tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420)'
ss - Socket统计
# 比netstat更快

# 查看所有TCP连接
ss -ant

# 查看监听端口
ss -tln

# 查看连接统计
ss -s

# 结果
Total: 183 (kernel 0)
TCP:   10 (estab 3, closed 2, orphaned 0, synrecv 0, timewait 2/0), ports 0

Transport Total     IP        IPv6
*         183       -         -
RAW       0         0         0
UDP       7         5         2
TCP       8         6         2
INET      15        11        4
nslookup/dig - DNS查询
# nslookup
nslookup www.google.com

Server:     8.8.8.8
Address:    8.8.8.8#53

Name:   www.google.com
Address: 172.217.160.100

# dig (更详细)
dig www.google.com

; <<>> DiG 9.10.6 <<>> www.google.com
;; ANSWER SECTION:
www.google.com.  300  IN  A  172.217.160.100

;; Query time: 23 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)

7.2 常见问题排查

无法连接服务器
# 1. 检查网络连通性
ping server_ip

# 2. 检查端口是否开放
telnet server_ip 80
# 或
nc -zv server_ip 80

# 3. 检查防火墙
# Linux
iptables -L -n
firewall-cmd --list-all

# 4. 检查服务是否运行
ps aux | grep nginx
systemctl status nginx

# 5. 检查监听端口
netstat -tln | grep 80
网络缓慢
# 1. 检查带宽
iftop    # 实时流量监控
iperf3   # 带宽测试

# 2. 检查延迟
ping -c 100 server_ip | tail -1

# 3. 检查丢包
ping -c 100 server_ip | grep loss

# 4. 检查连接数
ss -s
netstat -an | wc -l

# 5. 检查系统资源
top       # CPU、内存
iostat    # 磁盘IO
连接超时
# 1. 增加超时时间
curl --connect-timeout 10 --max-time 30 http://example.com

# 2. 检查DNS解析
time nslookup example.com

# 3. 检查路由
traceroute example.com

# 4. 检查MTU
ping -M do -s 1472 example.com  # Linux
ping -D -s 1472 example.com     # macOS

8. 面试高频题

Q1: TCP和UDP的区别?使用场景?

A: 见3.1节

场景选择:

使用TCP:
✅ 需要可靠传输(文件下载、网页浏览)
✅ 数据完整性要求高(支付交易、数据库同步)
✅ 有序传输(HTTP请求)

使用UDP:
✅ 实时性要求高(视频直播、语音通话)
✅ 允许少量丢包(游戏位置同步)
✅ 广播/组播(局域网发现)
✅ 简单查询(DNS)

Q2: 为什么TCP握手是三次,挥手是四次?

A:

三次握手:

  1. 客户端 → 服务器: SYN(我要连接)
  2. 服务器 → 客户端: SYN+ACK(可以,我也准备好了)
  3. 客户端 → 服务器: ACK(收到,开始传输)

为什么不是两次?防止已失效的连接请求到达服务器造成资源浪费。

四次挥手:

  1. 客户端 → 服务器: FIN(我不发了)
  2. 服务器 → 客户端: ACK(知道了)
  3. 服务器 → 客户端: FIN(我也不发了)← 可能延迟
  4. 客户端 → 服务器: ACK(知道了)

为什么不是三次?TCP是全双工,关闭需要双方都同意,但服务器可能还有数据要发。


Q3: TIME_WAIT状态有什么作用?过多如何解决?

A:

作用:

  1. 确保最后的ACK被对方收到
  2. 确保旧连接的所有报文都消失

TIME_WAIT过多的问题:

  • 占用端口(客户端有65535个端口限制)
  • 占用内存

解决方案:

# 1. 启用端口复用
sysctl -w net.ipv4.tcp_tw_reuse=1

# 2. 减少TIME_WAIT时间
sysctl -w net.ipv4.tcp_fin_timeout=30

# 3. 使用长连接
Connection: keep-alive

# 4. 使用连接池

Q4: 从输入URL到页面展示,经历了什么?

A:

1. URL解析
   https://www.example.com/index.html

2. DNS解析
   www.example.com → 192.168.1.1

3. TCP三次握手
   建立连接

4. TLS握手(如果是HTTPS)
   - 协商加密套件
   - 证书验证
   - 生成会话密钥

5. 发送HTTP请求
   GET /index.html HTTP/1.1
   Host: www.example.com

6. 服务器处理请求
   - 路由匹配
   - 业务处理
   - 返回响应

7. 浏览器解析渲染
   - 解析HTML → DOM树
   - 解析CSS → CSSOM树
   - 合并 → 渲染树
   - 布局 → 绘制

8. 加载资源
   - JS、CSS、图片等

9. 页面交互就绪

10. TCP四次挥手
    关闭连接(或保持连接)

Q5: 如何理解TCP的流量控制和拥塞控制?

A:

流量控制 (Flow Control):

  • 目的: 防止发送方发送太快,接收方来不及处理
  • 机制: 滑动窗口
  • 窗口大小: 接收方通告的接收缓冲区大小
接收方窗口: 4096字节
发送方最多发送: 4096字节
接收方处理后: 通告新窗口大小

拥塞控制 (Congestion Control):

  • 目的: 防止网络拥塞
  • 机制:
    1. 慢启动 (Slow Start): cwnd指数增长
    2. 拥塞避免 (Congestion Avoidance): cwnd线性增长
    3. 快速重传 (Fast Retransmit): 收到3个重复ACK立即重传
    4. 快速恢复 (Fast Recovery): 不回到慢启动

Q6: 常见HTTP状态码?

A:

2xx 成功:
200 OK              - 请求成功
201 Created         - 创建成功
204 No Content      - 成功但无内容返回

3xx 重定向:
301 Moved Permanently  - 永久重定向
302 Found              - 临时重定向
304 Not Modified       - 资源未修改(缓存)

4xx 客户端错误:
400 Bad Request      - 请求错误
401 Unauthorized     - 未授权
403 Forbidden        - 禁止访问
404 Not Found        - 资源不存在
429 Too Many Requests - 请求过多

5xx 服务器错误:
500 Internal Server Error - 服务器错误
502 Bad Gateway          - 网关错误
503 Service Unavailable  - 服务不可用
504 Gateway Timeout      - 网关超时

Q7: HTTPS加密过程?

A:

1. 客户端 → 服务器: Client Hello
   - 支持的TLS版本
   - 支持的加密套件
   - 客户端随机数

2. 服务器 → 客户端: Server Hello
   - 选择的TLS版本
   - 选择的加密套件
   - 服务器随机数
   - 服务器证书(含公钥)

3. 客户端验证证书
   - 检查CA签名
   - 检查有效期
   - 检查域名匹配

4. 客户端 → 服务器: 
   - 生成Pre-Master Secret
   - 用服务器公钥加密发送

5. 双方生成会话密钥
   Session Key = f(客户端随机数, 服务器随机数, Pre-Master Secret)

6. 开始加密通信
   使用对称加密(AES)传输数据

加密算法:

  • 非对称加密: RSA/ECDHE (握手)
  • 对称加密: AES-256-GCM (数据传输)
  • 哈希算法: SHA-256 (完整性)

总结

核心要点

  1. TCP/IP: 三次握手、四次挥手、状态转换
  2. 协议对比: TCP vs UDP,选择依据
  3. IP地址: 分类、子网划分、CIDR
  4. DNS: 解析流程、记录类型、优化
  5. 性能优化: TCP参数、HTTP优化、缓存
  6. 问题排查: 诊断命令、常见问题

面试建议

  • 理解协议原理,不只是记概念
  • 能画出握手/挥手流程图
  • 掌握常用网络命令
  • 结合实际项目经验

推荐书籍:

  • 《TCP/IP详解 卷1》
  • 《图解TCP/IP》
  • 《计算机网络 自顶向下方法》