Linux 网络编程:套接字基础与 UDP 协议实现
一、预备知识
1.1 理解网络通信的本质
网络通信的本质是不同主机下的进程间通信。以 QQ 为例,应用层完成数据的发送和接收,而网络协议的中下三层主要解决将数据安全可靠地送到远端机器。要使用软件进行通信,必须先启动进程。
1.2 理解 IP 地址和端口号
为了找到对方主机,我们需要 IP 地址作为唯一标识。但仅有 IP 地址无法区分主机上的具体进程,因此需要端口号来标识信息应交给哪个进程处理。
端口号 (port) 是传输层协议的内容
- 端口号是一个 2 字节 16 位的整数。
- 用来标识一个进程,告诉操作系统当前的数据要交给哪一个进程来处理。
- 一个端口号只能被一个进程占用。
所以 IP 地址 + 端口号能够标识网络上的某一台主机的某一个进程。
传输层协议 (TCP 和 UDP) 的数据段中有两个端口号,分别叫做源端口号和目的端口号,描述'数据是谁发的,要发给谁'。
1.3 端口号 VS 进程 ID
PID 虽然能标识一台主机上进程的唯一性,但引入端口号是为了让系统和网络功能解耦。并非所有进程都需要网络通信,但所有进程都有 PID。端口号设计为众所周知或内置,便于客户端定位服务端。
- 一个进程可以绑定多个端口号。
- 一个端口号不能绑定多个进程。
1.4 TCP vs UDP
| 特性 | TCP (Transmission Control Protocol) | UDP (User Datagram Protocol) |
|---|---|---|
| 类型 | 传输层协议 | 传输层协议 |
| 连接 | 有连接 | 无连接 |
| 可靠性 | 可靠传输 | 不可靠传输 |
| 数据单元 | 面向字节流 | 面向数据报 |
- 有连接和无连接:连接好比打电话,先确认连接再沟通;无连接好比发送邮件,发了就行,不关心是否收到。
- 为什么 UDP 存在:可靠是有成本的,不可靠更简单。TCP 需要维护报文信息、重传策略、排序等;UDP 拿到数据包直接转发,不关心发送情况。注意,可靠的前提是网络必须连通。
1.5 网络字节序
内存中的多字节数据相对于内存地址有大端和小端之分,网络数据流同样如此。TCP/IP 协议规定,网络数据流应采用大端字节序(低地址高字节)。
为使网络程序具有可移植性,使同样的 C 代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换:
htonl: 32 位长整数从主机字节序转换为网络字节序。htons: 16 位短整数从主机字节序转换为网络字节序。ntohl,ntohs: 反向转换。
1.6 Socket 接口
Socket 常见 API:
;
;
;
;
;


