才子佳人博客

我的故事我讲述

详解TCP协议之差错控制
 
来源:blog.csdn.net  编辑:xjh  2017-10-26

TCP必须保证数据:按序,没有差错,没有部分丢失,没有重复的交给应用层。其处理办法如下:

1)TCP对传输出错的报文和丢失的报文处理方式一样,接收端不向发送端发送确认消息,当发送端重传计时器时间已到,仍未收到对该报文的确认,则发送端重传该报文段,并将计时器复位;

2)TCP接收端收到有同样序号的报文时则认为有重复发来的报文,直接丢弃不去理会;

3)TCP对乱序的报文段不确认,直到收到它序号以前的所有报文段为止,但是请注意,TCP从来不会把失序的报文段交付给进程,而是把完整有序的数据交付到应用进程。

TCP通过三个简单的工具来完成其差错控制:检验和、确认以及超时。

1、检验和

每个报文都包含了一个检验和字段,用来检查报文段是否受到损伤。如果某个报文段因检验和无效而被检查出受到损伤,就由终点TCP将其丢弃,并被认为是丢失了。TCP规定每个报文段都必须使用16位的检验和。

2、确认

控制报文段不携带数据,但需要消耗一个序号,它也需要被确认,而ACK报文段永远不需要确认,ACK报文段不消耗序号,也不需要被确认。在以前,TCP只使用一种类型的确认:累计确认。目前有一些TCP实现还采用了选择确认。

(1)累计确认(ACK)

接收方不必对收到的分组逐个发送确认,而是可以在收到几个分组后,对按序到达的最后一个分组发送确认,这样就表示:到这个分组为止的前面所有分组都已正确收到。

应当记住:若确认号=N,则表明:到序号N-1为止的所有数据都已正确收到。

或者说,接收方通告它期望接收的下一个字节的序号,并忽略之前的确认丢失。比如,发送报文序列1 2 3 4 5 6 7,接收端发送确认,但是3号报文的确认报文丢了,而在报文3 确认超时重传之前收到了4的确认,那么就认为4以前的报文接收端都正常接收了,发送端可以忽略4之前的确认而可以继续发送 5 6了。这种方法有时也被称为肯定积累确认或ACK。在TCP首部的32位ACK字段用于累计确认,而它的值仅在ACK标志为1时才有效。

(2)选择确认(SACK)

选择确认(selective acknowledgment)或SACK。SACK并没有取代ACK,而是向发送方报告了更多的信息。SACK要报告失序的数据块以及重复的报文段块。SACK是作为TCP首部末尾的选项来实现的。

3、重传

差错控制机制的核心就是报文段的重传。在一个报文段发送时,它会被保存到一个队列中,直至被确认为止。当重传计时器超时,或者发送方收到该队列中第一个报文段的三个重复的ACK时,该报文段被重传。

(1)RTO重传(超时重传)

发送方TCP的计时器时间到,TCP则发送队列中最前面的报文段(即序列号最小的报文段),并重启计时器。在TCP中RTO的值是动态的,它根据报文段的往返时间(RTT)更新。TCP整个连接期间只有一个RTO计时器。

(2)三个重复的ACK报文段(快重传)

收到三个重复ACK则立即重传丢失的报文段,这一特性称为快重传(fast retransmission),如果针对某个报文段有三个重复的确认(即原始的ACK再加上三个完全一样的副本)到达,那么将立即重传,并重启RTO计时器,而不用等待计时器超时。

发送端与接收端何时可能产生死锁现象?TCP是如何解决该死锁僵局的?

当接收端向发送端发送一个零窗口报文段(报文段首部中窗口值的大小设置为0),发送端就停止向接收端发送报文段。后来接收端想通知发送端,让其接着发送数据时,便向发送端发送一个非零窗口报文段。但是该报文段在路上丢失了,此时接收端以为该非零报文段已经发送给发送端,而发送端由于没有收到接收方的非零窗口报文段,于是两端都等待,陷入“死锁”的状态。

为此,TCP为发送端设置一个保持(持续)计时器,当发送端收到零窗口报文段时,便启动该持续计时器,等待着接收方的非零通知。持续计时器超时了还没收到非零通知,发送端便向接收方发送一个“探测报文段”,该探测报文仅携带1B的数据(该探测报文会消耗一个序号,但特殊的是,该探测报文段的序号永远不需要确认),目的是督促TCP接收端重传一个确认,即如果接收端希望发送端的窗口大小仍然是0,重置持续计时器;如果不是0,则该僵局打破了。

注意:即便发送端收到了零窗口设置的报文段,发送端也能接收这几种报文段:探测报文段、ACK报文段和携带紧急数据的报文段。

来源参考:
吴功宜,《计算机网络第2版》,清华大学出版社,p305-309
http://blog.csdn.net/u012813201/article/details/70173528


分类:网络日志| 查看评论
相关文章
文章点击排行
本年度文章点击排行
发表评论:
  • 昵称: *
  • 邮箱: *
  • 网址:
  • 评论:(最多100字)
  • 验证码: