为什么我们在 websocket 握手响应中使用 \n\r?

why we use the \n\r in the websocket handshake response?

为什么我们在HTTP headers中使用\r\n进行JS WebSocket握手response和两次\r\n\r\n最后握手request。这是否可以在不添加 \r\n 的情况下进行握手响应?

\r\n 是否也用于 TCP socket 还是仅用于 JS WebSocket

例如:

"Upgrade: something\r\n".
"Connection: something\r\n".
// ...
"Sec-WebSocket-Accept: something\r\n\r\n";

Why we use the \n\r in HTTP headers for JS WebSocket handshake response ...

最初的 Websocket 握手是 HTTP。所以使用的消息格式在 HTTP 规范中定义。 HTTP 本身从早期的标准(如 RFC 821(邮件格式))中获得了这个想法,它再次从旧的东西中得到了这个——我们只是说它的演变方式与语言的演变方式相似。人们可能会以不同的方式做到这一点,但现在就像这样。

重要的是所有人都以相同的方式使用它并以相同的方式理解它,包括理解它既不是您所说的\n\r,也不是通常使用的\n,而是\r\n.

Are the \n\r is also used in TCP socket or no it is only used for JS WebSocket?

TCP 是一个八位字节流,只有在不同的传输字节在 TCP 级别没有特定含义的情况下。 HTTP 或 WebSockets 等应用层协议为字节添加了含义,从而定义了传输数据的结构。最终,WebSockets 使用 TCP 套接字来传输消息,即 WebSockets 本质上定义了结构化消息以及它们如何序列化为字节以便在 TCP 提供的数据流中传输。

最初的 WebSocket 握手请求是一个标准的 HTTP 升级请求。 HTTP 使用 CRLF(在许多语言中可以使用 \r\n 转义序列来表示,包括 C 和 C++)来终止消息的 header 中的每一行,并使用 2 个 CRLF 来分隔消息的 headers 来自其 body。格式化初始握手时必须遵循 HTTP 规范。

阅读 RFC 6455 了解 WebSocket 协议规范,其中包含所有内容。