《UNIX網絡編程卷1:套接字聯網API》第1章 簡介

《UNIX網絡編程卷1:套接字聯網API》第1章 簡介


1.1 網絡編程的核心價值與挑戰

網絡編程是實現跨設備通信的技術基礎,其核心目標是通過協議棧實現數據的可靠傳輸與高效交換。在嵌入式系統、云計算、物聯網等領域,網絡編程能力直接決定了系統的擴展性、實時性和穩定性。然而,開發者需要面對以下挑戰:

  • 異構網絡環境:不同硬件(如ARM嵌入式設備與x86服務器)和操作系統(如Linux、RTOS)的兼容性問題;
  • 協議復雜性:TCP/IP協議族的層次化設計與狀態機邏輯;
  • 資源限制:嵌入式設備的內存與計算資源有限,需優化網絡棧實現。

示例場景
在智能家居系統中,溫濕度傳感器(嵌入式設備)通過TCP協議將數據上報至云端服務器,服務器通過HTTP協議向手機客戶端推送告警信息。整個過程涉及多協議協作端到端可靠性保障


1.2 網絡模型與協議分層
1.2.1 OSI七層模型與TCP/IP四層模型
  • OSI模型(理論指導):

    層級功能典型協議
    應用層用戶接口與數據處理HTTP、FTP、MQTT
    表示層數據加密與格式轉換SSL/TLS、JSON
    會話層會話管理與同步NetBIOS
    傳輸層端到端可靠傳輸TCP、UDP、SCTP
    網絡層路由與尋址IP、ICMP
    數據鏈路層物理尋址與幀傳輸Ethernet、Wi-Fi
    物理層比特流傳輸RS-232、光纖
  • TCP/IP模型(實際應用):

    +---------------------+
    | 應用層(HTTP/FTP)  |
    +---------------------+
    | 傳輸層(TCP/UDP)   |
    +---------------------+
    | 網絡層(IPv4/IPv6) |
    +---------------------+
    | 鏈路層(Ethernet)  |
    +---------------------+
    

關鍵區別
TCP/IP模型將會話層、表示層功能合并至應用層,更注重實際工程實現。

1.2.2 協議分層的優勢
  1. 模塊化設計:各層獨立演進,如IPv6替代IPv4無需修改傳輸層;
  2. 職責分離:應用層關注業務邏輯,傳輸層保障可靠性;
  3. 跨平臺兼容:不同操作系統通過相同協議棧實現互操作。

嵌入式場景適配
在資源受限的嵌入式設備中,可裁剪協議棧(如LwIP)僅保留必要層級,以降低內存占用。


1.3 客戶-服務器模型剖析
1.3.1 模型架構
  • 客戶端:主動發起請求,需實現重試機制與超時處理;
    // 客戶端連接重試示例
    int retry = 0;
    while (connect(sockfd, (SA*)&servaddr, sizeof(servaddr)) < 0) {if (retry++ >= MAX_RETRY) break;sleep(1); // 等待后重試
    }
    
  • 服務器:被動監聽,需處理并發請求;
    // 多進程并發服務器框架
    if (fork() == 0) {  // 子進程close(listenfd); // 關閉監聽套接字process_request(connfd); // 處理請求exit(0);
    }
    close(connfd); // 父進程關閉連接套接字
    
1.3.2 模型變體
  1. P2P模型:節點同時充當客戶與服務器(如區塊鏈網絡);
  2. 代理服務器:中間節點轉發請求(如Nginx反向代理);
  3. 混合模型:物聯網中的邊緣計算架構(設備與云端協同)。

1.4 協議無關性設計
1.4.1 IPv4與IPv6兼容

通過getaddrinfo函數實現地址無關性:

struct addrinfo hints, *res;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;    // 支持IPv4/IPv6
hints.ai_socktype = SOCK_STREAM;getaddrinfo("www.example.com", "http", &hints, &res);
// 遍歷res鏈表選擇合適地址

優勢:代碼無需修改即可適配雙棧環境。

