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

java网络原理(二)------TCP确认应答和超时重传

一Tcp协议

TCP,即Transmission Control Protocol,传输控制协议。人如其名,要对数据的传输进行一个详细的控制。

二.TCP协议段格式

在这里插入图片描述
在这里插入图片描述
知道了端口号才能进一步确认这个数据报交给了哪一个程序。16为端口号是2字节,范围是0到65535.如果端口号超过了65535那么这个端口号是不合法的。
在这里插入图片描述
tcp的报头是变长的,Tcp报头的最大长度是60字节,前20个字节是固定的,报头最短长度是20字节。选项部分可以有 ,也可以没有,可以是一个,也可以是多个。
在这里插入图片描述
当tcp的空间不够用了,可以升级拓展空间。

确认应答

tcp的特点是:有连接,全双工,可靠,面向字节流。那么可靠的传输机制是什么样的呢?确认应答是保证tcp可靠性的重要条件。
比如我给女生发信息,第一条信息是我们一起去吃麻辣烫,第二条是做我女朋友。
在这里插入图片描述

正常情况是女生同意和我一起吃麻辣烫但是不做我女朋友,有没有可能是第二条回应先过来,第一条回应后过来
在这里插入图片描述
后发先至导致意思全变了,女生拒绝了吃麻辣烫但是答应做我女朋友,那么对我来说更加开心。那么这种后发先至的情况有没有可能存在?一定是存在的,网络从a->b中间的路径很多,每个节点的路由器繁忙程度也不一样,此时就会有后发先至的可能性。解决这个问题针对数据进行编号。
在这里插入图片描述
当客户端发送数据时,会把数据转换为一个一个字节,然后对每个字节进行编号,假设第一次发送编号1到1000的,第二次发送1001-2000,第三次2001-3000.
在这里插入图片描述
第一次主机A发送编号1-1000的数据,主机B收到后会给A返回一个编号1001的数据(不一定发送的是1到1000的数据,可能编号是1到500,1到600都有可能,但主机B返回的一定是A发送编号的最后一位加1),主机A收到后说明1到1000的数据已经成功发送,下一次发送的数据应该从1001开始。
在这里插入图片描述
在这里插入图片描述
32位序号是每次发送的第一个字节编号,32为确认序号是最后一个字节编号加1。
搞清楚当前是普通报文和应答报文是很有必要的。
在这里插入图片描述
当ack为0时是一个普通报文,此时只有32为序号是有效的。
当ack时1时表示是一个应答报文,这个报文的32为序号和32位确认序号都是有效的。
主机A发送1000到2000的数据时,主机B收到后同样会发送一个TCP数据报,32位确认序号是1001,主机A收到反馈后会把32为确认序号+1和发过来的32为序号进行对比,如果相等说明数据发送成功,如果不相等说明发送失败。保证了数据传输的可靠性。

超时重传

丢包,在网络上很可能出现发一个数据,然后丢了。路由器和交换机就是交通枢纽,数据传输的时要经过很多路由器和交换机,传输的线路结构复杂,传输的数据量也不确定,如果设备太繁忙,后面的数据等待太久就会出现丢包的可能。
超时重传是主机A给主机B发信息,如果主机A收不到确认应答既发送失败,主机A等待一定的时间后会重新给A发送一次。超时重传相等于确认应答进行的重要补充。
在这里插入图片描述
不管是应答报文丢失还是数据本身丢失都会重新发送。如果是应答报文丢失,那么同一条信息B收到了2次,本身是有问题的。

接收方收到数据后,需要对数据进行去重,把重复的数据丢失掉。
tcp会在内核中给每个socket对象安排一个内存空间,相当于一个队列,也称为接收缓存区,收到的数据都会被放在内存缓存区中,并且按照序号进行排序,当B主机读数据的时候,会把数据从队列中读走并删除,如果有重复的,下一次主机A发过来的数据编号一定大于队列队首元素的编号,这时候说明上次主机B发给主机A的数据重复发送过去了,把重复的数据删除即可。

为啥重传的时候能传过去?
丢包本来就是一个概率性的问题,假设丢包的概率是10%,那么连续传2次丢包的概率是10%*10%=1%,那么随着重传的次数增多丢包的概率会越来越小,如果重传了很多次都没收到,那么说明是重大网络事故。每次未收到数据都需要等待一定的时间,如果超过等待时间还没有收到,那么就要重传。超时重传不是一个固定的值,会随着时间的轮次增加,而进一步增加。
如果重传到一定的程度会自动放弃。次数就会重置tcp的连接。
在这里插入图片描述
rst为1为一个复位报文,如果网络出现严重的故障,复位操作就无法完成,最终放弃连接。

超时重传和确认应答是保证tcp可靠性的关键。

http://www.lryc.cn/news/323865.html

相关文章:

  • 机器学习:智能时代的核心引擎
  • Docker-Image
  • YOLOv8 如何实现多主干特征融合方式 | GhostNet+ShuffleNet / SwinTransformer+ShuffleNet
  • 工作需求ElementUi组件的使用
  • 自动驾驶轨迹规划之时空语义走廊(一)
  • [环境配置].ssh文件夹权限修改方法
  • LeetCode刷题【树状数组、并查集、二叉树】
  • 使用POI以OLE对象的形式向excel中插入附件(pdf为例)
  • Unity构建详解(2)——SBP的初始设置和脚本编译
  • Matlab使用教程(持续更新)
  • 管理能力学习笔记一:角色转身
  • Redis面试题 概要
  • 原型,模板,策略,适配器模式
  • Ollama 在本地快速启动并执行LLM【大语言模型】
  • ubuntu : 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。
  • 瑞芯微RK3576|触觉智能:开启科技新篇章
  • Visual Studio 2013 - 清理
  • 1、初识JVM
  • JavaScript 权威指南第七版(GPT 重译)(七)
  • 从零开始搭建游戏服务器 第四节 MongoDB引入并实现注册登录
  • 【Unity】宏定义Scripting Define Symbols
  • 算法 之 排序算法
  • Prism:打造WPF项目的MVVM之选,简化开发流程、提高可维护性
  • Springboot+vue的四川美食分享网站+数据库+报告+免费远程调试
  • 温湿度项目V1.0——原理图设计
  • H5 与 App、网页之间的通信
  • 亚马逊云科技:企业如何开启生成式AI之旅?
  • AMPQ和rabbitMQ
  • 在存在代理的主机上,为docker容器配置代理
  • 备考ICA----Istio实验4---使用 Istio 进行金丝雀部署