網絡通信與協議棧 -- OSI,TCP/IP模型,協議族,UDP編程

網絡通信的核心是實現不同主機上進程間的數據交換,其技術體系圍繞 “協議分層模型” 展開,向下依賴硬件介質傳輸電 / 光信號,向上支撐各類網絡應用(如網頁瀏覽、文件傳輸)。本文結合 OSI 理論框架與 TCP/IP 工業標準,從模型、協議、地址、配置、編程到架構,系統梳理網絡通信核心知識。

一、網絡通信的核心模型:OSI 與 TCP/IP 的對應與差異

網絡通信需通過 “分層協作” 實現 —— 每層專注解決一類問題(如尋址、傳輸可靠性),并為上層提供標準化接口。OSI 七層模型是理論參考框架,TCP/IP 四層模型是實際工業標準,二者并非替代關系,而是 “理論指導實踐” 的映射關系。

1. 分層模型對比(含功能、協議、設備)

OSI 七層模型(理論)核心功能拆解TCP/IP 四層模型(實用)對應功能整合(含 OSI 多層邏輯)關鍵協議 / 技術典型硬件 / 載體
應用層為終端用戶提供具體網絡服務(如 “瀏覽網頁”“發送郵件”),定義應用程序與網絡的交互規則應用層整合 OSI 應用層 + 表示層 + 會話層功能,直接面向應用程序提供 APIHTTP/HTTPS、FTP、DNS、SMTP、DHCP瀏覽器、郵件客戶端、FTP 工具
表示層1. 數據格式轉換(如 ASCII 與 UTF-8 編碼轉換);2. 數據壓縮 / 解壓(如 gzip);3. 加密 / 解密(如 SSL/TLS)應用層功能隱含在應用層協議中,無需單獨實現(例:HTTPS 通過 TLS 完成加密,HTTP 響應頭通過Content-Encoding指定壓縮格式)SSL/TLS、gzip、Base64 編碼操作系統協議棧、應用程序
會話層1. 建立 / 終止進程間會話(如 WebSocket 連接握手);2. 會話管理(如 HTTP Keep-Alive 保持連接);3. 會話恢復(如斷網后重連)應用層功能通過應用協議或傳輸層機制實現(例:HTTP/1.1 的Connection: Keep-Alive,TCP 的連接狀態管理)WebSocket、HTTP Keep-Alive、會話令牌(如 JWT)應用服務器、瀏覽器
傳輸層1. 端到端(進程到進程)通信定位(通過端口號);2. 傳輸可靠性控制(重傳、確認);3. 流量控制(避免接收方緩沖區溢出)傳輸層與 OSI 傳輸層功能完全對齊,是 “進程通信可靠性” 的核心保障TCP、UDP、TCP 滑動窗口機制、UDP 校驗和主機操作系統(內核協議棧)
網絡層1. 跨網絡主機定位(通過 IP 地址);2. 路由選擇(選擇從源主機到目標主機的最優路徑);3. 數據包分片 / 重組(解決 MTU 限制)網絡層與 OSI 網絡層功能完全對齊,是 “跨網段通信” 的核心IP(IPv4/IPv6)、ICMP、IGMP、RIP/OSPF(路由協議)路由器、三層交換機
數據鏈路層1. 物理相鄰設備定位(通過 MAC 地址);2. 數據成幀(將 IP 數據包封裝為 “幀”,添加幀頭 / 幀尾);3. 差錯控制(通過 CRC 校驗丟棄錯誤幀);4. 介質訪問控制(如以太網 CSMA/CD 避免沖突)接口層(鏈路層 + 物理層)整合 OSI 數據鏈路層 + 物理層功能,負責 “物理介質上的幀傳輸”以太網協議(Ethernet)、ARP、RARP、PPP(撥號協議)交換機、網卡、網橋
物理層1. 定義物理介質特性(如雙絞線線序、光纖波長);2. 信號轉換(將 “幀” 的二進制數據轉為電 / 光信號);3. 比特同步(確保發送方與接收方時鐘一致)接口層(鏈路層 + 物理層)功能隱含在硬件設備中,無需軟件配置(例:網卡將數字信號轉為電信號,WiFi 將信號轉為無線電波)雙絞線(CAT5/CAT6)、光纖、WiFi(2.4GHz/5GHz)、以太網電信號標準(100Mbps/1Gbps)網卡、雙絞線、光纖、無線路由器

2. 核心差異:OSI 與 TCP/IP 的本質區別

  • 設計目標不同:OSI 追求 “通用性”(適配所有網絡場景),TCP/IP 追求 “實用性”(解決互聯網通信問題);
  • 分層粒度不同:OSI 拆分更細(如將 “應用相關功能” 拆分為 3 層),TCP/IP 合并冗余層(將表示層、會話層融入應用層);
  • 實現難度不同:OSI 理論復雜,未大規模落地;TCP/IP 簡潔高效,成為全球互聯網的標準。

