网络编程(一)
刷题:
网络编程核心要点总结
1. 网络编程基础
- 目的:了解互联网数据传输过程、常见问题及解决方法,掌握不同协议和模型下的通信实现。
- 协议:通信双方需遵循相同协议(数据表示与识别的规则)确保数据正常收发。
2. 套接字(Socket)
- 操作方式:通过
int
类型的套接字文件描述符操作网络通信。 - 功能:
- 发送端将数据写入套接字文件,接收端从中读取数据。
- 套接字文件包含接收端的 IP地址 和 端口号,用于准确定位主机和进程。
3. OSI七层模型与TCP/IP四层模型
- 分层原因:各层独立工作,便于维护和快速定位问题。
- OSI七层模型:
- 应用层:用户操作生成数据。
- 表示层:数据压缩、加密、统一格式(解决字节序和编码差异)。
- 会话层:管理通信会话(建立、维护、中断)。
- 传输层:选择协议(如TCP/UDP),控制传输速率。
- 网络层:选择最佳路由路径。
- 数据链路层:管理MAC地址。
- 物理层:定义物理传输标准(如电缆接口、电平值)。
- TCP/IP模型:实际工业标准,分为应用层、传输层、网络层、网络接口层。
4. IP地址与分类
- IPv4 vs IPv6:
- IPv4:32位,点分十进制格式(如
192.168.1.1
),数量有限(约42亿)。 - IPv6:128位,解决地址耗尽问题。
- IPv4:32位,点分十进制格式(如
- IPv4分类:
- A类(
0.0.0.0~127.255.255.255
):公网IP(如云服务器)。 - B类(
128.0.0.0~191.255.255.255
):组织内部网络(校园网、政府)。 - C类(
192.0.0.0~223.255.255.255
):局域网。 - D类:组播地址(仅局域网)。
- E类:保留实验使用。
- A类(
- 特殊IP:
- 网段号:如
192.168.1.0
。 - 广播地址:如
192.168.1.255
(向网段内所有主机广播)。
- 网段号:如
5. 子网掩码
- 作用:划分子网,减少广播风暴。
- 格式:与IP地址类型匹配,如C类IP的子网掩码为
255.255.255.0
。 - 子网计算:
子网网段号 = IP地址 & 子网掩码
。- 示例:
192.168.1.2 & 255.255.255.128
→ 划分出192.168.1.0
和192.168.1.128
两个子网。
- 示例:
6. 域名系统(DNS)
- 功能:将IP地址转换为易记域名(如
www.baidu.com
)。 - 域名层级:
- 一级域名:国家(
.cn
)。 - 二级域名:组织性质(
.com
、.edu
)。 - 三级域名:组织名称(
baidu
)。 - 四级域名:服务类型(
www
)。
- 一级域名:国家(
7. 字节序与转换函数
- 网络字节序:大端模式。
- 转换函数:
htonl()
、htons()
:本地转网络字节序(用于int
和short
类型)。inet_pton()
:字符串IP转二进制(支持IPv4/IPv6)。inet_ntop()
:二进制IP转字符串。
8. 端口号(Port)
- 范围:
0~65535
,其中0~1023
为系统保留端口(如SSH:22,MySQL:3306)。
9. TCP与UDP协议
- TCP:
- 特点:面向连接、可靠传输(应答机制、数据重发)、粘包与分包(数据拼接或拆分发送)。
- 适用场景:要求数据完整性的应用(文件传输、网页浏览)。
- UDP:
- 特点:无连接、不可靠传输(可能丢包)、数据报独立发送(上限约4096字节)。
- 适用场景:实时性要求高(视频通话、在线游戏)。
10. 关键问题
- 粘包与分包:
- 粘包:多个数据包合并发送(如连续发送400+500+600字节)。
- 分包:单个数据包因超限拆分为多次发送(如1800字节拆为1500+300字节)。
总结:网络编程核心围绕协议、地址、数据传输模型展开,需掌握分层模型、IP/子网划分、TCP/UDP特性及数据转换方法,以解决实际通信中的问题。
套接字核心要点总结
1. 套接字定义与功能
- 功能演变:
- 最初用于进程间通信(IPC),类似管道、消息队列。
- 支持TCP/IP协议后,扩展为网络通信工具,称为域套接字。
- 核心作用:通过套接字文件实现数据收发,包含接收端IP和端口信息。
2. 套接字工作流程
- 写入地址:将接收端的IP和端口写入套接字文件。
- 写入数据:将待发送数据存入套接字文件。
- 发送文件:通过同一函数同步发送地址和数据。
3. 服务端配置步骤
-
3.1 创建套接字文件
使用函数:int socket(int domain, int type, int protocol);
- 参数说明:
domain
:通信域,如AF_INET
(IPv4)、AF_INET6
(IPv6)、AF_UNIX
(本地IPC)。type
:套接字类型,决定协议:SOCK_STREAM
:面向连接的TCP协议(可靠传输)。SOCK_DGRAM
:无连接的UDP协议(不可靠传输)。
protocol
:通常设为0
,根据type
自动选择协议。
- 参数说明:
-
3.2 绑定IP和端口
- 结构体定义:
-
struct sockaddr_in {sa_family_t sin_family; // 地址族(固定AF_INET)in_port_t sin_port; // 端口号(需用htons转换网络字节序)struct in_addr sin_addr; // IP地址(需用inet_pton或inet_addr转换)char sin_zero[8]; // 填充字段 };
- 绑定函数:
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
- 参数:套接字描述符、地址结构体指针(需强制转换
(struct sockaddr*)&addr
)、结构体长度。 - 关键点:
- 端口被占用时
bind()
会失败,需错误处理(如检查返回值)。 - IP过滤规则:
0.0.0.0
:接受任意IP。127.0.0.1
:仅接受本地通信。
- 端口被占用时
- 参数:套接字描述符、地址结构体指针(需强制转换
4. 客户端操作(补充)
- 连接服务端:使用
connect()
函数(未在原文详细说明)。 - 数据发送:通过
send()
或write()
写入套接字文件。
5. 注意事项
- 字节序转换:端口号需用
htons()
转为网络字节序(大端模式)。 - IP地址转换:
inet_pton()
:推荐使用,支持IPv4/IPv6(示例:inet_pton(AF_INET, "192.168.1.1", &addr.sin_addr)
)。inet_addr()
:仅支持IPv4,已逐渐淘汰。
- 错误处理:
bind()
失败常见原因为端口占用,需通过返回值检测。
6. 关键区别
- TCP vs UDP:
- TCP(
SOCK_STREAM
):可靠传输,需建立连接,适合大文件或连续数据流。 - UDP(
SOCK_DGRAM
):无连接,速度快但可能丢包,适合实时应用(如视频通话)。
- TCP(
总结:套接字是实现网络通信的核心工具,需掌握创建、绑定、地址转换等操作,并注意协议选择、字节序处理及错误排查。