为什么我们在\r\n
中使用HTTP headers
进行JS WebSocket
握手response
,却两次使用\r\n\r\n
,但没有在握手{{1}中进行握手}。无需添加request
就能握手响应吗?
\r\n
是否也用在\r\n
中?否,它仅用于TCP socket
?
例如:
JS WebSocket
答案 0 :(得分:3)
为什么我们在HTTP标头中使用\ n \ r来实现JS WebSocket握手响应...
最初的Websocket握手是HTTP。因此,所使用的消息格式在HTTP规范中定义。 HTTP本身是从诸如RFC 821(邮件格式)之类的早期标准中获得这一想法的,该标准再次从较旧的东西中得到了这一点-可以说,它的发展方式与语言的发展方式相似。一个人可能做了不同的事情,但现在却是这样。
重要的是,所有人都以相同的方式使用它,并以相同的方式理解它,包括理解它既不是您所说的\n\r
,也不是常用的\n
,而是{{1 }}。
\ n \ r是否也用于TCP套接字或否,仅用于JS WebSocket?
TCP是一个八位位组流,仅在TCP级别上不同的传输字节没有特定含义的情况下。 HTTP或WebSockets之类的应用程序层协议在字节中添加了含义,从而定义了所传输数据的结构。最终,WebSocket使用TCP套接字来传输消息,即WebSocket实质上定义了结构化消息以及如何将它们串行化为字节以在TCP提供的数据流中进行传输。
答案 1 :(得分:2)
初始WebSocket握手请求是标准的HTTP升级请求。 HTTP使用CRLF(可以使用\r\n
转义序列在许多语言(包括C和C ++)中表示)来终止消息标题中的每一行,并使用2个CRLF将消息标题与正文分开。格式化初始握手时,必须遵循HTTP规范。
阅读RFC 6455了解WebSocket协议规范,所有内容都包含在其中。