【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✿✿ヽ(°▽°)ノ✿


