【TCP】四次挥手(终止连接)

news/2024/5/17 18:00:19 标签: tcp, 网络协议

图片

前言

TCP(传输控制协议)是互联网协议(IP)中的一种重要传输层协议,用于在通信的计算机之间建立可靠的、有序的和错误校验的数据传输。在TCP连接中,数据传输是双向的,因此需要一种机制来开始和结束连接。这就是所谓的“握手”和“挥手”。TCP四次挥手是TCP连接断开过程中的一个重要环节,它确保了数据传输的完整性和可靠性。

TCP四次挥手过程和状态变迁

TCP的四次挥手过程发生在两个端点都准备好关闭连接时。以下是四次挥手的详细步骤:

图片

  1. FIN:当一方完成数据发送并决定关闭连接时,它会发送一个FIN报文段,请求关闭连接。此时,发送方进入FIN_WAIT_1状态,等待接收方的确认。

  2. ACK:接收方收到FIN报文段后,会发送一个ACK报文段作为回应,表示同意关闭连接。此时,接收方进入CLOSE_WAIT状态。

  3. FIN:一旦接收方完成所有数据接收并准备关闭连接,它也会发送一个FIN报文段,表示请求关闭连接。此时,发送方进入TIME_WAIT状态。

  4. ACK:接收方发送一个ACK报文段作为回应,确认收到FIN报文段并完成关闭连接。

以下是使用Java代码模拟TCP四次挥手的示例:


import java.io.BufferedReader;  
import java.io.InputStreamReader;  
import java.io.PrintWriter;  
import java.net.Socket;  
  
public class TCPHandshake {  
    public static void main(String[] args) {  
        try {  
            // 创建Socket连接  
            Socket socket = new Socket("localhost", 8000);  
            System.out.println("Connected to server");  
  
            // 获取输入输出流  
            BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));  
            PrintWriter output = new PrintWriter(socket.getOutputStream(), true);  
  
            // 第一次挥手:客户端发送FIN报文段请求关闭连接  
            output.println("FIN");  
            System.out.println("Sent FIN");  
  
            // 等待服务器响应  
            String response = input.readLine();  
            System.out.println("Received response: " + response);  
  
            // 第二次挥手:服务器发送ACK报文段确认关闭连接请求  
            output.println("ACK");  
            System.out.println("Sent ACK");  
  
            // 等待客户端响应  
            response = input.readLine();  
            System.out.println("Received response: " + response);  
  
            // 第三次挥手:客户端发送FIN报文段请求关闭连接  
            output.println("FIN");  
            System.out.println("Sent FIN");  
  
            // 等待服务器响应  
            response = input.readLine();  
            System.out.println("Received response: " + response);  
  
            // 第四次挥手:服务器发送ACK报文段确认关闭连接请求  
            output.println("ACK");  
            System.out.println("Sent ACK");  
  
            // 关闭连接和流  
            socket.close();  
            input.close();  
            output.close();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
}

第一次挥手:主动关闭方发送关闭请求(FIN)

在TCP的四次挥手过程中,首先由主动关闭方(通常是客户端)发起关闭请求。主动关闭方发送一个TCP报文,其中包含FIN(Finish)标志位,表示主动关闭方不再有数据要发送了。此时,主动关闭方进入FIN_WAIT_1状态,等待被动关闭方的确认。

第二次挥手:被动关闭方回应确认(ACK)

被动关闭方(通常是服务器)接收到主动关闭方的FIN后,发送一个确认(ACK)报文,表示已经收到了关闭请求。此时,被动关闭方进入CLOSE_WAIT状态,表示服务器端的应用程序已经等待关闭了,但仍可以接收来自客户端的数据。

第三次挥手:被动关闭方发送关闭请求(FIN)

在完成自己的数据发送后,被动关闭方也发送一个带有FIN标志的TCP报文,表示被动关闭方也没有数据要发送了。此时,被动关闭方进入LAST_ACK状态,等待主动关闭方的确认。

第四次挥手:主动关闭方回应确认(ACK)

主动关闭方接收到被动关闭方的FIN后,发送一个确认(ACK)报文,表示已经收到了关闭请求。此时,主动关闭方进入TIME_WAIT状态,等待一段时间,以确保被动关闭方收到了确认,并防止可能存在的延迟报文导致连接混乱。一旦等待时间过去,主动关闭方进入CLOSED状态,表示连接已经完全关闭。

为什么挥手需要四次

TCP的四次挥手是为了确保数据流的正确和可靠地关闭。这需要双方都明确地确认关闭请求,并确保所有的数据包都已接收或处理。通过四次握手,每一方都可以确认对方已经完成了数据传输和接收的准备工作。

为什么TIME_WAIT等待的时间是2MSL

TIME_WAIT状态是TCP四次挥手中的一个重要状态,其持续时间通常是2MSL(最大段生存期)。这是为了确保在网络中的所有数据包都已过期并被丢弃,防止出现旧的数据包在网络中循环并导致连接错误关闭的问题。TIME_WAIT状态也提供了一个机会让发送方等待一段时间,以确保接收方已经收到了关闭连接的请求。

