收藏
原创 小志 立志测试栈
(本文共约 3000 字,希望能帮你打开一扇新的大门。)
你好,我是小志。
最近约了几家面试,面试官都有问到“你们项目主要用什么协议?HTTP、TCP还是WebSocket?怎么测试的?区别是什么?”,“那你知道HTTP和TCP什么关系吗?”,“WebSocket和普通Socket有啥区别?”
说实话,这个问题面试官特别喜欢问,因为它能快速判断你对网络基础的理解深度。我在创业公司这几年,从接口测试到性能测试,各种协议都踩过坑,今天就把HTTP、TCP、WebSocket这三兄弟掰开揉碎了讲清楚。
面试官问这个问题,其实是想考察三点:
第一,你对项目架构的理解。不知道用啥协议,说明你只停留在功能层面,没关心过底层通信。
第二,你的测试方法是否匹配。不同协议,测试工具、关注点完全不同。HTTP用Postman、JMeter,TCP可能要用netty模拟客户端,WebSocket得用专门的工具或写脚本。
第三,你解决问题的能力。协议问题往往跟性能、稳定性相关,懂协议才能定位深层bug。
HTTP大家天天见,但很多人其实只懂皮毛。
HTTP是应用层协议,基于TCP/IP,默认端口80/443。特点是“请求-响应”模型:客户端发请求,服务端给响应,一次请求一次响应,完事后连接可能断开(短连接)或复用(长连接)。
基本功能:各种方法(GET/POST/PUT/DELETE)是否正常,状态码对不对(200、404、500等)。
请求头/响应头:Content-Type、Cookie、Token等是否传递正确。
参数校验:必填、类型、长度、边界值。
鉴权:cookie、session、token机制是否生效。
性能:并发下响应时间、TPS、错误率。
连接复用:HTTP/1.1支持长连接,但服务端配置不当可能导致连接数打满。
超时设置:连接超时、读取超时设置不合理,容易导致假死。
编码问题:中文乱码、特殊字符转义。
HTTP是建立在TCP之上的,但很多业务场景直接基于TCP开发,比如游戏、金融交易。
TCP是传输层协议,提供可靠的、面向连接的字节流服务。特点是有三次握手建立连接、四次挥手断开连接、数据包确认重传、流量控制、拥塞控制。
自研私有协议,比如某些物联网设备。
游戏服务器,实时性要求高,用TCP或UDP。
中间件通信,比如Redis、MySQL的底层连接。
连接建立与断开:握手是否正常,释放是否及时,半关闭状态处理。
数据收发:粘包和半包问题(因为TCP是流式协议,没有消息边界)。
心跳机制:长连接中,服务端和客户端如何保活。
重传机制:丢包时能否正确重传。
流量控制:发送方过快,接收方是否能处理。
telnet:简单测试端口连通性。
nc(netcat):发送原始TCP数据。
wireshark:抓包分析,看三次握手、数据包序列号等。
自己写客户端:用Java的Socket或Python的socket库模拟。
之前测一个游戏登录,玩家偶尔登录不上。抓包发现,客户端发起的TCP连接在三次握手的第二步就断了,后来发现是防火墙误杀。如果没有协议基础,这种问题根本无从下手。
随着Web实时性要求提高,WebSocket火了,比如在线聊天、直播弹幕、股票行情。
WebSocket也是应用层协议,但它实现了真正的全双工通信。客户端和服务端建立一次连接后,双方都可以随时发数据,避免了HTTP的轮询开销。
基于TCP:和HTTP一样,底层走TCP。
握手走HTTP:建立连接时,先通过HTTP请求升级协议(Upgrade: websocket),之后切换为WebSocket协议。
与HTTP不同:一旦建立,连接持续,数据帧格式也更轻量。
握手过程:检查Upgrade头是否正确,返回101状态码。
消息收发:文本消息、二进制消息是否正常。
心跳维持:长时间无消息时,连接是否自动断开。
异常场景:网络闪断、服务端重启,客户端能否重连。
性能:大量连接下,服务端内存、CPU消耗,消息延迟。
在线工具:WebSocket在线测试网站。
Postman:支持WebSocket请求。
JMeter:有WebSocket Sampler插件。
自己写脚本:Python的websocket库。
连接数限制:浏览器对同一域名有最大连接数限制,WebSocket也受影响。
代理兼容:某些代理服务器不支持WebSocket,导致连接失败。
心跳和超时:没有合理的心跳机制,连接可能被中间设备断开。
| 特性 | HTTP | TCP | WebSocket |
|---|---|---|---|
| 所属层级 | 应用层 | 传输层 | 应用层 |
| 连接方式 | 短连接/长连接 | 长连接 | 长连接 |
| 通信模式 | 请求-响应 | 双向流 | 全双工 |
| 数据格式 | 文本(报文) | 字节流 | 帧(文本/二进制) |
| 典型场景 | Web API、网页 | 数据库连接、自定义协议 | 实时聊天、游戏、推送 |
| 测试工具 | Postman、JMeter | nc、Socket编程 | WebSocket在线工具、JMeter插件 |
| 主要难点 | 鉴权、参数校验 | 粘包、重传、状态机 | 握手、心跳、并发连接 |
HTTP和TCP是什么关系?HTTP基于TCP,TCP提供可靠传输,HTTP在TCP基础上定义了请求-响应格式。
WebSocket和HTTP有什么区别?WebSocket是双向实时,HTTP是单向请求响应;WebSocket建立时用HTTP握手,之后独立。
怎么测试TCP粘包问题?模拟发送端连续发送小包,接收端看是否能正确解析;或者用wireshark抓包分析。
WebSocket断线重连怎么测?手动断开服务端连接或拔掉网线,观察客户端重连机制和消息续传。
别只停留在工具层面。用Postman调通接口不算什么,你得知道HTTP报文结构、状态码含义。
学会抓包。wireshark、Fiddler、Charles是必备技能,很多疑难杂症一看包就明白。
根据协议设计测试用例。比如测试TCP,要设计粘包、半包、重传场景;测试WebSocket,要设计心跳、断线重连场景。
多写代码模拟客户端。用Python或Java写个小程序,能让你更深入理解协议细节。
还没有关注我宝藏公众号的朋友,可以点个关注,后台回复“简历”获取模板,回复“基础”获取详细路线图,回复“面试”获取最新面试题库。让我们一起在测试的路上,越走越远!
我是小志,我们路上见。
-------------------------------
小志建了一个测试互助群,主要是各种行业测试工程师交流工作机会。扫码直接进群。群链接失效也可以扫描最下方二维码添加小志微信,备注【 进群 】直接拉 最近开发了一个免费面试刷题网站,扫描文末二维码或者添加小志微信lizhiceshi,添加时备注【网站】获取最新访问地址,欢迎围观学习~ 最后,有任何测试疑问以及在找工作需要免费诊断简历,或者免费测试资料,以及小志编写的软件测试面试宝典、整理的测试真实面经等可以扫码添加小志微信 lizhiceshi ,一定知无不言,言无不尽! 推荐阅读: 卡顿不止是网络问题?性能测试助你打造流畅体验 搞性能测试?Linux 命令帮你轻松搞定! 测试开发工程师必备技能分享:Mock的使用技巧 测试藏宝图(一份超全的测试资料)微信扫一扫关注该公众号
继续滑动看下一个