二、TCP/IP 協議族:分層協議詳解(從應用到接口)

TCP/IP 協議族是 “四層模型” 的具體實現,每層包含多個協議,協同完成數據傳輸。數據從應用層到接口層會逐層封裝(添加頭部信息),接收端則逐層解封裝,最終還原原始數據。

1. 應用層協議:面向具體網絡服務

應用層協議直接與應用程序交互,定義 “數據格式” 和 “交互流程”,解決 “用戶需要什么服務” 的問題。

協議名稱核心功能應用場景關鍵細節
HTTP(超文本傳輸協議)傳輸超文本數據(HTML、CSS、JS),是網頁瀏覽的核心協議瀏覽器訪問網頁、API 接口調用(如前后端交互)- 基于 TCP,默認端口 80;
- 無狀態(每次請求獨立,需 Cookie/Session 保持登錄);
- 版本:HTTP/1.1(支持 Keep-Alive)、HTTP/2(多路復用)、HTTP/3(基于 QUIC,UDP 協議)
HTTPS(HTTP 安全版)在 HTTP 基礎上添加 TLS 加密層,保障數據傳輸安全(防竊聽、防篡改)支付、登錄、敏感數據傳輸(如網銀)- 默認端口 443;
- 需 SSL 證書驗證服務器身份;
- 加密流程:握手→密鑰協商→數據加密傳輸
DNS(域名系統)將 “域名”(如www.baidu.com)解析為 “IP 地址”(如 180.101.49.12),解決 “記 IP 難” 問題所有網絡應用(需通過域名訪問的場景)- 基于 UDP(查詢)和 TCP(zone 傳輸),默認端口 53;
- 分層解析:根域名服務器→頂級域名服務器→權威域名服務器;
- 緩存機制:本地 DNS 緩存(如路由器)、瀏覽器緩存
DHCP(動態主機配置協議)自動為局域網主機分配 IP 地址、子網掩碼、網關、DNS,避免手動配置家庭網、企業網(多主機場景)- 基于 UDP,服務器端口 67,客戶端端口 68;
- 分配流程:發現(DHCP Discover)→提供(Offer)→請求(Request)→確認(ACK);
- 租約期限:默認 24 小時,到期前需續租
FTP(文件傳輸協議)實現客戶端與服務器間的文件上傳(PUT)、下載(GET)網站運維(上傳網頁文件)、大文件傳輸- 基于 TCP,控制端口 21(傳輸指令),數據端口 20(傳輸文件);
- 模式:主動模式(服務器主動連客戶端)、被動模式(客戶端主動連服務器);
- 安全性低(明文傳輸賬號密碼),替代方案:SFTP(基于 SSH)
TFTP(簡單文件傳輸協議)輕量級文件傳輸協議,功能簡化(無身份驗證、僅支持文件傳輸)局域網設備配置(如路由器刷固件)- 基于 UDP,默認端口 69;
- 僅支持讀(RRQ)、寫(WRQ)操作;
- 適合小文件(如配置文件),不適合大文件(無差錯恢復優化)
SMTP(簡單郵件傳輸協議)負責 “發送郵件”(從發件人服務器到收件人服務器)郵件客戶端(如 Outlook、網易郵箱)- 基于 TCP,默認端口 25(非加密)、465(SSL 加密);
- 需配合 POP3/IMAP 協議(接收郵件)使用;
- 發送流程:連接→認證→發送郵件→斷開
SNMP(簡單網絡管理協議)監控網絡設備狀態(如路由器流量、交換機端口狀態),實現網絡運維自動化企業網運維(管理多設備)- 基于 UDP,默認端口 161(代理)、162(陷阱);
- 核心組件:管理站(監控端)、代理(被監控設備)、MIB(管理信息庫,定義設備可監控的參數)

2. 傳輸層協議:保障端到端(進程間)傳輸

傳輸層通過 “端口號” 定位主機上的進程,解決 “數據發給哪個應用” 的問題,核心協議為 TCP 和 UDP,二者按需選擇使用。

