深入解析TCP/IP协议分层与通信原理
一、网络的整体结构
·网络是由局部组成整体的系统。
·协议是通信的约定,目的是减少通信成本。
·实际应用中,最常用的是 TCP/IP 协议。
·协议具有分层结构,所有软件系统也呈现层状结构。
二、TCP/IP 协议分层及通信流程
·TCP/IP 是一种解决方案,其分层设计源于问题本身的分层。
·主机之间的通信本质上是协议栈之间的通信。
·协议报头 + 有效载荷。
·报文封装、解包和分用是通信的基本流程。
·同层之间视为直接通信,但必须贯穿操作系统和协议栈。
·发送(封装):数据入栈。
·接收(解包):数据出栈。
·操作系统(OS)是硬件的基础。
三、TCP/IP 协议分层结构
- 应用层:请求与应答。
- 传输层:数据段。
- 网络层:数据报。
- 数据链路层:数据帧。
- MAC 地址:局部地址,当前网络有效。
- IP 地址:全局地址,标识长远目标。
四、协议细节与报文处理
- 报头必须具备与有效载荷分离能力。
- 报头中需包含将有效载荷交付给上一层具体协议的信息。
- 数据链路层收到非本机报文时直接丢弃。
- 网络层具备路由功能:路由过程中 IP 地址不变,MAC 地址随局域网变化。
·网络层和 IP 实现“一切皆 IP”,为全球网络提供虚拟化层。
- 本质是不同主机的进程间数据交互(进程间通信)。
- 端口号标识主机中进程的唯一性。
- IP + 端口号标识网络上某一主机的某一进程。
- 套接字(socket)= IP + 端口号。
五、TCP与UDP协议及端口号
- 进程有 PID,但端口号用于网络通信标识。
- 不是所有进程都需要网络通信,端口号与操作系统解耦。
- 创建 socket 文件描述符(TCP/UDP,客户端与服务器)int socket(int domain, int type, int protocol);
- AF_TNET SOCK_DGRAM (UDP) 0
- 返回值:成功返回文件描述符,失败返回 -1
int bind(int socket, const struct sockaddr *address, socklen_t address_len);
·返回值:成功返回 0,失败返回 -1
- recvfrom() 接收数据
- sendto() 既可读又可写(全双工)
- 客户端无需显示绑定端口号,由系统自动完成,避免端口冲突
- 服务端需显示绑定端口号,且端口号不能随意更改
4. 端口绑定注意事项
- bind 公网 IP 不行
- bind 127. 或内网 IP 可以
- server bind 内网 IP,但用 127. 访问时无法访问
- 使用 netstat -anup 查看 UDP 协议端口
- 创建套接字 socket
- 绑定 socket 信息(IP 和端口)
- 填充 socketaddr_in 结构体
- 本地环回用于网络测试
六、系统调用与网络协议栈
- 宏 ##(合并左右两端符号)
- 传输层(TCP)、网络层(IP)
- 网络协议栈注定为层状结构
- 网络是操作系统的一部分,Windows 和 Linux 都有协议栈
- 协议即通信双方约定好的结构体
- 必须具备序列化与反序列化功能
- 保证读取时获取完整报文
- TCP读取可能出现“粘包”问题
- 常用函数:recv(), read(), write(), send()
- TCP有接收和发送缓冲区,UDP只有接收缓冲区
- json、jsoncpp(C++ 库)
- json::value
- toStyledString() 转换为字符串
- FastWriter(数据量小)、StyledWriter(可读性好)
七、网络通信标准与分层优势
·多种局域网通信标准 + 一种广域网通信标准
- 两种视角:用户视角与工程师视角
- 只有同层之间可以通信
- 分层设计可对任意层替换,实现强解耦
八、进程与会话管理
- 应用层(顶层)
- 表示层(协议层)
- 会话层(服务端)
- PGID:进程组
- SIG:会话 ID
- 进程组等价于任务(作业)
- jobs:查看系统当前后台任务
- fg 任务号:将指定任务切到前台(foreground)
- ctrl+c:终止前台任务
- ctrl+z:暂停前台进程,自动切换到后台
- bg 任务号:让后台任务运行
- 只能有一个前台进程,后台进程可有多个
- 登录 Windows 时即建立会话过程
- 守护进程(精灵进程):独立会话,不能是进程组长
- setsid() 创建守护进程会话
- int daemon(int nochdir, int noclose)
- noclose 0:显示丢弃;1:正常
九、网络代码与高性能服务器设计
- 网络协议层为分层结构
- 网络代码涉及 socket、UDP、TCP
- 代码实现:应用层、字节流、序列化
- 网络原理(4层)
- 高性能服务器设计需理解协议分层与进程管理