websocket-http
START >_
最近工作上接触到了websocket这概念,发现自己以前对它的理解一直都是错的,于是搜索了一下资料,决定写下来记录下来.
http协议
单向
客户端发起请求,服务端接收请求并响应,request–>response.
http建立在tcp之上,每个http请求发送到服务器时,客户端和服务端会打开TCP连接,客户端收到响应后,连接断开.
例如如果客户端向服务器发送10个请求,则将打开10个单独的
HTTP
连接。并在获得响应后关闭。
http与tcp
- http的长连接和短连接实际上是TCP长链接和短连接
- 每个
HTTP
连接完成后,其对应的TCP
连接并不是每次都会关闭。从HTTP/1.1
起,默认使用长连接,用以保持连接特性。使用长连接的HTTP
协议,会在响应头加入这个头部字段:Connection:keep-alive
- 长连接状态下,当一个网页打开完成,就是请求响应完成后,客户端和服务端之间的
TCP
连接不会关闭,如果客户端再次访问这个网页,将再次使用这条已经建立的TCP
连接.当然也不会永久保持,有一个超时时间,一般是服务器端设定(如nginx
默认时间是75s
). - 长连接需要客户端和服务端都支持
http
是应用层协议,在传输层使用TCP
协议,在网络层使用IP
协议.IP
协议: 解决网络路由和寻址TCP
协议: 解决如何在IP层之上可靠地传递数据包.(可靠收发,重传机制,保证顺序等)
数据结构
HTTP消息信息是用ASCII
编码的,每个HTTP
请求消息均包含HTTP
协议版本(HTTP/1.1
,HTTP/2
),HTTP
方法(GET
/POST
等),HTTP
标头(Content-Type
,Content-Length
),主机信息等。以及包含要传输到服务器的实际消息的正文(body
)。
HTTP
标头的大小从200字节到2KB
不等,HTTP
标头的常见大小是700-800字节。当Web
应用程序在客户端使用更多的如cookie
等其他工具扩展代理的存储功能时,它将减少HTTP
标头的荷载。
websocket协议
双向
- 全双工协议,以
ws://
或者wss://
开头 - 有状态协议,这意味着客户端和服务端之间的连接将保持活动状态,直到被任何一方终止.终止时,连接将从两端终止.
连接过程
比如
client
要向server
建立连接,首先会发送一个request到服务端,此时类似http
server
收到请求,会跟client
开始建立TCP
连接,三次握手,此时类似socket/tcp
连接当连接建立起来后,就会一直保持,并以全双工模式交换数据,直到某一方断开.
忘记了在哪里看到类似的比喻:
客户端骑马(http request)拉着两条水管到服务端请求建立连接,服务端收到后就跟客户端连起来两条水管(全双工长链接).直到某一端要拔掉水管(断开连接),则另一端也会拔掉水管(断开连接)
http长连接和websocket持久连接
http长连接
- 即在一定的期限内保持链接,客户端会需要在固定时间内向服务端请求大量的资源,保持TCP连接不断开。客户端与服务器通信,必须要由客户端发起然后服务器返回结果。客户端是主动的,服务器是被动的。
- 实际上是在一个TCP连接上传输多个
request
|respone
消息对,存在资源浪费,实时性不强等缺点 - 长轮询,即客户端发送一个超时时间很长的
request
,服务器hold住这个连接,在有新数据到达时response
websocket持久连接
- 只需建立一次
request
|respone
消息对,之后都是TCP
连接,避免了需要多次建立request
|respone
消息对而产生的冗余头部信息。
总结
WEBSOCKET | HTTP |
---|---|
全双工 | 单向,服务端不能主动推数据到客户端 |
一次建立持续使用 | 一次请求一个连接,每次连接都要重新tcp握手 |
具体要看使用场景:
如果需要长时间保持连接,持续交换数据时,使用websocket
,此时比起使用特定时间的http
长连接速度更快,也不存在断连重连的情况,如:
- IM
- 实时更新的页面
如果只是简单的一次请求获取数据,使用HTTP
即可