消息隊列篇--通信協議篇--TCP和UDP(3次握手和4次揮手,與Socket和webSocket的概念區別等)

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!!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/67343.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/67343.shtml
英文地址,請注明出處:http://en.pswp.cn/web/67343.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql_store_result的概念和使用案例

mysql_store_result() 是 MySQL C API 中的一個函數,用于檢索一個完整的結果集到一個客戶端。當執行一個查詢(通常是 SELECT 查詢)并希望處理所有返回的數據時,可以使用此函數。 概念 mysql_store_result() 函數的原型如下&…

React Router v6配置路由守衛

首先準備好以下頁面 登錄頁:用戶可以在此頁面登錄。 受保護頁:只有登錄的用戶可以訪問,否則會重定向到登錄頁。 公共頁面:不需要鑒權,任何人都可以訪問。 1. 安裝依賴 首先,我們需要安裝 react-router-do…

打破傳統束縛:領略 Web3 獨特魅力

在互聯網發展的歷程中,我們見證了Web1和Web2的變遷。Web1是靜態信息的展示平臺,Web2則引領了社交互動和內容創作的繁榮,而如今,Web3作為新時代的互聯網架構,正逐漸展現出其獨特的魅力,帶領我們走向一個更加…

[論文總結] 深度學習在農業領域應用論文筆記14

當下,深度學習在農業領域的研究熱度持續攀升,相關論文發表量呈現出迅猛增長的態勢。但繁榮背后,質量卻不盡人意。相當一部分論文內容空洞無物,缺乏能夠落地轉化的實際價值,“湊數” 的痕跡十分明顯。在農業信息化領域的…

Linux 學習筆記__Day3

十八、設置虛擬機的靜態IP 1、VMware的三種網絡模式 安裝VMware Workstation Pro之后,會在Windows系統中虛擬出兩個虛擬網卡,如下: VMware提供了三種網絡模式,分別是:橋接模式(Bridged)、NAT…

QT+mysql+python 效果:

# This Python file uses the following encoding: utf-8 import sysfrom PySide6.QtWidgets import QApplication, QWidget,QMessageBox from PySide6.QtGui import QStandardItemModel, QStandardItem # 導入需要的類# Important: # 你需要通過以下指令把 form.ui轉為ui…

筆記本跑大模型嘗試

1,筆記本電腦資源 我是一臺聯想筆記本電腦,基本配置如下: CPU:12th Gen Intel(R) Core(TM) i7-1255U 1.70 GHz (12核心,2個P核和8個E核,共計10個核心) 顯卡:NVIDIA GeForce MX550 內存&am…

C語言實現掃雷游戲(有展開一片和標記雷的功能)

實現準備 分2個.c源文件和1個.h頭文件去寫代碼 test.c 對掃雷游戲進行測試game.c 掃雷游戲功能的實現game.h 掃雷游戲功能的聲明 掃雷游戲 1.test.c對掃雷游戲進行測試 首先我們要先把玩游戲的框架寫出來,然后一步一步去完成其功能 跟著下面的代碼的節奏走一步一步…

GitHub 倉庫的 Archived 功能詳解:中英雙語

GitHub 倉庫的 Archived 功能詳解 一、什么是 GitHub 倉庫的 “Archived” 功能? 在 GitHub 上,“Archived” 是一個專門用于標記倉庫狀態的功能。當倉庫被歸檔后,它變為只讀模式,所有的功能如提交代碼、創建 issue 和 pull req…

基礎IO(2)

基礎IO(2) 理解“?切皆?件” ?先,在windows中是?件的東西,它們在linux中也是?件;其次?些在windows中不是?件的東西,?如進程、磁盤、顯?器、鍵盤這樣硬件設備也被抽象成了?件,你可以使…

Transformation,Animation and Viewing

4 Transformation,Animation and Viewing 聲明:該代碼來自:Computer Graphics Through OpenGL From Theory to Experiments,僅用作學習參考 4.1 Modeling Transformations 平移、縮放和旋轉,即 OpenGL 的建模轉換&…

Deepseek的RL算法GRPO解讀

在本文中,我們將深入探討Deepseek采用的策略優化方法GRPO,并順帶介紹一些強化學習(Reinforcement Learning, RL)的基礎知識,包括PPO等關鍵概念。 策略函數(policy) 在強化學習中, a…

【python】python基于機器學習與數據分析的二手手機特性關聯與分類預測(源碼+數據集)【獨一無二】

👉博__主👈:米碼收割機 👉技__能👈:C/Python語言 👉專__注👈:專注主流機器人、人工智能等相關領域的開發、測試技術。 python基于機器學習與數據分析的二手手機特性關聯與…

手撕Diffusion系列 - 第十一期 - lora微調 - 基于Stable Diffusion(代碼)

手撕Diffusion系列 - 第十一期 - lora微調 - 基于Stable Diffusion(代碼) 目錄 手撕Diffusion系列 - 第十一期 - lora微調 - 基于Stable Diffusion(代碼)Stable Diffusion 原理圖Stable Diffusion的原理解釋Stable Diffusion 和Di…

前端【8】HTML+CSS+javascript實戰項目----實現一個簡單的待辦事項列表 (To-Do List)

目錄 一、功能需求 二、 HTML 三、CSS 四、js 1、綁定事件與初始設置 2.、綁定事項 (1)添加操作: (2)完成操作 (3)刪除操作 (4)修改操作 3、完整js代碼 總結…

C++標準線程庫實現優雅退出的方式

目錄 1.通過設置共享退出標記 2.使用std::jthread創建線程 3.定義消息類型的方式 4.注意事項 1.通過設置共享退出標記 定義一個退出變量bool stop false; 表示線程是否應該停止。在主線程中設置標記stoptrue,然后join一直等待,然后線程循環檢測到stop是否為tru…

Java學習教程,從入門到精通,JDBC插入記錄語法及案例(104)

JDBC插入記錄語法及案例 一、JDBC插入記錄語法 在JDBC中,插入記錄主要通過執行SQL的INSERT語句來實現。其基本語法如下: INSERT INTO 表名 (列1, 列2, ..., 列n) VALUES (值1, 值2, ..., 值n);表名:需要插入記錄的表的名稱。列1, 列2, …,…

vue事件總線(原理、優缺點)

目錄 一、原理二、使用方法三、優缺點優點缺點 四、使用注意事項具體代碼參考: 一、原理 在Vue中,事件總線(Event Bus)是一種可實現任意組件間通信的通信方式。 要實現這個功能必須滿足兩點要求: (1&#…

圖像處理之HSV顏色空間

目錄 1 RGB 的局限性 2 HSV 顏色空間 3 RGB與HSV相互轉換 4 HSV顏色模型對圖像的色相、飽和度和明度進行調節 5 演示Demo 5.1 開發環境 5.2 功能介紹 5.3 下載地址 參考 1 RGB 的局限性 RGB 是我們接觸最多的顏色空間,由三個通道表示一幅圖像,分…

DeepSeek是由杭州深度求索人工智能基礎技術研究有限公司(簡稱“深度求索”)發布的一系列人工智能模型

DeepSeek是由杭州深度求索人工智能基礎技術研究有限公司(簡稱“深度求索”)發布的一系列人工智能模型,其在知識類任務上展現出了卓越的性能。以下是對DeepSeek的詳細介紹,內容雖無法達到10000字,但會盡可能全面且深入地…