A向B发送HTTP请求,并要求某些文档。 B回复并发送所请求的文档,并带有200 OK消息,但是机器A抱怨由于网络故障未接收到文档。
HTTP状态码200是否也可以作为确认已接收文档的标志?
HTTP 200状态码是否也表示已经接收到文档?
不是的,完全不是。
它甚至不能保证文档已完整传输。
响应代码位于响应流的第一行。服务器可能在发送第一行和响应的最后一个字节之间的任何位置失败或与客户端断开连接。服务器可能甚至不知道发生了这种情况。
事实上,服务器无法知道客户端是否已接收完整(或部分)HTTP响应。 HTTP协议中没有提供确认机制。
现在,您可以在HTTP之上实现一个应用程序协议,其中客户端需要向服务器发送第二个HTTP请求以表示“是的,我已收到文档”。但这将涉及用户浏览器中实现一些“应用程序逻辑”,例如JavaScript。
绝对不行。 HTTP 200 是由服务器生成的,仅表示它理解了请求并认为能够满足请求(例如文件实际上存在)。 传输完整响应文档期间可能发生各种错误(网络连接中断、丢包等),这些错误不会在 HTTP 响应中显示,但需要单独检测。
这里有一份关于HTTP协议的相当不错的指南:http://blog.catchpoint.com/2010/09/17/anatomyhttp/
你应该区分HTTP协议和底层流传输协议,后者应该对HTTP目的进行可靠传输。流传输协议将确认所有数据传输,包括响应,以确保交换的双方都确认数据正确传输。如果传输流失败,则会出现“网络故障”或类似错误。当发生这种情况时,HTTP协议无法继续;数据不再可靠甚至不完整。
在HTTP级别上,200 OK消息的意思是服务器具有您要请求的文档并即将向您传输它。通常还会得到一个内容长度头,因此您可以确定何时完成主体作为流协议的附加检查。从HTTP协议的角度来看,响应没有接收到任何确认,因此一旦响应被发送,就没有验证。
然而,由于流传输是可靠的,发送响应的行为将成功或导致错误。这确实验证了文档是否已被网络目标接收(如TripeHound所述,在非直接连接的情况下,例如代理,这不能保证传递到最终目标)。
200 OK
响应代码无法保证响应文档的任何内容。它是在文档被传输前发送的,因此只有违反因果关系才能使其依赖于成功接收文档。它只用作指示请求是否正确接收以及服务器是否能够满足请求的指标。如果请求需要额外处理(例如运行脚本),而不仅仅返回静态文档,则响应代码通常应在完成此操作后发送,因此通常表示此操作成功(但在存在持久连接和推送通知等情况下可能不可行,因为脚本可能稍后失败)。HTTP的设计考虑了各种"中间盒子"的可能性,这些代理能够在客户端知道或不知情的情况下进行操作。
如果有代理参与,则即使知道服务器传输了所有数据并收到了正常的关闭连接,也无法确定文档是否已被生成HTTP请求的机器接收。
A向B发送请求。在请求到达B之前,可能会有各种障碍阻止请求到达B。在https的情况下,请求可能已经到达B,但被拒绝,并且它将被视为未到达B。在所有这些情况下,B都不会发送任何状态。
一旦请求到达B,并且没有崩溃B的错误和硬件故障等问题,B将检查请求并确定要做什么以及要报告什么状态。如果A请求的文件存在并且A被允许访问,则B将开始发送“状态200”以及文件数据。
同样,各种事情都可能出错。A可能什么也没收到,或者收到了没有数据或不完整数据的“状态200”等。(通过“接收”,我指的是数据通过以太网电缆或WiFi到达)。
通常,A的用户将使用某个处理不良部分的库。使用一些体面的库,用户可以期望他们要么得到一些错误,要么得到一个带有相应数据的状态。如果状态200带有只有一半数据的到达A,用户将(根据库的设计)收到一个错误,而不是状态,绝对不是状态200。
或者你可能有一个库报告状态200并告诉你“这是前2000个字节”,“这是接下来的2000个字节”等等,当出现问题时,你可能会被告知“抱歉,发生了错误,数据不完整”。
但一般情况下,用户得到状态200但没有数据的情况是不会发生的。
random.nextInt(500)
作为其响应代码的Web服务器,如果我想的话。我可以让它始终返回404
,无论什么情况,并返回html
,就好像已经接收到了一切 - 这只是文本而已。底线是:你不能相信任何东西。 - corsiKa