TCP/IP:拥塞算法与流量控制算法 学习小结

1.查看支持的拥塞控制协议?

cat /proc/sys/net/ipv4/tcp_allowed_congestion_control


2.修改阻塞算法:

 sysctl net.ipv4.tcp_congestion_control=???? 进行修改算法

 

概念:

 

SWND(SendWindow,发送窗口);

拥塞窗口(Congestion Window,CWND);

 

3 拥塞算法与流量控制算法有什么关系与区别?

流量控制

流量控制用来避免“主机分组发送”得过快而使接收方来不及完全收下

拥塞控制

是“接收机”对cwnd的窗口调整

算法

属于

描述

算法使用的位置

Nagle算法

流量控制

1. 起始缓冲算法 (slow start)

2. 解除拥塞算法 (congestion avoidance)

3. 快速重发算法 (fast retransmit)

4. 快速恢复算法 (fast recovery)

 

Nagle算法就是以这4种算法为基础来实现的。

发送的时候使用:tcp_write_xmit

reno算法、vegas算法和cubic算法等

拥塞控制

对应上面的“

2. 解除拥塞算法 (congestion avoidance)

它们或者部分或者全部实现了上述四个部分;

接收端ack包的时候使用tcp_ack()函数

所以Nagle算法的一个整体的算法,包含了拥塞算法(reno算法、vegas算法和cubic算法等),后者属于整个流量控制过程的一个环节,他们互相影响cwnd的调整:发端窗口大小 = min{ rwnd , cwnd };

理解成:

发端窗口的大小Nagle算法控制)取决于收端的窗口大小rwnd(TCP报文的窗口大小字段 拥塞窗口大小cwnd(见拥塞控制拥塞算法(reno算法、vegas算法和cubic算法等来控制

“根据协议TCP/IP协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接收到数据,也需要发送ACK表示确认

意思就是:发送过程为例:

发送者,使用nagle算法来控制发送者的流量,同时收到,接受者的 ack包。发送者根据ack包,使用拥塞算法,调整cwnd

接收者,在接收的时候,使用拥塞算法达到控制cwnd的大小,cwnd的大小就决定了发送者的发送窗口大小。

          -----------这样一来一回,保证了发送和接收的稳定和可靠。

 

 

拥塞算法与流量控制算法什么时候 起用?

根据算法原理,对于TCP数据包“发送过程”,简单理解如下:

TCPpackage-> 缓冲进window缓存区 ->

                          slow start网络探测 -> 连接被唤醒 -> 包大小超过拥塞阀值 ->

                                yes -> 开始拥塞 ->  congestion avoidance解除拥塞->  是否解除 ->

                                        yes -> 准备从缓存区发包到目标设备 -> 是否满足Nagle算法 ->

                                           yes -> (a) 发送包... -> 是否超时或收到重复ack ->

                                               yes -> fast retransmit快速重发ack-> 是否三次重发ack失败 ->

                                                    yes-> 丢包,fast recovery快速恢复 -> (a)

 

拥塞算法 什么时候 启动?

拥塞控制算法会在tcp_ack()函数“中被调用,如果是正常的ack(比如不是重复的,不是sack等等)就会进入拥塞控制算法。

Tck_ack,发生在接收窗口:

Tcp_input.c(prerelease.p36\kernel-3.10\net\ipv4):static int tcp_ack(struct sock *sk, conststruct sk_buff *skb, int flag)

Tcp_input.c(prerelease.p36\kernel-3.10\net\ipv4):                                tcp_ack(sk,skb, 0);

Tcp_input.c(prerelease.p36\kernel-3.10\net\ipv4):                                tcp_ack(sk,skb, FLAG_DATA);

Tcp_input.c(prerelease.p36\kernel-3.10\net\ipv4):        if(tcp_ack(sk, skb, FLAG_SLOWPATH | FLAG_UPDATE_TS_RECENT) < 0)

Tcp_input.c(prerelease.p36\kernel-3.10\net\ipv4):                tcp_ack(sk,skb, FLAG_SLOWPATH);

Tcp_input.c(prerelease.p36\kernel-3.10\net\ipv4):                intacceptable = tcp_ack(sk, skb, FLAG_SLOWPATH |

调起---icsk->icsk_ca_ops->cong_avoid();

 

6.为何“拥塞控制算法 ”只对接收包(也就是只针对接收到的ack包)

 

由于需要考虑“拥塞控制”和“流量控制”两个方面的内容,因此TCP的真正的:发送窗口=min(rwnd, cwnd)。但是rwnd是由对端确定的,网络环境对其没有影响,所以在考虑拥塞的时候我们一般不考虑rwnd的值,我们暂时只讨论如何确定cwnd值的大小

你可能感兴趣的:(tcp,IP,拥塞算法,流量控制算法)