60.C++网络编程基础
约 971 字大约 3 分钟
方法 类型 适用场景 优缺点
accept 阻塞式 单个连接 ✅ 简单易用,适合小型服务器❌ 只能处理单个连接,性能差
select I/O 多路复用 少量连接(几十到几百) ✅ 兼容性好,适用于小规模并发❌ 每次检查都遍历整个 fd_set,效率低
poll I/O 多路复用 中等规模连接(几百到上千) ✅ 不受 FD_SETSIZE 限制,支持更多连接❌ 仍然需要遍历整个 pollfd 数组,性能一般
epoll I/O 多路复用(高效) 大规模连接(上万) ✅ 适合高并发,使用事件驱动方式❌ 仅适用于 Linux,跨平台性较差
网络模型OSI
物理层(Physical Layer):负责传输数据的物理媒介和比特流,例如电缆、光纤、无线信号等。
数据链路层(Data Link Layer):提供对物理层传输的比特流进行分帧和差错校验,确保可靠的数据传输,例如以太网协议。
以太网(Ethernet):是最常用的局域网技术,定义了数据链路层的帧格式和MAC地址的使用规则。
PPP(Point-to-Point Protocol):用于在点对点连接上建立和维护数据链路连接,例如拨号连接或串行链路。
HDLC(High-Level Data Link Control):一种数据链路层协议,用于在点对点或点对多点的通信链路上提供可靠的数据传输。
SLIP(Serial Line Internet Protocol):一种简单的数据链路层协议,通常用于串行线路上的IP数据传输。
PPPoE(Point-to-Point Protocol over Ethernet):在以太网上运行的一种协议,将PPP封装在以太网帧中,用于在宽带接入网络中建立和维护连接。
Wi-Fi(Wireless Fidelity):无线局域网技术,定义了无线数据链路层的帧格式和协议,如IEEE 802.11系列标准。
网络层(Network Layer):处理分组的路由和转发,实现不同网络之间的数据传输,例如IP协议。
传输层(Transport Layer):提供端到端的可靠数据传输,包括分段、流量控制和错误恢复,例如TCP协议和UDP协议。
会话层(Session Layer):建立、管理和终止会话(连接)中的通信会话,例如会话控制协议。
表示层(Presentation Layer):处理数据的表示格式,包括数据加密、压缩和格式转换,例如加密协议和压缩协议。
应用层(Application Layer):提供网络应用服务和用户接口,例如HTTP协议、FTP协议、SMTP协议等。
常用的网络协议
ARP
IP
ICMP
TCP
三次握手
四次挥手
过程
半关闭状态
2MSL ( TIME_WAIT 状态 )
在 TCP 连接关闭的过程中,主动关闭方 在发送 FIN 后,
会进入 TIME_WAIT 状态,
并保持 2MSL(Maximum Segment Lifetime,最大报文生存时间) 的时长。
如何优化 TIME_WAIT
1.开启端口快速回收(推荐)
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
2.减少 MSL 时间
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
3.使用 SO_LINGER 立即关闭连接
struct linger so_linger;
so_linger.l_onoff = 1;
so_linger.l_linger = 0;
setsockopt(sockfd, SOL_SOCKET, SO_LINGER, &so_linger, sizeof(so_linger));
4.使用 SO_REUSEADDR 复用端口
int reuse = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));
滑动窗口
滑动窗口是一种流量控制机制,用于 TCP 传输中优化数据传输效率,防止网络拥塞。它允许发送方在无需等待 ACK 的情况下连续发送多个数据包,提高吞吐量
发送窗口(Send Window):发送方可以发送但未确认的数据。
接收窗口(Receive Window):接收方可以接收的数据范围。
UDP
网络字节序
大端序列 和 小端序列
网络传输用的是大端序列, 主机用的是小端序列
大端与小端转换
htonl --> 本地--》网络 (IP)
htons --> 本地--》网络 (port)
ntohl --> 网络--》 本地(IP)
ntohs --> 网络--》 本地(Port)