面试题精讲:网络

大家好,我是「面试冲刺站」的站长。作为后端开发(尤其是 Python 后端)的敲门砖,网络知识在中大厂笔面试中占比常超 25%——它不只是考点的堆砌,更是理解 Web 架构、排查线上问题(如超时、跨域、并发连接数打满)的核心钥匙。

今天这篇文章,我会拆解最常考的 10 个网络模块,补全逻辑链路,加一点点实战代码/配置片段,帮你把「背熟」转化为「说通」。


1. TCP 三次握手 (Establishment)

核心必问: 为什么不是两次/四次?

先看标准流程:

  1. SYN(同步):客户端向服务端发送同步序列号 seq=x,自己进入 SYN_SENT 状态。
    → 服务端收到后知道:客户端发送能力正常
  2. SYN/ACK(同步+确认):服务端返回自己的 seq=y + 对客户端的确认 ack=x+1,自己进入 SYN_RCVD 状态。
    → 客户端收到后知道:服务端收发能力都正常
  3. ACK(最终确认):客户端返回 ack=y+1,双方进入 ESTABLISHED 状态。
    → 服务端收到后才确定:客户端接收能力也没问题

为什么两次不行?

历史失效连接突然复活坑服务器: 假设网络卡,客户端第一次发的 SYN 很久才到服务端,此时客户端早放弃了第一次连接。如果只用两次握手,服务端收到后会直接开连接占资源,客户端根本不会理——三次握手的最后一步 ACK 能让服务端发现异常,及时释放资源。


2. TCP 四次挥手 (Termination)

核心必问: 最后为什么要等 2MSL

挥手的前提是「数据可能还没传完」,所以是半双工转全关闭的过程:

  1. FIN(无数据发送):客户端发起,进入 FIN_WAIT_1,告诉服务端「我这边发完了」。
  2. ACK(确认接收 FIN):服务端返回 ack=fin+1,自己进入 CLOSE_WAIT,告诉客户端「知道了,但我可能还有数据」。
  3. FIN(服务端也发完):服务端传完剩余数据,发起 FIN,进入 LAST_ACK
  4. ACK(确认服务端 FIN):客户端返回 ack=fin+1,进入 TIME_WAIT(2MSL);服务端收到后立刻关闭。

2MSL 的作用

MSL 是「报文最大生存时间」(RFC 建议 2 分钟,实际系统常用 30-60s):

  1. 确保最后一步 ACK 能送达:如果 ACK 丢了,服务端会重发 FIN,客户端在 2MSL 内能收到并再补 ACK。
  2. 本次连接的所有残留报文彻底从网络消失:避免新连接复用端口时,收到旧连接的脏数据。

3. HTTP 核心:GET vs POST

核心误区纠正: 不要再说「POST 比 GET 安全」!

先看官方定义+真实差异(HTTPS 场景下更明显):

