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

Android第三次面试(网络篇补充)

TCP(传输控制协议)的 “模式” 通常指其核心工作机制和特性,这些机制共同确保数据传输的可靠性、效率和稳定性。以下是 TCP 的主要模式和特点,用通俗易懂的语言解释:

1. 面向连接模式

  • 核心:先 “握手” 再通信,像打电话前先拨号。
  • 过程
    1. 发送方发起连接请求(SYN)。
    2. 接收方确认并回复(SYN+ACK)。
    3. 发送方再次确认(ACK),连接建立完成(三次握手)。
  • 作用:确保双方准备好通信,避免无效数据传输。

2. 可靠传输模式

  • 核心:数据不丢、不乱序,像寄快递要签收。
  • 机制
    • 序列号:给每个字节编号,接收方按序重组。
    • 确认应答(ACK):接收方收到数据后回复确认。
    • 超时重传:发送方未收到 ACK 时,重新发送数据。
  • 例子:下载文件时,若某部分数据丢失,TCP 会自动补传。

3. 字节流模式

  • 核心:数据像水流一样连续传输,不保留消息边界。
  • 特点
    • 发送方连续发送字节,接收方按顺序接收。
    • 比如发送 “HELLO” 和 “WORLD” 两次,接收方可能一次性收到 “HELLOWORLD”。
  • 注意:需应用层自己处理消息边界(如加分隔符)。

4. 滑动窗口模式

  • 核心:动态控制发送速率,避免接收方被 “淹没”。
  • 工作原理
    • 接收方告诉发送方自己当前能处理的数据量(窗口大小)。
    • 发送方在窗口范围内发送数据,每收到一个确认,窗口向右滑动(允许发送更多数据)。
  • 类比:快递员根据客户剩余空间调整每次送货量(见之前详细解释)。

5. 拥塞控制模式

  • 核心:防止网络拥堵,像交通信号灯调节车流。
  • 算法
    • 慢启动:初始发送少量数据,逐步增加速率。
    • 拥塞避免:接近网络极限时,线性增长速率。
    • 快重传:发现丢包时,立即重传而不等待超时。
    • 快恢复:快速调整速率,减少因误判导致的性能损失。
  • 目标:在网络允许的情况下最大化吞吐量。

6. 特殊选项模式

  • Nagle 算法:合并小数据包,减少网络负担(适合文本传输)。
  • 延迟确认(Delayed ACK):延迟发送 ACK,减少确认包数量。
  • 紧急数据(Urgent Data):允许发送优先级高的数据(如终止命令)。

🔄 总结:TCP 模式的协作

TCP 通过多种模式协同工作:

  1. 面向连接建立通道;
  2. 可靠传输保证数据完整;
  3. 滑动窗口控制速率;
  4. 拥塞控制保护网络;
  5. 字节流适应不同应用场景。

TCP 的三次握手和四次挥手是建立和终止连接的核心流程,下面用通俗易懂的语言和生活场景类比详细解释:

一、三次握手:建立连接(像打电话)

目标

确保双方都准备好通信,并同步初始序列号(防止历史数据干扰)。

步骤拆解
  1. 第一次握手:客户端发起请求(SYN)

    • 动作:客户端发送 SYN=1 的数据包,告诉服务器:“我想和你建立连接,我的初始序号是 x。”
    • 状态变化:客户端从 CLOSED → SYN_SENT
    • 类比:你给朋友打电话,说 “喂,能听到吗?”(等待对方回应)。
  2. 第二次握手:服务器确认并响应(SYN+ACK)

    • 动作:服务器收到请求后,发送 SYN=1 和 ACK=1 的数据包,回复:“我收到了,我的初始序号是 y,确认你下次发送的序号是 x+1。”
    • 状态变化:服务器从 CLOSED → SYN_RCVD
    • 类比:朋友说 “能听到,你先说吧!”(确认连接,同时准备接收你的消息)。
  3. 第三次握手:客户端确认(ACK)

    • 动作:客户端发送 ACK=1 的数据包,告诉服务器:“我收到你的确认,下次发送的序号是 y+1。”
    • 状态变化:客户端从 SYN_SENT → ESTABLISHED,服务器从 SYN_RCVD → ESTABLISHED
    • 类比:你说 “好的,我开始说了”(双方正式进入通信状态)。
