簡單介紹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();      }  }  

Tags: