[转]Websocket 底层是 TCP 还是 UDP?白话版解析 TCP 和 UDP 传输过程

发布时间 2023-09-24 17:34:42作者: dirgo

原文地址:Websocket 底层是 TCP 还是 UDP?白话版解析 TCP 和 UDP 传输过程 - 掘金

写在前面

在前面陆陆续续写了好几篇数字孪生相关的文章,而其中所涉及的一个其他项目比较不常使用的技术,网络通讯协议 Websocket,这个协议主要用于服务器定时向客户端推送数据,相比 HTTP 更加适合数字孪生应用场景,在项目的使用中我们能够体会到他所带来的优越性,而如果我们想要探究一下底层原理,你还能说清楚吗?

Websocket 是什么?

WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

如果对于Websocket 这种通信协议还不是很了解的话,可以看看我之前的文章 面试官:除了 HTTP,你还用过什么通信协议?(Websocket 在数字孪生中的应用), 本篇主要复习 TCP 与 UDP 两个协议的异同点以及 Websocket 使用的哪个底层协议。

TCP

什么是 TCP?

传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793 [1]  定义。

TCP旨在适应支持多网络应用的分层协议层次结构。 连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。TCP假设它可以从较低级别的协议获得简单的,可能不可靠的数据报服务。 原则上,TCP应该能够在从硬线连接到分组交换或电路交换网络的各种通信系统之上操作。

TCP三次握手与四次挥手

初略了解过 TCP 连接过程的朋友可能都听过 TCP 的三次握手和四次挥手,但是看了好多的关于三次握手四次挥手的解释,都显得非常专业,每个过程的 SYN/ACK 等标识符让初学者或者非网络出身的人看了一头雾水,不仅没有促进我们理解连接过程,反而徒增了更大的盲区。今天我就用更加简洁的方式,通过画图,来给大家呈现一个更加解析的连接过程,让大家能够抛开细节,从更加宏观的角度理解建立连接的原理。

TCP 三次握手

过程如下图,可以看到 A 主机想要与B 主机建立连接,需要通过 3 个 来回,最后形成“默契”,才能够建立连接。这过程是不是像极了我们周末约朋友打麻将的场景,首先第一步,你需要打探一下对方是否方便(确定是否空闲),第二步是=对方抛出连接信号,表明愿意连接(推进事件发展),第三步则是最后一步,与对方约定具体方安排,让对方在家等着(双方确认周末安排)

当完成了这三步后,双方的连接才算完整建立,接下去才是真正的数据传输过程。在建立连接的过程中,其实涉及很多的连接确认机制,更加详细的连接过程看下图2的详细说明,这里主要让大家理解过程,不深究细节!

批注 2022-06-27 210406.png

批注 2022-06-27 214227.png

TCP 四次挥手

四次挥手和三次握手过程其实差不多,如图所示,A 主机和B 主机想要断开连接,想要通过4个来回,最后“达成共识”,才算完成断开操作。具体过程如下

还是以A 主机做客的例子来讲解,首先 A 告诉 B,我要走了,这个时候,B 为了表达自己非常热情好客,所以 B 没有直接让 A 走,而是告诉 A ,先暂留一会,等我把给你准备的礼物奉上后,再离开,这个时候,B 赶忙回到房间,翻箱倒柜掏出了自己珍藏多年的好酒,给 A 带去,然后才送 A 离开,最后 A 向 B 挥挥手,告别 B 而去,整个断开过程结束!!在下面图二依然附上详细的细节图解,有兴趣的可以自行了解了解。

批注 2022-06-27 220111.png

批注 2022-06-27 220331.png

TCP 握手和挥手次数为什么不一样?

分析了三次握手和四次挥手后,可能大家会有一个疑问,为什么建立连接只需要3个数据包做确认,而断开却需要4个数据包呢?这也是一个面试经常会被问到的题目,我们来稍微解析一下。

我们仔细回忆一下我们平时进行网络请求的过程,通常,我们进行数据请求的时候,发送完请求,我们需要等待一段时间,才能收到对端的回复,这个时间也就是响应时间,当我们请求的数据非常大的时候,那么响应的时间就会非常长,而在这个时候,当我们发起断开连接的指令时,对端并没有完成请求内容的传输,因此,对端需要发送一个数据报文,表明目前依然有任务需要传输,然后继续将剩下的数据传输完毕后,再次发送数据报文告知我们,数据传输完成,我们才能成功断开连接。

可以看到,四次挥手比三次握手多,主要是体现在数据传输这一步,只要我们理解了整个传输过程,这个问题,可以说是完全没有难度的。

UDP

Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。由于 UDP 是无连接的,因此这里就不分析 UDP 的传输过程了,接下来主要了解 UDP 与 TCP 的异同点。

TCP 与 UDP 的区别

这里主要列举几个比较常见的异同点

TCP 面向连接,通过三次握手和四次挥手建立和断开连接,因此需要牺牲部分性能,用于处理连接与断开的相关操作,由于 TCP 是面向连接的,具有非常多的传输相关的控制方案,因此,TCP 传输过程更加可靠,

UDP 无连接传输,只关心发包,不关心对方是否收到,因此可能出现丢包情况,而由于不需要进行相关的包确认,因此 UDP 相比 TCP,性能表现上更加优异,在对于数据完整性要求不是很高的情况下,可以使用 UDP 替换 TCP,获取更高的性能

Websocket 底层是 TCP 还是 UDP

分析完 TCP 和 UDP,那回到题目抛出的问题,“Websocket 底层是 TCP 还是 UDP”,答案是 TCP,Websocket 的诞生可以说是特定场景下 Http 的优化方案,也就是说 Websocket 也是像 HTTP 一样的“可靠的传输方式”,因此 Websocket 采用的依然是与 HTTP 相同的 TCP 作为底层协议来支撑起进行可靠的传输过程!

总结

通过对 TCP 以及 UDP 相关传输过程的分析和比较,从原理上理解了整个传输过程后,对于相关的问题,我们也就能够以更加准确的方式来判断,而不是盲目地做选择题,这也印证了我一直坚信的观念,从原理出发,才能看到事情的本质,看透了本质,任何的变幻,都不过是幌子罢了,驴依然是驴,骡依然是骡!!!


作者:YimWu
链接:https://juejin.cn/post/7113928853281587231
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。