【JavaEE初阶】TCP协议

news2024/11/27 17:56:21

🌲TCP协议的概念

TCP(TransmissionControlProtocol 传输控制协议)是一种面向连接的、可靠的、面向字节流,双全工的传输层通信协议。

这几个特点在我们前面写得TCP服务器和客户端的搭建中,代码能够直观的感受到,但是这个可靠传输我们是无法直观的感受到的,但是这个特性其实是TCP最核心的部分!!!

本文章就来谈谈关于可靠传输具体是怎么回事!

🚩TCP协议段格式

  • 源/目的端口号:表示数据是从哪个进程来,到哪个进程去;
  • 32位序号/32位确认号:后面详细讲;
  • 4位TCP报头长度:表示该TCP头部有多少个32位bit(有多少个4字节);所以TCP头部最大长度是15 * 4 = 60
  • 保留(6位):未来某天TCP需要扩展一些新功能,就可以使用这个保留位来表示
  • 6位标志位:                                                                                                                         URG:紧急指针是否有效                                                                                                         ACK:确认号是否有效                                                                                                     PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走                                                 RST:对方要求重新建立连接;我们把携带RST标识的称为复位报文段                               SYN:请求建立连接;我们把携带SYN标识的称为同步报文段                                           FIN:通知对方,本端要关闭了,我们称携带FIN标识的为结束报文段
  • 16位窗口大小:后面再说
  • 16位校验和:发送端填充,CRC校验。接收端校验不通过,则认为数据有问题。此处的检验和不光包含TCP首部,也包含TCP数据部分
  • 16位紧急指针:标识哪部分数据是紧急数据
  • 选项:可理解为是可选项,可以选择加还是不加(这块可有可无就对TCP的报头产生影响),如果选项完全没有,tcp报头长度就是20个字节(5行,一行4个字节),如果选项拉满,tcp报头最长是60个字节。最大长度是60,去掉固定的20,剩下选项部分最多40个字节。

🚩TCP的特性

  • TCP提供一种面向连接的, 可靠的字节流服务;

  • 在一个TCP连接中,仅有两方进行彼此通信。广播和多播不能用于TCP;

  • TCP使用校验和, 确认和重传机制来保证可靠传输;

  • TCP使用累积确认

  • TCP使用滑动窗口机制来实现流量控制,通过动态改变窗口的大小进行拥塞控制

上述特性,在下面的TCP原理里面回进行一一介绍

🌳TCP原理

TCP对数据传输提供的管控机制,主要体现在两个方面:安全和效率。

这些机制和多线程的设计原则类似:保证数据传输安全的前提下,尽可能的提高传输效率

下面我们会讲述10个TCP的核心机制!!!(当然TCP的机制不止10个)

🚩确认应答机制

对于TCP来说,要解决一个很重要的问题,就是可靠传输。确认应答就是保证TCP可靠性的核心机制。

所谓可靠传输,不是说你发送方能够100%的把数据发送给接收方,但是会尽可能,尤其是能够让发送方知道,接收方是否收到数据。

确认应答机制图示如下:

单看这一幅图还是比较懵逼的,接下来我为大家解答一下

我们知道TCP是属于可靠传输,它就为了解决UDP不可靠传输而发明的。我们有了确认应答机制后,我们每发送一个消息,都能收到对方的一个回应,确保自己知道自己的消息发过去了。

就像一个小伙子给他女神发消息说“我请你吃饭好吗?”,然后收到了女神的回复“好啊好啊”,这样的回应就是确认应答。这个"好啊好啊"就是应答数据,称为"应答报文"。

要想知道对方是否已经收到,核心的机制就是靠对方给你回应,给你一个应答。

在这个传输过程中了,我们用上述提到的ACK来表示请求和应答报文

  • ACK=0,表示是发送报文

  • ACK=1,表示是应答报文

但是光有确认应答还是不够,比如出现以下情况

小伙子对女神说“我请你吃饭好吗?”,然后这时候女生还没有回复,然后小伙又发了一句“做我女朋友好吗?”,这时候女神回消息了,回了两句为“好啊好啊”,“滚”。此时就有两条应答报文,那么女神给我回的两条报文是按照发送的顺序来传输的,也不难理解此时的含义(吃饭,不做女朋友)。

