Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当我们有TCP/IP时,为什么HTTP操作需要是幂等的?_Http_Networking_Rest_Tcp - Fatal编程技术网

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

当我们有TCP/IP时,为什么HTTP操作需要是幂等的?,http,networking,rest,tcp,Http,Networking,Rest,Tcp,如果TCP/IP是代表我们重试请求的可靠协议,那么为什么我们需要HTTP GET、PUT或DELETE是幂等的?TCP/IP不会重试请求,它会在必要时重新传输组成每个请求的原始数据包 如果请求失败(在HTTP层),则客户端的任务是重试请求,而不是网络堆栈 特别是,如果客户端(无论出于何种原因)未能接收到指示RESTful操作是否成功的响应代码,则客户端必须能够重新发送相同的操作,而不必担心任何意外的副作用 这些故障可能会发生-中间防火墙可能在服务器处理操作时连接超时。服务器一收到请求就不会知道发

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

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

如果请求失败(在HTTP层),则客户端的任务是重试请求,而不是网络堆栈

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


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

您似乎混淆了HTTP协议级别的幂等性和TCP级别的字节流可靠性

HTTP幂等性: 这意味着发送相同的HTTP请求10次与发送一次具有相同的效果

TCP可靠性: 如果您在TCP流中丢失了一个数据包,它将被重新传输。但是应用程序协议(HTTP)不知道TCP必须重新传输数据包


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

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


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

什么样的请求失败需要在HTTP层重试,而不是在数据包层重试?502坏网关、504网关超时、500内部服务器错误(例如,数据库超时)这就是论坛中可怕的“三重发布”的原因,reddit,等等。超时方面的要点非常好。所以我们要说的是,TCP/IP保证服务器接收我们的请求,但是客户端可能会在服务器执行操作之前超时。客户端希望能够稍后重试,而无需重复原始操作。你能用这个解释更新答案吗?@Gili TCP不能保证双方就是否交换数据达成一致。如果您发送了一个请求,并且在收到答复之前连接中断,您不知道对方是否处理了该请求。@DavidSchwartz就是一个很好的例子@迈克:我理解其中的区别。我不明白为什么你需要重复同样的请求10次,除非是由于数据包丢失。@Gili,这正是问题所在。由于数据包重新传输,您不需要重复
HTTP PUT
或任何其他HTTP命令。HTTP请求被重复是因为人类(或机器人)的行为(在浏览器中点击重新加载)。@Mike:你对幂等性和TCP可靠性提供了很好的解释,但没有解释为什么客户端需要重复请求(用户/机器人不会无故重复操作)。@Gili,我甚至不明白为什么这是相关的;请详细说明原因matters@Mike,我们为什么要保护用户不重复购买请求?也许他们真的想买同样的东西两次?我的观点是,除非你理解为什么请求会被重复,否则你不清楚为什么你应该防范它。如果没有具体的例子,这是一个业务逻辑决策,而不是属于HTTP层的决策。那么您是说HTTP是幂等的,以便处理配置错误的TCP/IP连接?我认为在正常情况下无法重置连接。HTTP被设计为即使在重置非常“正常”的情况下也能正常工作。这与错误配置无关;这是关于即使在大规模负载下也能正常工作的问题。任何一个大型网站都已经学会接受这样一个事实,即他们的机器的某些部分将持续出现故障。HTTP允许他们设计能够在这种情况下生存的应用程序。cf TCP连接,特别是请求/响应方式,可能存在与配置无关的非常严重的时间问题。