Linux 网络编程实战:TCP/IP 协议栈与 UDP 通信
【一】初识协议
(1)协议简介
协议即为双方共同遵守的规定——统一约定。
理解:你需要和对方共同遵守一套协议,才能交流。比如发电报,你需要对方有和你一样的翻译本,才能知道对方是在传递什么信息。只要遵守网络标准,就能实现通信。
因此网络也有自己的一套协议,它由权威、最有价值、被所有人认可的机构或者组织一起定制出的网络'约定'!
(2)协议分层
如果所有协议全部挤在一起,那么不好维护,因此就出现了协议分层。一个信息的传递需要经过发送人 -> 打包 -> 传输 -> 解包 -> 对方。将协议分层实质是解耦的过程,方便后面维护。因此网络协议是层状结构的(解耦合、维护性高)。
(3)OSI 七层模型
你可以理解为 OSI 七层模型是最初的完整的网络通信协议,包括应用层、表示层、会话层等,结构较为复杂。利用它的理论逻辑形成了更加实用现实精简的分层结构——TCP/IP 分层模型。
(4)TCP/IP 分层模型
Linux 网络编程完全遵循 TCP/IP 分层逻辑,每层各司其职,自上而下层层封装数据,接收方自下而上层层解包。常用'五层模型'(清晰易懂),而我们仅了解其中的物理层(不涉及编程)即可:
应用层:直接对接用户进程(如浏览器、QQ),负责处理具体业务逻辑。核心协议:HTTP(网页)、FTP(文件传输)、SMTP(邮件)、Telnet(远程登录)。Linux 中实现:由用户编写的代码实现(比如写 HTTP 客户端/服务器)。
传输层:负责两台主机之间的'端到端数据传输',解决'数据发给哪个进程'的问题。核心协议:TCP(可靠、有连接)、UDP(不可靠、无连接)。关键标识:端口号(16 位整数,如 HTTP 默认 80 端口),用来标识主机上的进程。Linux 中实现:由操作系统内核实现,通过系统调用(如 socket)供用户调用。
网络层:负责'地址管理'和'路由选择',解决'数据发给哪个主机'的问题。核心协议:IP(IPv4 为主)、ICMP(网络差错控制)。关键标识:IP 地址(32 位,点分十进制如 192.168.0.1),用来标识网络中的主机。Linux 中实现:内核内置,路由器就是基于这一层工作。
数据链路层:负责'相邻设备间的数据帧传输',解决'局域网内发给哪个设备'的问题。核心协议:以太网协议、无线 LAN 协议。关键标识:MAC 地址(48 位,如 08:00:27:03:fb:19),网卡出厂固化的唯一标识。Linux 中实现:由网卡驱动程序实现,交换机工作在这一层。
物理层:负责'光/电信号传输',是数据的物理载体。核心载体:网线(双绞线)、光纤、电磁波(WiFi)。Linux 中实现:完全由硬件(网卡、集线器)实现,编程中基本不用直接操作。
【二】Linux 与协议关系
在上面我们已经知道了,网络协议被划分成了 TCP/IP 协议栈:应用、传输、网络、数据链路层。
而 TCP/IP 协议栈主要由操作系统来实现,因此二者存在如下关系:协议栈其实是在操作系统里面。

【三】通信的过程
(1)报文打包
学习通信过程之前,我们需要先知道报文:报文=报头(每层的识别标志)+ 有效载荷(数据内容)。
以'你好'为例:消息从发出到网卡,需要经过四大层,每层将上一层打包的数据增加报头,就形成了该层的报文。
例如:










