通信前:三次握手建立连接
通信过程中:可靠传输(ARQ技术与滑动窗口技术)、流量控制、拥塞避免
通信后:四次握手释放连接

以字节为单位的滑动窗口技术详解

image.png
image.png
丢包重传的选择性确认见TCP报文首部

超时重传时间

由于网络环境是一直变化的,故而往返时间RTT并不是固定的,而是实时变化的。
TCP往返传输时间(RTT) 的测量可以采用两种方法:
(1)TCP Timestamp选项
(2)重传队列中数据包的TCP控制块
tcp建立连接时,就能计算出RTT
下图中第5个包时建立TCP连接请求,第6个包是连接请求的响应。第5个包的确认(即第6个包)中就能计算出RTT,因为tcp建立连接已有一个往返。
image.png
RTTs(Round-Trip Time,TCP往返传输时间)计算公式:
TCP工作实现 - 图4
说明:1. RFC2988推荐的α值为1/8,即0.125。
2. 新的RTT样本由新的请求与响应计算出来的。

RTTD(RTT的偏差的加权平均值) 计算公式:
TCP工作实现 - 图5
说明:1. β是个小于1的系数,它的推荐值是1/4,即0.25。

RTO(RetransmissionTime-Out,超时计时器设置的超时重传时间)计算公式:
TCP工作实现 - 图6,这里β是个小于1的系数,它的推荐值是1/4,即0.25。
说明:1. 超时重传时间要略大于甲醛平均往返时间RTTs。

举例:
假设原来的RTT时间为2s,新的RTT时间为3s,求此时新的往返时间RTT与超时重传时间RTO。
RTTs=0.875 ×2+0.125 ×3=2.125
RTTD=0.75 × 0.5+0.25 ×|2.125-3|=0.59375
RTO=2.125+4 ×0.59375=4.5

TCP流量控制

控制方式

利用滑动窗口实现流量控制,接收方可以控制发送方。
image.png
image.png
客户端建立tcp连接时,发送客户端相关信息(最大可接收窗口win=64240,最大可接收帧数据MSS=1460,是否为选择性确认SACK_PERM=1),服务器响应时,也会告知此类信息。建立连接后,再发送数据过程中,窗口大小会根据情况调整,发送端会根据调整后的窗口大小发送数据。
上图中建立tcp连接时,最大可接收窗口win=64240,最大可接收帧数据MSS=1460,表示客户端允许对方连续发送40(64240/1460=40)帧数据。

TCP传输效率

