HTTP VS Websocket
实际上websocket协议和http是两个完全不想相关的协议,但是由于 之前HTTP已经大量普及,为了兼容之前的东西,websocket采用了一些HTTP存在的东西,比如握手规则等.
Websocket的协议升级过程
-
客户端发起一个头部包含协议升级请求的请求,请求头部为大概是这样
GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== Sec-WebSocket-Protocol: chat,superchat Sec-WebSocket-Version: 13 Origin: http://example.com
这样的一个请求告诉服务器,我需要一个websocket的服务,而不是Http. 与普通的HTTP请求相比,他有两个东西不一样: Connection,Upgrade 并且多了三个字段: key,protocol,version. 前面提到,websocket跟HTTP有交叉的地方,这里的连接建立方式就是一个共同点,都是发起一个请求的时候,通过三次握手建立TCP传输通道,然后发送请求,接收响应.
Key是浏览器确认服务器已经转换为websocket服务的凭证,这个key在后边还会用到.
protocol暂时省略... 待补充.
Version表示websocket的版本,因为一开始websocket只是一个草案,所以实现起来大相径庭. 为了能让协议更好地工作,就需要确定版本号. -
服务器返回101状态码,表示协议升级成功. 返回相应头部大概是这样:
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= Sec-WebSocket-Protocol: chat
Accept字段用于服务类型确认,这个字段是利用了客户端发来的key,加上一个'魔幻字符串',再经过SHA-1加密,最后经过base-64编码的一个十六进制字符串. 用于让浏览器确认,现在为其提供的服务是能处理websocket服务提供者.
连接建立完成
断开websocket连接.
待补充
学习笔记,纯新手一个,谨防坑.