等待2MSL的意义

等待2MSL是为了确保在网络中的所有数据包都已过期并被丢弃。如果发送方在发送完最后一个ACK报文段后立即关闭连接,而网络中仍然存在未过期或未被丢弃的数据包,那么这些数据包可能会在网络中循环并导致连接错误关闭。通过等待2MSL的时间,发送方可以确保这些数据包已经过期并被丢弃,从而避免这种情况的发生。此外,等待2MSL的时间也为接收方提供了一个机会,以确保它已经收到了关闭连接的请求并完成了所有必要的处理工作。

如何解决TIME_WAIT状态过多

最好的办法是尽量让客户端主动断开连接,除非遇到一些异常情况,如客户端协议错误、客户端超时等。

打开系统的TIME_WAIT重用和快速回收。

在Linux系统可以修改以下参数:

1.打开TCP对时间戳的支持,保持服务器与客户端时间同步 

net.ipv4.tcp_timestamps=1(默认即为 1)

2.修改net.ipv4.tcp_tw_reuse = 1,允许对处于TIME_WAIT的socket用于建立新的连接

net.ipv4.tcp_tw_reuse = 1 (默认为0)

修改TIME_WAIT连接状态的上限值,超过上限值,处于TIME_WAIT状态的socket将立刻被清除并打印警告信息。

net.ipv4.tcp_max_tw_buckets = 18000,表示系统同时保持处于TIME_WAIT状态的socket的最大数量,默认为18000。

可修改为更小值。

net.ipv4.tcp_max_tw_buckets = 6666

结语

TCP的四次挥手是一个复杂但必要的过程,用于确保可靠地关闭TCP连接。通过四次握手和TIME_WAIT状态,TCP协议可以确保数据流的正确和可靠地关闭,并避免在网络中循环的数据包导致连接错误关闭的问题。了解TCP的四次挥手过程和状态变迁对于理解TCP协议的工作原理和实现可靠的网络通信至关重要。

图片


http://www.niftyadmin.cn/n/5361103.html

相关文章

2款网络监控系统软件,你更喜欢哪款?

伴随电脑使用的普及,人们对于网络安全也越来越重视,网络监控系统软件可以监控电脑网络的使用情况。高品质的网络监控系统软件有哪些? 一、绿虫监控软件 是一款服务于各类企事业单位的网络监控软件,被称为帮助企业降本增效的利器…

K8s 集群可观测性-数据分流最佳实践

简介 在微服务架构下,一个 k8s 集群中经常会部署多套业务,同时也意味着不同团队、不同角色、不同的业务会在同一集群中,需要将不同业务的数据在不同的空间进行管理和查看。 在传统的主机环境下,这个是可以通过不同的主机部署 Da…

北朝隋唐文物展亮相广西,文物预防性保护网关保驾护航

一、霸府名都——太原博物馆收藏北朝隋朝文物展 2月1日,广西民族博物馆与太原博物馆携手,盛大开启“霸府名都——太原博物馆北朝隋文物展”。此次新春展览精选了北朝隋唐时期150多件晋阳文物珍品。依据“巍巍雄镇”“惊世古冢”“锦绣名都”三个单元&am…

和鲸科技与智谱AI达成合作,共建大模型生态基座

近日,上海和今信息科技有限公司(简称“和鲸科技”)与北京智谱华章科技有限公司(简称“智谱AI”)签订合作协议,双方将携手推动国产通用大模型的广泛应用与行业渗透,并积极赋能行业伙伴探索领域大…

深入探讨 React 组件生命周期(新版)

深入探讨 React 组件生命周期(新版) React 18 引入了一些新的组件生命周期函数,以提供更灵活和强大的控制。在新的生命周期中,我们可以更好地处理组件的渲染、更新和卸载过程。下面我们将深入了解这些新的生命周期函数。 1. com…

069:vue中EventBus的使用方法(图文示例)

第069个 查看专栏目录: VUE ------ element UI 本文章目录 示例背景示例效果图示例源代码父组件:子组件A:子组件B:eventbus/index.js: EventBus的基本使用方法: 示例背景 在Vue中,使用EventBus可以实现组件…

Python||五城P.M.2.5数据分析与可视化_使用华夫图分析各个城市的情况(中)

目录 1.上海市的空气质量 2.成都市的空气质量 【沈阳市空气质量情况详见下期】 五城P.M.2.5数据分析与可视化——北京市、上海市、广州市、沈阳市、成都市,使用华夫图和柱状图分析各个城市的情况 1.上海市的空气质量 import numpy as np import pandas as pd impor…

13.2 Web与Servlet进阶(❤❤)

13.2 Web与Servlet进阶 1. 请求与响应1.1 URL与URI1.2 HTTP请求的结构1. 结构2.后端获取访问工具类型:getHeader().toLowerCase方法1.3 响应的结构1. 结构2. 响应常见状态码3. 后端设置响应参数4. 响应的ContentType作用1.4 请求转发与响应重定向应用1. 请求转发:getRequestDis…