可以用不同的机制来控制 TCP 报文段的发送时机:

  1. 第一种机制是 TCP 维持一个变量,它等于最大报文段长度 MSS。只要缓存中存放的数据达到 MSS 字节时,就组装成一个 TCP 报文段发送出去。
  2. 第二种机制是由发送方的应用进程指明要求发送报文段,即 TCP 支持的推送 (push) 操作。
  3. 第三种机制是发送方的一个计时器期限到了,这时就把当前已有的缓存数据装入报文段(但长度不能超过 MSS)发送出去。

    Nagle算法

    image.png

  4. 若发送应用进程把要发送的数据逐个字节地送到 TCP 的发送缓存,则发送方就把第一个数据字节先发送出去,把后面到达的数据字节都缓存起来。

  5. 当发送方收到对第一个数据字符的确认后,再把发送缓存中的所有数据组装成一个报文段发送出去,同时继续对随后到达的数据进行缓存。
  6. 只有在收到对前一个报文段的确认后才继续发送下一个报文段。
  7. 当到达的数据已达到发送窗口大小的一半或已达到报文段的最大长度时,就立即发送一个报文段。

    糊涂窗口综合症

    每次仅发送一个字节或很少几个字节的数据时,有效数据传输效率变得很低的现象。
    image.png
    假设场景:
    接收方应用进程消耗数据太慢,例如:每次只读取一个字节。
    出现现象:
    当接收方的 TCP 缓冲区已满,接收方会向发送方发送窗口大小为 0 的报文。若此时接收方的应用进程以交互方式每次只读取一个字节,于是接收方又发送窗口大小为一个字节的更新报文,发送方应邀发送一个字节的数据(发送的 IP 数据报是 41 字节长),于是接收窗口又满了,如此循环往复。
    image.png
    TCP工作实现 - 图12
    此种场景下,发送方 TCP 每次接收到一字节的数据后就发送。发送一个字节需要形成 41 字节长的 IP 数据报,效率很低。
    解决方法:
    让接收方等待一段时间,使得或者接收缓存已有足够空间容纳一个最长的报文段,或者等到接收缓存已有一半空闲的空间。只要出现这两种情况之一,接收方就发出确认报文,并向发送方通知当前的窗口大小。

    TCP拥塞控制

    通信两端的tcp协议在发数据包时,要动态感知网络状态。若网络畅通,则提高发送速度;若网络拥塞,则降低发送速度。

    拥塞原理

    image.png
    超出了网络带宽,则有一部分数据包会被扔掉,则会出现丢包现象。
    当网络中的负载在可接受的范围内,则可以正常发送数据包处理,当负载增加时,则会出现轻度拥塞,产生丢包现象。再增加负载,则路由器搞负荷工作,事件处理不过来,产生死机,则进入死锁状态,即为网络拥塞。
    TCP协议要避免出现拥塞现象,则采用拥塞控制方法,可分为两类:

  8. 慢开始和拥塞避免

  9. 快重传和快恢复

    慢开始和拥塞避免

    假设:1. 数据单方向传送,另外一个方向只传送确认。
    2. 接收方总是有足够大的缓存空间,因而发送窗口的大小由网络的拥塞程度来决定。

    慢开始

    image.png

  10. 接收方告知发送方窗口大小rwnd=3000,MSS=100;

  11. 发送方初始状态,发送窗口=拥塞窗口,第1轮先发送1个数据包,大小100字节;
  12. 发送方及时得到响应,网络状态良好,第2轮发送2个数据包,大小200字节;
  13. 发送方及时得到响应,网络状态良好,第3轮发送4个数据包,大小400字节;
  14. 发送方及时得到响应,网络状态良好,第4轮发送8个数据包,大小800字节;

    …………

  15. 发送方及时得到响应,网络状态良好,第n轮发送2n-1个数据包,,大小2n-1x100字节,最大不能超出rwnd=3000。若中间出现拥塞,则等待超时重传时间后,重发丢失的包,此时进入拥塞避免慢开始阶段;

    拥塞避免

    image.png

  16. 第1轮发送1个数据包,此后每一轮以指数规律增长发送字节数;

  17. 到达慢开始门限ssthresh初始值(1600),则以加1的方式线性增长;
  18. 当出现网络拥塞(即丢包)时,则更新ssthresh,新的ssthresh等于拥塞时发送字节数/2(上图就变为1200),重新开始1-3的循环。

    快重传和快恢复

    慢开始和拥塞避免存在个问题,遇到网络拥塞后,每次都是从0开始,效率不高。快重传和快恢复可解决此问题。

    快重传

    image.png
    发送方连续发出4个包,其中第3个包丢失。接收方发现第3个包没有按顺序到达,丢失了,接收方立即发3个连续的确认,要求重传第3个包。发送方并不等待超时重传时间,收到接收方3个连续重传请求后,立即重传第3个包。

    快恢复

    image.png
    与慢开始算法的区别:
    当遇到拥塞时,并不是从1开始恢复,而是直接从新的ssthresh值开始。

    发送窗口上限

    发送方的窗口的上限值应当取为接收方窗口rwnd和拥塞窗口cwnd这两个变量中较小的一个,也就是说:
    发送方窗口的上限值 = Min [rwnd,cwnd]
    当rwnd

    TCP连接管理

    三次握手及释放