简单介绍TCP三次握手的那些事
- 2019 年 10 月 10 日
- 筆記
正文

最近墨白在寻找合适的offer,遇到高频面试题,TCP三次握手的原理是什么?离我学习TCP的时间太久了,自我感觉和面试官这方面的交流不是特别优秀哇,于是又学习了一下,今天就给大家聊一聊TCP三次握手的原理以及附上代码操作;
简单概述下TCP:
TCP通信是能够实现两台计算机之间的数据交互,通信的两端,要严格区分为客户端(Client)与服务端(Server)。
两个端口通信时的步骤:
1. 服务端程序,需要事先启动,等待客户端的连接。
2. 客户端主动连接服务器端,连接成功才能通信。服务端不可以主动连接客户端。
了解完TCP概述以后我们进入今天的主题讲下TCP三次握手的原理,我们知道TCP传输数据是先有服务端在有客户端,比方服务端就相当于大表哥,客户端就相当于小表妹;

大表哥(ServerSocket)自己准备好以后(创建ServerSocket,并监听一个端口),然后创建小表妹;
第一次握手
- 小表妹需要发送第一次请求,大表哥自然是要同意小表妹的请求,既然同意了请求,:那么大表哥就需要创建一个和小表妹对应的Socket,大表哥的Socket和小表妹的socket对应上以后;
第二次握手
- 他们就要开始搞事情了,这个时候出现了一个通道(流),小表妹和大表哥可以互通信息了,小表妹这边的流(输出流)叫做getoutputStream(用来写入数据),比方小表妹写入的数据叫做你好,约吗?,通过流传输到大表哥那里,大表哥接受之后是需要读取小表妹给她发送的数据的,那么这个时候大表哥的流也出现了(getInputStream,这个流用来读取数据),既然读取到了数据,就需要给小表妹回消息了;
第三次握手
- 大表哥用(getoutputStream,输出流)给小表妹回了一个老地方见!,小表妹收到这个数据以后就要读取数据(getInputStream,输入流),这样就完成了TCP通信的三次握手;
代码参考,服务端;
import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; /** TCP服务端实现步骤: 1.创建服务端ServerSocket,绑定端口号9999 2.同意客户端的连接 3.得到输入流,读取数据 4.得到输出流,写数据 5.关闭资源 */ public class TCPServer { public static void main(String[] args) throws IOException { System.out.println("墨白启动啦..."); // 1.创建墨白ServerSocket,绑定端口号9999 ServerSocket ss = new ServerSocket(9999); // 2.同意小柠檬的请求 Socket socket = ss.accept(); // 阻塞方法 // 3.得到输入流,读取数据 InputStream in = socket.getInputStream(); byte[] buf = new byte[1024]; int len = in.read(buf); // 阻塞方法 System.out.println("墨白收到: " + new String(buf, 0, len)); // 4.得到输出流,写数据 OutputStream out = socket.getOutputStream(); out.write("老地方见!".getBytes()); // 5.关闭资源 out.close(); in.close(); socket.close(); ss.close(); } }
客户端:
package com.itheima.demo02TCP练习; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; /** TCP客户端实现步骤: 1.创建客户端Socket连接服务器 2.得到输出流,写数据 3.得到输入流,读取数据 4.关闭资源 */ public class TCPClient { public static void main(String[] args) throws IOException { System.out.println("小柠檬启动啦..."); // 1.创建小柠檬Socket连接墨白 Socket socket = new Socket("127.0.0.1", 9999); // 2.得到输出流,写数据 OutputStream out = socket.getOutputStream(); out.write("你好,约吗?".getBytes()); // 3.得到输入流,读取数据 InputStream in = socket.getInputStream(); byte[] buf = new byte[1024]; int len = in.read(buf); System.out.println("小柠檬收到: " + new String(buf, 0, len)); // 4.关闭资源 in.close(); out.close(); socket.close(); } }