Java演示TCP 3次握手与 4次分手
2017-04-09 14:36
162 查看
啥都不说,先上代码。
服务端:
客户端:
先启动服务端,然后启动客户端,通过wireshark软件进行抓包。结果如下
![](https://img-blog.csdn.net/20170409141705282?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTk4MzUzMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
注:实际操作过程中,抓取的包可能是下面这样,不过红色部分可以不加
考虑
![](https://img-blog.csdn.net/20170409144150903?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTk4MzUzMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
附:如果你本地无法抓包,请参考
https://yq.aliyun.com/ziliao/140472
下面,简单的介绍一下,TCP的3次握手和4次分手。
先上一个经典图形。
![](https://img-blog.csdn.net/20170409142255332?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTk4MzUzMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
3次握手
当服务的启动之后,处于LISTEN状态。
当客户端执行下面的代码后,就开始了3次握手
客户端首先发送一个SYN报文,服务端返回一个SYN+ACK报文,客户端再回一个ACK报文
4次分手
当客户端执行下面的代码后
客户端会发送一个FIN+ACK报文,服务端会响应一个ACK报文。
此时,客户端处于FIN_WAIT_2状态,服务端处于CLOSE_WAIT状态。
当服务端执行下面的代码后
服务端会发送一个FIN报文,进入LAST_ACK状态
客户端返回一个ACK报文,进入TIME_WAIT状态
至于TCP为什么要经过3个握手4次分手,可以参考下面这篇博文。
http://www.jellythink.com/archives/705
服务端:
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
相关文章推荐
- tcp/ip 3次握手与4次分手
- TCP/IP_3次握手4次分手
- tcp 3次握手 和4次分手 详解
- Java 基础快速掌握 TCP 3次握手和4次握手的理解
- TCP3次握手4次分手
- TCP的3次握手/4次握手
- tcp连接 为什么要进行3次握手,断开为什么要4次握手
- TCP3次握手连接协议和4次握手断开连接协议
- TCP3次握手连接协议和4次握手断开连接协议
- TCP3次握手/4次握手
- TCP3次握手/4次握手
- 【转】TCP3次握手连接协议和4次握手断开连接协议
- TCP为何需要3次握手与4次挥手
- tcp 协议3次连接握手和4次结束握手
- TCP3次握手和4次挥手具体状态
- TCP3次握手连接协议和4次握手断开连接协议
- tcp 协议3次连接握手和4次结束握手
- tcp 协议3次连接握手和4次结束握手
- tcp3次握手和4次挥手
- TCP 3次握手/4次握手