目录
一、osi & tcp/ip模型
首先我们要了解osi七层模型,和预支对应的tcp/ip 四层的模型。
用下面的图可以看出,tcp udp 工作在传输层,而 http websocket 工作在应用层,但socket不属于七层模型中的任何一层,可以理解为socket工作在传输层与应用层中间的隐含层中。
socket 本身不是一种协议,而是对传输层中的 tcp/ udp 协议进行了封装,对用户隐藏了内部tcp/ udp 是如何传输的,只提供一套接口(api)给程序员调用(套接字),从而完成 socket 编程。通过 socket 接口,我们才能使用 tcp/udp 协议。
二、几者之间的关系
http websocket 等应用层协议通过 socket 接口从而调用 tcp/ udp 等传输层协议,从而达到网络通信。
tcp/ udp => socket => http websocket
综上所述,我们编程不会直接去调用tcp/ udp ,而是通过他们封装好的接口 socket 去通信。可以说,现在几乎网络上所有的通信,底层都是通过 socket 完成的,一切皆 socket 。
三、http
http 是基于 tcp 协议的应用的超文本传输协议,属于应用层的协议。请求时需建立 tcp 连接,请求结束后断开连接,完成一次请求/响应操作。
http 协议永远都是客户端发起请求,服务器回送响应,这样就限制了使用 http 协议,无法实现在客户端没有发起请求的时候,服务器将消息推送给客户端。
http 协议是一个无状态的协议,同一个客户端的这次请求和上次请求是没有对应关系。
四、socket
socket是对tcp/ip协议的封装,socket本身并不是协议,而是一个调用接口(api)
socket连接需要一对套接字,一个运行于客户端,另一个运行于服务端!之间的连接分为三个步骤:服务器监听,客户端请求,连接确认。
(1)服务器监听:服务端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
(2)客户端请求:由客户端的套接字提出连接请求,要连接的目标是服务端的套接字。所以客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
(3)连接确认:指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
五、websocket
websocket 也是一种协议,并且也是基于 tcp 协议的。可以理解为 websocket 是 http 的优化,但 websocket 不仅仅在web应用程序上得到支持。websocket 虽然是 html5 的产物,但也不仅仅局限于浏览器的应用程序,许多语言都提供了 websocket 的支持,比如c,c++,python等。
为了建立⼀个 websocket 连接,客户端浏览器首先要向服务器发起⼀个 http 请求,这个请求和通常的 http 请求不同,包含了⼀些附加头信息,通过这个附加头信息完成握⼿过程并升级协议的过程。如下图所示:
5.1、websocket 优点
- 节约带宽。不停地轮询服务端数据这种方式,使用的是 http 协议,head 信息很大,有效数据占比低, 而使用 websocket 方式,头信息很小,有效数据占比高。
- 无浪费。 轮询方式有可能轮询10次,才碰到服务端数据更新,那么前9次都白轮询了,因为没有拿到变化的数据。 而 websocket 是由服务器主动回发,来的都是新数据。
- 实时性,考虑到服务器压力,使用轮询方式不可能很短的时间间隔,否则服务器压力太多,所以轮询时间间隔都比较长,好几秒,设置十几秒。 而 websocket 是由服务器主动推送过来,实时性是最高的。
本文要是有不足的地方,欢迎大家在下面评论,我会在第一时间更正。
发表评论