1.4.2 數據序列化與字節序
  • 網絡字節序:大端模式,使用htonl/ntohl轉換;
  • 結構體對齊:避免編譯器填充,使用#pragma pack__attribute__((packed))

示例:定義協議頭

#pragma pack(1)
struct protocol_header {uint16_t type;   // 報文類型uint32_t length; // 數據長度
};
#pragma pack()

1.5 錯誤處理與健壯性設計
1.5.1 系統調用錯誤處理

UNIX系統調用通過返回值與errno指示錯誤:

if ( (n = read(fd, buf, size)) < 0) {if (errno == EINTR) // 被信號中斷goto retry;elseerr_sys("read error"); // 終止程序
}
1.5.2 包裹函數設計

封裝系統調用以簡化錯誤處理:

int Socket(int family, int type, int protocol) {int n;if ( (n = socket(family, type, protocol)) < 0)err_sys("socket error");return n;
}

應用場景:所有示例代碼均使用包裹函數提升可讀性。


1.6 開發環境與工具鏈
1.6.1 推薦工具
  • 調試工具:GDB(支持遠程調試嵌入式設備)、strace;
  • 抓包工具:tcpdump、Wireshark(圖形化分析);
  • 性能工具:netstat、ss、iperf。
1.6.2 嵌入式交叉編譯示例
# 使用arm-linux-gnueabihf工具鏈編譯
arm-linux-gnueabihf-gcc -o tcpserv tcpserv.c -lrt

1.7 圖文說明
  1. TCP/IP協議棧數據流圖
    在這里插入圖片描述

    *說明:數據從應用層向下封裝,經物理網絡傳輸后向上解封裝,如一個數據包經過逐層封裝示例如下
    在這里插入圖片描述

  2. 客戶-服務器交互時序圖

    +---------+       +----------+
    | Client  |       | Server   |
    +---------+       +----------+|--- SYN ------>|           # 三次握手|<-- SYN+ACK ---| |--- ACK ------>| |--- DATA ----->|           # 請求|<-- DATA ------|           # 響應|--- FIN ------>|           # 四次揮手|<-- ACK -------||<-- FIN -------||--- ACK ------>|
    

1.8 本章小結與習題

小結:本章系統介紹了網絡編程的核心概念、協議分層模型、客戶-服務器架構及健壯性設計方法,為后續深入套接字API打下基礎。

習題

  1. 編寫一個協議無關的時間獲取客戶端,支持IPv4/IPv6;
  2. 使用tcpdump抓取HTTP請求,分析TCP/IP各層頭部字段;
  3. 對比LwIP與標準TCP/IP協議棧的差異,總結嵌入式優化方法。

付費用戶專屬資源

  • 完整代碼倉庫(含跨平臺編譯腳本);
  • 協議棧交互動畫(GIF演示);
  • 擴展閱讀:《嵌入式網絡編程優化實戰》。

協議無關的時間獲取客戶端,支持IPv4/IPv6;
2. 使用tcpdump抓取HTTP請求,分析TCP/IP各層頭部字段;
3. 對比LwIP與標準TCP/IP協議棧的差異,總結嵌入式優化方法。


付費用戶專屬資源

  • 完整代碼倉庫(含跨平臺編譯腳本);
  • 協議棧交互動畫(GIF演示);
  • 擴展閱讀:《嵌入式網絡編程優化實戰》。

通過本章的學習,讀者將掌握網絡編程的基礎理論,并能夠搭建健壯的客戶-服務器應用。

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

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

相關文章

D-Wave專用量子計算機登頂Science 率先展示在真實場景中的量子優勢(內附下載)

內容來源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 文丨浪味仙 排版丨浪味仙 行業動向&#xff1a;4200字丨16分鐘閱讀 摘要&#xff1a;加拿大專用量子計算機公司 D-Wave 在 Science 期刊發表了論文&#xff0c;題為《Beyond-Classical Compu…

在Ubuntu上安裝MEAN Stack的4個步驟

