Socket与WebScoket
socket
英文socket的意思是插座,网络中的Socket是一个抽象的接口,可以理解为网络中连接的两端。通常被叫做套接字接口,其意义在对传输层进行封装屏蔽了传输层的复杂性。它并不是一个协议,是为了大家更方便的使用传输层协议产生的一个抽象层。大部分的主流编程语言都提供socket函数.
套接字:TCP用主机的IP地址加上主机上的端口号作为TCP连接的端点,这种端点就叫做套接字(socket)或插口。
(套接字用(IP地址:端口号)表示。
WebSocket
WebSocket就是其中一种,是为了创建一种双向通信(全双工)的协议,来作为HTTP协议的一个替代者,以解决基于http上的长轮询等技术解决不了(或者解决的不那么优美)的问题。作为HTTP的替代者,它和HTTP(或者HTTP的长连接)的有一定的联系和区别!
在HTTP中,一个Request对应着一个Response,早期的HTTP1.0每次的HTTP连接都需要打开一个TCP连接,在一个Request后,服务器产生一个应答Request,这次HTTP连接就结束了,同时关闭了TCP连接,重复的建立TCP连接是一种资源浪费,主动关闭TCP连接后还会出现time_wait状态,继续占用资源 一段时间(可以看上一篇文章TCP连接和 time_wait、close_waite)
这种情况在HTTP1.1中进行了一定的改进,使得有一个keep-alive,也就是说,在一个HTTP连接中,可以发送多个Request,接收多个Response,可以减少建立和拆除TCP连接的次数,因此同时减少了time_wait状态的连接,但是,如果设置了keep-alive的超时时间比如nginx中是keepalive_timeout,一段时间没有通信超时后服务器主动关闭连接也是可能造成服务器出现time_wait状态的,如果不设置超时时间也会造成一定的资源浪费(占用连接却不发送数据),所以怎么设置这个超时时间也很重要。
本质上HTTP1.1中虽然可以保持持久的连接,但是它依然不是全双工的,因为服务端是不可以主动给客户端发送消息的,ajax轮询的方式虽然可以达到WebSocket全双工的类似效果,但是会造成大量的资源浪费。