協議名稱核心特性工作機制適用場景頭部大小對比優勢與劣勢
TCP(傳輸控制協議)面向連接、可靠傳輸、流量控制、擁塞控制1. 連接建立:三次握手(SYN→SYN+ACK→ACK);
2. 可靠傳輸:確認(ACK)、重傳(超時 / 快速重傳)、排序(序號字段);
3. 流量控制:滑動窗口(根據接收方緩沖區調整發送速率);
4. 擁塞控制:慢啟動、擁塞避免(避免網絡擁堵);
5. 連接關閉:四次揮手(FIN→ACK→FIN→ACK)
文件傳輸(FTP/SFTP)、網頁(HTTP/HTTPS)、郵件(SMTP)等需 “數據不丟失” 的場景20-60 字節優勢:數據可靠、無丟包亂序;
劣勢:延遲高(握手 / 重傳)、開銷大(頭部字段多)
UDP(用戶數據報協議)無連接、不可靠傳輸、低延遲、數據報邊界1. 無連接:直接發送數據,無需握手;
2. 不可靠:僅校驗頭部(校驗和字段),出錯則丟棄,不重傳;
3. 數據報邊界:發送 1 次對應接收 1 次,不合并 / 拆分數據;
4. 無流量 / 擁塞控制:按發送方速率傳輸
視頻通話(如 Zoom)、游戲(如王者榮耀)、DNS 查詢、實時監控等需 “低延遲” 的場景8 字節優勢:延遲低、開銷小、適合實時場景;
劣勢:數據可能丟包 / 亂序,需應用層處理

3. 網絡層協議:實現跨網絡主機定位與路由

網絡層通過 “IP 地址” 定位跨網段的主機,解決 “數據發給哪個主機” 的問題,同時通過路由協議選擇最優傳輸路徑。

協議名稱核心功能關鍵細節
IP(互聯網協議)1. 定義 IP 地址格式(如 IPv4 的 32 位、IPv6 的 128 位);
2. 封裝 IP 數據包(添加源 / 目標 IP);
3. 數據包分片 / 重組(當數據包超過 MTU 時,分片傳輸,接收端重組)
- IPv4:點分十進制(如 192.168.1.1),地址池即將耗盡;
- IPv6:冒分十六進制(如 2001:0db8:85a3:0000:0000:8a2e:0370:7334),解決地址不足問題;
- 無連接:僅負責轉發,不保證送達(可靠性由 TCP 保障)
ICMP(互聯網控制消息協議)1. 網絡診斷(如 ping 測試連通性);
2. 錯誤通知(如目標不可達、超時);
3. 路由控制(如重定向)
- 基于 IP 協議(封裝在 IP 數據包中),無端口號;
- ping 命令:發送 ICMP Echo Request,接收方回復 Echo Reply;
- traceroute 命令:通過 ICMP 超時消息跟蹤路由路徑
IGMP(互聯網組管理協議)管理主機與路由器間的 “組播” 關系(如主機加入 / 退出組播組)- 組播地址:D 類 IP 地址(224.0.0.0~239.255.255.255);
- 應用場景:視頻會議(同一組播組內的主機接收相同視頻流)、直播
路由協議(RIP/OSPF)路由器間交換路由信息,生成 “路由表”,選擇從源到目標的最優路徑- RIP(路由信息協議):基于 “跳數”(每經過一個路由器為 1 跳)選擇路徑,最大跳數 15(超過視為不可達),適合小型網絡;
- OSPF(開放式最短路徑優先):基于 “鏈路成本”(如帶寬、延遲)計算最短路徑,適合大型網絡(如企業網、互聯網骨干網)

4. 接口層協議:實現物理相鄰設備通信

接口層負責 “物理介質上的幀傳輸”,通過 “MAC 地址” 定位同一網段的設備,解決 “數據發給哪個物理設備” 的問題。

協議名稱核心功能關鍵細節
以太網協議(Ethernet)1. 定義 “幀” 格式(添加源 / 目標 MAC 地址、幀校驗位);
2. 介質訪問控制(CSMA/CD:載波監聽多路訪問 / 沖突檢測,避免同一網段設備同時發數據)
- MAC 地址:6 字節(如 00:1A:2B:3C:4D:5E),全球唯一(燒錄在網卡中);
- 幀結構:前導碼(同步)+ 幀首定界符 + 目的 MAC + 源 MAC + 類型字段(如 0x0800 表示 IP 數據包) + 數據 + CRC 校驗位;
- 傳輸介質:雙絞線(CAT5/CAT6)、光纖、同軸電纜
ARP(地址解析協議)將 “IP 地址” 轉換為 “MAC 地址”(同一網段內通信需 MAC 地址)- 工作流程:主機 A 要發數據給主機 B(同一網段)→ 廣播 ARP 請求(“誰是 192.168.1.100?請回復 MAC”)→ 主機 B 回復 ARP 應答(“我是 192.168.1.100,MAC 是 00:1A:2B:3C:4D:5E”)→ 主機 A 緩存 ARP 表(IP→MAC 映射,默認緩存 10-20 分鐘);
- 跨網段場景:主機 A 發數據給跨網段主機 C→ ARP 請求網關 MAC→ 網關轉發數據
RARP(反向地址解析協議)將 “MAC 地址” 轉換為 “IP 地址”(適合無磁盤工作站,無法存儲 IP 配置)- 工作流程:無磁盤主機啟動→ 廣播 RARP 請求(“我的 MAC 是 00:1A:2B:3C:4D:5E,請分配 IP”)→ RARP 服務器回復 IP 地址;
- 現在已被 DHCP 替代(DHCP 更靈活,可分配網關、DNS)
PPP(點對點協議)實現 “點對點” 設備通信(如撥號上網:電腦通過 Modem 連運營商服務器)- 無 MAC 地址(點對點無需廣播);
- 功能:鏈路建立、身份驗證(PAP/CHAP)、數據壓縮;
- 早期 ADSL 撥號上網的核心協議,現在逐漸被光纖 PPPoE 替代