在Ubuntu上安裝MEAN Stack的4個步驟為&#xff1a;1.安裝MEAN&#xff1b;2.安裝MongoDB&#xff1b;3.安裝NodeJS&#xff0c;Git和NPM&#xff1b;4.安裝剩余的依賴項。 什么是MEAN Stack&#xff1f; 平均堆棧一直在很大程度上升高為基于穩健的基于JavaScript的開發堆棧。…

jmeter將返回的數據寫入csv文件

舉例說明&#xff0c;我需要接口返回體中的exampleid與todoid的數據信息&#xff08;使用邊界提取器先將其提取&#xff09;&#xff0c;并將其寫入csv文件進行保存 使用后置處理器BeanShell 腳本實例如下 import java.io.*;// 設置要寫入的文件路徑 String filePath "…

Linux下Redis哨兵集群模式搭建(1主2從+3哨兵)

Linux下Redis哨兵集群模式搭建&#xff08;1主2從3哨兵&#xff09; 一、Redis哨兵模式搭建 1.安裝包下載 鏈接: https://pan.baidu.com/s/1_n2rCMi5MHX-mVkkyMo4LA 提取碼: gbra 2.新建redis目錄 mkdir -p /app/redis3.解壓到/app/redis目錄下 tar -zxvf redis-6.2.16.ta…

Debian 系統命令集合 |Debian 和 CentOS常見命令的異同

Debian 系統命令集合 Debian 是一個非常流行且穩定的 Linux 發行版&#xff0c;廣泛用于服務器、桌面和工作站環境。 Debian 和 CentOS常見命令 使用方式的對比 注: 部分人&#xff08;比如我&#xff09;先學的centos&#xff0c;其實centos和debian 就記住幾十個有區別命…

20250319在榮品的PRO-RK3566開發板的buildroot系統下使用集成的QT應用調試串口UART3

stty -F /dev/ttyS3 115200 -echo cat /dev/ttyS3 & echo serialdata > /dev/ttyS3 20250319在榮品的PRO-RK3566開發板的buildroot系統下使用集成的QT應用調試串口UART3 2025/3/19 14:17 緣起&#xff1a;在榮品的PRO-RK3566開發板的buildroot系統下&#xff0c;在命令…

深入理解 C# 反射 的使用

總目錄 前言 反射是.NET框架中一個強大的特性&#xff0c;允許程序在運行時檢查和操作類型信息。通過反射&#xff0c;開發者可以動態地創建對象、調用方法、訪問屬性等&#xff0c;為程序提供了極大的靈活性。本文將詳細講解C#反射的使用方法及其應用場景。 一、什么是反射&a…

YOLO+OpenCV強強聯手:高精度跌倒檢測技術實戰解析

目錄 關于摔倒檢測 摔倒檢測核心邏輯 摔倒檢測:聯合多種邏輯判斷 原理詳細解釋 1. 導入必要的庫 2. 定義函數和關鍵點連接關系 3. 篩選有效關鍵點并計算邊界框 4. 計算人體上下半身中心點和角度 5. 繪制關鍵點和連接線 6. 繪制角度標注和檢測跌倒 7. 返回處理后的圖…

AI入門7:python三種API方式調用本地Ollama+DeepSeek

回顧 書接上篇&#xff1a;各種方式搭建了本地知識庫&#xff1a; AI入門&#xff1a;AI模型管家婆ollama的安裝和使用-CSDN博客 AI入門2&#xff1a;本地AI部署&#xff0c;用ollama部署deepseek&#xff08;私有化部署&#xff09;-CSDN博客 AI入門3&#xff1a;給本地d…

內網安全-橫向移動Kerberos 攻擊SPN 掃描WinRMWinRSRDP

1.WinRM&WinRS 條件&#xff1a; 雙方開啟winrm winrs服務 2008版本以上默認開啟&#xff0c;win 7默認關閉 檢測使用cs內置端口掃描5985開放情況 進行連接 winrs -r:http://192.168.93.30:5985 -u:administrator -p:Whoami2021 whoami 2.內網-spn shell setspn -T …

LoRA中黑塞矩陣、Fisher信息矩陣是什么

