TCP可靠传输的实现

      我们首先介绍以字节为单位的滑动窗口。为了讲述可靠传输原理的方便,我们假定数据传输只在一个方向进行,即A发送数据,B给出确认。这样的好处是讨论限于两个窗口,即发送方A的发送窗口和接收方B的接收窗口。如果在考虑B也向A发送数据,那么还要增加A的接收窗口和B的发送窗口,这对讲述可靠传输的原理并没有多少帮助,反而使问题更加繁琐。

以字节为单位的滑动窗口

      TCP的滑动窗口是以字节为单位的。为了便于说明滑动窗口的工作原理,我们故意把后面图中的字节编号都取得很小。现假定A收到了B发来的确认报文段,其中窗口是20字节,而确认号是31(这表明B期望收到的下一个序号是31,而序号30为止的数据已经收到了)。根据这两个数据,A就构造出自己的发送窗口,如下图。

       我们先讨论发送方A的发送窗口。发送窗口表示:在没有收到B的确认情况下,A可以连续把窗口内的数据发送出去。凡是已经发送过的数据,在未收到确认之前都必须暂时保留,以便在超时重传时使用。

       发送窗口后沿的后面部分表示已发送且已收到了确认。这些数据显然不需要再保留了。而发送窗口前沿的前面部分表示不允许发送的,因为接收方都没有为这部分数据保留临时存放的缓存空间。

       发送窗口的位置有窗口前沿和后沿的位置共同决定。发送窗口后沿的变化情况有两种可能,既不动(没有收到新的确认)和前移(收到了新的确认)。发送窗口后沿不可能向后移动,因为不能撤销掉已收到的确认。发送窗口前沿通常是不断向前移动的,但是也有可能不动。这对应于两种情况:一是没有收到新的确认,对方通知的窗口大小也不变;二是收到了新的确认但对方通知窗口缩小了,使得发送窗口前沿正好不动。

       现在假定A发送了序号为31~41的数据,这时,发送窗口位置并未改变(下图),但发送窗口内靠后面有11个字节(红色小框表示)表示已发送但未收到确认。而发送窗口靠前面的9个字节是允许发送但尚未发送的。

       从上述可以看出,要描述一个发送窗口的状态需要三个指针p1,p2,p3(如上图),指针都指向序号,意这三个指针意义如图上所示。

      再看一下B的接收窗口(上图),B的接收窗口大小是20。在接收窗口前面,到30号为止的数据是已经发送过确认,并且已经交付主机了。因此在B可以不再保留这些数据。接收窗口内的序号(31~50)是允许接收的。在上图中,B收到了序号为32和33的数据。这些数据没有按序到达,因为序号31的数据没有收到(也许丢失了,也许滞留在网络中的某处)。请注意,B只能对按序收到的数据中最高序号给出确认,因此B发送的确认报文段中的确认号仍然是31(即期望收到的序号),而不是32或33。

       现在假定B收到了序号为31的数据,

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值