跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++

Linux 网络基础与 TCP 协议核心解析

Linux 网络通信基于分层协议栈,通过 IP 地址定位主机,端口号定位进程。文章详解了应用层、传输层、网络层等五层模型,以及 IPv4 地址转换函数 inet_pton 与 inet_ntop 的使用差异。重点剖析 TCP 协议的可靠性机制,包括三次握手建立连接、四次挥手断开连接、序号确认重传策略,以及滑动窗口流量控制与拥塞控制原理。同时对比了 TCP 与 UDP 的适用场景,并介绍了 Linux 常用网络管理工具及 Socket 编程的基本内核路径。

氛围发布于 2026/3/15更新于 2026/10/978 浏览
Linux 网络基础与 TCP 协议核心解析

Linux 网络基础与 TCP 协议核心解析

一、网络通信的底层逻辑:协议栈与封装

在浏览器输入网址,数据是如何传输到服务器的?答案在于'分层协作'。这就像快递系统:应用层负责打包(定格式),传输层贴地址(标进程),网络层选路线(标主机),物理层负责运输。每一层各司其职,互不越界。

1. Linux 网络协议栈分层

  • 应用层:给数据定格式,如 HTTP、SSH、FTP。
  • 传输层:给数据标进程,通过端口号区分同一台电脑上的不同程序(80 端口通常是浏览器,3306 是 MySQL),核心协议是 TCP 和 UDP。
  • 网络层:给数据标主机,用 IP 地址定位目标设备。
  • 数据链路层:给数据标节点,用 MAC 地址在局域网内传输。
  • 物理层:纯硬件传输,如网线传电信号、光纤传光信号。

在 Socket 网络编程(IPv4 场景)中,sockaddr_in结构体的 sin_addr字段以 32 位二进制形式存储 IP 地址,但日常习惯使用点分十进制字符串(如 192.168.1.1)。因此需要借助地址转换函数实现两种格式的互转,这是绑定 IP、解析地址的基础操作。

地址转换函数

需引入头文件 <arpa/inet.h>,常用函数包括:

  • inet_pton:更通用的函数(支持 IPv4/IPv6),将字符串转为二进制地址存入指定指针。推荐优先使用此函数替代旧版接口。
  • inet_ntop:将二进制地址转为可读字符串,需手动传入缓冲区,避免线程安全问题。

相比之下,inet_aton 和 inet_ntoa 虽然经典,但在多线程或复杂场景下存在局限性。例如 inet_ntoa 返回的是静态缓冲区,多次调用可能导致结果被覆盖。

image.png

2. 数据封装与解封装

发送数据时,各层依次添加头部信息:

  1. 应用层:生成原始数据。
  2. 传输层:加头,包含源端口和目的端口,形成报文段。
  3. 网络层:加头,包含源 IP 和目标 IP,形成数据报。
  4. 数据链路层:加头和尾,包含源 MAC 和目的 MAC,形成以太网帧。
  5. 物理层:将帧转换为电信号发出。

接收方则反向操作:拆帧→拆数据报→拆报文段→拿到原始数据。

在 C++ 网络编程中,通常会封装一个 InetAddr 类来处理 IP 与端口的转换逻辑,统一字节序处理。

#include <arpa/inet.h>
#include <string>
#include <cstdint>


  {
:
    
    (  sockaddr_in& addr) : _addr(addr) {
        _port = (addr.sin_port); 
        _ip = (addr.sin_addr); 
    }

    
    ( std::string& ip,  port) : _ip(ip), _port(port) {
        (&_addr, , (_addr));
        _addr.sin_family = AF_INET; 
        _addr.sin_port = (port); 
        (AF_INET, ip.(), &_addr.sin_addr);
    }

    
    {  _port; }

    
    {  _ip; }

    
      & ()  {  _addr; }

:
      _addr; 
    std::string _ip;          
     _port;           
};
#include <cstring>
class
InetAddr
public
// 构造函数 1:从 sockaddr_in(网络字节序)初始化
InetAddr
const
struct
ntohs
// 网络字节序端口 -> 主机字节序
inet_ntoa
// 网络字节序 IP -> 点分十进制字符串
// 构造函数 2:从 IP 字符串(主机序)和端口(主机序)初始化
InetAddr
const
uint16_t
memset
0
sizeof
// IPv4 协议族
htons
// 主机字节序端口 -> 网络字节序
inet_pton
c_str
// 获取主机字节序的端口
uint16_t Port() const
return
// 获取点分十进制的 IP 字符串
std::string Ip() const
return
// 获取 sockaddr_in 结构体(网络字节序)
const
struct
sockaddr_in
GetSockAddr
const
return
private
struct
sockaddr_in
// 网络字节序的地址结构体
// 主机序:点分十进制 IP 字符串
uint16_t
// 主机序:端口号

二、网络定位核心:IP 地址与端口

IP 地址好比小区地址,端口号则是具体的门牌号。只有同时知道这两个,数据才能准确送达目标进程。

1. IP 地址

  • 作用:定位主机(电脑、服务器、路由器)。
  • 格式:IPv4 为 32 位二进制(如 192.168.1.1),IPv6 为 128 位,解决地址耗尽问题。

2. 端口号

  • 作用:定位主机上的进程,范围 0-65535。
  • 分类:
    • 知名端口(0-1023):系统预留,如 80(HTTP)、443(HTTPS)、22(SSH)。
    • 注册端口(1024-49151):应用程序注册使用,如 3306(MySQL)。
    • 动态端口(49152-65535):客户端临时使用,通信结束释放。

