网络编程
一、网络模型
1. OSI 模型(开放系统互联模型)- 7层理想模型
| 层级 | 名称 | 功能 | 示例/设备 |
|---|---|---|---|
| 7 | 应用层 | 为网络用户提供各种服务 | HTTP、FTP、TFTP |
| 6 | 表示层 | 数据格式转换、加密解密 | gzip、SSL |
| 5 | 会话层 | 建立、管理、终止会话 | keep-alive、keep-close |
| 4 | 传输层 | 端到端数据传输,可靠/不可靠传输 | TCP、UDP |
| 3 | 网络层 | 路由选择、网际互连 | IP、ICMP、路由器 |
| 2 | 数据链路层 | 物理相邻主机间数据传输,帧封装 | 交换机、MAC地址 |
| 1 | 物理层 | 比特流传输、物理介质 | 网线、光纤、无线 |
2. TCP/IP 模型 - 4层实用模型(工业标准)
| 层级 | 对应协议/功能 | 说明 |
|---|---|---|
| 应用层 | HTTP、TFTP、FTP、DNS、DHCP、SNMP | 应用程序 |
| 传输层 | TCP、UDP | 端口号管理 |
| 网络层 | IP、ICMP、RIP、OSPF、IGMP | IP地址路由 |
| 接口层 | ARP、RARP | 网卡驱动、物理传输 |
3. TCP/IP 协议族
-
DNS : 域名解析(www.taobao.com → 192.168.0.19)
-
DHCP: 动态主机配置协议
-
ICMP: 网络控制消息协议(ping命令)
-
ARP: IP地址 → MAC地址解析
-
RARP: MAC地址 → IP地址解析
二、TCP/IP 基础知识
1. IP地址分类(IPv4)
| 类别 | 地址范围 | 默认掩码 | 私有地址 | 用途 |
|---|---|---|---|---|
| A类 | 1.0.0.0 - 126.255.255.255 | 255.0.0.0 | 10.0.0.0 - 10.255.255.255 | 超大规模网络 |
| B类 | 128.0.0.0 - 191.255.255.255 | 255.255.0.0 | 172.16.0.0 - 172.31.255.255 | 大中规模网络 |
| C类 | 192.0.0.0 - 223.255.255.255 | 255.255.255.0 | 192.168.0.0 - 192.168.255.255 | 中小规模网络 |
| D类 | 224.0.0.0 - 239.255.255.255 | - | - | 组播 |
| E类 | 240.0.0.0 - 255.255.255.255 | - | - | 实验用途 |
特殊地址:
-
127.0.0.1: 本地回环地址
-
192.168.x.1: 通常为网关地址
-
192.168.x.255: 广播地址
2. C类网络详解
-
前3组: 网络地址
-
第4组: 主机地址(2^8=256个,实际可用254个)
-
网络个数: 2^24 ≈ 209万个
-
私有地址: 192.168.x.x
3. 网络配置(Linux)
# 配置IP地址
ifconfig ens33 192.168.0.13/24 up
# 添加网关
route add default gw 192.168.0.1
# 配置DNS
echo "nameserver 8.8.8.8" > /etc/resolv.conf
# 重启网络
sudo /etc/init.d/networking restart
# 查看网络状态
netstat -anp
三、Socket 编程基础
1. 核心概念
-
Socket套接字: 网络通信的API接口
-
IP + Port:
-
IP地址识别主机
-
端口号识别应用程序(1-65535)
-
系统端口: <1000
-
2. 字节序转换
#include <arpa/inet.h>
// 主机字节序 → 网络字节序
uint32_t htonl(uint32_t hostlong); // 32位
uint16_t htons(uint16_t hostshort); // 16位
// 网络字节序 → 主机字节序
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
// 字符串IP地址转换
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
in_addr_t inet_addr(const char *cp); // "192.168.1.1" → 网络字节序
char *inet_ntoa(struct in_addr in); // 网络字节序 → 字符串
四、TCP 编程
1. TCP C/S 模型框架
服务器: socket() → bind() → listen() → accept() → recv()/send() → close()
客户端: socket() → connect() → send() → recv() → close()
2. 服务器端函数详解
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
// 1. 创建套接字
int socket(int domain, int type, int protocol);
// domain: PF_INET/AF_INET (IPv4)
// type: SOCK_STREAM (TCP), SOCK_DGRAM (UDP)
// protocol: 0 (自动适应)
// 2. 绑定地址
int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);
struct sockaddr_in {
u_short sin_family; // AF_INET
u_short sin_port; // 端口号(网络字节序)
struct in_addr sin_addr; // IP地址
char sin_zero[8]; // 填充
};
// 3. 监听连接
int listen(int sockfd, int backlog);
// backlog: 允许的最大连接数
// 4. 接受连接
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
// 返回新的套接字用于通信
// 5. 设置端口重用
int on = 1;
setsockopt(listfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
3. 数据传输函数
// TCP专用
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
// 通用(TCP/UDP都可用)
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
五、UDP 编程
1. UDP 特性
-
无连接、不可靠
-
支持大数据传输
-
效率高,速度快
2. UDP C/S 模型框架
服务器: socket() → bind() → recvfrom() → sendto() → close()
客户端: socket() → bind()(可选)→ sendto() → recvfrom() → close()
3. UDP 专用函数
// 创建UDP套接字
int sockfd = socket(PF_INET, SOCK_DGRAM, 0);
// 发送数据
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
// 接收数据
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
六、常用端口号
| 端口 | 协议 | 服务 |
|---|---|---|
| 21 | FTP | 文件传输 |
| 22 | SSH | 安全Shell |
| 23 | Telnet | 远程登录 |
| 25 | SMTP | 邮件发送 |
| 53 | DNS | 域名解析 |
| 80 | HTTP | 网页浏览 |
| 110 | POP3 | 邮件接收 |
| 143 | IMAP | 邮件访问 |
| 443 | HTTPS | 安全网页 |
| 3306 | MySQL | 数据库 |
| 3389 | RDP | 远程桌面 |
七、网络模式
-
C/S模式: 客户端/服务器模式(如HTTP、FTP)
-
B/S模式: 浏览器/服务器模式(Web应用)
-
P2P模式: 点对点模式(如BT下载)
八、编程注意事项
-
错误处理:检查每个系统调用的返回值
-
资源管理:及时关闭socket,释放资源
-
并发处理:服务器需支持多客户端连接
-
超时设置:避免程序永久阻塞
-
缓冲区管理:防止缓冲区溢出