传输层-TCP可靠传输的实现(二)

361 阅读8分钟

这是我参与11月更文挑战的第26天,活动详情查看:2021最后一次更文挑战

3. TCP可靠传输的实现

1)、 可靠传输的工作原理---------停止等待协议

image.png

2)、 确认丢失和确认迟到

image.png

3)、 可靠通信的实现

  使用上述的确认和重传机制,我们就可以在不可靠的传输网络上实现可靠的通信。

  这种可靠传输协议通常称为自动重传请求ARQ(Automatic Repeat Request)。

  ARQ表明重传的请求是自动进行的。接收方不需要请求发送方重传某个出错的分组。

  TCP连接的每一端都必须设有两个窗口——一个发送窗口和一个接收窗口。

  TCP的可靠传输机制用字节的序号进行控制。TCP所有的确认都是基于序号而不是基于报文段。

  TCP两端的四个窗口经常处于动态的变化之中。

  TCP连接的往返时间RTT也不是固定不变的,需要使用特定的算法估算较为合理的重传时间。

发送缓存

image.png

接收缓存

发送缓存和接收缓存的作用

发送缓存用来暂时存放:

  发送应用程序传送给发送方TCP准备发送的数据;

  TCP已发送出但是尚未收到确认的数据。

接收缓存用来展示存放:

  按顺序到达的,但是尚未被接收应用程序读取的数据;

  不按顺序到达的数据。

强调:

  A的发送窗口并不总是和B的接收窗口一样大(因为有一定的时间滞后)。

  TCP标准没有规定对不按顺序到达的数据应如何处理。通常是先临时存放在接收窗口中,等到字节流中所缺少的字节收到后,在按顺序交付上层的应用进程。

  TCP要求接收方必须有累积确认的功能,这样能减小传输开销。

4)、 超时重传时间的选择

  重传机制是TCP中最重要和最复杂的问题之一。

  TCP每发送一个报文段,就对这个报文段设置一次计时器。只要计时器设置的重传时间到但是没有收到确认,就要重传这一报文段。

  往返时延的方差很大

  由于TCP的下一层是一个互联网环境,IP数据报所选择的路由变化很大。因而运输层的往返时间的方差也很大

image.png

加权平均往返时间

  TCP保留了RTT的一个加权平均往返时间RTTs(这又称为平滑的往返时间)。

  第一次测量到RTT样本时,RTTs值就取为所测量到的RTT样本值。以后每测量到一个新的RTT样本,就按下式重新计算一次RTTs:

    新的RTTs = (1+α)* (旧的RTTs) + α * (新的RTT样本)

  式中,0 <= α < 1。若α很接近0,表示RTT值更新较慢。若选择α接近1,则表示RTT值更新较快。

  RFC2988推荐的α值为 1/8 , 即0.125。

  超时重传时间RTO(RetransmissionTime-Out)

  RTO 应略大于上面得到的加权平均往返时间RTTs。

  RFC 2988 建议使用下式计算RTO:

  RTTd是RTT的偏差的加权平均值。

  RFC 2988 建议这样计算RTTd。第一次测量时,RTTd取值为测量到的RTT样本值的一半。在以后的测量中,则使用下式计算加权平均的RTTd:

  β是个小于1的系数,其推荐值是 1/4,即0.25.

  往返时间的测量相当复杂

  TCP波阿文段1没有收到确认。重传(即报文段2)后,收到了确认报文段ACK。

  如何判断此确认报文段是对原来的报文段1的确认,还是对重传的报文段2的确认?

image.png Karn算法

  在计算平均往返时间RTT时,只要报文段重传了,就不采用其往返时间样本。

  这样得出的加权平均往返时间RTTs和超时重传时间RTO就较准确。

  修正的Karn算法

  报文段每重传一次,就把RTO增大一些:

      新的RTO = γ * (旧的RTO)

  系数γ的典型值为2。

  当不再发生报文段的重传时,才根据报文段的往返时间延迟跟新平均往返时延RTT和超时重传时间RTO的数值。

  实践证明,这种策略较为合理。

  选择确认 SACK(Selective ACK)

  接收方收到了和前面的字节流不连续的两个字节快。

  如果这些字节的序号都在接收窗口之内,那么接收方就先收下这些数据,但要把这些信息准确的告诉发送方,使发送方不要在重复发送这些已收到的数据。

image.png

  和前后字节不连续的每一个字节块都有两个边界,左边界和右边界。途中用四个指针标记了这些边界。

  第一个字节块的左边界L1=1501,但右边界R1=3001。

  左边界指出字节块的第一个字节的序号,但右边界减1才是字节块中的最后一个序号。

  第二个字节块的左边界L2=3501,而右边界R2=4501.

信道的利用率

  停止等待协议的有点是简单,但缺点是信道利用率太低。

image.png

信道利用率U

image.png

5)、 流水线传输

  发送方可连续发送多个分组,不必每发送完一个分组就停顿下来等待对方的确认。

  由于信道上一直有数据不间断地传送,这种传输方式可获得很高的信道利用率。

image.png

6)、 连续ARQ协议

7)、 累计确认

  接收方一般采用累计确认的方式。

  优点是,容易实现,信道利用率高。

  缺点是:不能向发送方反映出接收方已经正确收到的所有分组的信息。

8)、TCP报文段的首部格式

image.png

  源端口和目的端口字段——各占2个字节。端口是传输层与应用层的服务接口。运输层的复用和分用功能都要通过端口才能实现。

  序号字段——占4个字节。TCP连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的每一个字节的序号。

  确认号字段——占4个字节。是期望收到对方的下一个报文段的数据的每一个字节的序号。=

  数据偏移(即首部长度)——占4位.它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。“数据偏移”的单位是32位字(以4字节为计算单位)。

  保留字段——占6位。保留为今后使用,但目前应置为0。

  紧急URG——占1位。当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。

  确认ACK——占1位。只有当ACK=1时,确认号字段才有效。当ACK=0时,确认号无效。

  推送PSH(PuSH)——占1位。接收TCP收到PSH=1的报文段,就尽快的交付接收应用进程,而不再等到整个缓存都填满了后在向上交付。

  复位RST(ReSeT)——占1位。当RST=1时,表明TCP连接中出现严重差错(如由于主机奔溃或其他原因),必须释放连接,然后在重新建立运输连接。

  同步SYN——占1位。同步SYN=1,表示这是一个连接请求或连接接受报文。

  终止FIN(FINis)——占1位。用来释放一个连接。FIN=1表明此报文段的发送端的数据已发送完毕,并要求释放传输层连接。

  窗口字段——占2个字节。用来让对方设置发送窗口的依据,单位为字节。

  检验和——占2个字节。检验和字段检验的范围包括首部和数据这两个部分。在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。

  紧急指针字段——占16位。指出在本报文段中紧急数据共有多少个字节(紧急数据放在报文段数据的最前面)

  选项字段——长度可变。TCP最初只规定了一种选项,即最大报文长度MSS。MSS告诉对方TCP:“我的缓存所能接受的报文段的数据字段的最大长度是MSS个字节”

  填充字段——这是为了使这个首部长度是4字节的整数倍。