为什么需要三次握手?
  • 防止历史连接干扰:若网络延迟导致旧的 SYN 包后到,服务器不会因为二次握手就误认为连接有效(必须等客户端确认)。

二、四次挥手:终止连接(像挂断电话)

目标

双方确认数据传输完毕,释放资源。

步骤拆解
  1. 第一次挥手:客户端请求关闭(FIN)

    • 动作:客户端发送 FIN=1 的数据包,告诉服务器:“我没有数据要发了,可以关闭连接。”
    • 状态变化:客户端从 ESTABLISHED → FIN_WAIT_1
    • 类比:你说 “我说完了,挂了吧?”(等待对方回应)。
  2. 第二次挥手:服务器确认(ACK)

    • 动作:服务器收到请求后,发送 ACK=1 的数据包,回复:“我知道你要关闭了,但我还有数据要发,等我发完。”
    • 状态变化:服务器从 ESTABLISHED → CLOSE_WAIT,客户端从 FIN_WAIT_1 → FIN_WAIT_2
    • 类比:朋友说 “好的,我这边还有几句话,说完就挂。”(继续传输剩余数据)。
  3. 第三次挥手:服务器请求关闭(FIN)

    • 动作:服务器发送 FIN=1 的数据包,告诉客户端:“我数据发完了,可以关闭连接。”
    • 状态变化:服务器从 CLOSE_WAIT → LAST_ACK
    • 类比:朋友说 “我说完了,现在可以挂了。”(等待你的确认)。
  4. 第四次挥手:客户端确认(ACK)

    • 动作:客户端发送 ACK=1 的数据包,回复:“收到,连接关闭。”
    • 状态变化:客户端从 FIN_WAIT_2 → TIME_WAIT,服务器从 LAST_ACK → CLOSED
    • 客户端等待 2MSL 时间:确保服务器收到最后一个 ACK,避免因网络问题导致连接未完全关闭。
    • 类比:你说 “好的,再见!”(双方挂断电话)。
为什么需要四次挥手?
  • 全双工通信特性:TCP 允许双向同时传输数据,关闭连接需双方独立确认。服务器可能在收到 FIN 后仍有数据要发送,因此需要两次 ACK 和两次 FIN。

三、关键细节补充

  1. 序列号(Sequence Number)

    • 确保数据按序接收,避免乱序。例如,客户端发送 SYN 时的序号为 x,后续数据序号从 x+1 开始。
  2. ACK 号(Acknowledgment Number)

    • 表示期望收到的下一个数据序号。例如,服务器回复 ACK=101,表示已收到序号 100 及之前的数据。
  3. TIME_WAIT 状态

    • 作用:等待 2 倍 MSL(最大段生命周期)时间,确保所有旧数据包在网络中消失,避免新连接复用端口时收到旧数据。

总结

  • 三次握手:确保双方 “能收能发”,同步初始序号。
  • 四次挥手:双方确认 “数据传完”,优雅释放资源。
  • 核心思想:通过多次确认,保证连接建立和终止的可靠性,避免因网络延迟或丢包导致的问题。

http://www.kler.cn/a/594542.html

相关文章:

  • 绿盟科技安全服务面试
  • 如何优化 React 应用性能?
  • 技术进阶:Open WebUI与Ollama的跨平台整合秘籍
  • CUDA编程基础
  • Qt 控件概述 QLabel
  • STM32——独立看门狗(IWDG)
  • 中电金信25/3/18面前笔试(需求分析岗+数据开发岗)
  • 关于运行 npm run serve/dev 运行不起来,node_modules Git忽略不了等(问题)
  • llama源码学习·model.py[3]ROPE旋转位置编码(3)源码中的广播机制
  • C++ 之多态 ------ C++面向对象三大特性之一【三大特性:封装、继承、多态】
  • WIFI p2p连接总结
  • MySQL 入门大全:查询语言分类
  • HTML 写一个计算器
  • 基于YOLOv8深度学习的智能小麦害虫检测识别系统
  • LabVIEW界面布局优化
  • Elasticsearch text字段检索方法
  • 使用Python SDK在亚马逊云科技上调用AI模型构建生成式AI应用
  • 【SpringMVC】SpringMVC拦截器,统一异常处理,文件上传与下载
  • 【Json—RPC框架】:宏定义不受命名空间限制,续行符的错误使用造成的bug
  • 【JVM】内存区域划分,类加载机制和垃圾回收机制