LoRA中黑塞矩陣、Fisher信息矩陣是什么 1. 三者的核心概念 黑塞矩陣(Hessian) 二階導數矩陣,用于優化問題中判斷函數的凸性(如牛頓法),或計算參數更新方向(如擬牛頓法)。 Fisher信息矩陣(Fisher Information Matrix, FIM) 統計學中衡量參數估計的不確定性,反映數據…

高級java每日一道面試題-2025年3月04日-微服務篇[Eureka篇]-Eureka是什么?

如果有遺漏,評論區告訴我進行補充 面試官: Eureka是什么&#xff1f; 我回答: 在Java高級面試中&#xff0c;關于Eureka的討論通常會涵蓋其基本概念、組件與架構、工作原理、高級特性以及與其他服務發現工具的比較等多個方面。以下是結合提供的內容對Eureka進行的詳細解析和…

YZi Labs 談對 Plume 的投資:利用區塊鏈創造現實價值的典范項目

3 月 17 日&#xff0c;YZi Labs 宣布投資 RWAfi 賽道項目 Plume&#xff0c;引發市場廣泛關注。本輪融資是 Plume 在 去年 5 月和 12 月 連續兩輪融資后的第三輪融資&#xff0c;代表著市場資本市場對于 Plume RWAfi 敘事以及其發展潛力的高度認可。 本次融資不僅提升了市場對…

互功率譜 cpsd

互功率譜(Cross-Power Spectral Density, CPSD)是信號處理中用于描述兩個信號在頻域中相關性的工具。它表示兩個信號在不同頻率下的功率分布及其相位關系,廣泛應用于模態分析、系統辨識和信號匹配等領域。 matlab 實現 MATLAB 提供了 cpsd 函數來計算互功率譜。以下是使用 …

RocketMQ 架構

一、RocketMQ 核心架構概述 ?1. 主要組件 ?Name Server&#xff1a; 集群的「中樞神經」&#xff0c;負責 Topic 元數據管理&#xff08;如 Topic 分區分布、Broker 節點狀態監控&#xff09;。 ?Broker&#xff1a; 消息存儲與流轉的核心節點&#xff0c;負責消息的持久化…

單片機學完開發板,如何繼續提升自己的技能?

很多人學完開發板后都會卡在一個尷尬的階段&#xff1a;覺得自己會的東西不少&#xff0c;但又不知道下一步該干啥。會點C語言&#xff0c;能燒錄程序&#xff0c;能點亮LED&#xff0c;玩轉按鍵&#xff0c;搞定串口等等&#xff0c;能用開發板做點小玩意兒&#xff0c;但面對…

olmOCR大模型:支持結構化精準提取復雜PDF文件內容

基于streamlit與olmOCR大模型實現的pdf提取工具 import os import json import subprocess import pandas as pd from pathlib import Path import shutil import time import re import streamlit as st# 創建工作目錄 WORKSPACE_DIR "olmocr_workspace" os.maked…

五模型對比!Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多變量時間序列預測

目錄 預測效果基本介紹程序設計參考資料 預測效果 基本介紹 光伏功率預測&#xff01;五模型對比&#xff01;Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多變量時間序列預測(Matlab2023b 多輸入單輸出) 1.程序已經調試好&#xff0c;替換數據集后&#xff0c;僅運…

druid開啟防火墻之后的bug

bug以及解決方案 不允許執行多個語句不允許有注釋部分數據有誤識別&#xff0c;拋出異常&#xff0c;導致原本正常執行的語句被中斷 解決方案 application.yaml中對于druid配置如下&#xff1a; wall:enabled: true # 開啟防火墻config:multi-statement-allow: true # 允許多個…

SQLMesh 系列教程:Airbnb數據分析項目實戰

在本文中&#xff0c;我們將探討如何利用dbt項目的代碼庫來實現一個簡單的SQLMesh項目。本文的基礎是基于Udemy講師為dbt課程創建的示例項目&#xff0c;可以在這個GitHub repo中獲得。這個dbt項目是相對完整的示例&#xff0c;我們將使用它作為模板來演示SQLMesh&#xff08;下…