CS(Client-Server)与BS(Browser-Server)模型区别
专用客户端与通用客户端
CS模型使用专用客户端软件,需针对不同平台开发并安装。BS模型通过浏览器作为通用客户端,无需安装额外软件,跨平台兼容性更强。
协议差异
CS模型可使用自定义协议或标准协议(如FTP、SMTP),灵活性高。BS模型强制依赖HTTP/HTTPS协议,遵循Web标准。
功能复杂度
CS模型客户端通常承担更多逻辑处理(如本地计算、缓存),功能更复杂。BS模型将主要逻辑放在服务器端,客户端功能简化,适合轻量级应用。
资源分布
CS模型的资源(如配置文件、数据库)常存储在本地。BS模型的资源完全由服务器动态提供,客户端仅负责展示。
P2P(Peer-to-Peer)模型特征
角色动态转换
节点既是客户端也是服务器。例如下载工具中,初始阶段从其他节点获取数据(作为客户端),下载进度提升后为新节点提供数据(作为服务器)。
去中心化优势
资源分散在各节点,减轻服务器压力。网络规模越大,可用资源越多,适合文件共享、区块链等场景。
TCP协议核心特性
连接与可靠性
通过三次握手建立连接,四次挥手释放连接。确保数据传输的可靠性,包括:
- 应答机制(ACK确认)
- 超时重传
- 数据顺序保证
流式传输与全双工
数据以字节流形式传输,无明确边界。双缓存区支持双向同时通信,但发送/接收次数无需严格对应。
阻塞与感知
写缓冲区满(默认64KB)时触发阻塞。连接异常可通过挥手过程实时感知。
TCP函数调用流程
服务器端顺序
socket()创建监听套接字bind()绑定IP和端口listen()启动监听队列accept()接受连接,生成通信套接字recv()/send()进行数据传输
客户端顺序
socket()创建套接字connect()主动连接服务器send()/recv()通信
关键函数说明
socket()
int socket(int domain, int type, int protocol);domain: 地址族(如AF_INET)type: 套接字类型(SOCK_STREAM对应TCP)protocol: 通常为0,自动适配协议
bind()
int bind(int sockfd, struct sockaddr *addr, socklen_t addrlen);将套接字与特定地址绑定,服务器必需调用。
listen()
int listen(int sockfd, int backlog);设置监听队列长度,影响并发连接处理能力。
accept()
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);返回新通信套接字,原监听套接字继续等待新连接。
黏包问题处理
原因
TCP流式传输无消息边界,多条数据可能合并接收。
解决方案
- 固定长度协议:每次读取固定字节
- 分隔符协议:如
\n标记消息结束 - 长度前缀:在数据头部声明消息长度
连接管理示例
三次握手
客户端SYN → 服务器SYN+ACK → 客户端ACK
确保双方收发能力正常。
四次挥手
主动方FIN → 被动方ACK → 被动方FIN → 主动方ACK
允许数据收尾处理,避免资源泄漏。