TCP连接与拥塞控制
tcp三次握手,四次挥手以及tcp拥塞控制
tcp三次握手
目的:建立tcp链接
结果:建议一条全双工信道,即双方都能确保自己的收/发信道通畅
过程:
-
Client发送SYN给Host,Host收到SYN
此时client无法获取任何有关自己收/发信道的讯息
Host收到SYN,于是可以确认自己的接收信道通畅
-
Host向Client发送SYN以及ACK,Client收到
由于Client发送的SYN有了ACK,则可以确认自己发送信道通畅
同时由于收到了Host的消息,于是可以确认自己接收信道通畅。
至此Client方的两条信道确认完毕,Host方还有发送信道没有确认
-
Client向Host发送ACK(同时也可以携带数据),Host收到
Host发送的SYN有了ACK,于是确认自己的发送信道通畅
tcp四次挥手
目的:断开tcp连接
结果:双方都知晓连接中再无数据传输,并断开连接
过程:
-
A传输完所有数据后,向B发送FIN,B收到FIN
此时还无法保证双方都知晓“A->B方向已无数据”,因为此FIN可能丢失
-
B向A放回ACK,A收到
B收到FIN,知晓“A->B方向已无数据”,并发送ACK给A
A收到ACK后,知晓了自己的FIN已送达,于是可以彻底关闭自己的发送信道
3, 4 同理于1, 2
tcp拥塞控制
目的:为了防止网络进入拥塞状态,每个发送者需要控制自己的发送频率
方法:每个发送者维护一个发送窗口,当网络空闲时,这个窗口会慢慢变大,网络发生拥塞时该窗口会缩小
具体算法:
-
每个发送者维护一个拥塞窗口cwnd(Congest Window),和一个慢启动阈值sshthresh(Slow Start threshold)
-
慢开始状态
初始cwnd设置为1,每当一个报文按时到达且cwnd小于sshthresh时,则指数增加cwnd(cwnd *= 2)
-
拥塞避免状态
当一个报文按时到达,但此时cwnd已经超过了sshthresh,则线性增加cwnd(cwnd *= 1)
-
快速恢复状态
当报文传输超时时,意味网络可能发生拥塞
此时重置cwnd为初始值(1),同时将sshthresh减半(sshthresh /= 2)
cwnd变化曲线
参考资料: