本文主要是介绍12.3 拥塞控制流程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
12.3.1 TCP拥塞状态
TCP拥塞状态共有5个:
135 enum tcp_ca_state {
136 TCP_CA_Open = 0,
137 #define TCPF_CA_Open (1<<TCP_CA_Open)
138 TCP_CA_Disorder = 1,
139 #define TCPF_CA_Disorder (1<<TCP_CA_Disorder)
140 TCP_CA_CWR = 2,
141 #define TCPF_CA_CWR (1<<TCP_CA_CWR)
142 TCP_CA_Recovery = 3,
143 #define TCPF_CA_Recovery (1<<TCP_CA_Recovery)
144 TCP_CA_Loss = 4
145 #define TCPF_CA_Loss (1<<TCP_CA_Loss)
146 };
Open:是初始状态,也是正常状态
Disorder:当第一次由于SACK块或重复确认而检测到拥塞时进入此状态;此状态下拥塞窗口不变,TCP需要保持网络中的包的数量不变;TCP在进入Recovery状态之前要进入本状态
CRW(Congestion Window Reduced):此状态下TCP会减小拥塞窗口,但不会重传已发送数据;这个状态在本地拥塞或收到显示拥塞通告(ECN)后设置
Recovery:减小拥塞窗口直至到达ssthresh但不能增加拥塞窗口,会重传数据
Loss:所有已发送数据都会被标记为丢失,拥塞窗口减小到一个报文段,然后数据发送端使用慢启动算法增大拥塞窗口。这个状态下不能使用快速重传算法
12.3.2 拥塞窗口
TCP在调用tcp_write_xmit函数发送数据时会检查拥塞窗口:
1811 static bool tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle,
1812 int push_one, gfp_t gfp)
1813 {
...
1842 cwnd_quota = tcp_cwnd_test(tp, skb);
1843 if (!cwnd_quota) { //拥塞窗口不允许发送数据
1844 if (push_one == 2) //发送丢失探测报文是允许的
1845 /* Force out a loss probe pkt. */
1846 cwnd_quo
这篇关于12.3 拥塞控制流程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!