1、TCP和UDP概述
TCP(傳輸控制協議,Transmission Control Protocol)和UDP(用戶數據報協議,User Datagram Protocol)都算是最底層的通信協議,它們位于OSI模型的傳輸層。*傳輸層的主要職責是確保數據能夠在不同設備之間可靠地傳輸,并提供端到端的通信服務。*TCP和UDP是兩種最常見的傳輸層協議,它們各自有不同的特點和適用場景。
TCP是一種面向連接、可靠的傳輸協議,適用于需要高可靠性和順序保證的應用。它提供了流量控制、擁塞控制和重傳機制,確保數據的完整性和正確性。然而,TCP的延遲較高,吞吐量也相對較低。
三次握手:(建立連接)
- 第一次握手:客戶端發送SYN段給服務端。
- 第二次握手:服務器收到SYN后,發送SYN-ACK段給客戶端。
- 第三次握手:客戶端收到SYN-ACK后,發送ACK(確認)段。
注意:
為了確保連接創建的準確性,3次握手采用了計時+確認的機制。
即:客戶端發出SYN后,會開始計時,在計時內收到服務端的SYN+ACK,那么就算是正常的。同理,服務端返回SYN+ACK時,也會開啟計時,在計時內客戶端返回ACK,則算是正常,完成連接創建。如果在有一次在計時內沒有做出回應,那么連接就失敗了,就需要重頭來開始3次握手。
四次揮手:(終止連接)
- 第一次揮手:主動關閉方發送FIN段。
- 第二次揮手:被動關閉方發送ACK段。
- 第三次揮手:被動關閉方發送FIN段。
- 第四次揮手:主動關閉方發送ACK段,并進入TIME_WAIT狀態。
UDP是一種無連接、不可靠的傳輸協議,適用于對實時性要求較高的應用。它具有較低的延遲和較高的吞吐量,但不提供可靠性保證。UDP適合用于那些可以容忍少量數據丟失的應用,如視頻流、語音通話和在線游戲等。
選擇使用TCP還是UDP取決于你的具體需求。如果你的應用需要高可靠性和順序保證,那么TCP是更好的選擇;如果你的應用對實時性要求較高,且可以容忍少量數據丟失,那么UDP更加合適。
2、TCP和UDP的區別
(1)、面向連接vs無連接
TCP是面向連接的協議,這意味著在數據傳輸之前,發送方和接收方必須先建立一個可靠的連接。這個過程通過三次握手來完成:發送方發送SYN(同步請求),接收方回應SYN-ACK(同步確認),然后發送方再發送ACK(確認)。只有當連接成功建立后,數據傳輸才能開始。傳輸結束后,還需要通過四次揮手來終止連接。
UDP則是無連接的協議,它不需要在數據傳輸之前建立連接。發送方可以直接發送數據報文(Datagram),而接收方也會立即接收。這種方式減少了建立連接的開銷,但同時也意味著沒有連接狀態的維護。
(2)、可靠性
TCP提供了可靠的數據傳輸。它使用序列號和確認機制來確保每個數據包都能按順序到達接收方。如果某個數據包丟失或損壞,TCP會自動請求重傳該數據包,直到接收方確認收到為止。因此,TCP適合用于需要高可靠性的應用,如文件傳輸、電子郵件等。
UDP不提供可靠性保證。它只是簡單地將數據報文發送出去,而不關心對方是否收到或是否按順序接收。因此,UDP適合用于對實時性要求較高的應用,如視頻流、語音通話等,這些應用即使偶爾丟失一些數據包也不會嚴重影響用戶體驗。
(3)、流量控制和擁塞控制
TCP提供了流量控制和擁塞控制機制。流量控制通過滑動窗口機制來限制發送方的發送速率,確保接收方不會因為接收到過多的數據而溢出。擁塞控制則通過慢啟動、擁塞避免、快速重傳和快速恢復等算法來避免網絡擁塞,確保網絡資源的有效利用。
UDP不提供流量控制和擁塞控制。發送方可以以任意速率發送數據,而不考慮網絡的當前狀態。這可能導致網絡擁塞,尤其是在網絡帶寬有限的情況下。
(4)、頭部開銷
TCP的頭部較大,通常為20字節(不含選項字段)。頭部中包含了序列號、確認號、窗口大小等重要信息,用于實現可靠傳輸和流量控制。
UDP的頭部較小,通常為8字節。頭部中只包含了源端口、目標端口、長度和校驗碼,沒有復雜的控制信息。因此,UDP的頭部開銷更小,適合對性能要求較高的應用。
(5)、延遲和吞吐量
TCP的延遲較高,因為它需要進行確認、重傳等操作,確保數據的可靠傳輸。此外,TCP的流量控制和擁塞控制也會增加傳輸時間,因此它的吞吐量相對較低,尤其是在網絡擁塞的情況下。但與此相反,TCP能提供可靠性和流量控制。
UDP的延遲較低,因為它沒有確認和重傳機制,數據可以直接發送和接收。這使得UDP更適合對實時性要求較高的應用,如視頻流、語音通話等。由于UDP沒有流量控制和擁塞控制,它的吞吐量較高,但在網絡擁塞時可能會導致數據包丟失。
(6)、應用場景
TCP適用于需要高可靠性的應用,如:
- HTTP/HTTPS:網頁瀏覽
- FTP:文件傳輸
- SMTP:電子郵件
- Telnet/SSH:遠程登錄
- 數據庫通信:MySQL、PostgreSQL等
UDP適用于對實時性要求較高的應用,如:
- DNS:域名解析
- VoIP:語音通話(如 Skype、WhatsApp 語音)
- 視頻流:在線視頻播放(如 YouTube、Netflix)
- 在線游戲:多人游戲中的實時交互
- 實時監控:物聯網設備的狀態更新
擴展:TCP、Socket和WebSocket的區別
1、TCP (傳輸控制協議)
TCP是OSI模型中的傳輸層協議,負責提供可靠的數據傳輸服務。它確保數據包按順序到達接收方,并且不會丟失或損壞。TCP通過序列號、確認機制、流量控制和擁塞控制等技術來保證數據的可靠性。
特點:
- 面向連接:在數據傳輸之前,發送方和接收方必須通過三次握手建立連接,傳輸結束后再通過四次揮手終止連接。
- 可靠傳輸:TCP提供了確認機制和重傳機制,確保每個數據包都能按順序到達接收方。
- 流量控制:通過滑動窗口機制限制發送方的發送速率,避免接收方溢出。
- 擁塞控制:通過慢啟動、擁塞避免、快速重傳和快速恢復等算法避免網絡擁塞。
應用場景:
- HTTP/HTTPS:網頁瀏覽
- FTP:文件傳輸
- SMTP:電子郵件
- Telnet/SSH:遠程登錄
- 數據庫通信:MySQL、PostgreSQL等
TCP是一種底層的傳輸層協議,提供了可靠的、面向連接的通信服務。它是許多上層應用協議的基礎,如HTTP、FTP、SMTP等。
2、Socket (套接字)
Socket是一個編程接口(API),用于實現網絡通信。它位于應用層和傳輸層之間,允許應用程序通過網絡與其他應用程序進行通信。Socket可以基于TCP或UDP協議工作,具體取決于應用的需求。
類型:
- 流式套接字(Stream Socket):基于TCP,提供可靠的、面向連接的通信。
- 數據報套接字(Datagram Socket):基于UDP,提供不可靠的、無連接的通信。
工作原理:
- 創建Socket:應用程序首先創建一個Socket對象,指定使用的協議(TCP或UDP)。
- 綁定地址:將Socket綁定到本地的IP地址和端口號。
- 監聽連接(僅適用于服務器端):對于TCP Socket,服務器端需要調用listen()方法來等待客戶端的連接請求。
- 建立連接(僅適用于TCP Socket):客戶端通過connect()方法與服務器建立連接。
- 發送和接收數據:通過send()和recv()方法在客戶端和服務器之間傳輸數據。
- 關閉連接:通信結束后,雙方調用close()方法關閉連接。
(1)、基于TCP的Socket的代碼示例
服務器端:
import java.io.*;
import java.net.;public class TCPServer {public static void main(String[] args) throws IOException {// 創建服務器Socket,監聽8080端口ServerSocket serverSocket = new ServerSocket(8080);System.out.println("Server is listening on port 8080");// 等待客戶端連接Socket clientSocket = serverSocket.accept();System.out.println("Client connected");// 獲取輸入輸出流PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));// 讀取客戶端消息并回復String inputLine;while ((inputLine = in.readLine()) != null) {System.out.println("Received: " + inputLine);out.println("Echo: " + inputLine);}// 關閉連接clientSocket.close();serverSocket.close();}
}
客戶端:
import java.io.;
import java.net.;public class TCPClient {public static void main(String[] args) throws IOException {// 客戶端,用于連接到服務器端Socket socket = new Socket("localhost", 8080);System.out.println("Connected to server");// 獲取輸入輸出流PrintWriter out = new PrintWriter(socket.getOutputStream(), true);BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));// 發送和接收消息String userInput;while ((userInput = stdIn.readLine()) != null) {out.println(userInput);System.out.println("Server response: " + in.readLine());}// 關閉連接socket.close();}
}
Socket是一個編程接口,允許應用程序通過網絡與其他應用程序進行通信。它可以基于TCP或UDP協議工作,具體取決于應用的需求。Socket提供了低級別的網絡通信功能,適合開發自定義的網絡應用程序。
3、WebSocket
WebSocket是一種應用層協議,旨在提供全雙工通信通道,允許客戶端和服務器之間保持持久連接,并支持雙向數據傳輸。WebSocket最初是為了改進Web瀏覽器和服務器之間的通信而設計的,但它也可以用于其他類型的客戶端-服務器通信。
特點:
- 全雙工通信:WebSocket允許客戶端和服務器同時發送和接收數據,而不需要像HTTP那樣依賴請求-響應模式。
- 持久連接:一旦連接建立,客戶端和服務器可以持續交換數據,直到一方主動關閉連接。
- 低延遲:由于WebSocket使用的是持久連接,減少了每次通信的開銷,因此具有較低的延遲。
- 基于HTTP升級:WebSocket連接是通過HTTP協議的Upgrade請求從HTTP協議升級而來,通常使用ws://或wss://(加密)URL方案。
- 支持文本和二進制數據:WebSocket可以傳輸文本數據(如JSON)和二進制數據(如圖像、音頻、視頻等)。
工作原理:
1、握手階段:客戶端通過HTTP請求發起WebSocket連接,服務器響應并同意升級為WebSocket協議。
2、數據傳輸階段:一旦連接建立,客戶端和服務器可以自由地發送和接收數據幀。數據幀可以是文本幀或二進制幀。
3、關閉連接:當一方決定關閉連接時,會發送關閉幀,另一方收到后也會關閉連接。
示例代碼:
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import java.net.URI;
import java.net.URISyntaxException;public class WebSocketExample extends WebSocketClient {public WebSocketExample(URI serverUri) {super(serverUri);}@Overridepublic void onOpen(ServerHandshake handshakedata) {System.out.println("Connected to server");// 發送消息到服務器send("Hello, Server!");}@Overridepublic void onMessage(String message) {System.out.println("Received from server: " + message);}@Overridepublic void onClose(int code, String reason, boolean remote) {System.out.println("Connection closed: " + reason);}@Overridepublic void onError(Exception ex) {ex.printStackTrace();}public static void main(String[] args) {try {// 創建 WebSocket 客戶端并連接到服務器WebSocketExample client = new WebSocketExample(new URI("ws://localhost:8080"));client.connect();} catch (URISyntaxException e) {e.printStackTrace();}}
}
WebSocket是一種應用層協議,旨在提供全雙工、低延遲的通信通道,特別適合實時應用,如聊天系統、在線游戲、股票交易平臺等。它通過HTTP升級機制建立連接,并允許客戶端和服務器之間持續交換數據。
4、三者的區別與聯系
聯系:
- TCP是Socket的基礎,Socket通過TCP或UDP協議實現網絡通信。TCP提供了可靠的、面向連接的傳輸服務,而Socket是應用程序與TCP或UDP交互的接口。
- WebSocket是一種應用層協議,它基于TCP協議工作,實際通過HTTP升級機制建立了更高效的全雙工通信通道。WebSocket的底層仍然是基于TCP的,但它提供了比傳統HTTP更強大的實時通信能力。
區別:
- TCP是一個傳輸層協議,專注于數據的可靠傳輸和連接管理。它是許多上層協議的基礎,如HTTP、FTP、SMTP等。
- Socket是一個編程接口,允許應用程序通過網絡與其他應用程序通信。它可以基于TCP或UDP協議工作,具體取決于應用的需求。
- WebSocket是一種應用層協議,專門用于實現實時、全雙工的通信。它通過HTTP升級機制建立連接,并允許客戶端和服務器之間持續交換數據。
5、綜述
- TCP是一種傳輸層協議,提供了可靠的、面向連接的通信服務,是許多上層協議的基礎。
- Socket是一個編程接口,允許應用程序通過網絡與其他應用程序通信。它可以基于TCP或UDP協議工作,具體取決于應用的需求。
- WebSocket是一種應用層協議,旨在提供全雙工、低延遲的通信通道,特別適合實時應用,如聊天系統、在線游戲等。它通過HTTP升級機制建立連接,并基于TCP協議工作。
選擇使用哪種技術取決于你的具體需求:
- 如果你需要構建自定義的網絡應用程序,并且需要可靠的、面向連接的通信,可以選擇TCP Socket。
- 如果你需要實現實時、全雙工的通信,特別是基于Web的應用,WebSocket是更好的選擇。
- TCP是底層協議,通常由操作系統和網絡庫處理,開發者通常不需要直接操作TCP,而是通過Socket或WebSocket來實現通信。
乘風破浪!Dare to Be!!!