三、IP 地址:主機的 “網絡身份證”(分類、特殊地址)

IP 地址是網絡層用于定位主機的 “唯一標識”(IPv4 為 32 位二進制數,IPv6 為 128 位),分為 “網絡號”(標識網段)和 “主機號”(標識網段內主機),通過子網掩碼區分二者邊界。

1. IPv4 地址分類

IPv4 地址采用 “點分十進制” 表示(如 192.168.1.1),根據 “前幾位二進制數” 分為 A-E 五類,核心區別在于 “網絡號 / 主機號位數” 和 “適用場景”。

地址類別范圍(點分十進制)網絡號位數主機號位數默認子網掩碼適用場景
A 類1.0.0.0 ~ 126.255.255.255824255.0.0.0超大規模網絡(如早期互聯網主干、大型跨國企業)
B 類128.0.0.0 ~ 191.255.255.2551616255.255.0.0中大規模網絡(如中型企業、高校校園網)
C 類192.0.0.0 ~ 223.255.255.255248255.255.255.0中小規模網絡(如家庭網、辦公室、小型門店)
D 類224.0.0.0 ~ 239.255.255.255無(組播地址無網絡號 / 主機號劃分)組播通信(如視頻會議、直播、IPTV)
E 類240.0.0.0 ~ 255.255.255.255科研實驗、未來擴展(未商用)

2.特殊地址

  • 127.0.0.1:本地回環地址

  • 192.168.x.0:網絡地址

  • 192.168.x.1:通常為網關地址

  • 192.168.x.255:廣播地址

四、單機上網配置:從 “硬件” 到 “測試” 的全流程

單機(如 Linux 主機)要接入網絡,需完成 “硬件準備→參數配置→連通性測試” 三步,核心是確保 “IP、網關、DNS” 三大參數正確。

1. 配置前提(硬件與軟件)

  • 硬件:有網絡接口(如以太網網卡、無線網卡),插入網線(有線)或連接 WiFi(無線);
  • 軟件:操作系統支持 TCP/IP 協議棧(如 Linux、Windows、macOS 均默認支持)。

2. 關鍵配置參數(以 Linux 為例)

配置項作用配置文件 / 命令示例配置
IP 地址標識本機在網段內的唯一身份配置文件:/etc/network/interfaces(靜態 IP)
命令:dhclient(動態獲取 IP)
靜態:address 192.168.1.100
子網掩碼區分 IP 地址中的 “網絡號” 和 “主機號”同 IP 配置文件netmask 255.255.255.0
網關本機跨網段通信的 “出口”命令:route add default gw 192.168.1.1(臨時生效)gateway 192.168.1.1
DNS將域名(如www.baidu.com)解析為 IP 地址,實現 “域名訪問”配置文件:/etc/resolv.confnameserver 8.8.8.8(谷歌 DNS)

3. 配置驗證與網絡診斷命令

命令作用示例輸出說明
ifconfig/ip addr查看網卡信息(IP、MAC、網卡狀態)eth0: inet 192.168.1.100/24(正常)
route -n/ip route查看路由表(確認網關是否生效)default via 192.168.1.1 dev eth0
ping <IP/域名>測試與目標主機的連通性(基于 ICMP 協議)64 bytes from 202.108.22.5: icmp_seq=1 ttl=56 time=8.2ms(連通)
nslookup <域名>測試 DNS 解析是否正常Name: www.baidu.com Address: 180.101.49.12(解析成功)
netstat -anp查看本機所有網絡連接(含端口、進程 PID)tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1234/nginx(80 端口被 nginx 占用)

五、網絡接口:進程與網絡的 “橋梁”(Socket)

進程要通過網絡通信,必須借助Socket(套接字)?—— 它是操作系統提供的 “網絡通信接口”,本質是一個 “文件描述符”(Linux 中 “一切皆文件”,網絡通信即 “讀寫 Socket 文件”)。

1. Socket 的核心作用

  • 封裝底層協議:進程無需關注 TCP/UDP、IP、ARP 等底層細節,只需調用 Socket API(如socket()bind()recvfrom());
  • 定位通信目標:通過 “IP + 端口號” 確定 “目標主機 + 目標進程”,即(IP, Port)二元組唯一標識一個網絡進程。

