计算机网络专科毕业设计:从零实现一个轻量级HTTP代理服务器(含并发与安全考量)

📅 发布时间:2026/7/10 15:55:25 👁️ 浏览次数:
计算机网络专科毕业设计:从零实现一个轻量级HTTP代理服务器(含并发与安全考量)
计算机网络专科毕业设计从零实现一个轻量级HTTP代理服务器含并发与安全考量1. 为什么选“HTTP代理”当毕设做毕设最怕两件事选题太“水”老师一眼看穿只能拿及格技术太“重”三个月写不完最后靠 PPT 续命。HTTP 代理正好卡在中间网络协议全栈覆盖——TCP、HTTP、DNS、并发、缓存、安全都能聊代码量可控——核心转发 300 行就能跑后续再叠功能结果看得见——浏览器配一下代理就能演示答辩现场不尴尬。把“抓包Wireshark”那一套升级成“自己写个中间人”既闭环又有深度老师想不给优秀都难。2. 技术选型同步阻塞 vs 异步非阻塞先放结论专科毕设直接上异步非阻塞别纠结同步多线程。模型代表API优点痛点同步阻塞Python socket threading思路直观调试简单1k 并发就扛不住GIL 锁到怀疑人生异步非阻塞asyncio / Boost.Asio单线程扛 10k 并发代码干净回调/协程思维需适应场景建议只会 Python用asyncioasyncio.start_server三天出 demo熟悉 C上Boost.Asio顺便秀一把内存管理想写 JavaNetty 太重毕业设计容易写崩不推荐。下面所有示例以 Python 3.8 为准Win/Mac/Linux 通用装完即跑。3. 核心实现拆解3.1 整体流程图3.2 关键模块请求解析状态机逐行读\r\n首行拆出METHOD URL VERSIONHeader 用dict存遇到Host记录下游地址Body 按Content-Length或Transfer-Encoding读够长度即可。连接池管理浏览器 ↔ 代理 一条连接代理 ↔ 目标 另一条用asyncio.open_connection懒创建超时 10 s 回收毕设级别无需真“池”字典缓存已够用。Host 头处理绝对 URLhttp://example.com/path直接解析相对 URL 靠 Host 头补全缺 Host 直接回400 Bad Request防止裸 IP 撞库。错误统一封装网络异常 →502 Bad GatewayDNS 解析失败 →523 Origin Unreachable自己写 HTML 模板答辩时展示友好页面。4. 300 行能跑的参考实现目录结构先摆好方便直接塞论文附录mini_proxy/ ├─ proxy.py # 主入口 ├─ parser.py # 请求解析 ├─ logger.py # 脱敏日志 └─ tests/ └─ bench.py # 性能压测4.1 proxy.py#!/usr/bin/env python3 import asyncio, re, signal, sys from logger import logger from parser import parse_request, serialize_response # 全局配置 MAX_CONNS 1000 # 并发连接硬限制 TIMEOUT 10 BUF_SIZE 64 * 1024 semaphore asyncio.Semaphore(MAX_CONNS) async def relay(reader, writer, name): 无脑转发读到 EOF 自动关 try: while True: data await reader.read(BUF_SIZE) if not data: break writer.write(data) await writer.drain() except Exception as e: logger.debug(%s relay abort: %s, name, e) finally: writer.close() await writer.wait_closed() async def handle_client(client_r, client_w): async with semaphore: try: req await parse_request(client_r) logger.info(accept %s %s, req.method, req.url) # 连接目标 target_r, target_w await asyncio.wait_for( asyncio.open_connection(req.host, req.port, sslFalse), timeoutTIMEOUT) except Exception as e: logger.error(connect fail: %s, e) client_w.write(serialize_response(502, bodybGateway Error)) await client_w.drain() client_w.close() return # 如果客户端发的是 CONNECT直接隧道 if req.method CONNECT: client_w.write(bHTTP/1.1 200 Connection Established\r\n\r\n) await client_w.drain() await asyncio.gather( relay(client_r, target_w, client-target), relay(target_r, client_w, target-client)) else: # 普通 HTTP先转发请求头 target_w.write(req.raw_header) await asyncio.gather( relay(client_r, target_w, client-target), relay(target_r, client_w, target-client)) async def main(host0.0.0.0, port8080): srv await asyncio.start_server(handle_client, host, port) logger.info(Serving on %s:%s, host, port) await srv.serve_forever() if __name__ __main__: signal.signal(signal.SIGINT, lambda s, f: sys.exit(0)) asyncio.run(main())4.2 parser.py节选import re, dataclasses, asyncio dataclasses.dataclass class Request: method: str url: str version: str headers: dict host: str port: int raw_header: bytes async def parse_request(reader): header_lines [] while True: line await reader.readline() if line b\r\n: break header_lines.append(line) first header_lines[0].decode().rstrip() method, url, version first.split( , 2) headers {} for li in header_lines[1:]: k, v li.decode().split(:, 1) headers[k.strip()] v.strip() host_port headers.get(Host, ) if : in host_port: host, port host_port.rsplit(:, 1) port int(port) else: host, port host_port, 80 raw_header b.join(header_lines) b\r\n return Request(method, url, version, headers, host, port, raw_header)4.3 logger.pyimport logging, re class SensitiveFilter(logging.Filter): def filter(self, record): record.msg re.sub(r(Authorization: )\S, r\1[REDACTED], record.msg) return True logger logging.getLogger(mini_proxy) logger.setLevel(logging.INFO) logger.addHandler(logging.StreamHandler()) logger.addFilter(SensitiveFilter())代码跑通步骤安装依赖Python 3.8 即可无需第三方库终端执行python proxy.py默认监听 8080浏览器设 HTTP 代理127.0.0.1:8080访问任意网站看到日志 200 即成功Ctrl-C 优雅退出。5. 性能与安全别只跑通还得抗揍5.1 并发连接数限制用asyncio.Semaphore(MAX_CONNS)硬控超阈值直接拒连防止文件描述符爆掉。答辩时把ulimit -n打印出来显得你懂系统调优。5.2 慢速攻击Slowloris防御读头阶段加总超时asyncio.wait_for(..., 5s)防止恶意客户端 1 byte/s 拖死协程。body 阶段按Content-Length限速 64 KB/s超阈值直接 408。5.3 日志脱敏用 Filter 正则抹掉Authorization、Cookie字段防止演示时把账号投屏。日志落盘按天分割既省空间又方便老师复查。5.4 基础访问控制加分项在parse_request后加黑白名单黑名单返回403 Forbidden白名单外返回404 Not Found。配置文件写 JSON答辩现场随手改互动感拉满。6. 生产环境避坑指南提前写进论文“展望”TIME_WAIT 堆积高并发压测后netstat -ant | grep TIME_WAIT一看上万条别慌调低net.ipv4.tcp_fin_timeout或打开SO_LINGER杀连接论文里写“后续可加入连接复用”。DNS 缓存污染默认asyncio每次现查 DNS压测线程一多就把系里 DNS 打挂用aiodnslru_cache把解析结果缓存 60 s老师直呼内行。代理链路编码问题部分老站gzip后忘记给Content-Lengthrelay会提前关连接解析Transfer-Encoding: chunked时把 chunk 大小行全部转发别自作主张拼接。HTTPS CONNECT 没实现目前代码只演示 HTTP论文里写“后续可扩展 TLS 嗅探与证书动态签发”一句话把坑占住。7. 5 分钟压测数据直接进论文工具ApacheBench 或 hey单文件绿色版# 开 2 终端 # 1. 启动代理 python proxy.py # 2. 起压测 hey -n 10000 -c 200 -x http://127.0.0.1:8080 http://目标站/输出示例Requests/sec: 5342 Transfer/sec: 28.73 MB把 QPS、时延 P99、CPU 占用截图插论文比贴 Wireshark 五颜六色包更吸睛。8. 可继续叠的功能写到“展望”能凑字数HTTPS CONNECT 动态证书实现全流量中间人限流模块令牌桶算法保护后端小水管缓存层用lru-dict把静态图片缓存 5 分钟演示断网还能刷出 logoWeb 后台Streamlit 快速搭实时看 QPS、带宽、热点域名Docker 化一行docker run -p 8080:8080直接交镜像老师免安装。9. 小结把“能跑”变成“能讲”毕业设计不是代码马拉松而是“讲清动机→展示实现→抛出数据→承认不足”的闭环。HTTP 代理麻雀虽小五脏俱全协议解析、并发模型、安全加固、性能压测、运维坑位一步不落。三个月时间先用两周跑通 300 行核心再按需叠功能最后两周整理图表和答辩稿节奏刚刚好。祝各位网络专业同学都能把“代理”写成“加分项”顺顺利利毕业。代码仓库丢到 Gitee附 README 和实验数据明年师弟师妹还能继续 Star何乐而不为