
书: https://pan.baidu.com/s/1hMg-9fMkkzntAfHoLymQMA?pwd=2tx9
笔记如下:
- TCP/IP协议栈分层:Linux网络协议栈分为应用层、传输层(TCP/UDP)、网络层(IP)、链路层(MAC)。
- Socket编程基础:使用
socket()
创建套接字,bind()
绑定地址,listen()
监听连接,accept()
接受连接。 - TCP三次握手与四次挥手:
connect()
触发SYN→SYN-ACK→ACK,close()
触发FIN→ACK→FIN→ACK。 - UDP无连接通信:无需建立连接,直接使用
sendto()
和recvfrom()
发送/接收数据。 - 多进程并发服务器:父进程
fork()
子进程处理客户端请求,避免阻塞主进程。 - 多线程并发服务器:使用
pthread_create()
创建线程,提高并发性能。 - I/O多路复用(select/poll/epoll):
select()
:跨平台但效率低,受FD_SETSIZE限制。epoll()
:Linux高效模型,支持水平触发(LT)和边缘触发(ET)。
- 非阻塞I/O:设置
fcntl(fd, F_SETFL, O_NONBLOCK)
,避免read()
/write()
阻塞。 - 信号驱动I/O:通过
SIGIO
信号通知进程数据就绪,减少轮询开销。 - 原始套接字(Raw Socket):直接访问链路层或网络层数据包,用于抓包或自定义协议。
- 网络超时控制:
setsockopt(fd, SO_RCVTIMEO, &timeout, sizeof(timeout))
设置接收超时。- 使用
alarm()
或select()
实现超时检测。
- 广播与组播:
- 广播:
setsockopt(fd, SO_BROADCAST, &on, sizeof(on))
。 - 组播:
setsockopt(fd, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq))
加入组播组。
- 广播:
- 域名解析(DNS):使用
getaddrinfo()
和gethostbyname()
将域名转换为IP地址。 - IPv6编程:
AF_INET6
地址族,struct sockaddr_in6
结构体,支持双栈(IPv4/IPv6)。 - UNIX域套接字:本地进程间通信(IPC),使用
AF_UNIX
地址族,路径名绑定(如/tmp/sock
)。 - 网络字节序转换:
htons()
、htonl()
主机到网络序,ntohs()
、ntohl()
网络到主机序。 - Socket选项设置:
SO_REUSEADDR
:允许地址复用。TCP_NODELAY
:禁用Nagle算法,降低延迟。
- 心跳机制:应用层定时发送心跳包检测连接存活,避免TCP Keepalive的局限性。
- SSL/TLS安全通信:使用OpenSSL库实现加密传输(
SSL_new()
,SSL_connect()
)。 - 高性能网络框架:
- Reactor模式:基于事件驱动(如libevent、libuv)。
- Proactor模式:异步I/O(如Windows IOCP,Linux需模拟)。