Unix 网络编程(卷1)
接触到 swoole 框架才知道网络编程是多么广大的一份天地, 无论是 rango 的 blog 还是 Lancelot 编写的 swoole 文档, 有有提到要去看看这边书, 基本了解Unix网络编程相关知识
映射: OSI模型 -> 网际网络协议簇 -> 用户进程 + 应用层细节 / 内核 + 通信细节
物理层 -> 数据链路层 -> 网络层(ip) -> 传输层(tcp/udp) -> 应用层(http)
协议是每层之间的, 但是数据实际是一个通道, 通过网络中的每一层, 因为严格的协议约定, 所以只用关心业务层(应用层协议), 就可以保证网络传输
指定服务器 ip 地址和端口(网络层): 3类网络(外网 / 内网 / 127.0.0.1, 以及 0.0.0.0 代替上面3种) + 端口(tcp/udp 可以使用相同端口, 但是常规做法都是使用不同端口)
ip 数据报: 长度有限制, 所以就有分片操作
为什么要 应用层协议: tcp 是一个没有记录边界的字节流协议
tcp 三路握手(three way handshake)(2 军问题): 必须使用非可靠的通信通道, 但是又要保证通信可靠
包裹函数(wrapper function): 原函数的首字母大写, 包含 发生错误时终止程序运行 的功能
unix errno: 一般在 <sys/errno.n> 中定义, 0 表示未产生错误
snprintf(): 可以指定缓冲区大小, 确保缓冲区不溢出
unix 守护进程(daemon): 能在后台运行且不跟任何终端关联的进程
netstat -ir # i: 网络接口信息; r: 路由表ifconfig # 网络接口详细信息ping给多个客户服务: 迭代服务器; 并发服务器 -> 为每个客户创建一个子进程(fork()); 使用线程替代 fork(); 服务器启动时预先 fork() 一定子进程
POSIX(portable operating system interface): 可移植操作系统接口
传输层: tcp udp sctp
udp(user datagram protocol): 无连接协议
tcp(transmission control protocol): 面向连接 为用户进程提供可靠全双工字节流 确认/超时/重传
sctp(stream control transmission protocol): 面向消息 可靠 消息边界 传输级别多宿(multihoming)支持 头端阻塞(head-of-line blocking)减少到最小
ip(Internet protocol)
icmp(internet control message protocol): 处理路由器和主机之间流通的错误和控制消息
igmp(Internet group management protocol): 用于多播
arp(address resolution protocol) / rarp: 把一个 ipv4 地址映射为一个硬件地址, 点对点网络并不需要
tcp
tcp 3次握手: client SYN -> server ACK(SYN) + server SYN -> client ACK
tcp 4次挥手: 每个端都需要一个 FIN 和一个 ACK
MSS(maximum segment size)选项: 每个 tcp 分节中愿意接受的最大数据量
sctp 4次握手: client INIT -> server ACK -> client COOKIE ECHO -> server ACK
端口: 0~1023(众所周知的端口) 1024~49151(建议使用)
socket pair: server/client 端都需要分配 临时端口, 用来建立连接
socket 基础编程
处理ip: inet_aton() inet_ntoa()
POSIX信号处理: wait() waitpid()