但是在网络传输过程中,会出现一种情况,叫做"后发先至",也就是后发的消息反而先到,先发的消息反而后到。

如果此时出现了"后发先至",小伙子对女神说“我请你吃饭好吗?”,然后这时候女生还没有回复,然后小伙又发了一句“做我女朋友好吗?”,这时候女神回消息了,回了两句为“滚”,“好啊好啊”

那么这时候的小伙就懵了,小伙就想

  • 女神是现在不想吃饭,给我发了一句滚,她还是愿意做为我的女朋友的
  • 女神不想做我女朋友,但是想和一起吃饭

这时候的小伙也就迷茫了,女神到底什么意思呢?

针对不同的应答报文(ack)我们引入的序号和确认序号来区分不同的ack报文。

注意:后发先至是网络通信中客观存在的,改变不了。

我们引入一个序号和确认序号。只要能够对传输数据进行编号,并且让应答报文的编号和发送数据的编号,能够一一对应,即使出现后发先至,也不影响对于传输意思的理解

在上述的32位序号和32位确认序号,此时32位序号就是发送数据的序号,32位确认序号就是给应答报文用到(ack为1的时候才有效),这样的数据就可以根据确认序号区分出要应答哪个上面的报文了。

实际上TCP的序号和确认序号并非我们说的这么简单,实际真实的tcp序号不是按照"一条两条"方式来编号的,由于TCP是面向字节流的,所以是按照字节来编号的,每个字节都会分配一个序号。

比如说TCP载荷中的数据为1000字节:

32位序号:

32位确认序号:

图片示例:

🚩超时重传

TCP最核心的功能就是可靠传输,可靠传输之所以能达成,主要是依靠"确认应答"机制,这里是通过应答报文来通知发送方,我已经收到请求,这是一切顺利的情况,如果不顺利呢?假如出现"丢包"呢??

丢包是指数据在传输过程中,被丢弃,无法到达对端,也是客观存在的随机事件。

那为什么会出现丢包,是因为在网络传输过程中,里面错综复杂,A给B传输数据,会经过多个路由器和交换机,这些路由器交换机又不止是给A和B提供数据传输服务,整个网络是非常繁忙的。若其中一个路由器/交换机过于繁忙!!!

这么复杂的网络,是不知道哪个设备出现丢包,什么时候出现丢包,所以丢包是客观存在的事件,是随机事件。网络环境本身是不可靠的,但是TCP就是要在不可靠的环境中,构造出可靠的通信方式。

那么就引入了超时重传机制,就是用来应对网络出现丢包的情况。正常情况下,TCP就是通过确认应答来知道数据是否被对端收到了。假如A给B传输数据,若过程中出现丢包了,那么B不会收到A发来的数据,此时B也不可能给出任何应答。A就可以根据"是否收到了ACK"来区分是否出现丢包。

当A从发送数据之后,到正常收到ACK,在这中间肯定也需要一定的时间,A就会进行等待,如果等待时间超过了某个阈值,还没有收到ACK,此时就可以认为出现丢包了。

那么主机A没有收到ACK有两种情况:

  1. 主机A发送数据给B之后,可能因为网络拥堵等原因,数据无法到达主机B(数据丢了)
  2. 主机B收到主机A的数据之后,做出应答后,应答报文没有到达主机A(ack丢了)

这两种情况都当成第一种情况处理,客户端会进行重传数据

情况一:

情况二:

站在主机A的角度,A是无法区分是数据丢了,还是ACK丢了,A能看到的都是没有收到ACK。A做的事情就是触发重传。

但是呢,对于情况一,重传数据就好,但是如果出现第二种情况,那么这些数据不是相同了吗,不就出现数据重复了吗?很明显,这是不科学的。

TCP接收方,会针对收到的数据进行去重,会按照序号来进行去重。

这时候我们可以利用前面提到的序列号,其实我们这里的主机B这里接收就像一个优先级的阻塞队列,我们会对传来的数据按照序列号进行排序,如果序列号相同,该队列还可以起到一个去重的效果

