计算机网络-TCP怎么保证可靠?

文章目录

  • 一、字节编号机制
  • 二、数据段确认机制
  • 三、超时重传机制
  • 四、选择性确认
  • 五、流量控制
  • 六、拥塞控制

一、字节编号机制

TCP数据段以字节为单位对数据段中的“数据”部分进行一一编号,确保每个字节的数据都可以有序传送和接收。

序号->序号TCP发送的数据段中“数据”部分(不包括TCP数据段头部),每个字节都有一个序号,每个数据段中的“序号”字段是以该数据段中第一个字节的序号进行填充的。

确认号->确认号确认号指发送包含这个“确认号”的数据段的一端期望接收另一端的下一个数据段的起始序号。同时也暗示了在此序号前的所有字节数据均已正确接收。

ACK-> ACK是一个表明“确认号”字段是否有效的标志位。只有ACK字段的值为1,数据段中的“确认号”才有意义,否则数据段中的“确认号”没有意义,即不具有上面所说的“确认号”含义,因为TCP通常不会针对单个数据段进行确认,而是一次性对多个连续数据段进行确认。只需要对最近收到的那个数据段进行确认,即表明前面所有数据段均已正确接收。


二、数据段确认机制

TCP要求每接收一个数据段都必须由接收端向发送端返回一个确认数据段(可以用一个确认数据段一次确认前面多个数据段),其中的“确认号”表明了接收端已正确接收的数据段序号(“确认号”前面的所有数据段)。

TCP可一次连续发送多个数据段

TCP不需要等待接收对方发送的确认数据段(“ACK”字段为1的数据段)就可以一次性连续发送多个数据段,这样可大大提高数据发送效率。但一次性可发送多少个数据段是受对方返回的“窗口大小”字段值和当前可用“发送窗口”大小双重限制的。因为发送端对还没有收到确认的数据段要进行缓存,这需要占用一定的“发送窗口”大小。


仅对连续接收的数据段进行确认

返回的确认数据段中的“确认号”字段值仅代表对端已正确接收的连续数据段(最高字节序号+1),而不一定是已正确接收数据段中的“最高序号+1”,因为中间可能还有些数据段因为网络延迟而暂时未收到,或出现了传输错误而丢失了。

假设每个数据段的长度大小均100字节,接收端收到了序号为1、101、201、401四个数据段。其中序号为301的数据段暂时没收到,此时接收端返回的确认数据段中的“确认号”只能是301,而不会是501,也就是只对前三个数据段进行确认,不会对后面的401数据段进行确认,因为中间的301数据段还没收到。当后面收到了301数据段后,可能会返回一个“确认号”为501的数据段,这时就代表301和401数据段均已正确接收了。


不连续序号的数据将先缓存

当主机接收到的数据段序号不连续时,不连续部分不会向应用层的应用进程进行提交,而是先缓存在“接收窗口”中,等待接收到中断的序号的数据段后再一起提交。这时,尽管接收端已正确接收了某些数据,但仍不能及时向应用层提交,需要占用“接收窗口”空间。对于没有按先后次序正确接收的数据,在向应用层提交时会重新按数据段序号进行组合,然后再提交给应用层。

如某主机先后接收到了对端发来的序号分别为1、101、201、301、601、401、801、501的数据段(假设数据段大小均100字节),则该主机首先把1、101、201、301这四个数据段向应用层提交,并向发送端发送一个“确认号”为401的确认数据段,从而可以从“接收窗口”中删除这四个数据段,释放“接收窗口”;然后再把601、401、801这三个数据段先缓存在“接收窗口”中,直到接收到501号数据段,再按401、501、601顺序重组并向应用层提交,接着发送一个“确认号”为701的确认数据段,从而又可以从“接收窗口”中删除这三个数据段,释放“接收窗口”,但此时“接收窗口”中仍缓存有801号数据段,因为701号数据段还没有得到确认。


三、超时重传机制

在TCP中有一个重传定时器(Retransmission Timer,RTT),在发送一个数据段的同时也启动了该定时器。如果在定时器过期之前该数据段还没有被对方确认的话,则定时器停止,然后重传对应序号的数据段。

RTT值是一个数据段往返发送端和接收端的时间总和

如果在重传定时器超时后仍没收到一个数据段的确认,则可能会重传对应序号后面的所有数据段,因为后面的这些数据段均暂时不会被确认.

四、选择性确认

(Selective ACK,SACK)机制。在SACK支持下,仅可以重传缺少部分的数据,而不会重传那些已正确接收的数据。就是在TCP数据段格式的头部“可选项”字段中添加一个代表支持SACK的选项。但这个选项在不同的数据段中有不同的字段名称和不同的含义。

假设接收端已收到1、101、201、401、501这五个序号的数据段,在发送确认号为301的确认数据段时,在SACK扩展选项中标记401(起始序号为401,结束序号为500)和501(起始序号为501,结束序号为600)这两个不连续的数据段。这时发送端就会知道,不需要再发送401和501这两个数据段了,只需发送301号数据段即可。这样大大节省了网络资源,也提高了数据传输效率。

五、流量控制

TCP连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP使用的流量控制协议是可变大小的滑动窗口协议。

接收方有即时窗口(滑动窗口),随ACK报文发送。
计算机网络-TCP怎么保证可靠?_第1张图片
1)假设现在发送端收到了接收端发来的一个确认数据段,“确认号”为301,“窗口大小”为500,表示可以连续发送5个数据段(起始序号为301)。左边那个虚线“发送窗口”代表的就是后面发送的301、401、501、601、701这五个数据段,此时因为已达到了对方窗口大小值,不能继续发送了,需要停下来等待对端的确认。

2)如果某一时间收到了一个“确认号”为501的确认数据段(“ACK”字段值为1的数据段,下同),表示接收端已正确接收了301和401这两个数据段,即从“发送窗口”中删除这两个数据段,窗口向前滑动200字节

假设以上返回的确认数据段中的“窗口大小”为400(这里起到了流量控制的作用),理论上说,发送端可以一次性连续发送4个数据段,但因为“发送窗口”中缓存了原来已发送的501、601和701这三个数据段(300字节),于是此次只能发送100字节,即801号数据段。
计算机网络-TCP怎么保证可靠?_第2张图片

3)如果此时收到了一个“确认号”为801的确认数据段,同时“窗口大小”字段值又为500了(这里也起到了流量控制的作用)

如果在数据传输过程中有一个或多个数据段丢失,则发送端接收不到对这些数据段的确认数据段,这时可以通过上节介绍的超时重传来解决。

六、拥塞控制

当网络拥塞时,减少数据的发送。

如果网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而导致网络拥塞程度更高。因此当出现拥塞时,应当控制发送方的速率。

这一点和流量控制很像,但是出发点不同。流量控制是为了让接收方能来得及接收,而拥塞控制是为了降低整个网络的拥塞程度。

TCP 主要通过四个算法来进行拥塞控制:慢开始、拥塞避免、快重传、快恢复。


参考书籍:深入理解计算机网络

你可能感兴趣的:(计算机网络,网络)