当前位置: 首页 > 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.dtcms.com/a/192839.html

相关文章:

  • ProceedingJoinPoint的认识
  • free void* 指令
  • 第九讲 | 模板进阶
  • manuskript开源程序是面向作家的开源工具
  • 游戏代码混淆的作用与应用分析
  • gRPC为什么高性能
  • RabbitMQ高级篇-MQ的可靠性
  • 2025-5-14Vue3快速上手
  • Git-学习笔记(粗略版)
  • 互联网大厂Java求职面试:构建高并发直播平台的架构设计与优化
  • pycharm中qthread中的run函数debug不上的问题
  • Ubnutu ADB 无法识别设备的解决方法
  • 第六章: SEO与交互指标 二
  • 解决Mawell1.29.2启动SQLException: You have an error in your SQL syntax问题
  • 黑马程序员C++2024版笔记 第0章 C++入门
  • SpringBoot应用启动过程
  • mybatis-plus配置逻辑删除
  • SEO双核驱动:关键词与长尾词优化
  • AI 治理进行时:网信办审核加速,AI 合规刻不容缓
  • 精益数据分析(62/126):从客户访谈评分到市场规模估算——移情阶段的实战进阶
  • 用OBD部署OceanBase社区版的避坑指南
  • 最优化方法Python计算:有约束优化应用——线性不可分问题支持向量机
  • python处理异常,JSON
  • k8s 1.10.26 一次containerd失败引发kubectl不可用问题
  • [Harmony]获取资源文件中.txt文件中的字符串
  • Spring MVC 拦截器 (HandlerInterceptor) 是什么? 它与 Servlet Filter 有什么区别?
  • Python模块化编程
  • 检测按键抖动的时间
  • groovy 如何遍历 postgresql 所有的用户表 ?
  • pytest框架 - 第二集 allure报告