从实习开始我就接触 WebSocket 了。那时候项目用 Spring 自带的支持,照着文档配一配就能跑,ping/pong 心跳、断线重连,大概知道是怎么回事,但从没想过底层是怎么实现的。 后来换到 Netty,再后来接触了 .NET 的 SignalR,框架换了一个又一个,WebSocket 这块始终是拿来就用,从来没往深处想过。但有一个问题一直隐隐在脑子里:HTTP 和 WebSocket 共用同一个端口,一个普通的 HTTP 请求是怎么"变成" WebSocket 长连接的? 网上的技术文章讲这个要么一笔带…