HTTP 响应“200 OK”是否保证文档已被生成 HTTP 请求的机器接收?
Does HTTP response "200 OK" give a guarantee that the document has been received by the machine who generated the HTTP request?
我有两台机器,A 和 B。
A 向 B 发送 HTTP 请求并请求一些文档。
B 回复并发送请求的文档并给出 200 OK 消息,但机器 A 抱怨由于网络故障而未收到文档。
HTTP 代码 200 是否也可以作为收到文档的确认?
Does the HTTP 200 code also work as an acknowledgment that document has been received?
没有。完全没有。
甚至不能保证文档已完整传输。
响应代码在响应流的第一行。服务器可能会失败,或者在发送响应的第一行和最后一个字节之间的任何地方与客户端断开连接。服务器甚至可能不知道这已经发生了。
事实上,服务器无法知道客户端是否收到了完整(或部分)HTTP 响应。 HTTP 协议中没有确认的规定。
现在您可以在 HTTP 之上实现一个应用程序协议,其中客户端需要向服务器发送第二个 HTTP 请求以说“是的,我收到了文档”。但这将涉及在用户浏览器中实现的一些“应用程序逻辑”;例如在 Javascript.
绝对不是。
HTTP 200 由服务器生成,仅表示它理解请求并认为它能够实现它(例如文件实际上在那里)。
全响应文档传输过程中可能会出现各种错误(网络连接断开、丢包等),这些错误不会在HTTP响应中体现出来,需要单独检测。
这里有一个很好的 HTTP 协议指南:http://blog.catchpoint.com/2010/09/17/anatomyhttp/
您应该区分 HTTP 协议和底层流传输协议,后者对于 HTTP 而言应该是可靠的。流传输协议将确认所有数据传输,包括响应,以便交换的两端确认数据被正确传输。如果传输流失败,您将收到 'network failure' 或类似错误。发生这种情况时,HTTP 协议无法继续;数据不再可靠甚至不完整。
在 HTTP 级别,200 OK 消息的含义是服务器拥有您要查找的文档并且即将将其传输给您。通常你也会得到一个 content-length header,所以你将能够确定 if/when body 作为流协议之上的附加检查是完整的。从 HTTP 协议的角度来看,响应不会收到确认,因此一旦发送响应就不会进行验证。
但是,由于流传输是可靠的,发送响应的行为要么成功要么导致错误。这确实验证了文档是否已被网络目标接收(如 TripeHound 所指出的,在 non-direct 连接的情况下,例如代理,这不是交付到最终目标的保证)。
HTTP 的设计考虑到了各种可能性 "middleboxes" - 代理在客户端不知情的情况下运行。
如果涉及到代理,那么即使知道服务器已经传输了所有数据并收到了正常的关闭连接,也不会告诉您文档是否已被的机器接收到的任何信息生成了 HTTP 请求.
A向B发送请求,请求到达B的途中可能有各种障碍,如果是https,请求可能到达B但被拒绝,算作它没有到达 B。在所有这些情况下,B 根本不会发送任何状态。
一旦请求到达 B,并且没有 Bug 导致 B 崩溃,也没有硬件故障等。B 将检查请求并确定要做什么以及报告什么状态。如果 A 请求了一个文件并且 A 被允许访问,B 将开始发送一个 "status 200" 连同文件数据。
同样,各种事情都可能出错。 A 可能什么也没收到,或者 "status 200" 没有数据或数据不完整等("receive" 我的意思是数据通过以太网电缆或通过 WiFi 到达)。
通常 A 的用户会使用一些处理丑陋位的库。对于一些像样的库,用户可以预期他们要么得到一些错误,要么得到一个包含相应数据的完整状态。如果状态 200 到达 A 时只有一半数据,用户将(取决于库的设计)收到错误,而不是状态,绝对不是状态 200。
或者你可能有一个报告状态 200 的库,并告诉你 "here's the first 2,000 bytes"、"here's the next 2,000 bytes" 等等,当出现问题时,你可能会被告知 "sorry, there was an error, the data is incomplete".
但一般情况下,用户得到状态200,没有数据的情况是不会发生的。
很简单,200 OK
响应代码不能保证响应文档的任何内容。它是在 之前 发送文档的,因此只有违反因果关系才能使其依赖于文档的成功接收。它仅作为请求已正确接收并且服务器认为它能够满足请求的指示器。如果请求需要额外的处理(例如 运行 一个脚本),而不是仅仅返回一个静态文档,通常应该在完成后发送响应代码,所以它通常是成功的指示(但有这是不可行的情况,例如具有持久连接和推送通知的请求——脚本稍后可能会失败)。
在更一般的层面上,由于 Two Generals Problem,永远不可能提供任何协议中的所有消息都已收到的绝对保证。没有确认系统可以解决这个问题,因为在某些时候必须有最后的确认;无法知道是否已成功接收,因为这将需要另一次确认,这与它是最后一次的前提相矛盾。
我有两台机器,A 和 B。
A 向 B 发送 HTTP 请求并请求一些文档。 B 回复并发送请求的文档并给出 200 OK 消息,但机器 A 抱怨由于网络故障而未收到文档。
HTTP 代码 200 是否也可以作为收到文档的确认?
Does the HTTP 200 code also work as an acknowledgment that document has been received?
没有。完全没有。
甚至不能保证文档已完整传输。
响应代码在响应流的第一行。服务器可能会失败,或者在发送响应的第一行和最后一个字节之间的任何地方与客户端断开连接。服务器甚至可能不知道这已经发生了。
事实上,服务器无法知道客户端是否收到了完整(或部分)HTTP 响应。 HTTP 协议中没有确认的规定。
现在您可以在 HTTP 之上实现一个应用程序协议,其中客户端需要向服务器发送第二个 HTTP 请求以说“是的,我收到了文档”。但这将涉及在用户浏览器中实现的一些“应用程序逻辑”;例如在 Javascript.
绝对不是。 HTTP 200 由服务器生成,仅表示它理解请求并认为它能够实现它(例如文件实际上在那里)。 全响应文档传输过程中可能会出现各种错误(网络连接断开、丢包等),这些错误不会在HTTP响应中体现出来,需要单独检测。
这里有一个很好的 HTTP 协议指南:http://blog.catchpoint.com/2010/09/17/anatomyhttp/
您应该区分 HTTP 协议和底层流传输协议,后者对于 HTTP 而言应该是可靠的。流传输协议将确认所有数据传输,包括响应,以便交换的两端确认数据被正确传输。如果传输流失败,您将收到 'network failure' 或类似错误。发生这种情况时,HTTP 协议无法继续;数据不再可靠甚至不完整。
在 HTTP 级别,200 OK 消息的含义是服务器拥有您要查找的文档并且即将将其传输给您。通常你也会得到一个 content-length header,所以你将能够确定 if/when body 作为流协议之上的附加检查是完整的。从 HTTP 协议的角度来看,响应不会收到确认,因此一旦发送响应就不会进行验证。
但是,由于流传输是可靠的,发送响应的行为要么成功要么导致错误。这确实验证了文档是否已被网络目标接收(如 TripeHound 所指出的,在 non-direct 连接的情况下,例如代理,这不是交付到最终目标的保证)。
HTTP 的设计考虑到了各种可能性 "middleboxes" - 代理在客户端不知情的情况下运行。
如果涉及到代理,那么即使知道服务器已经传输了所有数据并收到了正常的关闭连接,也不会告诉您文档是否已被的机器接收到的任何信息生成了 HTTP 请求.
A向B发送请求,请求到达B的途中可能有各种障碍,如果是https,请求可能到达B但被拒绝,算作它没有到达 B。在所有这些情况下,B 根本不会发送任何状态。
一旦请求到达 B,并且没有 Bug 导致 B 崩溃,也没有硬件故障等。B 将检查请求并确定要做什么以及报告什么状态。如果 A 请求了一个文件并且 A 被允许访问,B 将开始发送一个 "status 200" 连同文件数据。
同样,各种事情都可能出错。 A 可能什么也没收到,或者 "status 200" 没有数据或数据不完整等("receive" 我的意思是数据通过以太网电缆或通过 WiFi 到达)。
通常 A 的用户会使用一些处理丑陋位的库。对于一些像样的库,用户可以预期他们要么得到一些错误,要么得到一个包含相应数据的完整状态。如果状态 200 到达 A 时只有一半数据,用户将(取决于库的设计)收到错误,而不是状态,绝对不是状态 200。
或者你可能有一个报告状态 200 的库,并告诉你 "here's the first 2,000 bytes"、"here's the next 2,000 bytes" 等等,当出现问题时,你可能会被告知 "sorry, there was an error, the data is incomplete".
但一般情况下,用户得到状态200,没有数据的情况是不会发生的。
很简单,200 OK
响应代码不能保证响应文档的任何内容。它是在 之前 发送文档的,因此只有违反因果关系才能使其依赖于文档的成功接收。它仅作为请求已正确接收并且服务器认为它能够满足请求的指示器。如果请求需要额外的处理(例如 运行 一个脚本),而不是仅仅返回一个静态文档,通常应该在完成后发送响应代码,所以它通常是成功的指示(但有这是不可行的情况,例如具有持久连接和推送通知的请求——脚本稍后可能会失败)。
在更一般的层面上,由于 Two Generals Problem,永远不可能提供任何协议中的所有消息都已收到的绝对保证。没有确认系统可以解决这个问题,因为在某些时候必须有最后的确认;无法知道是否已成功接收,因为这将需要另一次确认,这与它是最后一次的前提相矛盾。