【C++八股文】计算机网络篇
网络协议核心知识点详解
TCP头部结构
TCP头部包含多个关键字段,每个字段都有其特定作用:
- 16位源端口:标识发送方应用程序的端口号
- 16位目的端口:标识接收方应用程序的端口号
- 32位序号:保证数据包有序传输的唯一标识
- 32位确认序号:期望收到的下一个数据包的序列号
- 4位首部长度:以4字节为单位计算头部实际长度
- 6位标志位:包含SYN、ACK、FIN等控制标志
- 16位窗口大小:指示接收方可用的缓冲区空间
- 16位校验和:用于检测数据传输中的错误
- 16位紧急指针:标识紧急数据的位置
重要提示:TCP报文不包含IP地址信息,仅通过端口号标识应用程序。一个完整的TCP连接需要四元组来唯一标识:(源IP地址,源端口,目的IP地址,目的端口)。
完整C++后端八股文:>> C++八股文(完整版)<<
三次握手的重要性
TCP建立连接需要三次握手,主要目的包括:
- 初始化序列号:双方交换初始序列号(ISN),确保数据包按正确顺序组装
- 参数协商:交换最大报文段长度(MSS)、窗口大小等关键参数
- 防止历史连接干扰:避免网络中延迟的旧连接请求被误认为新连接请求
TCP粘包问题分析与解决
UDP协议不存在粘包问题,因为UDP是基于数据报的传输方式,每个数据包都有明确边界。TCP粘包问题产生的主要原因包括:
- 发送方启用Nagle算法,将多个小数据包合并发送以提高网络效率
- 接收方应用程序未能及时从缓冲区读取数据,导致多个数据包堆积
解决方案:
- 封包与拆包:在数据前添加固定长度的包头,指明数据体长度
- 特殊分隔符:使用特定字符序列(如\r\n)标记数据包边界
- 关闭Nagle算法:通过设置TCP_NODELAY选项立即发送数据
HTTP协议原理
HTTP是应用层协议,基于请求-响应模型在客户端与服务器间通信。主要特点包括:
- 明文传输:所有数据以未加密形式传输
- 无状态:服务器不保存客户端的状态信息,每次请求独立处理
- 灵活可扩展:支持多种数据格式和请求方法
HTTP与HTTPS的区别
- 安全性:HTTP明文传输,易被窃听和篡改;HTTPS通过SSL/TLS加密传输数据
- 身份认证:HTTPS需要数字证书验证服务器身份,HTTP无此机制
- 端口号:HTTP使用80端口,HTTPS使用443端口
- 性能开销:HTTPS加密解密过程消耗更多计算资源
- SEO影响:搜索引擎优先收录HTTPS网站
HTTPS建立连接的过程:
- 客户端发送支持的加密套件列表
- 服务器返回数字证书和选定的加密方式
- 双方通过非对称加密协商对称密钥
- 使用对称密钥加密实际传输数据
HTTP/1.1的改进
相比HTTP/1.0,HTTP/1.1引入多项重要改进:
- 持久连接:允许在单个TCP连接上发送多个请求和响应
- 范围请求:支持通过Range头请求资源的特定部分
- 新增Host头:支持虚拟主机,多个域名共享同一IP地址
- 扩展方法:新增OPTIONS、PUT、DELETE等请求方法
- 缓存优化:提供更灵活的缓存控制机制
GET与POST方法对比
- 用途差异:GET用于获取资源,POST用于创建或修改资源
- 参数位置:GET参数显示在URL中,POST参数放在请求体中
- 安全性:POST相对更安全,参数不暴露在URL中
- 长度限制:GET受URL长度限制,POST无此限制
- 幂等性:GET是幂等的,多次执行结果相同;POST非幂等
Cookie与Session机制
Cookie和Session都是用于维护会话状态的技术:
- 存储位置:Cookie存储在客户端,Session存储在服务器端
- 安全性:Session更安全,敏感信息不暴露在客户端
- 生命周期:Cookie可设置长期有效,Session随会话结束而失效
- 依赖关系:Session依赖Cookie传递会话ID
- 性能影响:Session需要服务器存储空间,高并发时影响性能
Session优化方案包括Session集群共享和Session Ticket机制。
TCP与UDP协议对比
- 连接方式:TCP面向连接,需要建立和断开过程;UDP无连接
- 可靠性:TCP提供确认重传机制保证可靠传输;UDP尽最大努力交付
- 数据边界:TCP是字节流,可能粘包;UDP保留数据包边界
- 头部开销:TCP头部20-60字节,UDP头部仅8字节
- 适用场景:TCP适合可靠性要求高的场景;UDP适合实时性要求高的场景
三次握手与四次挥手详解
三次握手过程:
- 客户端发送SYN=1和初始序列号seq=x
- 服务器回应SYN=1、ACK=1,携带自己的序列号seq=y和确认号ack=x+1
- 客户端发送ACK=1,确认号ack=y+1
四次挥手过程:
- 主动关闭方发送FIN=1和序列号seq=u
- 被动关闭方回应ACK=1和确认号ack=u+1
- 被动关闭方发送FIN=1和序列号seq=v
- 主动关闭方回应ACK=1和确认号ack=v+1
TIME_WAIT状态的作用是确保最后一个ACK到达对端,并让旧连接的数据包在网络中消失。
流量与拥塞控制
流量控制通过滑动窗口机制实现,接收方通过窗口大小字段告知发送方可用的缓冲区空间。
拥塞控制采用多种算法:
- 慢启动:初始窗口指数增长
- 拥塞避免:达到阈值后线性增长
- 快重传:收到3个重复ACK立即重传
- 快恢复:调整阈值后直接进入拥塞避免阶段
浏览器访问网页全过程
- DNS解析:将域名转换为IP地址
- TCP连接:与服务器建立TCP连接
- 发送HTTP请求:构建并发送请求报文
- 接收HTTP响应:接收并解析服务器响应
- 渲染页面:解析HTML、CSS和JavaScript,渲染页面
- 连接释放:完成数据传输后关闭TCP连接
常见网络攻击与防御
- SQL注入:通过输入恶意SQL代码攻击数据库。防御:参数化查询、输入验证
- DDoS攻击:大量请求耗尽服务器资源。防御:流量清洗、CDN分发
- ARP欺骗:伪造MAC地址窃取数据。防御:静态ARP绑定、ARP监控
- XSS跨站脚本:注入恶意脚本代码。防御:输入转义、内容安全策略
高频面试题精粹
1.UDP如何实现可靠传输?
通过应用层添加序列号、确认机制和重传定时器,模拟TCP的可靠性保证
2.常见HTTP状态码:
- 200:请求成功
- 206:部分内容
- 301/302:重定向
- 404:资源不存在
- 499:客户端提前关闭连接
- 500:服务器内部错误
- 504:网关超时
3.HTTP/2主要特性:
- 二进制分帧提高传输效率
- 多路复用解决队头阻塞问题
- 头部压缩减少开销
- 服务器主动推送资源
4.网络层与传输层区别:
网络层负责主机到主机的通信,关注IP数据报的路由和转发;传输层负责进程到进程的通信,提供端到端的可靠性保证。
5.粘包问题解决方式:
- 设置立即发送标志禁用Nagle算法
- 添加长度字段标识数据包大小
- 使用特殊分隔符标记数据包边界
推荐阅读:【C++八股文】操作系统篇