【发布时间】:2015-10-18 20:35:34
【问题描述】:
我了解 TCP 被认为是一种可靠的协议,因为它向发送器发送确认信号,使其知道数据包完好无损地到达目的地。
在处理传入的 HTTP 请求时,TCP 是否会在将数据传递给 HTTP 协议进行处理之前发送确认信号?或者 HTTP 协议发送的响应消息是否兼作确认信号?
【问题讨论】:
标签: networking tcp
我了解 TCP 被认为是一种可靠的协议,因为它向发送器发送确认信号,使其知道数据包完好无损地到达目的地。
在处理传入的 HTTP 请求时,TCP 是否会在将数据传递给 HTTP 协议进行处理之前发送确认信号?或者 HTTP 协议发送的响应消息是否兼作确认信号?
【问题讨论】:
标签: networking tcp
您的问题在这里似乎有些题外话。但是……
简短的回答是肯定的。 TCP 在 HTTP 看到数据之前发送一个 ACK。但是 HTTP 响应不是 TCP ACK。
一个稍微长一点的答案是,在大多数系统上,TCP ack 独立于堆栈中更高层的处理。通常为每个数据窗口发送一个 ACK。窗口是两端同意发送而不需要ack的数据量——循环描述,但现实方式超出了这里的回答范围,重点是超出范围此处的答案以完整描述行为。
更长的答案是 HTTP(至少在 1.0 和 1.1 版本中)是在基于数据包的网络 (TCP/IP) 之上实现的流协议 (TCP) 之上实现的消息传递协议。 HTTP (1.x) 与堆栈中较低层发生的事情无关。虽然 TCP/IP 是在 OSI 网络模型出现之前设计的,但大多数实现都遵循该模型(尽管 TCP/IP 仅跨越第 3 层和第 4 层)。
事实的下一个版本是,应用层(在本例中为 HTTP)可以要求 TCP 层通过网络将数据无延迟地推送出去(参见 RFC793 第 2.8 节)——并且通常会在最后一次这样做HTTP 请求的数据包。
但是,对于 HTTP/2.0,情况就完全不同了;在实现流复用的 TCP/IP 公开的流之上还有额外的网络协议层。
【讨论】:
HTTP 使用 TCP 作为底层协议。 ACK 可以在空包(无应用程序数据)中发送,也可以在包含应用程序数据的包中发送。因此,客户端请求的 TCP ACK 可以是没有数据的单独数据包,也可以与 HTTP 响应在同一个数据包中发送。
【讨论】: