您的位置:首页 > 理论基础 > 计算机网络

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

2015-04-22 10:08 465 查看
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值的大小
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: