UDP類型套接字

理解UDP協議:互聯網世界的"明信片"通信

UDP是什么?為什么需要它?

想象一下,你正在給朋友寄送兩種不同的東西:一份重要的合同文件和一疊度假時的風景明信片。對于合同文件,你會選擇掛號信,要求簽收確認;而對于明信片,你隨手投進郵筒,不在乎對方是否收到。這正是TCP和UDP的區別。

**UDP(用戶數據報協議)**就像互聯網世界的"明信片":

  • 輕量快速:沒有復雜的包裝和確認流程
  • 簡單直接:寫上地址內容就發送,不等待回執
  • 經濟實惠:系統開銷小,占用資源少

UDP vs TCP:快遞與明信片的對比

特性TCP(快遞)UDP(明信片)
連接方式需要建立連接(三次握手)無連接,直接發送
可靠性確保送達,自動重傳可能丟失,不保證送達
順序性保證數據順序不保證順序
速度相對較慢非常快速
適用場景網頁瀏覽、文件傳輸視頻會議、在線游戲

UDP的工作機制:單兵作戰

與TCP需要"團隊協作"不同,UDP是典型的"獨行俠":

  1. 單套接字通信:客戶端和服務器都只需要一個套接字
  2. 無連接流程:省去了listen、accept等步驟
  3. 直接發送:通過sendto函數指明目的地即可發送數據
// 典型UDP發送代碼
sendto(sock, message, strlen(message), 0, (struct sockaddr*)&serv_addr, sizeof(serv_addr));

UDP的數據邊界特性:獨立包裝的包裹

UDP有個重要特點:保持數據邊界。想象你給朋友寄了三個明信片:

  • TCP會把三張明信片內容合并成一張大卡片
  • UDP則保持三張獨立的明信片,對方會收到完全相同的三份

這意味著:

  • 發送方調用幾次sendto,接收方就需要對應次數的recvfrom
  • 每次接收的數據都是完整的獨立數據包
// 發送方
sendto(sock, "Hello", 5, ...);  // 第一次發送
sendto(sock, "World", 5, ...);  // 第二次發送// 接收方
recvfrom(sock, buf1, ...);  // 收到"Hello"
recvfrom(sock, buf2, ...);  // 收到"World"

UDP的"偽連接"優化:常去的咖啡館

雖然UDP本質是無連接的,但可以通過connect函數建立"常去的目的地":

  1. 未連接UDP套接字

    • 每次發送都要指定地址
    • 像每次點外賣都要重新輸入地址
  2. 已連接UDP套接字

    • 用connect記錄常用地址
    • 之后可以直接用send/recv
    • 像常去的咖啡館,店員記得你的口味
// 轉換為connected套接字
connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));// 之后可以簡化發送
send(sock, message, strlen(message), 0);  // 不再需要指定地址

UDP的典型應用場景

  1. 實時視頻/語音

    • 丟幾幀畫面比延遲更可接受
    • Zoom、微信視頻都大量使用UDP
  2. 在線游戲

    • 玩家動作需要快速響應
    • 王者榮耀等MOBA游戲使用UDP
  3. DNS查詢

    • 簡單的問-答模式
    • 重試成本低,不需要復雜連接
  4. 物聯網設備

    • 資源受限的設備
    • 傳感器數據周期性上報

UDP編程注意事項

  1. 數據完整性

    • 應用層需要自己實現校驗
    • 如添加序列號、校驗和
  2. 流量控制

    • 沒有TCP那樣的擁塞控制
    • 發送太快會導致大量丟包
  3. 超時重試

    • 重要數據需要自己實現重傳
    • 設置合理的超時時間

代碼示例:簡易UDP回聲服務器

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>#define BUF_SIZE 1024int main() {int serv_sock;char buf[BUF_SIZE];struct sockaddr_in serv_addr, clnt_addr;socklen_t clnt_addr_size;// 創建UDP套接字serv_sock = socket(PF_INET, SOCK_DGRAM, 0);// 綁定地址memset(&serv_addr, 0, sizeof(serv_addr));serv_addr.sin_family = AF_INET;serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);serv_addr.sin_port = htons(8080);bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));// 處理請求while(1) {clnt_addr_size = sizeof(clnt_addr);// 接收數據int str_len = recvfrom(serv_sock, buf, BUF_SIZE, 0, (struct sockaddr*)&clnt_addr, &clnt_addr_size);// 發送回聲sendto(serv_sock, buf, str_len, 0, (struct sockaddr*)&clnt_addr, clnt_addr_size);}close(serv_sock);return 0;
}

