Java演示TCP 3次握手与 4次分手

本文通过一个简单的Java示例介绍了TCP的三次握手和四次挥手过程。客户端和服务端通过Socket API实现连接和断开,使用Wireshark抓包工具展示了整个交互流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

啥都不说,先上代码。
服务端:

package com.ghs.test;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServerSocket {
    private static ServerSocket serverSocket;
    private static Socket socket;

    public static void startServerSocket(int bindPort) {
        try {
            serverSocket = new ServerSocket(bindPort);
            while(true){
                socket = serverSocket.accept();
                System.out.println("连接的客户端地址和端口为:" + socket.getRemoteSocketAddress());
                socket.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        startServerSocket(6000);
    }
}

客户端:

package com.ghs.test;

import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

public class TCPClientSocket {

    private static Socket socket;

    /**
     * 是否主动发起关闭
     */
    private static boolean isLaunchClose=true;

    /**
     * 建立socket连接
     * 
     * @param bindIp
     * @param bindPort
     */
    public static void connectServerSocket(String bindIp, int bindPort) {
        try {
            socket = new Socket(bindIp, bindPort);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 关闭socket连接
     */
    public static void closeSocket(){
        try {
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        int bindPort = 6000;
        String bindIp = "192.168.1.36";
        connectServerSocket(bindIp, bindPort);
        if(!isLaunchClose){
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        closeSocket();
    }
}

先启动服务端,然后启动客户端,通过wireshark软件进行抓包。结果如下这里写图片描述

注:实际操作过程中,抓取的包可能是下面这样,不过红色部分可以不加
考虑
这里写图片描述
附:如果你本地无法抓包,请参考
https://yq.aliyun.com/ziliao/140472

下面,简单的介绍一下,TCP的3次握手和4次分手。
先上一个经典图形。
这里写图片描述

3次握手
当服务的启动之后,处于LISTEN状态。
当客户端执行下面的代码后,就开始了3次握手

socket = new Socket(bindIp, bindPort)

客户端首先发送一个SYN报文,服务端返回一个SYN+ACK报文,客户端再回一个ACK报文

4次分手
当客户端执行下面的代码后

socket.close();

客户端会发送一个FIN+ACK报文,服务端会响应一个ACK报文。
此时,客户端处于FIN_WAIT_2状态,服务端处于CLOSE_WAIT状态。

当服务端执行下面的代码后

socket.close();

服务端会发送一个FIN报文,进入LAST_ACK状态
客户端返回一个ACK报文,进入TIME_WAIT状态

至于TCP为什么要经过3个握手4次分手,可以参考下面这篇博文。
http://www.jellythink.com/archives/705

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值