谁发送http websocket升级请求?

7

Websocket?还是XMLHttpRequest?或者我必须自己处理?

所以我理解客户端必须发送它,但是什么时候发送以及为什么要发送呢?假设我使用XMLHttpRequest对象发送普通的HTTP GET请求。我无法控制浏览器内部TCP连接的持续时间,对吗?如果我想使用WebSockets,我不得不使用它们自己的WebSocket类,因此对于我作为用户,“升级”是不可见的,对吗?这只是浏览器在做一些内部魔法来重用连接,整个升级过程对我作为用户来说是无关紧要的吗?我仍然需要使用两个不同的类,只是碰巧使用相同的端口,然后浏览器出于性能原因决定升级。这是真的吗?

1个回答

24

不,WebSocket客户端发送HTTP请求请求建立WebSocket连接,然后服务器用HTTP 101 Switching protocols响应,表示接受了连接,然后客户端可以开始以二进制格式发送和接收数据。

示例客户端请求:

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

示例服务器响应:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat

这在维基百科文章中有很好的解释:http://en.wikipedia.org/wiki/WebSocket#WebSocket_protocol_handshake

同时,规范中也有详细说明:https://www.rfc-editor.org/rfc/rfc6455#section-1.3

这只是浏览器正在做一些内部魔法以重用连接,整个升级过程对我作为用户来说是无关紧要的吗?

没错。

我仍然需要使用两个不同的类,只是碰巧使用相同的端口,然后浏览器出于性能考虑决定升级。这真的正确吗?

如果您想使用AJAX,则使用XMLHttpRequest。 如果您想使用WebSocket,则使用WebSocket类。 仍然可以通过同一端口访问它们。 不同之处在于WebSocket连接将与服务器协商一个全双工持久的二进制通道,而XMLHttpRequest只会发出请求并获得响应。


哦,好的,所以每个WebSocket类如果想要发送二进制数据就会发送一个Http请求。那么假设我发送了一个http get请求,然后打开了一个websocket,然后再次发送一个普通的http get请求... 那么浏览器将不得不打开一个新的客户端套接字,因为旧的已经转换为websocket了,我认为现在它会永远保持这种状态,而且该套接字上的服务器端不需要能够处理http请求? - Blub
1
每个WebSocket连接始终以HTTP请求开头。一旦通过HTTP完成了WebSocket协商,连接不会关闭,它会保持打开状态,使用二进制帧进行消息传递直到关闭为止,在该通道中不再允许HTTP。这种HTTP协商机制非常有用,因为它允许遍历安全检查员,并且不需要在路由器和防火墙中映射和/或打开其他TCP端口;它还允许交换cookie,因此它在Web应用程序中具有很好的集成性。 - vtortola
1
@vtortola 服务器是否可以启动WebSocket升级?例如,浏览器客户端使用HTTP协议登录,一旦服务器验证了客户端,它会响应WebSocket升级。当客户端看到此响应时,它确认连接已升级为WebSocket,因此现在可以使用WebSocket与服务器通信。 - bobo
不,这是不可能的。客户必须请求升级。 - vtortola

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接