1 TCP 三次握手、四次挥手
1.1 三次握手
client: CLOSE->SYN_SEND->ESTABLISHED
server: LISTEN->SYN_RECV->ESTABLISHED
客户端发送连接请求,发送SYNC,状态变为SYN_SEND;如果服务器端接收到SYN报文,状态变为SYN_RECV,同时服务器端发送ACK+SYN报文;如果客户端收到ACK+SYN报文,则继续发送ACK确认报文,此时客户端变为ESTABLISHED状态;如果服务器端收到ACK报文,服务器端也变为ESTABLISHED状态。
1.2 四次挥手
client: FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT
server: CLOSE_WAIT->LAST_ACK->CLOSED
客户端关闭连接,发送FIN报文给服务器,状态变为FIN_WAIT_1,此时客户端停止发送数据,但仍能接收服务器端发送过来的数据;服务器端收到FIN,停止发送数据,回复客户端ACK报文,此时状态改为CLOSE_WAIT状态; 服务器端关闭连接,发送FIN报文给客户端,此时状态变为LAST_ACK;如果客户端收到服务器端的FIN报文,则客户端发送ACK确认报文,并且进入TIME_WAIT状态;如果服务器收到客户端的ACK报文,则进入CLOSED状态; 在TIME_WAIT期间,如果客户端没有再收到服务端的FIN报文(也即ACK报文没有丢失),则客户端也进入CLOSED状态。
2 拥塞控制
2.1 慢开始,拥塞控制
拥塞窗口、ssthresh关系
当cwnd<ssthresh时,使用慢开始算法(指数增长)。
当cwnd>ssthresh时,改用拥塞避免算法(线性增长)
当cwnd=ssthresh时,慢开始与拥塞避免算法任意;
本来遇到网络拥塞时,也即网络丢包;ssthresh设置为网络拥塞时cwnd值的一半,cwnd此时 重新为1开始发送;周而复始。
2.2 快重传,快恢复
快重传配合使用的还有快恢复算法,有以下两个要点:
①当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把ssthresh门限减半。但是接下去并不执行慢开始算法。
②考虑到如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方现在认为网络可能没有出现拥塞。所以此时不执行慢开始算法,而是将cwnd设置为ssthresh的大小,然后执行拥塞避免算法。如下图: