Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Linux 套接字編程核心原理:從 TCP/UDP 選型到常見網絡漏洞防範

編輯:Linux 教學

Socket 是應用層訪問網絡協議棧的標準 API,屏蔽了 OSI 會話層以下的路由、傳輸細節。掌握 Socket 類型選型、核心 API 語義及典型漏洞,是後端工程師構建高可靠網絡服務的必修功課。

兩大核心 Socket 類型深度對比

維度Stream Socket (SOCK_STREAM)Datagram Socket (SOCK_DGRAM)
協議TCP (IPPROTO_TCP)UDP (IPPROTO_UDP)
連接模式面向連接,三次握手建立雙向可靠流無連接,單向不可靠數據報
數據邊界無邊界,字節流 (需應用層分幀)保留邊界,每次 sendto/recvfrom 一個報文
可靠性序號、ACK、重傳、流控、擁塞控制保證有序不重不丟無保證,可能丟包、亂序、重複
開銷頭部 20+ 字節,連接狀態機,系統開銷大頭部 8 字節,無狀態,輕量
典型場景Web/HTTP、郵件/SMTP、SSH、資料庫、即時通訊核心邏輯DNS、NTP、流媒體/RTP、遊戲狀態同步、廣播發現
編程複雜度需處理粘包/拆包、背壓、半關閉需應用層實現 ACK/重傳/排序 (如 QUIC/KCP)

核心系統調用語義 (man 2 socket/connect/listen/accept/send/recv)

// 1. 創建 Socket
int sockfd = socket(int domain, int type, int protocol);
// domain: AF_INET(IPv4), AF_INET6(IPv6), AF_UNIX(本地)
// type: SOCK_STREAM, SOCK_DGRAM, SOCK_RAW...
// 返回文件描述符,失敗 -1

// 2. 客戶端發起連接
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
// 成功 0,失敗 -1 (errno: ECONNREFUSED, ETIMEDOUT...)

// 3. 服務端綁定、監聽
bind(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
listen(sockfd, backlog);  // backlog: 內核待接受隊列長度

// 4. 接受連接 (阻塞直到新連接到達)
int connfd = accept(int sockfd, struct sockaddr *cli_addr, socklen_t *addrlen);
// 返回**新**文件描述符代表此連接,原 sockfd 繼續監聽

// 5. 數據收發
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
// 返回實際收發字節數,0 表示對端關閉 (TCP),-1 失敗
// UDP 使用 sendto/recvfrom 需指定目標地址

協議族常量 (bits/socket.h)

PF_INET   2  // IPv4 (最常用)
PF_INET6  10 // IPv6
PF_UNIX   1  // 本地進程間通信 (Unix Domain Socket)
PF_PACKET 17 // 直接鏈路層封裝 (抓包、造包工具)

Socket 類型枚舉 (bits/socket.h)

enum __socket_type {
    SOCK_STREAM = 1,  // TCP 流
    SOCK_DGRAM = 2,   // UDP 數據報
    SOCK_RAW   = 3,   // 原始 Socket (需 CAP_NET_RAW)
    SOCK_SEQPACKET = 5, // 順序包 (SCTP)
    ...
};

五大典型網絡漏洞與 Socket 層緩解

  1. SYN Flood: 服務端 listen backlog 滿導致正常連接被丟。
    緩解: /proc/sys/net/ipv4/tcp_syncookies=1、增大 somaxconn、部署 WAF/抗 DDoS 設備。
  2. TCP RST 攻擊: 偽造 RST 斷開連接。
    緩解: TCP MD5 Signature Option (RFC 2385, BGP 常用)、IPsec ESP 加密傳輸層。
  3. UDP 反射放大: 開放 UDP 服務 (DNS/NTP/SSDP) 被利用攻擊第三方。
    緩解: 關閉非必要 UDP 端口、啟用 BCP38 入口過濾、響應速率限制 (RRL)。
  4. 緩衝區溢出: recv 緩衝區未校驗長度。
    緩解: 使用 recv(sock, buf, sizeof(buf)-1, 0)、編譯器啟用 -fstack-protector-strong -D_FORTIFY_SOURCE=2、地址隨機化 (ASLR)。
  5. 未授權數據讀取: 明文傳輸敏感信息。
    緩解: 應用層強制 TLS 1.2+ (HTTPS, FTPS, SMTPS, LDAPS) 或 Socket 層 IPsec。

最佳實踐清單

  • Server 端 setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) 避免重啟端口佔用。
  • 非阻塞 + epoll/kqueue/IOCP 實現高併發事件驅動。
  • TCP 應用層協議設計:長度前綴 / 分隔符 / 固定長度,解決粘包。
  • 設置 SO_RCVTIMEO / SO_SNDTIMEO 避免無限阻塞。
  • 關閉時 shutdown(sock, SHUT_WR) 觸發 FIN,再 recv 讀 0 後 close,優雅斷開。

Socket 編程看似底層,實則是架構可靠性的基石。從協議選型到參數調優,每一個決策都在為系統的穩健性投票。

Copyright © Windows教程網 All Rights Reserved