TCP协议
TCP --- 传输控制协议
是一种面向连接的可靠传输协议 。
面向连接 --- 在传输数据之前,收发双方先建立的一条逻辑上的通路。 ---> 进行参数协商 。
传输层 --- TCP 是在不可靠的 IP 层面之上来实现的一种可靠的数据传输协议。 ---> 有序传输、无丢失、
不重复、实现一种可靠传输行为 。
特点:
面向连接 --- 三次握手、四次挥手
提供可靠交付的服务。
每一条 TCP 连接都只能存在两个端点。 即点对点行为 。两端使用 套接字 (IP+ 端口 ) 来描述。
TCP 提供 全双工通信 ;
发送缓存
准备发送的数据
已经发送,但是没有收到确认的数据
接收缓存
按序到达,但未被应用程序读取的数据
乱序到达的数据
TCP 是 面向字节流 传输的协议; --- 以字节为单位 。 TCP 把应用程序交付下来的数据仅仅看做是一连
串无结构的字节流。

TCP 报文头部

序列号 :也是在标识报文的序号; 每个报文都必须包含序列号 。
序列号 = 上一个分组序列号 + 上个分组中传输的数据量 ;
能够帮助接收方进行数据排序。
确认序列号 :
通过确认序列号,来实现对数据的确认。
功能: 1. 代表接收方希望收到的下一个报文的序列号; 2. 代表该确认序列号之前的所有数据已
经收到 。
窗口大小 --- 指的是发送本报文的设备的接收窗口大小,即允许对方连续发送的数据量 。
紧急指针 --- 用来标记需要紧急处理的数据大小。
控制位 --- 标记位
紧急位 URG --- 代表此时的数据中,存在需要立即处理的数据,这部分数据不应该在缓存中排
队,需要立即处理,与紧急指针字段结合使用。
确认位 ACK --- 只有当 ACK=1 时,确认序列号才有意义 ; 在连接建立之后,所有传输的报文都
必须将 ACK 置位为 1 。
推送位 PSH --- 接收方应该尽快处理数据,不需要等待缓存填满等要求。
复位 RST
同步位 SYN --- 连接建立请求标志
终止位 FIN --- 连接释放标志,前提,本地数据传输完毕 。
在逐包确认机制中,发送方每发送一个数据,都需要等待接收方的确认报文,收到确认报文后,才
可以发送下一个报文信息,导致数据传输效率较低。而接收方只有将数据从接收缓存中提取给应用程序
处理后,才会发送确认报文 。
TCP 可靠性
手段 --- 确认、重传、排序、流控 排序机制
TCP 具备分段操作。 IP 协议具有分片操作。 ---> 分别基于 MSS 或 MTU 进行拆分 。
IP 分片和 TCP 分段是冲突的 。
MTU --- 代表数据帧中的数据信息 --- 最大传输单元(网络层 + 传输层 + 应用层)
MTU 是每一个接口所要维护的一个参数信息,代表该接口所在链路传输单个数据分组的最大
值 。
1500 字节。 --- 在以太网或 PPP 链路中。
MSS --- 代表数据大小 --- 最大段长度(应用层)
MSS = MTU - 网络层头部 - 传输层头部
该参数需要在 TCP 建立握手阶段时,通过前两个 SYN 报文进行参数协商,选择最小的 MSS 作为
后续传输的报文大小。之后传输的任何 TCP 报文,都不会在携带 MSS 数值,该参数携带在选项
字段 。
PMTU--->Path MTU---> 路径 MTU
确认机制
是可靠性机制的核心点 。 TCP 协议每发送一个数据报文,都需要让对端回复一个确认报文。
逐包确认 --- 累积确认 --- SACK( 选择确认机制 )
选择确认机制 --- 在 TCP 头部中增加一个选项字段,该字段包含了自己已经收到的数据信息。接收方
在确认报文中携带该字段,而发送方可以根据该字段判断需要重传的数据信息 。 --- 该功能需要协商。在
三次握手的前两次 SYN 报文中进行协商。
重传机制
发送方,什么时候会进行重传?
超时重传机制
发送者根据一个时间来判断,如果在时间超时时,没有收到对端的确认报文,则认为需要进行
重传。
RTT --- 往返时间:发送一个数据包,到收到对端反馈的确认报文的这段时间 。
RTO --- 超时重传时间:略大于 RTT 时间 。
这两个时间都是根据网络中实际报文的传输速率而动态变化的 。
超时间隔加倍 --- 当同一个 RTO 时间内没有收到回复,则下一个 RTO 时间加倍,但是不会无线
加倍,到达一定次数后,会舍弃重传报文。
快速重传机制 --- 当发送方连续收到三个冗余 ACK 报文时,将会触发重传机制。
TCP 流量控制机制
属于 TCP 传输效率问题。 单位时间内发送的数据量 。 在逐包确认机制中,只有收到对端的确认报文,才可以发送下一个报文;而确认报文只有对端接收
并处理数据后才会回复,如果没有及时处理数据,则发送方需要一直等待,导致数据传输效率过低。 --->
在接收方忙其他事情的时候,较多的传输自己的数据报文 。 ---> 窗口 --- 无需等待确认,可以继续发送的
数据包的最大量 。
窗口的大小 --- > 体现在接收缓存上。跟随接收缓存中剩余空间量的改变而变化的 。
窗口的大小,可以实现的是对数据传输效率高低的调整 。 真正用来实现流控机制的是窗口关闭机
制 。

