网络基本功(十):细说TCP确认机制

网络基本功(十):细说TCP确认机制算法

 

转载请在文首保留原文出处:EMC中文支持论坛https://community.emc.com/go/chinese p_w_picpath001.gifapi

 

 

介绍

 

在TCP确认机制中,没法有效处理非连续TCP片断。确认号代表全部低于该编号的sequence number已经被发送该编号的设备接收。若是咱们收到的字节数落在两个非连续的范围内,则没法只经过一个编号来确认。这可能致使潜在严重的性能问题,特别是高速或可靠性较差的网络。服务器


更多信息

 

仍是如下图为例,服务器发送了4个片断并收到1条回复,确认号为201。所以,片断1和片断2被当成已确认。它们从重传队列中移出,同时容许服务器发送窗口向右移动200字节,从而发送数据增长200个字节。微信


然而,再次假设片断3,从sequence number201开始,在发送过程当中丢失了。因为客户端从没有收到这一片断,因此它也没法发送确认号高于201的确认信息,从而致使滑动窗口停滞。服务器能够继续发送其余片断直到填满客户端的接收窗口,可是直到客户端发送另外一条确认信息,服务器的发送窗口都不会滑动。网络


另外一个问题是若是片断3丢失了,客户端将没法告知服务器是否收到后续的片断。在客户端接收窗口填满以前,颇有可能客户端已经接收到片断4以及以后的片断。可是客户端没法发送值为501的确认信息以代表接收到片断4,由于这意味着片断3也接收到了ide

p_w_picpath002.jpg

这里咱们看到了TCP单编号,累积确认机制的缺点。咱们能够想象一个最差的状况,服务器被告知它有一个10,000字节窗口,20个片断每一个片断500字节。第一个片断丢失了,其余19个被接收到了。可是因为第一个片断从没有接收到,其余19个也没法确认。性能

 

 

未确认片断处理策略:url

 

咱们怎样处理丢失片断以后的片断呢?本例中,当服务器片断3重传超时,它必须决定怎样处理片断4,它不知道客户端是否已经接收到。在上述最差状况下,第一个片断丢失后,其他19个可能或可能没法被客户端接收到。spa

处理这种状况有两种可能的方式:.net


仅重传超时片断:这是一种更加保守的方式,仅重传超时的片断,但愿其余片断都可以成功接收。若是该片断以后的其余片断实际上接收到了,这一方式是最佳的,若是没接收到,就没法正常执行。后者的状况每个片断须要单独计时并重传。假设上述最坏状况下,全部20个500字节片断都丢失了。咱们须要等片断1超时并重传。这一片断也许会获得确认,但以后咱们须要等待片断2超时并重传。这一过程会重复屡次。


重传全部片断:这是一种更激进或者说更悲观的方式。不管什么时候一个片断超时了,不只重传该片断,还有全部其余还没有确认的片断。这一方式确保了任什么时候间都有一个等待确认的停顿时间,在全部未确认片断丢失的状况下,会刷新所有未确认片断,以使对端设备多一次接收机会。在全部20个片断都丢失的状况下,相对于第一种方式节省了大量时间。这种方式的问题在于可能这些重传是没必要要的。若是第一个片断丢失而其余19个实际上接收到了,也得重传那9500字节数据。


因为TCP不知道其余片断是否接收到,因此它也没法确认哪一种方法更好,但只能选择一种方式。上图示例了保守的方式,而下图显示的是激进的方式:

p_w_picpath003.jpg

问题的关键在于没法确认非连续片断。解决方式是对TCP滑动窗口算法进行扩展,添加容许设备分别确认非连续片断的功能。这一功能称为选择确认(selective acknowledgment, SACK)。

 

 

选择确认:

 

经过SACK,链接的两方设备必须同时支持这一功能,经过链接时使用的SYN片断来协商是否容许SACK。这一过程完成以后,任一设备均可以在常规TCP片断中使用SACK选项。这一选项包含一个关于已接收但未确认片断数据sequence number范围的列表,因为它们是非连续的。

各设备对重传队列进行修改,若是该片断已被选择确认过,则该片断中的SACK比特位置为1。该设备使用图2中激进方式的改进版本,一个片断重传以后,以后全部片断也会重传,除非SACK比特位为1


例如,在4个片断的状况下,若是客户端接收到片断4而没有接收到片断3,当它发回确认号为201(片断1和片断2)的确认信息,其中包含一个SACK选项指明:“已接收到字节361至500,但还没有确认”。若是片断4在片断1和2以后到达,上述信息也能够经过第二个确认片断来完成。服务器确认片断4的字节范围,并为片断4打开SACK位。当片断3重传时,服务器看到片断4的SACK位为1,就不会对其重传。以下图所示。


在片断3重传以后,片断4的SACK位被清除。这是为了防止客户端出于某种缘由改变片断4已接收的想法。客户端应当发送确认号为501或更高的确认信息,正式确认片断3和4接收到。若是这一状况没有发生,服务器必须接收到片断4的另外一条选择确认信息才能将它的SACK位打开,不然,在片断3重传时或计时器超时的状况下会对其自动重传。

p_w_picpath004.jpg

  • 0

相关文章
相关标签/搜索