网络基础模型
1. OSI七层参考模型(理论标准)
这是描述计算机网络通信功能的通用框架。理解它有助于分析任何网络协议。
-
应用层 :直接面向用户,提供如HTTP(网页)、FTP(文件传输)、SMTP(电子邮件)、DNS(域名解析) 等服务。
-
表示层 :负责数据格式转换,如加密解密、压缩解压,确保不同系统能理解彼此的数据。
-
会话层 :建立、管理和终止应用程序之间的会话(对话),如断点续传。
-
传输层 :提供端到端的通信,核心是TCP(可靠、面向连接) 和 UDP(高效、无连接) 协议。
-
网络层 :负责将数据包从源主机路由到目标主机,核心协议是 IP(网际协议)。
-
数据链路层 :在相邻节点(如通过交换机相连)间可靠传输数据帧,处理物理地址(MAC地址)寻址和差错控制。
-
物理层 :定义物理媒介(如网线、光纤)的电气、机械特性,传输比特流。
2. TCP/IP四层模型(实际标准)
这是互联网实际采用的协议族,可以看作是OSI模型的简化与实践。
-
应用层 :对应OSI的
应用层、表示层、会话层,包含所有高层协议。 -
传输层 :对应OSI的
传输层,提供TCP/UDP。 -
网络层 :对应OSI的
网络层,核心是IP协议。 -
网络接口层 :对应OSI的
数据链路层和物理层。
核心协议详解
1. 应用层关键协议
-
DNS :将人类可读的域名(如
www.baidu.com) 翻译成机器可识别的IP地址。 -
DHCP :自动为网络中的设备分配IP地址、子网掩码、网关等配置,避免手动设置的麻烦。
-
HTTP/HTTPS:用于传输网页内容。
2. 传输层核心协议
| 特性 | TCP (传输控制协议) | UDP (用户数据报协议) |
|---|---|---|
| 连接性 | 面向连接(三次握手建立连接) | 无连接(直接发送) |
| 可靠性 | 高可靠,提供确认、重传、排序机制 | 不可靠,尽最大努力交付 |
| 数据形式 | 字节流,无边界 | 数据报,有边界 |
| 速度与开销 | 速度相对慢,头部开销大(20字节) | 速度极快,延迟低,头部开销小(8字节) |
| 典型应用 | Web浏览(HTTP)、文件传输(FTP)、电子邮件 | 视频流、语音通话、DNS查询 |
3. 网络层与接口层协议
-
IP :根据IP地址在网络中寻址和路由数据包。
-
ICMP :用于网络诊断,如
ping命令 (测试连通性)和traceroute命令(跟踪路径)。 -
ARP :在局域网内,根据IP地址 查找对应的MAC(物理)地址。
Linux网络配置与C语言Socket编程
1. 常用网络配置命令
-
ifconfig/ip addr:查看和临时配置网络接口信息。 -
ping:测试与目标主机的网络连通性。 -
netstat -anp:查看本机所有的网络连接、监听端口及对应进程。 -
永久配置 :编辑
/etc/network/interfaces文件,然后使用sudo /etc/init.d/networking restart重启网络服务。
2. C语言Socket编程核心概念
-
Socket(套接字) :网络通信的端点,本质是操作系统内核提供的一个文件描述符。
-
IP + 端口 :
IP地址唯一标识网络中的一台主机;端口号(1-65535)标识主机上的一个具体应用程序。 -
字节序 :网络传输统一使用大端字节序 。编程时需使用
htonl(),ntohl()等函数进行主机序(通常是小端)与网络序的转换。
3. UDP Socket编程流程与关键函数
UDP通信是无连接的,流程简单,适用于对实时性要求高、可容忍少量丢失的场景。
服务端:创建Socket -> 绑定地址 (bind) -> 接收数据 (recvfrom) -> 关闭 (close)
客户端:创建Socket -> 发送数据 (sendto) -> 关闭 (close)
关键数据结构 (struct sockaddr_in)
#include <netinet/in.h>
struct sockaddr_in {
sa_family_t sin_family; // 地址族,如 AF_INET
in_port_t sin_port; // 端口号(网络字节序)
struct in_addr sin_addr; // IP地址(网络字节序)
};
// 设置示例
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080); // 设置端口,htons转换为主机到网络序
inet_pton(AF_INET, "192.168.1.100", &server_addr.sin_addr); // 设置IP
核心函数
-
int socket(int domain, int type, int protocol);- 创建一个Socket。对于UDP,
type参数应为SOCK_DGRAM。
- 创建一个Socket。对于UDP,
-
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);- 服务器调用,将Socket与本地IP和端口绑定。
-
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);- 发送数据 。必须指定目标地址(
dest_addr)。
- 发送数据 。必须指定目标地址(
-
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);- 接收数据 。可通过
src_addr获取发送方的地址信息。
- 接收数据 。可通过
学习与实验建议
-
抓包分析 :使用 Wireshark 工具抓取
ping、浏览网页时的数据包,直观观察各层协议头(以太网帧头、IP头、TCP/UDP头)的结构,这是理解理论最有效的方式。 -
动手编码 :按流程图完成一个简单的 UDP 回声(Echo)程序 (客户端发什么,服务器原样返回什么),再进阶为 TCP 版本,体会两者的区别。
-
理解"边界" :重点体会UDP的数据报有边界 与TCP的字节流无边界在编程处理上的不同(TCP需要应用层自己处理消息边界,如约定长度或分隔符)。
-
网络调试 :在编程时,多用
netstat命令查看你的Socket是否在正确监听或连接。