那么我们又会想超时的时间如何确定?

  • 最理想的情况下,找到一个最小的时间,保证 “确认应答一定能在这个时间内返回”。
  • 但是这个时间的长短,随着网络环境的不同,是有差异的。
  • 如果超时时间设的太长,会影响整体的重传效率;
  • 如果超时时间设的太短,有可能会频繁发送重复的包;

TCP为了保证无论在任何环境下都能比较高性能的通信,因此会动态计算这个最大超时时间

  • Linux中(BSD Unix和Windows也是如此),超时以500ms为一个单位进行控制,每次判定超时重发的超时时间都是500ms的整数倍。
  • 如果重发一次之后,仍然得不到应答,等待 2*500ms 后再进行重传。
  • 如果仍然得不到应答,等待 4*500ms 进行重传。依次类推,以指数形式递增。
  • 累计到一定的重传次数,TCP认为网络或者对端主机出现异常,就会触发"重置报文",也就是上述六个标志位的RST(本身的含义是清空之前的中间状态,重新进行传输),RST过去还没有效果,就会释放连接(删除对方的相关信息)。

🚩 连接管理

🚩滑动窗口

🚩流量控制

🚩拥塞控制

🚩延迟应答

上述这些都会一一讲述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2062781.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

13 跳转控制语句(break、continue、goto),循环的加强练习

目录 1 break 1.1 介绍 1.2 流程图 1.3 在循环中使用 break 1.4 注意事项 1.5 案例:判断质数 2 continue 2.1 介绍 2.2 流程图 2.3 在循环中使用 continue 2.4 案例:逢七过游戏 3 goto 语句 3.1 介绍 3.2 基本语法 3.3 流程图 3.4 基本使…

开学必备清单来啦!大学好物合集推荐!每一个都能帮你提升幸福感

随着开学季的到来,好多学生都在忙着准备各类学习与生活必需品,以迎接新的大学生活到来。以下是一些开学季必备的好物推荐,每一个都很实用,可以帮你提升学习和生活的幸福感! 1、西圣电容笔 一句话推荐:公认…

Windows 11 24H2 终于允许多个应用程序同时使用摄像头

Windows 11(以及任何旧版本的 Windows)均不允许多个摄像头应用程序访问网络摄像头硬件,除非使用第三方应用程序创建虚拟摄像头设置。这种情况将在未来发布的 Windows 11 版本 24H2 中得到改变,该版本将增加一项可选功能&#xff0…

nginx 添加第三方nginx_upstream_check_module 模块实现健康状态检测

安装插件 下载 链接:https://pan.baidu.com/s/1iTPEmu_hCHYhDyaVDDTsVg?pwdvaw8 提取码:vaw8 安装依赖 yum install pcre pcre-devel yum -y install make gcc-c gcc编译安装 $ nginx -V #此处省略了很多模块,只是为了看清而已 ... co…

轻松掌握LLM三角原则:简化大模型应用开发流程的理解指南

不少朋友偷偷问我:“什么是LLM的三角原则?”今天就给大家仔细讲讲构建LLM应用的三角原则。这套原则其实不复杂,由“31”(一范式三原则)个基础组成,适合任何团队来实践。 说到以LLM为核心的应用,有不少人以为是高大上的…

【考研数学】二战能不看课,直接刷1000题或者李林880吗?