窗口关闭 --- 窗口值是一个动态变化的数值,那么就一定存在归 0 的可能。
但是窗口关闭机制存在隐患,当服务端关闭窗口,然后打开窗口时,发送的窗口大小不为 0 的数据报
文丢失,则双方进入 死锁状态 。 --- 解决方法:客户端周期发送探测报文,该报文仅携带 1 字节数据。
TCP 的拥塞控制机制
拥塞 ---> 网络中对资源需求超过了资源可用量的情况被称为拥塞 。传输数据的带宽资源小于传输的
数据量本身。 ---> 拥塞的结果一定是分组丢失 。
流量控制是为了让接收方能够来得及接收数据;而拥塞控制是为了降低整个网络的拥堵情况 。
TCP 拥塞控制的核心问题:
如何判断网络此时发生了拥塞? --- 1. 发生超时重传; 2. 接收到 3 次冗余 ACK 报文 ;
如何去控制数据的发送量? --- 拥塞控制算法 --- 目的就是计算,限制拥塞窗口 --- 慢启动,拥塞避免,
快速恢复 。
慢启动 --- cwnd 一开始会被设置为一个较小的数值,一般等同于一个 MSS ,即一次只能发送一
个数据报文段。每收到一个新的 ACK( 重传的不算 ) ,就会增加一个 MSS 的大小 。
该算法实际呈现指数性增长。
慢启动门限 --- 决定了慢启动算法使用到什么时候
当 cwnd < 门限,使用慢启动算法
当 cwnd > 门限,使用拥塞避免算法
如果等于,则两者都可以使用
拥塞避免 --- 不是直接避免拥塞,而是通过降低 cwnd 的增大速率而使得网络不容易出现拥塞 。
每完成一次通讯过程,则增加一个 MSS 。
快速恢复

当 TCP 发现触发超时重传时,会将门限值设定为当前 cwnd 的一半,然后将 cwnd 调整为
一个 MSS 数值 。
当 TCP 接收到 3 次冗余 ACK 时,判断发生拥塞,此时会采取快速恢复算法,将门限值设定
为 cwnd 的一半,然后将 cwnd 设定为当前门限值,直接通过拥塞避免算法进行增长 。
因为发送方需要根据拥塞情况来调整自己的发送速率,故, TCP 引入了一个新的参数,称为 拥塞窗
口 --cwnd 。 --- 该参数与接收窗口 (rwnd) 一样,都可以对发送的字节数大小做限制。
发送方,发出未收到确认的字节数必须小于等于 rwnd 和 cwnd 中的最小值 。
发送窗口 = min ( cwnd , rwnd )
延迟确认机制 --- 一般最大延迟时间为 0.5 秒。捎带应答机制 --- 将确认报文和回执数据一起发送。