根据Wikipedia,HTTP和WebSocket之间的唯一关系是Upgrade HTTP request
形式的额外握手。之后,似乎浏览器和HTTP服务器将通过普通套接字以旧的C / S范例进行通信。
所以我的问题是:
Web
Socket,因为通信目标是服务器的80端口?即port 80
只是web
的同义词。今天,我重温了@ jfriend00的优秀答案。让我们总结一下我的理解。
答案 0 :(得分:44)
webSockets和常规套接字不是一回事。 webSocket在常规套接字上运行,但在常规套接字之上运行自己的连接方案,安全方案和成帧协议,并且两个端点必须遵循这些额外的步骤才能建立连接。您可以在此处查看webSocket协议:http://tools.ietf.org/html/rfc6455
立即最大的区别是所有webSocket连接都是从客户端到服务器的HTTP请求开始的。客户端将HTTP请求发送到为正常Web通信打开的完全相同的服务器和端口(默认端口80,但如果Web服务器在不同的端口上运行,则webSocket通信将在其他端口上跟随它) 。客户端设置了一些自定义标头,其中最重要的是标头,表明客户希望升级"到webSocket协议。此外,双方还交换了一些安全密钥。如果服务器同意"升级",则客户端和服务器都将通过该原始套接字说出的协议从HTTP切换到webSocket,现在使用webSocket成帧协议。
此外,初始HTTP请求可以在其中具有请求路径以指示"子目的地"对于webSocket请求。这允许所有类型的不同webSocket请求都使用相同的服务器和端口启动。
还有一个带Sec-WebSocket-Protocol
标头的可选子协议说明符,允许请求进一步识别子协议(一个常见的协议可能是#34;聊天"),这样双方都可以达成一致意见一组特定的消息标识符及其可能使用的相应含义。
webSocket连接以HTTP连接开始这一事实非常重要,因为如果您可以访问Web服务器进行正常的Web通信,那么您可以访问它以获取webSocket请求,而客户端和服务器之间不需要任何网络基础设施在防火墙上打开新的洞或打开新的端口或类似的东西。
您可以在此处看到有关如何启动webSocket连接的完美摘要:https://developer.mozilla.org/en-US/docs/WebSockets/Writing_WebSocket_servers。
webSocket协议还定义了ping和pong数据包,帮助双方知道空闲的webSocket是否仍然连接。
人们只能假设将webSockets带入所有常见浏览器需要一段时间的原因与许多有用功能需要一段时间的原因相同。首先,一群有动力的人必须确定并同意需求,然后该小组需要带头制定解决问题的方法,然后这个想法会被激活一段时间,无论是收集支持,处理异议还是竞争解决这个问题的替代方法然后它似乎有足够的动力实际上可以成为一个标准,然后有人决定在浏览器和匹配的服务器实现中进行测试/试验实现(有时这个步骤来得更早)。然后,如果它仍然找到动力并且似乎处于标准轨道上,那么其他浏览器制造商将会接受这个想法并开始实施。一旦所有浏览器制造商都有一个体面的工作实施(通常有一些标准改进,因为不同的实现在规范中发现漏洞或早期开发人员发现问题或缺少功能或出现安全问题)。然后,它达到了至少两个主要浏览器在其最新版本中具有该功能的程度,该标准被认为相对稳固,并且消费者开始采用这些浏览器,并且一些站点通过使用新功能开始改善其用户体验。此时,尾随浏览器开始感到施加压力。然后,有时几年后,所有主流浏览器都具有该功能,并且这些浏览器具有足够的整体用户采用率,网站可以依赖该功能(无需具有主要的第二个后备设计,当浏览器不支持特征)。整个过程可能需要很多年。
这是启动webSocket连接的初始HTTP请求的示例:
GET /chat HTTP/1.1
Host: example.com:8000
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
并且,服务器响应:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
并且,数据框示例:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len | Extended payload length |
|I|S|S|S| (4) |A| (7) | (16/64) |
|N|V|V|V| |S| | (if payload len==126/127) |
| |1|2|3| |K| | |
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
| Extended payload length continued, if payload len == 127 |
+ - - - - - - - - - - - - - - - +-------------------------------+
| |Masking-key, if MASK set to 1 |
+-------------------------------+-------------------------------+
| Masking-key (continued) | Payload Data |
+-------------------------------- - - - - - - - - - - - - - - - +
: Payload Data continued ... :
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Payload Data continued ... |
+---------------------------------------------------------------+
答案 1 :(得分:7)
不,WebSockets不仅仅是普通的套接字。他们使用一个需要握手的成帧协议,然后用一个32位的随机数交换由XORint掩盖的消息。有关详细信息,请read the RFC which standardizes them。
这个额外编码层的原因是允许Web浏览器创建任意套接字连接会打开各种安全问题。例如,您可以使您网站的访问者通过SMTP连接到任意邮件服务器,并让他们发送垃圾邮件而无需用户意识到。这就是为什么协议的设计方式是任何服务器端应用程序都需要在从Web浏览器中使用之前有意地实现它。
关于端口:默认情况下,WebSocket连接到端口80,但API可以接收任何端口。客户端端口是随机的,就像大多数基于TCP / IP的协议一样。
为什么之前没有实现?因为直到最近,WhatWG和W3C还没有得到所有主要浏览器开发者的统一支持,无法获得引入新标准所需的权限。这就是为什么最近在HTML5标签下出现了大量新浏览器功能的原因。