是否可以在一个数据包中批处理多个 HTTP 消息?
Is it possible to batch multiple HTTP messages inside a one packet?
我的一个朋友提到我可以在一个 TCP 数据包中以批量方式发送 TLS 应用程序数据(HTTP 消息),而不是一个一个地发送。
我已经使用 Google 研究了他的说法,但找不到。
这可能吗?这不会导致浏览器出现解析问题吗?
HTTP 是一种请求-响应协议,即每个请求都需要一个响应。 HTTP/1 的传统方式是先发送一个请求,然后等待响应,然后发送另一个请求(如果支持 HTTP keep-alive 并且连接保持打开状态)并期待响应等。使用这个过程它多个请求不可能在同一个数据包中结束,因为在发送下一个请求之前必须等待当前请求的响应。类似的多个响应通常不会出现在同一个数据包中,因为还有一个未完成的响应。这里的一个特例是初步响应(状态代码 100),其后是“真实”响应。这些可以一起发。
使用 HTTP pipelining 可以一次发送多个请求,然后等待所有响应以与发送请求相同的顺序发回。在这种情况下,多个请求可能会在同一个数据包和多个响应中结束。但实际上允许服务器在响应完成后关闭连接。在这种情况下,请求可能得不到答复,并且可能需要重新发送请求。但实际上服务器可能已经处理了请求,但在发送响应之前连接已关闭,因此只有在不改变语义(即幂等请求)的情况下才应进行重放。
HTTP/2 然后支持并行发送请求,即请求实际上可以相互交错,与响应相同。这样,多个请求或响应也可能在同一个数据包中结束。
除此之外,可能需要澄清一点:普通应用程序不发送 TCP 数据包,但它发送数据。这些数据如何打包传输取决于内核,例如取决于 MTU。可能是单个 send
导致多个数据包。也可能是多个 send
彼此相继组合在一起成为一个数据包。
我的一个朋友提到我可以在一个 TCP 数据包中以批量方式发送 TLS 应用程序数据(HTTP 消息),而不是一个一个地发送。
我已经使用 Google 研究了他的说法,但找不到。
这可能吗?这不会导致浏览器出现解析问题吗?
HTTP 是一种请求-响应协议,即每个请求都需要一个响应。 HTTP/1 的传统方式是先发送一个请求,然后等待响应,然后发送另一个请求(如果支持 HTTP keep-alive 并且连接保持打开状态)并期待响应等。使用这个过程它多个请求不可能在同一个数据包中结束,因为在发送下一个请求之前必须等待当前请求的响应。类似的多个响应通常不会出现在同一个数据包中,因为还有一个未完成的响应。这里的一个特例是初步响应(状态代码 100),其后是“真实”响应。这些可以一起发。
使用 HTTP pipelining 可以一次发送多个请求,然后等待所有响应以与发送请求相同的顺序发回。在这种情况下,多个请求可能会在同一个数据包和多个响应中结束。但实际上允许服务器在响应完成后关闭连接。在这种情况下,请求可能得不到答复,并且可能需要重新发送请求。但实际上服务器可能已经处理了请求,但在发送响应之前连接已关闭,因此只有在不改变语义(即幂等请求)的情况下才应进行重放。
HTTP/2 然后支持并行发送请求,即请求实际上可以相互交错,与响应相同。这样,多个请求或响应也可能在同一个数据包中结束。
除此之外,可能需要澄清一点:普通应用程序不发送 TCP 数据包,但它发送数据。这些数据如何打包传输取决于内核,例如取决于 MTU。可能是单个 send
导致多个数据包。也可能是多个 send
彼此相继组合在一起成为一个数据包。