總結:UDP的哲學

UDP體現了"簡單即美"的設計哲學:

  • 相信網絡:不做過多的控制假設
  • 相信應用:把復雜性交給應用程序處理
  • 追求效率:為速度犧牲部分可靠性

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

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

相關文章

redis快速入門教程

更新中基本概念安裝centOS安裝redis&#xff1a;yum install redis -y啟動&#xff1a;systemctl start redis設置開機啟動&#xff1a;systemctl enable redis檢查運行狀態&#xff1a;systemctl status redis遠程訪問編輯配置文件 vi /etc/redis.conf在其中修改為bind 0.0.0.…

UDP和TCP的主要區別是什么

UDP&#xff08;用戶數據報協議&#xff09;和 TCP&#xff08;傳輸控制協議&#xff09;是互聯網傳輸層的兩大核心協議&#xff0c;主要區別體現在??連接方式、可靠性、傳輸效率、頭部開銷??及??適用場景??上。以下是具體對比&#xff1a;??一、核心區別對比表???…

ASP .NET Core 8結合JWT輕松實現身份驗證和授權

身份驗證和授權是每一個后端服務必不可少的&#xff0c;可以實現對非法請求進行攔截&#xff0c;能夠有效保護數據的安全性。 JSON Web Token&#xff08;JWT&#xff09;是一項開放標準&#xff08;RFC 7519&#xff09;&#xff0c;它定義了一種緊湊且自包含的方法&#xff…

5G時代的智慧燈桿:塔能“一桿多用”方案如何激活城市新基建?

在《5G應用“揚帆”行動計劃》持續推進的進程之中&#xff0c;智慧桿已然成為了5G基站部署環節極為重要的載體&#xff0c;并且被明確地歸入到新型基礎設施建設的重點范疇之內。相關政策提出&#xff0c;要在2025年達成重點區域5G網絡全面且深度覆蓋的目標&#xff0c;與此同時…

護照閱讀器:國外證件識別的 OCR “解碼師”

國外證件版式多樣、語種繁雜&#xff0c;人工識別不僅耗時&#xff0c;還易因翻譯誤差、格式不熟悉導致信息錯漏。尤其在跨境業務場景中&#xff0c;傳統識別方式嚴重影響效率與準確性。護照閱讀器搭載的 OCR 技術成為破局關鍵。它能精準提取國外護照、駕照等證件上的多語種文字…

Linux部署Python服務

1、創建項目目錄與虛擬環境#確保安裝 Python 和 python3-venv 工具 sudo apt update sudo apt install python3 python3-pip python3-venvmkdir myproject cd myproject python3 -m venv venv # 創建虛擬環境#Linux source venv/bin/activate # 激活虛擬環境#Windowds venv\S…

【Python辦公】使用Python和Tkinter構建Excel數據導入MySQL工具(GUI版)

目錄 專欄導讀前言項目概述技術棧環境準備核心代碼實現1. 導入必要的庫2. 主應用類設計3. 用戶界面設計數據庫配置區域數據庫選擇區域4. 數據庫連接功能測試連接獲取數據庫列表5. 數據導入功能關鍵技術點解析1. SQLAlchemy 2.x 兼容性2. MySQL 8.0 認證問題3. 避免啟動時連接錯…

華為OD機試_2025 B卷_猜數字(Python,100分)(附詳細解題思路)

題目描述 一個人設定一組四碼的數字作為謎底&#xff0c;另一方猜。 每猜一個數&#xff0c;出數者就要根據這個數字給出提示&#xff0c;提示以XAYB形式呈現&#xff0c;直到猜中位置。 其中X表示位置正確的數的個數&#xff08;數字正確且位置正確&#xff09;&#xff0c;而…

【網絡安全】理解安全事件的“三分法”流程:應對警報的第一道防線

1. 簡介 在網絡安全領域&#xff0c;每天都會產生大量安全警報。作為一名安全分析師&#xff0c;識別、評估并優先處理這些警報的能力至關重要。三分法&#xff08;Triage&#xff09; 是確保安全團隊高效響應安全事件的核心流程&#xff0c;它能夠幫助我們合理分配資源、集中精…

AI大模型計數能力的深度剖析:從理論缺陷到技術改進

AI大模型計數能力的深度剖析&#xff1a;從理論缺陷到技術改進 AI大模型在計數任務上表現出明顯的局限性&#xff0c;這不僅反映了模型架構的核心缺陷&#xff0c;也揭示了當前深度學習技術在處理結構化信息時的本質挑戰。通過對文本計數、圖像計數以及相關技術改進方向的全面分…