2. 端口號:進程的 “網絡門牌號”

  • 范圍:1~65535(16 位無符號整數);
  • 分類:
    • 知名端口(1~1023):系統 / 常用服務占用(如 HTTP 80、HTTPS 443、SSH 22、FTP 21);
    • 動態端口(1024~65535):客戶端進程臨時使用(如瀏覽器訪問網頁時隨機分配一個端口);
  • 特性:TCP 和 UDP 端口獨立(如 TCP 80 和 UDP 80 是兩個不同端口,可同時被占用)。

六、網絡字節序:大端

網絡傳輸采用大端存儲格式(高位字節在前),主機字節序,通常為小端模式(x86架構),需通過轉換函數確保數據一致性:

數字轉換函數(#include <arpa/inet.h>

uint32_t htonl(uint32_t hostlong); ?// 主機字節序 → 網絡字節序(32位)
uint16_t htons(uint16_t hostshort); // 主機字節序 → 網絡字節序(16位)
uint32_t ntohl(uint32_t netlong); ? // 網絡字節序 → 主機字節序(32位)
uint16_t ntohs(uint16_t netshort); ?// 網絡字節序 → 主機字節序(16位)
  • 理想運行結果:
    htonl(0x12345678)?返回?0x78563412(大端格式)

七、UDP 編程:無連接的 “數據報傳輸”

UDP 是傳輸層 “無連接、不可靠” 協議,適合對延遲敏感、可容忍少量丟包的場景(如視頻通話、游戲、DNS 查詢)。其編程模型分為服務端客戶端,流程簡單且無連接建立過程。

1. UDP 的核心特性

  • 無連接:通信前無需 “三次握手” 建立連接,直接發送數據;
  • 不可靠:不保證數據送達(可能丟包)、不保證順序(可能亂序)、不保證不重復(可能重傳);
  • 數據報邊界:發送端每調用一次sendto(),接收端需調用一次recvfrom()接收完整數據(如發送端發 2 次 100 字節,接收端不能一次收 200 字節);
  • 丟包原因:除了 “網絡擁堵”,還可能是接收端recvfrom()調用不及時(緩沖區滿)、發送速率超過接收速率(如服務器寫硬盤慢于客戶端發數據)。

2. UDP 通信框架

C/S模式通信流程:

在這里插入圖片描述

3.UDP 編程流程(以 C 語言 Socket API 為例)

角色核心步驟API 調用邏輯
服務端1. 創建 Socket → 2. 綁定 IP + 端口 → 3. 接收客戶端數據 → 4. 發送響應數據 → 5. 關閉 Socket1.?socket(AF_INET, SOCK_DGRAM, 0)(創建 UDP Socket)
2.?bind(sockfd, &addr, sizeof(addr))(綁定端口)
3.?recvfrom(sockfd, buf, len, 0, &cli_addr, &cli_len)(阻塞接收)
4.?sendto(sockfd, buf, len, 0, &cli_addr, cli_len)(發送響應)
5.?close(sockfd)
客戶端1. 創建 Socket → 2. 發送數據到服務端 → 3. 接收服務端響應 → 4. 關閉 Socket1.?socket(AF_INET, SOCK_DGRAM, 0)(創建 UDP Socket,無需綁定端口,系統自動分配)
2.?sendto(sockfd, buf, len, 0, &serv_addr, sizeof(serv_addr))(發送數據)
3.?recvfrom(sockfd, buf, len, 0, NULL, NULL)(接收響應)
4.?close(sockfd)

關鍵函數說明

int socket(int domain, int type, int protocol);
  • 功能:向內核申請創建基于內存的套接字描述符
  • 參數
    • domain:地址族(PF_INET/AF_INET用于互聯網程序,PF_UNIX/AF_UNIX用于單機程序)
    • type:套接字類型(SOCK_STREAM=TCP流式套接字,SOCK_DGRAM=UDP數據報套接字,SOCK_RAW=原始套接字)
    • protocol:協議(0表示自動適配應用層協議)
  • 返回值:成功返回套接字ID,失敗返回-1
int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);
  • 功能
    • 服務器端:將套接字與指定接口地址關聯,用于接收數據
    • 客戶端:指定數據發送的源接口(通常可省略)
  • 參數
    • sockfd:socket()返回的套接字ID
    • my_addr:物理接口結構體指針(通用結構sockaddr或專用結構sockaddr_in
    • addrlen:參數2的長度
  • 返回值:成功返回0,失敗返回-1
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
  • 功能:UDP協議中向對方發送數據
  • 參數
    • sockfd:本地套接字ID
    • buf:發送數據緩沖區
    • len:數據長度
    • flags:發送方式(0=阻塞)
    • dest_addr:目標主機地址結構體(必選)
    • addrlen:目標地址長度
  • 返回值:成功返回發送字節數,失敗返回-1
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
  • 功能:UDP協議中接收對方數據
  • 參數
    • sockfd:本地套接字ID
    • buf:接收數據緩沖區
    • len:緩沖區大小
    • flags:接收方式(0=阻塞)
    • src_addr:對方地址結構體(可選,NULL表示不關心)
    • addrlen:對方地址長度指針
  • 返回值:成功返回接收字節數,失敗返回-1
UDP 服務器代碼示例
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#include <time.h>typedef struct sockaddr * (SA);  // 定義sockaddr指針別名
int main(int argc, char **argv)
{// 創建UDP套接字int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (-1 == sockfd){perror("socket");  // 打印錯誤信息return 1;}// 配置服務器地址結構struct sockaddr_in ser, cli;ser.sin_family = AF_INET;       // IPv4協議族ser.sin_port = htons(50000);    // 主機轉網絡字節序端口ser.sin_addr.s_addr = inet_addr("192.168.14.128");  // 設置IP地址// 綁定套接字到指定地址int ret = bind(sockfd, (SA) &ser, sizeof(ser));if (-1 == ret){perror("bind");  // 綁定失敗處理return 1;}time_t tm;socklen_t len = sizeof(cli);while (1)  // 持續服務循環{char buf[512] = {0};  // 接收緩沖區time(&tm);  // 獲取當前時間// 接收客戶端數據(阻塞等待)recvfrom(sockfd, buf, sizeof(buf), 0, (SA)&cli, &len);// 附加時間戳到消息sprintf(buf, "%s %s", buf, ctime(&tm));// 將處理后的消息回傳客戶端sendto(sockfd, buf, strlen(buf), 0, (SA)&cli, len);}return 0;  // 理想結果:持續運行并處理客戶端請求
}
UDP 客戶端代碼示例
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <time.h>
#include <unistd.h>typedef struct sockaddr * (SA);  // 定義sockaddr指針別名
int main(int argc, char **argv)
{// 創建UDP套接字int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (-1 == sockfd){perror("socket");  // 錯誤處理return 1;}// 配置服務器地址結構struct sockaddr_in ser;ser.sin_family = AF_INET;       // IPv4協議族ser.sin_port = htons(50000);    // 主機轉網絡字節序端口ser.sin_addr.s_addr = inet_addr("192.168.14.128");  // 服務器IPint i = 10;while (i--)  // 發送10次請求{char buf[512] = "hello,this udp test";  // 初始化消息// 發送數據到服務器sendto(sockfd, buf, strlen(buf), 0, (SA)&ser, sizeof(ser));bzero(buf, sizeof(buf));  // 清空緩沖區// 接收服務器響應(阻塞等待)recvfrom(sockfd, buf, sizeof(buf), 0, NULL, NULL);printf("from ser:%s\n", buf);  // 打印服務器響應sleep(1);  // 間隔1秒}close(sockfd);  // 關閉套接字return 0;  // 理想結果:輸出10次類似 "from ser:hello,this udp test Wed Jun 12 10:30:45 2024"
}

八、網絡通信模型:C/S、B/S 與 P2P

不同場景下,網絡通信采用不同的 “角色分工模型”,核心區別在于 “資源存儲位置” 和 “客戶端形態”。

1. C/S 模型(客戶端 / 服務器模型)

  • 定義:由 “專用客戶端” 和 “中心服務器” 組成,服務器提供資源 / 服務,客戶端請求并處理資源;
  • 核心特點
    • 客戶端:專用(如 QQ、微信、游戲客戶端),需安裝,功能復雜(可本地處理大量數據);
    • 協議:靈活(可自定義 TCP/UDP 協議,也可使用標準協議如 FTP);
    • 資源:部分資源在客戶端(如游戲客戶端的本地地圖、QQ 的本地聊天記錄),服務器僅傳輸關鍵數據(如游戲同步信息、聊天消息);
  • 適用場景:對功能、性能要求高的場景(如大型游戲、企業 OA 系統)。

2. B/S 模型(瀏覽器 / 服務器模型)

  • 定義:是 C/S 的特殊形式,客戶端為 “通用瀏覽器”(如 Chrome、Edge),無需安裝額外軟件,服務器提供 HTTP/HTTPS 服務;承擔全部資源存儲與處理,是當前互聯網主流架構。
  • 核心特點(與 C/S 對比)
對比維度C/S 模型B/S 模型
客戶端形態專用客戶端,需安裝,適配成本高通用瀏覽器,無需安裝,“一次開發多端兼容”
依賴協議可自定義協議或使用 FTP 等標準協議強依賴 HTTP/HTTPS(長連接用 WebSocket)
資源分布客戶端存靜態資源,服務器存動態資源服務器存全部資源,瀏覽器僅臨時緩存(Cookie)
  • 適用場景:輕量型、跨平臺需求場景,如網頁版工具(在線文檔 Google Docs)、信息展示類網站(新聞網站、電商網站)、企業輕量辦公系統(網頁版考勤系統)、臨時使用服務(在線問卷調查)。

3. P2P 模型(點對點模型)

  • 定義:“去中心化” 架構,所有節點(Peer)地位平等,既可作為 “客戶端” 請求資源,也可作為 “服務器” 提供資源,節點間直接通信,無需依賴中心服務器(僅可選 “Tracker 服務器” 輔助節點發現)。
  • 核心特點
    • 架構:無中心節點,單個節點下線不影響整體網絡,抗故障能力強;
    • 資源分布:分布式存儲,文件拆分為多個片段(如 BT 下載拆分為 256KB 片段),分散存儲在不同節點,下載時從多節點并行獲取;
    • 擴展性:節點越多,提供資源的 “種子” 越多,下載速度越快(與 C/S 相反,C/S 節點多會增加服務器壓力);
    • 技術難點:需解決 “NAT 穿透”(內網節點無法被外網直接訪問,需 STUN/TURN 技術)、“節點信譽”(防范惡意節點提供錯誤數據);
  • 適用場景:大文件共享(BT 下載、迅雷 P2P 加速)、實時通信(WebRTC 網頁版視頻會議)、分布式計算(區塊鏈網絡、科學計算項目 SETI@home)。

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

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

相關文章

HarmonyOS 新一代聲明式 UI 彈窗機制:從 AlertDialog 到 CustomDialogController 的深度解析與實踐

好的&#xff0c;請看這篇關于 HarmonyOS 新一代聲明式 UI 彈窗機制的技術文章。 HarmonyOS 新一代聲明式 UI 彈窗機制&#xff1a;從 AlertDialog 到 CustomDialogController 的深度解析與實踐 引言 在 HarmonyOS 應用開發中&#xff0c;彈窗&#xff08;Dialog&#xff09;是…

混合推理模型(快思考、慢思考模型)

目錄基礎transformer架構、transformers庫預訓練模型的微調&#xff08;Fine-tuning&#xff09;預訓練微調的大模型應用模式base 模型、instruct 模型區別Hugging Face 上如何查看base模型、instruct模型混合推理模型大模型里的快思考 vs 慢思考qwen3模型含特殊 ChatML / 模型…

prometheus+grafana搭建

部署 prometheus 安裝 # 1,下載 wget https://github.com/prometheus/prometheus/releases/download/v2.45.1/prometheus-3.5.0.linux-amd64.tar.gz# 2,部署 tar -zxvf prometheus-3.5.0.linux-amd64.tar.gz -C /opt/ cd /opt/ mv ./prometheus-3.5.0.linux-amd64 …

MR30分布式I/O在面機裝備中的應用

隨著食品加工行業向自動化、智能化轉型&#xff0c;面機裝備對控制系統的響應速度、布線靈活性及穩定性提出了更高要求。本案例以某大型食品機械制造企業的全自動面條生產線升級項目為背景&#xff0c;引入 MR30 分布式 IO 模塊替代傳統集中式 IO 方案。通過將 MR30 分布式 IO …

Matlab使用小技巧合集(系列四):Table類型高效用法與數據處理實戰

Matlab使用小技巧合集(系列四):Table類型高效用法與數據處理實戰 在科研數據處理和論文寫作過程中,結構化數據的管理極為重要。Matlab的table類型為研究生和科研人員提供了靈活、高效的數據存儲與處理方式,尤其適合實驗結果整理、分組統計、數據預處理等場景。本文將系統介…

STM32的時鐘系統與時鐘樹的配置

STM32的時鐘系統是其微控制器&#xff08;MCU&#xff09;的核心組成部分&#xff0c;負責為CPU、外設和存儲器等模塊提供精確的時序信號。其設計靈活且復雜&#xff0c;通過多級時鐘樹&#xff08;Clock Tree&#xff09;實現時鐘源的選擇、分頻和分配。以下是詳細介紹&#x…

NV 工具metrics分析(ncu, nsys/torch profiler)

以下分析都以A100硬件架構為例; Theoretical Max Active Warps per SM: 64 Register number: 512 (規定每個thread不能超過256) Theoretical Active Warps per SM [warp]&#xff1a;512//registers_per_thread*4, which defines theoretical active warp occupancy Waves P…

[CISCN2019 總決賽 Day2 Web1]Easyweb

登錄界面可以看到隨機切換的圖片。從頁面源碼中可以看到<div class"avtar"><img src"image.php?id3" width"200" height"200"/></div>&#xff0c;圖片文件的請求地址&#xff0c;并且有傳參id。web應用中像這種動…

第 3 講:KAFKA生產者(Producer)詳解

這是一篇既照顧入門也能給高級工程師提供落地經驗的實戰筆記。0. TL;DR&#xff08;先上結論&#xff09; 想穩&#xff1a;acksall 合理 retries&#xff1b;需要“分區內不重不丟”→ 再加 enable.idempotencetrue 且 max.in.flight<5。想快&#xff1a;適度增大 batch.s…

微信小程序截屏與錄屏功能詳解

微信小程序提供了豐富的API支持截屏和錄屏功能&#xff0c;適用于多種場景&#xff0c;如教育類應用的課程錄制、游戲類應用的精彩瞬間分享、電商類應用的商品展示等。以下將詳細介紹實現方法和應用案例。 截屏功能實現 截屏功能通過調用wx.canvasToTempFilePath或wx.captureSc…

React 中的 HOC 和 Hooks

寫在前面 在函數式組件主導的 React 項目中&#xff0c;高階組件&#xff08;HOC&#xff09;并非首選推薦&#xff0c;更建議優先使用 Hooks來實現復用邏輯。核心原因是 HOC 存在固有的設計缺陷&#xff0c;而 Hooks 能更優雅、簡潔地解決相同問題&#xff0c;同時避免 HOC 的…

【 蒼穹外賣 | Day2】

1. 相關視頻 Day2的全部視頻集數 2. 學習記錄 2.1 對象屬性拷貝 當DTO與實體類或者VO對象之間的一個裝換的時候&#xff0c;如果通過new創建對象&#xff0c;然后調用set方法進行屬性賦值&#xff0c;不夠方便&#xff0c;代碼不夠簡潔。當屬性過多時候&#xff0c;代碼就會…

焊接自動化測試平臺圖像處理分析-模型訓練推理

1、使用技術棧&#xff1a;jdk17/springboot/python/opencv/yolov8 2、JAVA環境搭建 JDK17下載安裝&#xff1a;wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz 解壓軟件 tar -xf jdk-17.0.16_linux-x64_bin.tar.gz 配置全局變量 vim /etc/p…

【python實用小腳本-205】[HR揭秘]手工黨逐行查Bug的終結者|Python版代碼質量“CT機”加速器(建議收藏)

1. 場景故事 “作為HR&#xff0c;我曾用2小時逐行審閱50份Python簡歷項目&#xff0c;直到發現候選人的代碼復雜度超標導致線上事故…” → 轉折點&#xff1a;用麥凱布&#xff08;McCabe&#xff09;圈復雜度檢測腳本&#xff0c;30秒掃描全倉庫&#xff0c;現可100%攔截“高…

LeetCode - 1089. 復寫零

題目 1089. 復寫零 - 力扣&#xff08;LeetCode&#xff09; 思路 這道題我首先想到的是從前往后雙指針&#xff0c;但是這樣做會造成數據的覆蓋&#xff0c;比如說下面的這個情況 所以解決的方法就是從后往前去復寫&#xff0c;但是從后往前的話就要知道最后一個有效元素是…

c#中public類比博圖

簡單來說&#xff0c;**public 定義了“接口”或“引腳”**&#xff0c;就像你的FB塊上的 Input, Output, InOut 管腳一樣。它決定了外部的其他代碼&#xff08;如另一個FB或OB1&#xff09;可以看到和操作這個塊里的什么東西。讓我用你最熟悉的博圖概念來詳細類比一下。---###…

K8s基于節點軟親和的高 CPU Pod 擴容與優先調度方案

場景與目標 集群節點&#xff1a;master&#xff08;4 核&#xff09;、node1&#xff08;16 核&#xff09;、node2&#xff08;16 核&#xff09;。目標&#xff1a;將一個高 CPU 消耗的工作負載橫向擴展到 4 個實例&#xff0c;并通過**節點親和性&#xff08;軟親和&#…

MySQL InnoDB 的鎖機制

引言 鎖是數據庫管理并發訪問的另一種核心機制&#xff0c;與 MVCC 相輔相成。本文將系統梳理 MySQL InnoDB 中鎖的粒度、類型和工作原理&#xff0c;并深入探討它如何與事務隔離級別配合&#xff0c;共同保障數據的一致性和完整性。 一、 鎖的粒度&#xff1a;由粗到細 InnoD…

狀態模式(State Pattern)——網絡連接場景的 C++ 實戰

一、為什么要用狀態模式&#xff1f;在開發中&#xff0c;經常遇到“對象在不同狀態下行為不同”的情況。最常見的寫法是用一堆 if/else 或 switch 來判斷狀態&#xff0c;然后在不同分支里寫邏輯。這樣做有兩個問題&#xff1a;狀態增多后&#xff0c;條件分支會變得臃腫。修改…

使用csi-driver-nfs實現K8S動態供給

文章目錄一、部署NFS二、k8s環境部署csi-nfs三、測試動態供給補充應用服務器IPnfs-server192.168.1.5k8s-master01192.168.1.1k8s-node01192.168.1.2k8s-node02192.168.1.3 一、部署NFS 1、在NFS服務端和k8s所有節點部署nfs-utils 因為客戶端去掛載nfs服務端的共享目錄時&…