您现在的位置是:休闲 >>正文

socket与websocket区别

休闲1人已围观

简介Socket和WebSocket,名字看着像兄弟,实际却是两个时代的东西。Socket是操作系统提供的网络编程接口,你写TCP或UDP通信时用的就是它;而WebSocket是应用层协议,跑在HTTP之 ...

Socket和WebSocket,名字看着像兄弟,实际却是两个时代的东西。Socket是操作系统提供的网络编程接口,你写TCP或UDP通信时用的就是它;而WebSocket是应用层协议,跑在HTTP之上的,专门给浏览器和服务器搞实时双向通信用的。这俩根本不在一个层级,硬要比,就像拿“公路”和“快递服务”做对比——前者是基础设施,后者是建立在前者之上的业务模式。

拿个具体场景说事儿。你写个聊天软件,用原生Socket的话,你得自己管连接、分包、粘包、心跳检测,甚至要自己设计消息格式,一套流程下来,代码量不小,但好处是你能把每个字节都捏在手里。可要是放到Web环境里,浏览器压根不让你直接碰Socket——安全策略卡得死死的。这时候WebSocket就登场了,它本质上是HTTP协议的一次升级握手(状态码101),握手成功后,连接就从HTTP协议切换成WebSocket协议,之后两边就能自由地推数据了。

有个细节挺有意思:WebSocket的握手请求里有个`Upgrade: websocket`头,服务器看到这个头才决定要不要切换协议。而普通Socket连接根本不存在“升级”这回事,你创建socket fd的时候,协议类型就定死了。所以你看,WebSocket更像是HTTP的“变种”,而不是Socket的“Web版本”。很多新手被名字误导,以为WebSocket是Socket的封装,其实它俩唯一的共同点就是都叫“socket”而已。

再聊聊使用感受。用原生Socket做长连接,你得自己处理断线重连、半包黏包,还得考虑TCP的Nagle算法和延迟确认对实时性的影响。WebSocket呢,浏览器帮你把这些底层细节全吞了,你只管收发消息就行。但代价是——它只能跑在HTTP/HTTPS之上,而且消息格式有额外开销(每帧最少2字节头),对于高频小消息来说,效率不如裸TCP。

我见过不少团队在物联网项目里纠结选哪个。如果你的设备是嵌入式硬件,直接跟服务器通信,那肯定用原生Socket,因为WebSocket协议栈对MCU来说太重了。但要是做网页版数据看板,需要推送实时行情,WebSocket就是唯一合理的选择——你总不能要求用户装个客户端吧?

还有个容易踩的坑:WebSocket的“连接”是虚拟的,底层其实还是TCP连接。但WebSocket协议里有个关闭帧(close frame),而TCP的关闭是四次挥手。这意味着WebSocket连接关闭时,先发关闭帧,再走TCP的关闭流程,多了一层逻辑。有些程序员用WebSocket时没处理关闭帧,导致服务器端资源没释放干净,连接泄漏——这种问题用原生Socket反而不会遇到,因为close()一调,内核全给你收拾了。

说到底,选哪个不取决于“哪个更好”,而取决于“你在哪一层做开发”。写底层网络库、做游戏服务器,老老实实用Socket;搞Web应用,想快速实现双向通信,WebSocket是正道。别被名字忽悠了,这俩除了共享一个英文单词,技术栈上几乎没有交集。

Tags:

相关文章

  • 网上投资 做兼职 网恋 p2p回款维权

    休闲

    老张往那个叫“鑫源资本”的APP里又转了八万,是背着老婆卖的理财。客服说回款要“冲正”,得先交保证金。他信了,因为群里几十号人都在晒回款截图,截图上盖着红章,像模像样。交完钱,群主把他踢了,APP再也 ...

    【休闲】

    阅读更多
  • 江苏扬州的混凝土外加剂有限公司

    休闲

    江苏扬州的混凝土外加剂有限公司,厂区不大,藏在邗江区一条乡道边上。第一次去的人容易错过——门口没有气派的招牌,只有一块褪色的蓝底白字牌子,写着公司全称。但你要是往里面走几步,就能闻到那股特殊的化学气味 ...

    【休闲】

    阅读更多
  • struts2命令执行漏洞

    休闲

    2017年8月,Apache Struts2爆出S2-045漏洞,黑客只需构造一个恶意Content-Type头,就能远程执行任意命令。那几天,我所在的安全群里炸了锅——有人用PoC脚本扫全网,发现大 ...

    【休闲】

    阅读更多


友情链接