三次握手和四次挥手
TCP三次握手过程
TCP三次握手用于在客户端和服务器之间建立连接。以下是三次握手的详细步骤:
第一次握手:客户端向服务器发送一个SYN报文段(SYN=1),并随机生成一个初始序列号seq=x。此时,客户端进入SYN_SENT状态,等待服务器的确认。
第二次握手:服务器收到客户端的SYN报文段后,会向客户端回复一个SYN+ACK报文段(SYN=1,ACK=x+1),并随机生成一个初始序列号seq=y。此时,服务器进入SYN_RECV状态。
第三次握手:客户端收到服务器的SYN+ACK报文段后,会向服务器发送一个ACK报文段(ACK=y+1)。这个报文段发送完毕后,客户端和服务器都进入ESTABLISHED状态,完成三次握手,连接建立成功。
在这个过程中,SYN和ACK是TCP报文段的标志位,用于标识报文段的类型。
SYN标志位,表示建立一个连接,携带SYN的TCP报文段为同步报文段。
seq和ACK分别表示请求序列号和确认序列号,用于保证数据的顺序性和可靠性。
TCP四次挥手过程
TCP四次挥手用于在客户端和服务器之间断开连接。以下是四次挥手的详细步骤:
第一次挥手:当客户端希望断开连接时,会向服务器发送一个FIN报文段(FIN=1),并进入FIN_WAIT_1状态。
第二次挥手:服务器收到客户端的FIN报文段后,会向客户端发送一个ACK报文段(ACK=u+1),确认收到关闭请求。此时,服务器进入CLOSE_WAIT状态,客户端进入FIN_WAIT_2状态。
第三次挥手:当服务器也准备断开连接时,会向客户端发送一个FIN报文段(FIN=1),并进入LAST_ACK状态。
第四次挥手:客户端收到服务器的FIN报文段后,会向服务器发送一个ACK报文段(ACK=w+1),确认收到关闭请求。此时,客户端进入CLOSED状态,服务器也进入CLOSED状态,连接断开。
在这个过程中,每个报文段都需要等待对方的确认才能进行下一步操作,以确保双方都能正确关闭连接。MSL(报文最大生存时间)的概念也在这个过程中起到了重要作用,它保证了上一次连接的报文已经在网络中消失,不会出现与新TCP连接报文冲突的情况。
拥塞窗口全流程
拥塞窗口(cwnd)在TCP拥塞控制中扮演着核心角色,它的变化逻辑主要受到网络拥塞状况的影响。以下是拥塞窗口变化逻辑的基本概述:
慢启动阶段:
当TCP连接刚建立时,拥塞窗口(cwnd)初始化为一个较小的值,通常是一个数据包的大小。发送方按照cwnd的大小发送数据段。
每收到一个ACK确认,cwnd就会增加,通常是线性增长,具体增加的数量可能依赖于实现。
这样,随着时间的推移,发送方发送的数据量会急剧增加,但增长速率是指数级的,受到慢启动算法的控制。
慢启动的目的是在网络刚刚建立连接时,谨慎地探测网络的可用带宽,避免一开始就注入过多数据导致拥塞。
拥塞避免阶段:
当cwnd超过一个慢启动门限值(ssthresh)时,拥塞控制进入拥塞避免阶段。
在拥塞避免阶段,cwnd的增长不再是指数级的,而是线性增长,增长速率通常较小。
如果发送方检测到超时或收到重复的ACK(通常是3个),则认为网络发生了拥塞。
当发生拥塞时,发送方会将ssthresh设置为当前cwnd的一半,并将cwnd重置为1或ssthresh,具体取决于实现和拥塞的严重程度。
快重传和快恢复阶段:
如果发送方收到三个重复的ACK,说明有数据包丢失,此时会触发快重传机制。
在快重传阶段,发送方会重传丢失的数据包,而不是等待超时。
同时,进入快恢复阶段,此时cwnd会被设置为ssthresh加上3乘以MSS(最大报文段长度),并且发送方会继续发送新的数据包,直到收到一个非重复的ACK。
当收到非重复的ACK时,cwnd会被重置为ssthresh,重新进入拥塞避免阶段。
整个过程中,拥塞窗口的变化逻辑是根据网络的拥塞状况动态调整的。当网络拥塞时,拥塞窗口会减小,发送速率会降低,以减少拥塞;当网络状况良好时,拥塞窗口会逐渐增大,发送速率会增加,以充分利用网络带宽。这样的动态调整有助于确保TCP连接在网络拥塞时能够稳定运行,提供可靠的数据传输服务。
拥塞窗口的增长速率
慢启动阶段,拥塞窗口的增长速率是指数级的吗?
比如从1到2,从2到4,从4到8。看起来是,实际流程不是。
实际流程:
第一次发送1个数据段 ,接收方确认收到,发送1个ACK,发送方接收到ACK,
拥塞窗口1->2,
第二次发送2个数据段,接收方确认收到,发送2个ACK,发送方接收到2个ACK,第一个ACK的时候是2->3,第二个收到的时候是3->4,
看上去是倍增,其实是一个个加上去最终到4。
到慢启动门限值(ssthresh)之后,进入拥塞控制阶段,发送一堆接收一堆拥塞窗口只+1,看上去是线性增长。