当我们有TCP / IP时,为什么HTTP操作需要是幂等的?

时间:2011-05-03 13:32:24

标签: http networking rest tcp

如果TCP / IP是一个可以代表我们重试请求的可靠协议,为什么我们需要HTTP GET,PUT或DELETE才是幂等的?

3 个答案:

答案 0 :(得分:4)

TCP / IP不会重试请求,如有必要,它会重新传输构成每个请求的原始数据包

如果请求失败(在HTTP层),客户端的工作就是重试它,而不是网络堆栈。

特别是,如果客户端(出于任何原因)未能收到指示RESTful操作是否成功的响应代码,则客户端必须能够重新发送相同的操作,而不必担心任何意外的副作用。

这些故障可能发生 - 中间防火墙可能在服务器处理操作时超时连接。一旦收到它必须继续执行的请求,服务器就不会知道这已经发生了。

答案 1 :(得分:2)

您似乎在HTTP协议级别上将Idempotency与TCP级别的字节流可靠性混淆。

HTTP Idempotency:

Idempotent (wikipedia)表示发送10次相同的HTTP请求与执行一次相同的效果。

TCP可靠性:

如果丢失TCP流中的数据包,将重新传输。但应用程序协议(HTTP)并不知道TCP必须重新传输数据包。

即使包含完整HTTP请求的单个数据包被TCP重新传输10次,浏览器/服务器也只会看到一个HTTP请求。 TCP重新发送的原因是数据包丢失,但应用程序协议(如HTTP)不知道TCP必须重新传输。无论有无丢包,它们似乎都是相同的请求

答案 2 :(得分:2)

HTTP的GET,PUT和DELETE是幂等的,因为在某些网络故障模式下,客户端无法知道请求是完成还是完整。

例如,如果客户端请求资源的DELETE,但服务器在客户端收到完整响应之前关闭连接,则客户端不知道资源是否已删除。然后客户端陷入两难境地:操作可能失败,在这种情况下应该重新发送DELETE以便将应用程序推进到所需的状态。但也许它成功了;如果我重试,会发送相同的DELETE请求吗?也许它会起作用。也许它会返回500错误(这只会增加客户的困惑)。也许它适用于不同的资源!幂等性要求允许客户确信他们可以重试请求并使其工作。这并不意味着你会得到完全相同的反应;第一个请求可能会收到200 OK而第二个404 Not Found或410 Gone。但是客户不必担心重试会产生意外的副作用。