[C語言初階]結構體初階

目錄一、結構體的聲明二、結構體的定義和初始化三、結構體成員訪問四、結構體傳參五、函數調用的參數壓棧&#xff08;了解&#xff09;在C語言中&#xff0c;我們知道數組是一組相同類型元素的集合&#xff0c;而結構體則更為靈活&#xff0c;它允許我們將不同類型的數據組合在…

LVS(Linux Virtual Server)集群技術詳解

一.集群和分布式: 集群&#xff1a;同一個業務系統&#xff0c;部署在多臺服務器上&#xff0c;集群中&#xff0c;每一臺服務器實現的功能沒有差別&#xff0c;數據和代碼都是一樣的 分布式&#xff1a;一個業務被拆成多個子業務&#xff0c;或者本身就是不同的業務&#…

leetcode_27 移除元素

1. 題意 給定一個數組&#xff0c;把不等于val的元素全部移動到數組的前面來。 不需要考慮值為val里的元素。 2. 題解 2.1 同向雙指針 我們利用雙指針&#xff0c;慢指針指向下一個插入的位置。而快指針不斷向前找到首個不為val的值&#xff0c;找到后將快指針位置值賦給慢…

Linux-Ubuntu下的git安裝與配置

一、安裝git1.打開終端&#xff0c;運行以下命令&#xff08;需要聯網&#xff09;sudo apt-get update sudo apt-get install git2.驗證安裝安裝完成之后&#xff0c;通過運行以下命令驗證git是否已經正確安裝&#xff1a;git --version二、配置git2.1.配置用戶名及郵箱地址在…

2D和3D激光slam的點云去運動畸變

在使用激光雷達設備采集點云的時候&#xff0c;我們都知道&#xff0c;激光雷達是邊運動邊采集的&#xff0c;每一個點云采集時的激光雷達的中心和姿態都是不一樣的&#xff0c;如果不加以矯正&#xff0c;那么這一幀數據就會出現問題&#xff0c;比如采集一個平面的結構的時候…

Java 熱門面試題 200 道(Markdown表格版)【簡化版】

Java 熱門面試題 200 道(Markdown表格版)【簡化版】 Java與數據庫核心面試題摘要 本文精選200道Java與數據庫高頻面試題,重點涵蓋: Java集合: HashMap原理(數組+鏈表/紅黑樹)、ConcurrentHashMap分段鎖優化、紅黑樹改進目的(解決哈希沖突性能問題) MySQL索引: 最左前…

OpenCV探索之旅:多尺度視覺與形狀的靈魂--圖像金字塔與輪廓分析

在我們學會用Canny算法勾勒處世界的輪廓之后&#xff0c;一個更深層次的問題擺在了面前&#xff1a;這些由像素組成的線條&#xff0c;如何才能被賦予“生命”&#xff0c;成為我們能夠理解和分析的“形狀”&#xff1f;如果一個物體在圖像中時大時小&#xff0c;我們又該如何穩…

Redis作緩存時存在的問題及其解決方案

Redis最常用的一個場景就是作為緩存&#xff0c;本文主要探討Redis作為緩存&#xff0c;在實踐中可能會有哪些問題&#xff1f;比如一致性, 穿擊, 穿透, 雪崩, 污染等。 為什么要理解Redis緩存問題 在高并發的業務場景下&#xff0c;數據庫大多數情況都是用戶并發訪問最薄弱的…

day17 力扣654.最大二叉樹 力扣617.合并二叉樹 力扣700.二叉搜索樹中的搜索 力扣98.驗證二叉搜索樹

最大二叉樹給定一個不重復的整數數組 nums 。 最大二叉樹 可以用下面的算法從 nums 遞歸地構建:創建一個根節點&#xff0c;其值為 nums 中的最大值。遞歸地在最大值 左邊 的 子數組前綴上 構建左子樹。遞歸地在最大值 右邊 的 子數組后綴上 構建右子樹。返回 nums 構建的 最大…

天地圖前端實現geoJson與wkt格式互轉

geoJson與wkt都是WebGIS開發中經常用到的格式&#xff0c;天地圖行政區劃邊界接口返回的是wkt格式數據&#xff0c;需要轉換一下。 安裝插件&#xff1a;terraformer/wkt npm install terraformer/wkt 兩個函數&#xff1a; .wktToGeoJSON(WKT) ? object.geojsonToWKT(Geo…