您的位置:首页 > 理论基础 > 计算机网络

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

2017-04-09 14:36 162 查看
啥都不说,先上代码。

服务端:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java tcp socket