TCP连接管理
涉及双方四人,通信的两端和每端有的应用层和TCP协议栈
ack标志位在整个tcp连接期间,只有第一个segment 值为零,以后都是1
TCP为了追求可靠性,进行发送量的控制 —— 广义上的“流量控制”
发送方如果无脑发送数据,接收方的缓冲区满了就堵塞了
所以要进行发送量的控制
发送量受到哪些因素影响?
- 接收方的接受能力(流量控制)
- 网络情况的影响(拥塞控制)
流量控制
Flow Control 根据接收方接受能力,进行发送量的控制机制
- 作为发送方,如何得知接收方的接受能力?
在Header中 有16位的窗口大小
在握手的时候进行交流沟通 - 回到发送方角度,发送方是如何进行发送量控制的
- 发送方的发送缓冲区被分为了哪些区域
- TCP的发送缓冲区是一个循环Buffer
收到ack就向右滑动:发送方发送缓冲上两个下标。控制当前能发送的数据量。随着收到对方的应答ack之后,进行更新调整。—— 不动或者像右滑
- 发送方的发送缓冲区被分为了哪些区域
- 为了保证可靠性 —— 别做无用功,所以根据对方的接受能力来调节发送量的大小
- 通过TCP Header 中的窗口传递接受能力
- 发送方TCP协议栈内部通过溢血下标,标注发送缓冲区的各个区域
已发送 已应答 可以再次使用
已发送 未应答 算在接受能力之内
有数据 待发送
完全可用空间 - 这些下标中,有一组标识出滑动窗口的概念,本质上就是根据对方的应答 + 接受能力,实时记录下一步的情况
- 滑动窗口主要靠对方的应答进行更新
- 平时提到的窗口 指的是TCP Header 中的窗口字段,表示的意思是接收方的接受能力,滑动窗口指的是TCP协议栈,发送方的控制发送量的机制。
这种情况下,1000-2000丢了,导致后续的无法应答
虽然后续的也受到了但是不会应答3000,应答3000就代表之前的都受到了
这种情况下,连续收到了1000的应答。十有八九就是1000-2000丢包了。所以不等超时,就快速的重传,就称为快重传
流量控制是根据接收方能力来控制发送量的机制
拥塞控制
根据网络情况,进行发送量控制(启动,发送量控制发送也是通过滑动窗口控制)
- 接收方能力(比如是1000)网络承载能力(500)
- 发送量大小 = MIN(接收方能力,网络承载能力)
发送方如何得知网络承载能力?和接收窗口不一样
承载能力需要估算(发展中的算法) 对方发送方可以简单地通过单位时间内,丢包频率来估算,承载能力记录为拥塞窗口。
3. TCP谨慎 —— 做最坏的打算(一开始承载能力很低)
4. 随着时间发展,只要没有出现单位时间内频繁丢包的情况。拥塞窗口就会变大
因此,TCP的拥塞控制就是慢启动的
指数增长 到 线性增长
遇到网络拥塞 重新开始启动
能发多少货 有谁决定?
由流量控制 + 拥塞控制共同决定
TCP三个特点
可靠
有连接
面向字节流