TCP 流量控制/拥塞控制

流量控制——TCP支持根据接收端的处理能力,来决定发送端的发送速度。

我们知道TCP在接受方有接受缓存区,如果接受缓存区接受满了,会造成什么呢?

流量控制:如果接收端的接受缓存区满了,就接受不了数据了,而发送方还一直的发送数据段给接受方。接受不了就会导致丢包的情况,而丢包,就会导致丢包重传(快速重传的机制)等等一系列连锁的反应。会大大的增加网络复杂情况。

解决:
1.TCP中规定,在接收端发送ACK确认应答的时候,在TCP首部中“窗口大小”字段,存放的是 现在我能接收的数据段大小(即我现在的缓冲区空闲大小)。
2.接受端如果缓存区快满了,就会把窗口大小设置成一个更小的值,每次的ACK应答都会考虑自己的缓冲区大小而改变,缓冲区还剩多,设置的窗口大小就大点,小就小点。
3.如果接受方的缓存区满了,则把TCP包头中的窗口大小设置为0,这时候发送方就不再发送数据了。
4.如果发送方接收到了接受方ACK中窗口大小为0,不再发送数据,但是要定期发送一个窗口探测数据段,使接受方把窗口大小告诉发送方。

TCP 流量控制/拥塞控制_第1张图片


拥塞控制
刚开始通信的两方,接受缓存区肯定是空闲的,我们一开始通信,就大量的发送数据包合适吗?

不合适,因为当前的网络环境会很复杂,如果我们冒然的发送大量的数据,无疑会增加网络的负担,影响网络通信中各个通信。

为了避免这样的情况,TCP中还引入了拥塞控制

TCP 引入“慢启动”机制,先发少量的数据,探探路,摸清楚当前的网络拥堵情况,再决定按照多大的速度发送数据包。
TCP 流量控制/拥塞控制_第2张图片

1.此处引入一个拥塞窗口的概念。
2.发送开始的时候,定义的拥塞窗口大小为1。
3.每次接受到ACK应答,拥塞窗口加1。
4.每次发送数据包的时候,将拥塞窗口和ACK中的窗口大小做比较,去较小的值作为当前发送窗口大小。

慢启动:只是指初始时慢,但是增长速度非常快。
如图:
TCP 流量控制/拥塞控制_第3张图片

少量的丢包,我们仅仅是触发重传。大量的丢包,我们认为是网络拥塞。
拥塞控制就是想尽快的把数据传输给对方,但是又要避免给网络造成太大的压力。

你可能感兴趣的:(网络)