三次握手
1.第一次握手:第一次握手就是客户端发送一条tcp数据包,数据包里面将SYN标志位置为1,选择一个初始序列号J。
2.第二次握手:当服务端接收到客户端发来的这条tcp数据包以后,会将SYN标志位置为1,ACK标志位也置为1,表示确认接收到你刚刚发来的这条信息并且也和你建立连接,然后将确认应答号置为J+1,然后也选择一个初始序列号K
3.第三次握手:当客户端接收到服务端发来的tcp数据包以后,就会将ACK标志位置为1,将应答号置为K+1,表示收到了刚刚服务端的确认,并且将序列号置为J+1,最后一次握手可以携带数据,此时的三次握手建立成功。
四次挥手
1.第一次挥手:客户端将FIN标志位置为1,将序列号置为对应的号数J
2.第二次挥手:服务端接收到客户端发来的数据包,将ACK置为1,确认号置为J+1,表示收到客户端的消息。
3.第三次挥手:服务端也向客户端发送一个FIN标志位置为1,序列化置为N的数据包。
4.第四次挥手:客户端也向服务端发送一个ACK为1,确认号为N+1的数据包,表示确认接收服务端的断开。
序列号的计算
如果一个数据包的序列号是222,这意味着该数据包的第一个字节的序列号是222。如果这个数据包含有数据,比如10个字节,那么这个数据包的序列号范围就是222到231(222+10-1)。
下一个数据包的序列号将是最后一个字节的序列号加1。所以,如果当前数据包的序列号是222,并且它携带了10个字节的数据,那么下一个数据包的序列号将是231+1=232。
这里的关键是理解序列号是连续的,并且每个数据包的序列号都是基于前一个数据包的最后一个字节的序列号加1来设置的。这样,接收方可以根据序列号来正确地重新组装数据流。
意外情况
客户端断网:客户端的网络连接突然中断,这可能导致客户端的TCP栈无法发送或接收数据。
服务器超时:由于客户端断网,服务器可能无法收到来自客户端的任何数据或ACK。如果服务器在一定时间内没有收到客户端的响应,它会触发超时机制。
服务器重传:服务器在超时后可能会尝试重传数据或FIN报文段,以尝试维持或关闭连接。
服务器关闭连接:如果服务器在多次重传后仍然没有收到客户端的响应,它可能会决定关闭连接。这通常涉及到服务器发送一个FIN报文段,然后进入关闭等待状态。
客户端重新连接:如果客户端的网络连接恢复,它可能会尝试重新建立连接,这将重新开始三次握手过程。
客户端无法完成挥手:如果客户端在断网期间没有收到服务器的FIN报文段,它可能不会发送自己的FIN报文段。因此,客户端可能不会完成四次挥手过程。
网络恢复后的状态:如果网络恢复,客户端可能会尝试完成之前的TCP通信,或者根据应用程序的逻辑重新建立连接。
三次握手和四次挥手的实际意义
三次握手的实际意义:
同步序列编号:三次握手过程中,客户端和服务端交换序列号,确保双方都有一致的初始序列号,为后续的数据传输提供基础。
确认双方准备就绪:通过三次握手,双方都能确认对方已经准备好进行数据传输,从而避免无效的连接尝试。
防止旧连接请求被误接收:三次握手可以防止网络中延迟的旧连接请求突然到达,从而避免这些旧请求错误地建立新的连接。
建立可靠连接:三次握手确保了连接的可靠性,为数据的有序、错误检测和流量控制提供了基础
四次挥手的实际意义
确认关闭请求:通过四次挥手,双方都能确认对方已经接收到了关闭连接的请求,从而避免数据丢失。
处理半关闭状态:四次挥手允许一方在发送完所有数据后关闭连接,而另一方可能还在发送数据,这种半关闭状态需要四次挥手来正确处理。
释放资源:四次挥手完成后,双方都确认不再需要发送或接收数据,可以安全地释放分配给连接的资源,如端口号、内存等。
防止数据丢失:四次挥手确保即使在关闭连接的过程中,数据也不会丢失,因为双方都有机会发送完所有数据并确认。
避免端口占用:如果一方在没有完成四次挥手的情况下断开连接,另一方可能会长时间占用端口资源,等待关闭连接。四次挥手确保双方都有机会关闭连接,避免资源浪费。