当前位置: 首页 > news >正文

嵌软面试每日一阅----通信协议篇(二)之TCP

一. TCP和UDP的区别

  1. 可靠性

    TCP:✅ 可靠传输(三次握手 + 重传机制)

          UDP:❌ 不可靠(可能丢包)

  1. 连接方式

    • TCP:面向连接(需建立/断开连接)

    • UDP:无连接(直接发送数据包)

  2. 传输效率

    • TCP:慢(需保证可靠性)

    • UDP:快(无额外控制开销)

  3. 适用场景

    • TCP:文件传输(FTP)、邮件、网页(HTTP)

    • UDP:实时视频、在线游戏、直播(DNS、VoIP)

⚡ 核心结论

  • 要可靠 → TCP(牺牲速度保数据完整)

  • 要速度 → UDP(牺牲可靠保实时性)!

二. TCP通信如何保证通信的可靠性?

🔥 TCP可靠性极简核心机制

  1. 数据分段与重组
    → 按序切割数据包,接收端按序列号重组,确保顺序正确。

  2. 确认应答(ACK)
    → 接收方每收一包必回ACK,未收到ACK则触发重传。

  3. 超时重传
    → 动态计算超时时间,ACK超时自动重发,直到确认成功。

  4. 流量控制(滑动窗口)
    → 窗口大小动态调整,匹配接收方处理能力,防数据堆积。

  5. 拥塞控制
    → 慢启动 + 拥塞避免 + 快速恢复,动态降速防网络过载。

  6. 数据校验和
    → 每包计算校验和,校验失败则丢弃并重传,确保数据完整。

  7. 连接管理
    → 三次握手建连(防半开连接) + 四次挥手断连(保数据传完)。

  8. 序列号机制
    → 包头含唯一序列号,识别丢失/重复包,保证数据不丢不乱。

⚡ 终极目标
所有机制协同 → 数据不丢失、不重复、不乱序,实现可靠传输!

一句话总结:TCP靠 ACK重传保到达、滑动窗口控流量、拥塞算法防堵网、校验序列保完整

三. TCP为什么是三次握手?

目标:确保双方发送和接收能力正常,防止失效请求误触发连接。

流程图


步骤核心

  1. 第一次握手(SYN):客户端发起连接,证明客户端发送能力正常

  2. 第二次握手(SYN+ACK):服务端确认收到并同意连接,证明服务端收发能力正常

  3. 第三次握手(ACK):客户端确认服务端响应,证明客户端接收能力正常

⚡ 本质:三次握手后,双向通信通道确认可靠

四. 为什么是四次挥手?

目标:全双工通信需双方独立关闭通道,确保数据传完且无残留。

流程图

步骤核心

  1. 第一次挥手(FIN):客户端关闭发送通道(仍可接收数据)。

  2. 第二次挥手(ACK):服务端确认关闭请求,但可能继续发送剩余数据

  3. 第三次挥手(FIN):服务端数据发完后关闭发送通道

  4. 第四次挥手(ACK):客户端确认,双方彻底断开连接

⚡ 本质:全双工需独立关闭,四次保证双方数据传完且无残留

五. TCP两次握手可能引发的问题

  1. 资源浪费与半开连接

    • 问题:若客户端首次SYN因网络延迟未到达服务器,客户端超时重发SYN并完成两次握手。当延迟的SYN最终到达时,服务器误认为新连接请求,分配资源等待数据 → 资源浪费

    • 结果:服务器维护大量无效半开连接,消耗内存和端口资源。

  2. 无法防止历史连接干扰

    • 问题:客户端因网络波动发送多个SYN,旧的SYN可能延迟到达服务器。两次握手下,服务器会接受所有SYN请求,导致重复建立连接

    • 结果:同一端口多连接竞争,数据包错乱或覆盖。

  3. 双向通信能力未完全确认

    • 问题:两次握手仅确认了客户端→服务器的发送能力服务器→客户端的收发能力,但未验证客户端←服务器的接收能力

    • 结果:客户端可能未正确接收服务器的初始数据,导致丢包或乱序。

  4. 无法抵御SYN洪泛攻击

    • 问题:攻击者伪造大量SYN请求,服务器仅需两次握手即分配资源 → 服务器资源耗尽

    • 对比三次握手:第三次ACK需客户端真实响应,过滤无效请求。

⚡ 核心结论:三次握手通过双向能力验证 + 序列号同步,解决两次握手的资源泄露、历史连接干扰及安全性缺陷,确保可靠连接建立。

注:文章随手记录,如有错误,评论区交流

http://www.xdnf.cn/news/467011.html

相关文章:

  • 一招解决Tailwindcss4.x与其他库样式冲突问题
  • 报销单业务笔记
  • 中国近代史2
  • 深度学习框架对比---Pytorch和TensorFlow
  • MySQL 学习(十)执行一条查询语句的内部执行过程、MySQL分层
  • 验证可行分享-Rancher部署文档
  • CSRF攻击 + 观测iframe加载时间利用时间响应差异侧信道攻击 -- reelfreaks DefCamp 2024
  • 第一天的尝试
  • C语言中的指定初始化器
  • java 八股
  • Opencv C++写中文(来自Gemini)
  • uniapp+vite+cli模板引入tailwindcss
  • 智慧鱼塘可视化管理:养殖业数字孪生
  • [IMX] 02.GPIO 寄存器
  • Electron 应用的升级机制详解
  • 文科生如何重新开始学习数学?
  • OGSM 从上到下逐级分解策略:从战略目标到部门计划的标准化落地路径
  • 使用 frp 实现内网穿透:从基础到进阶
  • 司法系统之外的第三方平台未经许可披露企业涉诉信息是否构成侵权
  • 学前数学思维:整体代换
  • 深度解析:如何用DeepSeek等大模型增强MySQL运维效率
  • 访问 Docker 官方镜像源(包括代理)全部被“重置连接”或超时
  • Linux系统中部署java服务(docker)
  • WSF3089 N沟道MOSFET在按摩椅中的应用分析
  • SpringBoot 3.4.5版本导入Lomobok依赖后无法生效的问题
  • 软件设计师考试《综合知识》设计模式之——工厂模式与抽象工厂模式考点分析
  • Windows软件插件-写MP4
  • 极验验证码全套接口(无感,滑块,点字,点图,语序,推理,九宫格)
  • UR5e机器人Matlab仿真
  • UI自动化测试方案详解