浅谈一下socket底层

Source

目录

Socket简述:       

Http协议:

WebSocket:

我们来说一下为什么有了http还要使用websocket?

Socket底层原理

接收数据:

发送数据:

解析socket:


Socket简述:       

 说起socket,我们可能不得不想到 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议——WebSocket。

        WebSocket让服务器与客户端之间的交互变得更加简单,允许服务端向客户端发送数据。可能此时我们想到了Http协议。那么就接下来我们根据Http协议与WebSocket协议的区别来深入理解socket的好处。

Http协议

        我们都知道Http协议的连接需要建立三次握手,那么这就注定了当客户端向服务端发送请求给客户端的时候,服务端向客户端返回结果,但是想要再次使用 的时候,还需要向客户端发送请求,这就比较繁琐,服务端无法主动向客户端发送请求。

        于是有了websocket,在websocketApi中,浏览器与服务器之间只需要完成一次握手,两者之间就直接可以创建持久化的连接,并进行双向数据传输。

        我们可以了解到websocket的最大的特点就是:服务器可以主动向客户端推送消息,客户端也可以主动向服务端发送消息,是真正的双向平等对话,属于服务器推送技术的一种。

WebSocket

        客户端发送一个请求,服务端确认了之后,然后服务端与客户端就可以互传了,服务端也可以主动向客户端推送消息。socket只需要进行一次握手,就可以让服务端主动向客户端发送消息。

        其他的特点:较少的控制 开销,更好的实时性,保持连接状态,更好的二进制支持。可以支持扩展,更好的压缩效果。

我们来说一下为什么有了http还要使用websocket?

        那我们举例来说吧,比如天气,我们想要知道实时的天气状况,只能是客户端向服务端发送请求,服务器返回查询结果,这个Http协议做不到服务器主动向客户端推送消息。当然,并不是严格的做不到,我们可以采用Ajax轮询,现在网站为了实现推送技术,所用的技术一般都是Ajax轮询,轮询就是特定的时间由浏览器对服务端发送Http请求,然后由服务端返回最新的天气数据结果给浏览器,就像是定时任务,到了某个时间就特定发消息给服务器 。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。

        而比较新的技术去做轮询效果的就是Comet。这种技术虽然可以双向通信,但依然 需要反复发出请求。而且在Comet中,普遍 使用的是长链接,也会消耗 服务器资源。   

        HTML5 定义的 WebSocket 协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯 。

Socket底层原理

        我们了解了 一部分的socket,接下来肯定好奇socket底层是怎么工作的啊,底层是如何实现这种自动“轮询”的呢?

        我们从三个方面 来做介绍:

接收数据:

        两个服务器之间传输数据,需要使用网卡,通过网卡将数据发过去并且存到内存当中。服务器接收不同的程序是通过不同的端口来确定的,并且接收过来的数据不是直接过来,而是集中存储在一个地方。由每个端口去调用,隔一段时间去看一下,这就是“轮询”机制。这个socket内部服务器中有一个listen方法,是用来监听的,这个就是用来轮询的,每隔一段时间来看一次。

发送数据:

        发送也是需要socket,整个网络中传输的全部都是二进制的比特数据,内存中的变量基本都是基本类型组成的,所以这些数据来源于内存中变量,所以这些比特数据长度基本都是8的倍数。在计算机是数组形式存在,所以8bit形成一个byte数组,而且都是基本数据类型数组。不管是字节流、字符流,只要是流,底层都是数组组成的。所以发送的时候都是以基本数据类型数组发送的,接收的也是数组。

解析socket:

物理层决定01比特如何传输,一对一传输(电压信号)。

链路层表示局域网之内如何传输。

网络层表示广域网之间如何传输。

传输层表示tcp协议,udp协议,保障稳定可靠传输。

应用层:http协议、ftp协议,这层基本都是人为自定义的。这层是以下面四层为基础的,必须依托于他们。

socket就是到了传输层,其实到了传输层就可以稳定传输了。

对于一堆01比特数据,开头是物理层的协议,去掉后面就是物理层的数据,在这个物理层数据中,前多少位约定好的就是链路层的协议,后面就是链路层的数据,传输层之前,层层包含。到了网络层的数据包含链路层协议和数据,对于传输层的数据,需要先读前几位确定编码,比如ASCII码,每8位确定一个字符,把文字就兑换过来了。

应用层就是传输层的数据组成的。但是应用层不像其他这样有规律,他的协议和数据可能交错在一起。http协议就是混在一起的,我们看到的请求头什么是因为有换行符,本质就是字符串。

网卡就是负责这些01比特数据封装成byte类型数组,通过socket进行解析。

文件也是编码,发文件也是采用01比特编码,然后文件的开头需要标记是什么类型的。分成一份份的传出去,然后由接收方拼起来。