Linux 网络基础与 TCP 协议核心机制
一、网络通信的底层逻辑:协议栈与封装
数据在网络中的传输遵循分层协作模型,各层职责明确:
- 应用层:定义数据格式(如 HTTP、SSH、FTP)。
- 传输层:标识进程,使用端口号区分同一主机上的不同程序(如 80 端口为 HTTP,3306 为 MySQL),核心协议为 TCP 和 UDP。
- 网络层:标识主机,使用 IP 地址定位目标设备。
- 数据链路层:标识节点,使用 MAC 地址在局域网内传输。
- 物理层:纯硬件传输,如网线电信号或光纤光信号。
1. Linux 网络协议栈分层与地址转换
在 Socket 网络编程(IPv4 场景)中,sockaddr_in结构体的 sin_addr字段以 32 位二进制形式存储 IP 地址。日常习惯用点分十进制字符串表示,因此需要借助地址转换函数实现互转。
需引入头文件 <arpa/inet.h>,常用函数包括:
- 字符串转 in_addr:
inet_pton(int family, const char *strptr, void *addrptr):通用函数,支持 IPv4/IPv6。将字符串转为二进制地址存入addrptr。
- in_addr 转字符串:
inet_ntop(int family, const void *addrptr, char *strptr, size_t len):更安全的通用函数,需手动传入缓冲区,避免线程安全问题。
注意:
inet_ntoa返回静态缓冲区,多线程下可能被覆盖,建议优先使用inet_ntop。
2. 数据封装与解封装
发送方流程:
- 应用层:生成原始数据。
- 传输层:添加源/目的端口,形成报文段。
- 网络层:添加源/目的 IP,形成数据报。
- 数据链路层:添加源/目的 MAC 及帧尾,形成以太网帧。
- 物理层:转换为电信号发送。
接收方反向操作:拆帧→拆数据报→拆报文段→获取原始数据。
二、网络定位核心:IP 地址与端口
IP 地址定位主机,端口号定位主机上的进程。"IP+ 端口"构成唯一通信端点。
1. IP 地址
- 作用:定位主机(电脑、服务器、路由器)。
- 格式:IPv4 为 32 位二进制(如 192.168.1.1),IPv6 为 128 位。
2. 端口号
- 作用:定位进程,16 位整数(0-65535)。
- 分类:
- 知名端口(0-1023):系统预留(如 80=HTTP, 22=SSH)。
- 注册端口(1024-49151):应用程序注册使用(如 3306=MySQL)。
- 动态端口(49152-65535):客户端临时使用。


