網絡通信的核心是實現不同主機上進程間的數據交換,其技術體系圍繞 “協議分層模型” 展開,向下依賴硬件介質傳輸電 / 光信號,向上支撐各類網絡應用(如網頁瀏覽、文件傳輸)。本文結合 OSI 理論框架與 TCP/IP 工業標準,從模型、協議、地址、配置、編程到架構,系統梳理網絡通信核心知識。
一、網絡通信的核心模型:OSI 與 TCP/IP 的對應與差異
網絡通信需通過 “分層協作” 實現 —— 每層專注解決一類問題(如尋址、傳輸可靠性),并為上層提供標準化接口。OSI 七層模型是理論參考框架,TCP/IP 四層模型是實際工業標準,二者并非替代關系,而是 “理論指導實踐” 的映射關系。
1. 分層模型對比(含功能、協議、設備)
OSI 七層模型(理論) | 核心功能拆解 | TCP/IP 四層模型(實用) | 對應功能整合(含 OSI 多層邏輯) | 關鍵協議 / 技術 | 典型硬件 / 載體 |
---|---|---|---|---|---|
應用層 | 為終端用戶提供具體網絡服務(如 “瀏覽網頁”“發送郵件”),定義應用程序與網絡的交互規則 | 應用層 | 整合 OSI 應用層 + 表示層 + 會話層功能,直接面向應用程序提供 API | HTTP/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.255 | 8 | 24 | 255.0.0.0 | 超大規模網絡(如早期互聯網主干、大型跨國企業) |
B 類 | 128.0.0.0 ~ 191.255.255.255 | 16 | 16 | 255.255.0.0 | 中大規模網絡(如中型企業、高校校園網) |
C 類 | 192.0.0.0 ~ 223.255.255.255 | 24 | 8 | 255.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.conf | nameserver 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. 關閉 Socket | 1.?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. 關閉 Socket | 1.?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()返回的套接字IDmy_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
:本地套接字IDbuf
:發送數據緩沖區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
:本地套接字IDbuf
:接收數據緩沖區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)。