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

Sta*_*low 2 tcp http websocket handshake

为什么我们\r\n在 JS WebSocket 握手的 HTTP 标头中使用 ,并在最后使用response两次,但在握手中却没有使用?是否可以在不添加 的情况下进行握手响应?\r\n\r\nrequest\r\n

\r\n用于 TCP 套接字还是仅用于 JS WebSocket?

例如:

"Upgrade: something\r\n".
"Connection: something\r\n".
// ...
"Sec-WebSocket-Accept: something\r\n\r\n";
Run Code Online (Sandbox Code Playgroud)

Ste*_*ich 5

为什么我们在 JS WebSocket 握手响应的 HTTP 标头中使用 \n\r ...

最初的 Websocket 握手是 HTTP。所以所使用的消息格式是在HTTP规范中定义的。HTTP 本身就从早期的标准(例如 RFC 821(邮件格式))中汲取了这一理念,而 RFC 821(邮件格式)又是从旧的标准中汲取的——我们可以说,它的演变方式与语言的演变方式类似。人们可能会采取不同的做法,但现在是这样的。

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

\n\r 是否也用于 TCP 套接字或仅用于 JS WebSocket?

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