特性GETPOST
HTTP 语义安全的「只读」操作(获取资源)非安全的「写」操作(提交/修改/删除,虽有 DELETE/PUT,但浏览器/HTML 表单只原生支持这俩)
幂等性✅ 是(多次调用同一接口,结果相同)❌ 否(多次提交表单会生成多个订单/评论)
参数位置URL Query String(浏览器会记录在历史、收藏夹、日志)Request Body(除非手动抓包,否则不会轻易暴露)
数据长度浏览器+服务器双重限制(Chrome 建议不超 2KB,IIS 默认 16KB)理论无限制(可配置服务器限制,如 Nginx 的 client_max_body_size
缓存行为默认被浏览器/CDN 缓存除非显式加 Cache-Control,否则不缓存

💡 避坑提醒:HTTPS 会加密整个 HTTP 报文,包括 POST 的 Body,但两者的域名、端口、路径还是在 TLS 握手阶段明文传输的。


4. 状态管理:Cookie, Session 与 JWT

本质问题: HTTP 是无状态协议,怎么知道「这个请求和上一个是同一个人发的」?

方案对比

方式存储位置安全性扩展性适用场景
Cookie浏览器(磁盘/内存)❌ 低:可被 JS 修改(除非加 HttpOnly)、易被 CSRF 利用✅ 高:无需服务器同步小量非敏感数据(如主题、语言偏好)
Session服务器(Redis/内存/文件)✅ 中高:敏感数据存在服务端❌ 低:多机部署需同步(如 Redis 共享)传统单体应用、银行等强安全性系统
JWT客户端(Cookie/LocalStorage)✅ 中:Payload 仅 Base64 编码(敏感数据要加密),依赖签名防篡改✅ 极高:服务端无状态,天然支持微服务/跨域现代 SPA、前后端分离、微服务架构

5. 负载均衡:Nginx vs Apache

核心考点: 为什么大厂几乎都用 Nginx 做入口层?

一句话总结差异:Nginx 靠「异步非阻塞(epoll)」拼并发,Apache 靠「多进程/线程」堆稳定

Nginx 实战配置片段(反向代理+简单轮询负载均衡)

这里加个代码高亮,更有博客味儿:

http {
    # 后端服务器池
    upstream python_backend {
        server 127.0.0.1:8000;  # Django/Flask/FastAPI
        server 127.0.0.1:8001;
        # ip_hash;  # 开启后同一IP的请求固定到同一台服务器(解决Session共享问题)
    }

    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_pass http://python_backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

6. HTTP 状态码速查表(面试高频10选7)

不用记太多,掌握这 7 个+场景就够应付 90% 的面试:

状态码含义面试场景解析
200 OK请求成功最基础的返回,GET/POST 通用
301 Moved Permanently永久重定向旧域名换新域名、HTTP 升级 HTTPS(搜索引擎会转移权重)
302 Found临时重定向未登录跳转登录页、临时维护页面(搜索引擎不转移权重)
304 Not Modified缓存生效上次请求的 ETag/Last-Modified 没变,服务器直接返回空 Body,省流量神器
403 Forbidden权限不足知道你是谁(有登录态),但没权限访问(如管理员后台)
404 Not Found资源不存在最常见的错误,路由写错、文件删除都会触发
502 Bad Gateway网关/代理无法连接后端后端服务挂了(如 Gunicorn/Uvicorn 进程崩了)
504 Gateway Timeout网关/代理等待超时后端接口处理太慢(如查数据库卡了)

7. Web 安全双子星:XSS 与 CSRF

这俩是开发岗+安全岗都爱考的基础,要分清原理和防御。

XSS(跨站脚本攻击)

原理:攻击者在页面注入恶意 JS 脚本,其他用户访问时会执行(偷 Cookie、篡改页面、跳转钓鱼链接)。 分三类:存储型(最危险,恶意脚本存数据库)、反射型(通过 URL 触发)、DOM型(在浏览器端 DOM 操作时触发)。 防御措施

  1. 所有用户输入进行转义(如 Flask 用 {{ }} 自动转义 HTML、Django 默认也是);
  2. 给敏感 Cookie 加 HttpOnly 属性(JS 读不到);
  3. 设置 Content-Security-Policy(CSP)头(限制页面可加载的资源)。

CSRF(跨站请求伪造)

原理:攻击者利用用户的登录态(Cookie 会自动跨域发送同源请求),在第三方网站伪造请求(如偷偷转账、修改密码)。 防御措施

  1. 验证 CSRF Token:每次提交表单/非幂等请求时,服务端生成一个随机 Token,客户端带回验证(Django/Flask 都有原生插件);
  2. 检查 Referer 头(但可能被伪造);
  3. 给 Cookie 加 SameSite 属性(Strict/Lax,限制跨域发送)。

8. Python Web 开发必知:WSGI 与 ASGI

一句话区分: WSGI 是「同步单路」,ASGI 是「异步多路」。

WSGI(Web Server Gateway Interface)

旧时代的标准(Django ≤3.1 默认、Flask 原生):

  • 一次请求,一个线程;
  • 不支持 WebSocket、Server-Sent Events(SSE)等长连接;
  • 性能一般,但生态极其成熟。

ASGI(Asynchronous Server Gateway Interface)

新时代的领航者(FastAPI/Starlette、Django ≥3.2 支持):

  • 原生支持 async/await,一个线程能处理成千上万的并发请求;
  • 支持 HTTP、WebSocket、SSE 等多种协议;
  • 性能高,适合做实时应用(如聊天、直播弹幕)。

9. *NIX 进程间通信 (IPC)(后端进阶偶尔考)

Python 写多进程程序时会用到,重点掌握「最快的」和「跨机器的」:

方式速度核心限制适用场景
管道 (Pipe)只能亲缘进程(父子/兄弟)用,半双工简单的父子进程数据传递
共享内存🚀 最快需手动处理锁(防止数据竞争)大量数据共享(如图像处理、科学计算)
Socket-跨进程+跨机器通信(分布式系统的基石)
信号量-只能做同步,不能传数据进程同步与资源竞争控制(如限制同时访问共享内存的进程数)

好啦,今天的网络面试题精讲就到这里!如果觉得有用,欢迎点赞、收藏、转发给正在找工作的朋友~

下次我们讲「Python 语言特性高频面试题」,不见不散!