1、5.6 TCP 可靠传输的实现5.6.1 以字节为单位的滑动窗口前移不允许发送已发送并收到确认A 的发送窗口=20允许发送的序号26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56B 期望收到的序号前沿后沿前移收缩根据 B 给出的窗口值A 构造出自己的发送窗口 TCP 标准强烈不赞成发送窗口前沿向后收缩 不允许发送已发送并收到确认A 的发送窗口位置不变允许发送但尚未发送26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
2、42 43 44 45 46 47 48 49 50 51 52 53 54 55已发送但未收到确认56P1P2P3不允许接收已发送确认并交付主机B 的接收窗口允许接收26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56未按序收到可用窗口A 发送了 11 个字节的数据 P3 P1=A 的发送窗口(又称为通知窗口)P2 P1=已发送但尚未收到确认的字节数P3 P2=允许发送但尚未发送的字节数(又称为可用窗口)允许发送但尚未发送A 的发送窗口向前滑动26 27 28
3、29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55已发送并收到确认不允许发送已发送但未收到确认56P1P2P3允许接收B 的接收窗口向前滑动26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55已发送确认并交付主机不允许接收56未按序收到A 收到新的确认号,发送窗口向前滑动 先存下,等待缺少的数据的到达不允许发送已发送并收到确认A 的发送窗口已满,有效窗口为零26
4、 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55已发送但未收到确认56P1P2P3A 的发送窗口内的序号都已用完,但还没有再收到确认,必须停止发送。发送缓存 最后被确认的字节发送应用程序发送缓存最后发送的字节发送窗口TCP序号增大接收缓存接收应用程序已收到接收窗口TCP接收缓存下一个读取的字节序号增大下一个期望收到的字节(确认号)发送缓存与接收缓存的作用n发送缓存用来暂时存放:n 发送应用程序传送给发送方 TCP 准备发送的数据;n TCP 已发送出但尚未收到确认的数据
5、。n接收缓存用来暂时存放:n 按序到达的、但尚未被接收应用程序读取的数据;n 不按序到达的数据。需要强调三点nA 的发送窗口并不总是和 B 的接收窗口一样大(因为有一定的时间滞后)。nTCP 标准没有规定对不按序到达的数据应如何处理。通常是先临时存放在接收窗口中,等到字节流中所缺少的字节收到后,再按序交付上层的应用进程。nTCP 要求接收方必须有累积确认的功能,这样可以减小传输开销。5.6.2 超时重传时间的选择n重传机制是 TCP 中最重要和最复杂的问题之一。nTCP 每发送一个报文段,就对这个报文段设置一次计时器。只要计时器设置的重传时间到但还没有收到确认,就要重传这一报文段。往返时延的方
6、差很大n由于 TCP 的下层是一个互联网环境,IP 数据报所选择的路由变化很大。因而运输层的往返时间的方差也很大。时间数据链路层运输层T1T2T3往返时间的概率分布加权平均往返时间nTCP 保留了 RTT 的一个加权平均往返时间 RTTS(这又称为平滑的往返时间)。n第一次测量到 RTT 样本时,RTTS 值就取为所测量到的 RTT 样本值。以后每测量到一个新的 RTT 样本,就按下式重新计算一次 RTTS:新的 RTTS (1 )(旧的 RTTS)(新的 RTT 样本)(5-4)n式中,0 1。若 很接近于零,表示 RTT 值更新较慢。若选择 接近于 1,则表示 RTT 值更新较快。nRFC
7、 2988 推荐的 值为 1/8,即 0.125。超时重传时间 RTO(RetransmissionTime-Out)nRTO 应略大于上面得出的加权平均往返时间 RTTS。nRFC 2988 建议使用下式计算 RTO:n RTO RTTS+4 RTTD (5-5)nRTTD 是 RTT 的偏差的加权平均值。nRFC 2988 建议这样计算 RTTD。第一次测量时,RTTD 值取为测量到的 RTT 样本值的一半。在以后的测量中,则使用下式计算加权平均的 RTTD:新的 RTTD=(1 )(旧的RTTD)+RTTS 新的 RTT 样本 (5-6)n 是个小于 1 的系数,其推荐值是 1/4,即
8、0.25。往返时间 RTT?往返时间的测量相当复杂 nTCP 报文段 1 没有收到确认。重传(即报文段 2)后,收到了确认报文段 ACK。n如何判定此确认报文段是对原来的报文段 1 的确认,还是对重传的报文段 2 的确认?发送一个TCP 报文段超时重传TCP 报文段收到 ACK时间12往返时间 RTT?是对哪一个报文段的确认?Karn 算法 n在计算平均往返时间 RTT 时,只要报文段重传了,就不采用其往返时间样本。n这样得出的加权平均平均往返时间 RTTS 和超时重传时间 RTO 就较准确。n报文段每重传一次,就把 RTO 增大一些:新的 RTO (旧的 RTO)n系数 的典型值是 2。n当
9、不再发生报文段的重传时,才根据报文段的往返时延更新平均往返时延 RTT 和超时重传时间 RTO 的数值。n实践证明,这种策略较为合理。修正的 Karn 算法 5.6.3 选择确认 SACK(Selective ACK)n接收方收到了和前面的字节流不连续的两个字节块。n如果这些字节的序号都在接收窗口之内,那么接收方就先收下这些数据,但要把这些信息准确地告诉发送方,使发送方不要再重复发送这些已收到的数据。1 1000 1501 3000 3501 4500确认号=1001L1=1501L2=3501R1=3001R1=4501接收到的字节流序号不连续 连续的字节流第一个字节块第二个字节块 和前后字
10、节不连续的每一个字节块都有两个边界:左边界和右边界。图中用四个指针标记这些边界。第一个字节块的左边界 L1=1501,但右边界 R1=3001。左边界指出字节块的第一个字节的序号,但右边界减 1 才是 字节块中的最后一个序号。第二个字节块的左边界 L2=3501,而右边界 R2=4501。RFC 2018 的规定n如果要使用选择确认,那么在建立 TCP 连接时,就要在 TCP 首部的选项中加上“允许 SACK”的选项,而双方必须都事先商定好。n如果使用选择确认,那么原来首部中的“确认号字段”的用法仍然不变。只是以后在 TCP 报文段的首部中都增加了 SACK 选项,以便报告收到的不连续的字节块的边界。n由于首部选项的长度最多只有 40 字节,而指明一个边界就要用掉 4 字节,因此在选项中最多只能指明 4 个字节块的边界信息。