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