二战数学,刷题的时间肯定要大于看课的时间,同时听课要注意: 1、针对问题听课,听课的时候你要带有目的性,如果毫无目的,那么这节课你能获得的东西就十分优先,你的精力也不会集中(提高…

JS SyntaxError: Unexpected token 报错解决

JS SyntaxError: Unexpected token 报错解决 在JavaScript开发中,SyntaxError: Unexpected token 是一个常见的错误,它通常表示JavaScript引擎在解析代码时遇到了意料之外的符号。这个错误可能由多种原因引起,包括拼写错误、缺少括号、引号不…

MySQ分库分表与MyCat安装配置

目录 介绍 拆分策略 垂直拆分 1. 垂直分库 2. 垂直分表 水平拆分 1. 水平分库‘ 2. 水平分表 实现技术 MyCat概述 安装 概念介绍 MyCat入门 需求 环境准备 分片配置 启动服务 连接测试 执行SQL语句测试 MyCat配置 1. schema.xml 1. schema标签 2. dat…

观测云产品更新 | 异常追踪、数据保存策略、BPF 日志、管理优化等

观测云更新 Breaking Changes OpenAPI:【事件】未恢复事件数据源从 UE 变更为 E 。 新增功能 管理:新增 Client Token 统一管理入口,用户使用公网 DataWay 接入 RUM 应用时,可更换系统默认生成的 Token,使用自定义…

重生奇迹 MU热血与激情的战斗岁月

这里,是一个充满神秘与奇幻色彩的大陆。古老的城堡诉说着往昔的荣耀,广袤的荒野等待着勇敢者的探索。长春的勇士们,准备好迎接挑战了吗? 绚丽的画面,每一帧都如同精美的画卷。从神秘的魔法森林到雄伟的龙巢&#xff0…

看看镭速传输中如何处理Mysql超时配置问题的

Mysql作为一个广泛使用的开源关系型数据库管理系统,以快速、可靠、易于使用、开源的特色闻名,使用 MySQL 来存储和管理数据,已经广泛应用于各个领域、各类大小型应用中。 使用 MySQL 来存储和管理数据的应用中,与数据库之间的连接…

程序员如何利用AI大模型逆袭

随着人工智能(AI)技术的迅猛发展,尤其是大规模预训练模型(如GPT-4、BERT等)的出现,程序员迎来了一个前所未有的机会窗口。AI不仅能提高开发效率,还能为程序员提供创新创业的机会。本文将探讨程序…

pytorch, torch_tesnsorrt安装各版本匹配

python -m pip install torch2.3.0 torchvision0.18.0 torch-tensorrt2.3.0 tensorrt10.0.1 --extra-index-url https://download.pytorch.org/whl/cu118 如果import tensorrt失败,则从官网下载再安装 https://developer.nvidia.com/tensorrt/download/10x 下载10.0…

四、Docker使用

1. 快速入门 1.1. Docker背景介绍 Docker是一个开源的平台,用于开发、交付和运行应用程序。它能够在Windows,macOS,Linux计算机上运行,并将某一应用程序及其依赖项打包至一个容器中,这些容器可以在任何支持Docker的环…

Aigtek电压放大器电路的特点是什么

电压放大器是一种电路,用于将低电压信号放大为高电压信号。它在电子、通信、音频和视频等领域广泛应用。下面是电压放大器电路的一些特点。 放大倍数高:电压放大器的主要功能是将输入信号的幅度放大到所需的输出电压。因此,电压放大器的一个重…

AI绘画工具 Stable Diffusion【插画转绘】:建筑 | 风景| 人像照片的插画转绘制作教程,照片秒变插画风格图片!

大家好,我是画画的小强 关于Stable Diffusion 的插画转绘,今天给大家分享一种制作方法。我们先看一下效果图。 一. 图片转插画的制作方法 本期教程我们将使用AI绘画工具Stable Diffusion,关于SD的安装和入门使用可以看看我的往期入门教程…

如何用Java SpringBoot+Vue搭建太原学院商铺管理系统?

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

解锁未来财富密码:AI自动化副业创收班——终身财富加速器

副业创收已经成为行业趋势,在当前经济形势下,许多人面临着行业裁员的不确定性。为了增强个人的抗风险能力,寻求一份副业已经成为一种重要的趋势。这不仅是经济上的补充,更是对自由与独立的一种追求——它应让你自主掌控&#xff0…

AI预测福彩3D采取888=3策略+和值012路或胆码测试8月22日新模型预测第64弹

经过60多期的测试,当然有很多彩友也一直在观察我每天发的预测结果,得到了一个非常有价值的信息,那就是9码定位的命中率非常高,60多期一共只错了6次,这给喜欢打私房菜的朋友提供了极高价值的预测结果~当然了&#xff0c…

chapter1_数制和码制

文章目录 1.简介2.常用的数制2.1 十进制2.2 二进制2.3 八进制2.4 十六进制 3.不同进制之间的转换3.1 二—十进制3.2 十—二进制3.3 十六—二进制3.4 二—十六进制3.5 八进制数与二进制数的转换3.6 十六进制数与十进制数的转换 4.二进制算数运算4.1 反码、补码和补码运算 5.几种…