简单介绍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();      }  }