一、TCP基于以字节为单位的滑动窗口来实现可靠传输
    1、发送窗口后沿移动的两种情况
    (1)不动(没有收到新的确认)
    (2)前移(收到了新的确认)
    2、前沿移动的三种可能
    (1)通常是不断向前移动
    (2)不动
    1)没有收到新的确认,对方通知的窗口大小也不改变
    2)收到新的确认,但对方通知的窗口缩小,使发送窗口前沿正好不动
    (3)向后收缩(对方通知的窗口缩小了,TCP不推荐这样做,可能导致错误)
    image.png
    3、可以使用三个指针分别指向相应的字节序号来描述发送窗口的状态
    (1)小于P1的已发送并已确认的部分
    (2)大于等于P3的是不允许发送的部分
    (3)P3-P1 = 发送窗口的尺寸
    (4)P2-P1 = 已发送但尚未收到确认的字节数
    (5)P3-P2 = 允许发送但当前尚未发送的字节数(又称为可用窗口或有效窗口)
    image.png
    4、虽然发送方的发送窗口是根据接收方的接收窗口设置的,但在同一时刻,发送方的发送窗口并不总是和接收方的接收窗口一样大
    (1)网络传送窗口需要经历一定的时间滞后,并且这个时间还是不确定的
    (2)发送方还可能根据网络当时的拥塞情况适当减少自己的发送窗口尺寸
    5、对于不按序到达的数据TCP并无明确规定如何处理。TCP通常对不按序到达的数据先临时存放在接收窗口中,等字节流中缺少的字节到达后,再按序交付给上层的应用进程。
    6、TCP要求接收方必须有累积确认和捎带确认机制,这样可以减小开销。接收方可以在合适的时候发送确认,也可以在自己有数据要发送时把确认信息顺便捎带上。
    (1)接收方不应过分推迟发送确认,否则会导致不必要的超时重传,这反而浪费了网络的资源。TCP标准规定,确认推迟的时间不应超过0.5秒。若收到一连串具有最大长度的报文段,则必须每隔一个报文段就发送一个确认(RFC 1122)
    (2)捎带确认实际上并不经常发生,因为大多数应用程序很少同时在两个方向上发送数据
    7、TCP的通信是全双工,通信中的每一方都在发送和接收报文段。因此,每一方都有自己的发送窗口和接收窗口。在谈到这些窗口时,一定要弄清楚是哪一方的窗口。