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的大小就决定了发送者的发送窗口大小。
-----------这样一来一回,保证了发送和接收的稳定和可靠。
4 拥塞算法与流量控制算法什么时候 起用?
根据算法原理,对于TCP数据包“发送过程”,简单理解如下:
TCPpackage-> 缓冲进window缓存区 ->
slow start网络探测 -> 连接被唤醒 -> 包大小超过拥塞阀值 ->
yes -> 开始拥塞 -> congestion avoidance解除拥塞-> 是否解除 ->
yes -> 准备从缓存区发包到目标设备 -> 是否满足Nagle算法 ->
yes -> (a) 发送包... -> 是否超时或收到重复ack ->
yes -> fast retransmit快速重发ack-> 是否三次重发ack失败 ->
yes-> 丢包,fast recovery快速恢复 -> (a)
5 拥塞算法 什么时候 启动?
拥塞控制算法会在”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值的大小