【JavaEE初阶】网络原理——TCP处理先发后至问题

引入序号后,接收方就可以根据编号对数据进行排序

处理先发后至

TCP需要处理后发先至的情况,要先确保应用程序通过socket api 读到的数据顺序是正确的

  • 即使出现后发先至的情况,TCP也要给我处理掉,确保代码里读到的数据(InputStream,read)和发送方写入的数据顺序一致(OutputStream,write)
    问题:是从载荷开始编号的吗?

  • 是的,TCP报头不参与编号

  • 序号和确认序号 都是针对载荷的

TCP编号示意图
TCP在接收方这边会安排"接收缓冲区"

  • 接收缓冲区是一段 操作系统内核里的内存

  • 通过网卡读到的数据,会先放到接收缓冲区里,后续代码调用read时,从缓冲区里拿数据
    TCP数据包在在接收缓冲区里"排队"

  • 网络有"后发先至"的特点,

  • 有了缓冲区,即使编号靠后的数据包先到了接收方这边,也要按编号排好队

  • 序号小的在前面,序号大的在后面

  • 如果是后面的数据先到,read会继续阻塞,不会开始读数据

  • 确保前面的数据都到了,且都排好队了,read才会解除阻塞


缓冲区示意图

把字节流想象成车队,

  • 一个车队是N个TCP请求,每辆车是一个TCP请求

  • 这N个TCP请求,可能共同表示的是一个应用层数据包

  • 也可能是M个应用层数据包

  • 就看你应用层协议怎么定了

  • TCP不关心应用层咋搞,它只关心 我要传多少个字节?
    写代码时,用TCP或UDP的区别:

  • 基于TCP协议写代码的时候,完全不必担心数据顺序的问题,这样代码写起来就方便了

  • 如果是基于UDP协议,要程序员自己实现拆包组包,就要考虑顺序,要自己实现排序逻辑

这一篇给上一篇收了个尾

下一节我们讲TCP核心机制二------超时重传

END✿✿ヽ(°▽°)ノ✿

相关推荐
tongluowan0073 小时前
一个请求在Spring MVC 中是怎么流转的
java·spring·mvc
kobesdu3 小时前
【ROS2实战笔记-20】ROS2 bag 录播与时间模拟:从基础操作到高级调试技巧
笔记·机器人·ros·ros2
Oflycomm3 小时前
工业以太网四大主流协议(EtherCAT/PROFINET/EtherNet/IP/Modbus)技术参数深度对比
网络·网络协议·tcp/ip·欧飞信·plc模组
夜郎king3 小时前
Spring AI 对接大模型开发易错点总结与实战解决办法
java·人工智能·spring
yong99904 小时前
C# 实时查看硬件使用率(CPU 内存 硬盘 网络)
开发语言·网络·c#
oradh4 小时前
Oracle数据库中的Java概述
java·数据库·oracle·sql基础·oracle数据库java概述
kobesdu4 小时前
【ROS2实战笔记-18】ROS2 通信的隐秘控制:DDS 配置参数如何决定系统性能
网络·人工智能·笔记·机器人·开源·ros·人形机器人
组合缺一4 小时前
Java AI 框架三国杀:Solon AI vs Spring AI vs LangChain4j 深度对比
java·人工智能·spring·ai·langchain·llm·solon
c++之路4 小时前
适配器模式(Adapter Pattern)
java·算法·适配器模式
吴声子夜歌5 小时前
Java——接口的细节
java·开发语言·算法