注意:inet_ntoa 返回的字符串存储在静态缓冲区中,多线程环境下可能被后续调用覆盖。生产环境中建议使用 inet_ntop 并手动管理缓冲区。

image.png

三、Linux 网络管理必备工具

学习网络不能仅停留在理论,必须掌握调试工具。

工具核心功能常用命令示例
ip addr查看/配置 IP 地址ip addr add 192.168.1.100/24 dev eth0
ip route查看/配置路由表ip route add default via 192.168.1.1
ping测试主机连通性ping -c 4 www.baidu.com
ss/netstat查看网络连接状态ss -tulnp (t=TCP, u=UDP, l=监听,p=进程)
tcpdump/Wireshark网络抓包分析tcpdump -i eth0 port 80

在 Windows 环境下,网络编程的配置略有不同。需引入 WinSock2.h 头文件,并通过 #pragma comment(lib, "ws2_32.lib") 链接库。此外,Windows 平台需要调用 WSAStartup 初始化套接字库,而 Linux 无需此步骤。

image.png

四、TCP 协议核心:可靠传输机制

TCP 是互联网的基石,其核心在于保证数据不丢、不错、不乱。

1. TCP 报文结构

TCP 报文由固定头部(20 字节)、选项和数据组成。关键字段包括序号、确认号、窗口大小及标志位(SYN、ACK、FIN、RST)。

2. 连接管理:三次握手

为什么是三次而不是两次?

  • 第一次:客户端发送 SYN,请求建立连接。
  • 第二次:服务器回复 SYN+ACK,表示同意连接。
  • 第三次:客户端回复 ACK,确认收到,双方进入 ESTABLISHED 状态。

若只有两次,服务器无法确认客户端是否收到了自己的同意消息,可能导致资源浪费。四次则多余,因为三次已能确认双向通信能力。

3. 连接管理:四次挥手

TCP 是全双工通信,关闭连接需分别关闭发送通道。

  1. 主动方发送 FIN,关闭发送通道。
  2. 被动方回复 ACK,确认收到。
  3. 被动方处理完剩余数据后发送 FIN。
  4. 主动方回复 ACK,连接关闭。

注意:主动方最后会进入 TIME_WAIT 状态,等待约 60 秒,防止最后一个 ACK 丢失导致对方重发 FIN。

4. 可靠性保障

  • 序号与确认号:接收方按序号重组数据,乱序可纠正,重复直接丢弃。
  • 重传机制:超时未收到确认则重传;若收到 3 个重复 ACK,触发快速重传。

5. 流量控制与拥塞控制

  • 流量控制:基于接收方缓冲区大小,通过滑动窗口限制发送速率。
  • 拥塞控制:基于网络链路状况,调整发送窗口(cwnd)。包括慢开始、拥塞避免和快速恢复三个阶段。

image.png

五、TCP vs UDP:协议选择逻辑

  • TCP(快递):慢但可靠,适合转账、文件传输等对准确性要求高的场景。
  • UDP(对讲机):快但不保证送达,适合直播、游戏等实时性要求高的场景。
特性TCPUDP
连接面向连接无连接
可靠性可靠(重传、确认)不可靠
有序性保证有序不保证有序
速度较慢较快

image.png

六、Linux 内核 TCP/IP 与网络编程

编写网络程序本质是调用内核接口(Socket),让内核处理底层细节。应用程序的数据流向通常为:Socket 层 → inet 层 → IP 层 → 数据链路层 → 网卡。

image.png

目录

  1. Linux 网络基础与 TCP 协议核心解析
  2. 一、网络通信的底层逻辑:协议栈与封装
  3. 1. Linux 网络协议栈分层
  4. 地址转换函数
  5. 2. 数据封装与解封装
  6. 二、网络定位核心:IP 地址与端口
  7. 1. IP 地址
  8. 2. 端口号
  9. 三、Linux 网络管理必备工具
  10. 四、TCP 协议核心:可靠传输机制
  11. 1. TCP 报文结构
  12. 2. 连接管理:三次握手
  13. 3. 连接管理:四次挥手
  14. 4. 可靠性保障
  15. 5. 流量控制与拥塞控制
  16. 五、TCP vs UDP:协议选择逻辑
  17. 六、Linux 内核 TCP/IP 与网络编程

更多推荐文章

查看全部
  • FAIR plus 机器人全产业链接会:聚焦具身智能与产业链协同
  • WebSocket 核心原理与前后端完整用法实战
  • Git 安装流程与基础使用步骤
  • AnythingLLM:零成本搭建私人 ChatGPT,支持主流大模型
  • 前端与服务器时间同步方法及 Vue3 实现示例
  • 基于代理服务与 AI 分析的亚马逊电商数据高效爬取方案
  • 《Agent Runtime 工程化》第四章 工具系统设计:4.5 失败分类
  • C++ 异常处理机制深度解析
  • SQL Copilot 搭建实战:利用 AI 助手提升 SQL 编写效率
  • 解决 pip list 报错 Fatal error in launcher
  • Super Qwen Voice World 效果展示:动态砖块节奏同步语音波形图
  • 自然语言处理在客户服务领域的应用与实战
  • Claude Code 本地环境配置与 API 调用教程
  • ERNIE-4.5-0.3B 轻量化部署与效能突破:文心一言 4.5 开源模型
  • VS Code 中 GitHub Copilot 的安装与高效使用指南
  • FastGPT 结合 MCP 协议实现工具增强型智能体构建
  • JVM 垃圾回收入门:对象死亡判断的底层逻辑
  • 转行程序员:开发语言选择与岗位薪资解析
  • 基于 Rust 实现 GitHub Trending 热门仓库爬虫
  • AI 大模型对会计工作与财务软件的影响分析

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online