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

Java Web 实战 17 - 计算机网络之传输层协议(2)

大家好 , 这篇文章继续给大家讲解 TCP 协议当中的一些操作 , 比如 : 滑动窗口、流量控制、拥塞控制、延时应答、捎带应答、面向字节流这几个提升 TCP 效率的操作 . 我们还会给大家分析 TCP 连接出现异常的时候 , 该如何处理 . 最后会将 TCP 和 UDP 进行比较
在这里插入图片描述
上一篇文章的链接也给大家贴在这里了
文章专栏在此

文章目录

  • TCP 协议
    • 滑动窗口
    • 流量控制
    • 拥塞控制
    • 延时应答
    • 捎带应答
    • 面向字节流
    • TCP 连接出现异常的时候 , 如何处理
    • TCP VS UDP

TCP 协议

滑动窗口

滑动窗口机制是用来提高传输效率的机制 , 本质就是把等待 ACK 的时间重叠起来 , 减少等待时间 , 就相当于提高了效率

比如说 : 发送了两次 SYN , 就需要返回两次 ACK , 滑动窗口就是一次性返回这两个 ACK

可靠性和效率是冲突的 , 如果要保证可靠性 , 就肯定会影响到效率的 .
TCP 选择了保证可靠性的前提下 , 尽可能的提高效率
无标题.png

流量控制

我们刚才介绍的滑动窗口 , 窗口大小越大 , 发送速率就越快 . 但是整体的传输效率 = 发送速率 & 接收速率 , 发送速率快但是接收速率跟不上也不行 .
如果发送速率 > 接收速率 , 这个时候继续提高发送速率 , 不能够提高整体的效率了 . 反而会因为接收方丢包 , 触发更多的重传 , 因此还降低了速率 .
流量控制 , 就是在针对发送速率进行制约 , 让发送速率和接收速率步调一致 ; 本质上就是对滑动窗口的制约
无标题.png

拥塞控制

流量控制 , 站在接收方的角度 , 来控制发送速率 .
但是整体的传输 , 其实不光有发送方和接收方 , 还有中间的一系列用来转发的设备 .
无标题.png


目前学到的这些机制 , 确认应答是保证可靠性的基石 , 超时重传是确认应答的重要补充 , 连接管理是确认应答和超时重传的前提条件 , 滑动窗口属于可靠性的基础上提高效率的方式 , 流量控制和拥塞控制又对滑动窗口进行制约

延时应答

延时应答也是用来提升效率的机制 , 延时应答则是想办法让滑动窗口大一些 , 实际上就是让流量控制别限制的太狠
在流量控制中 , 会通过 ACK 告知发送方 , 窗口大小是多少合适

窗口大小的衡量标准 : 接收缓冲区的剩余空间

image.png
情况 1 : 感受不太明显
image.png
情况 2 :
image.png

捎带应答

捎带应答是基于延时应答的策略 , 也是为了提高传输效率的机制
image.png
四次挥手 , 在延时应答机制 + 捎带应答机制中 , 也有可能实现 三次挥手
image.png

面向字节流

面向字节流 , 指的是读写载荷数据的时候 , 是按照 “字节流” 的方式来读取的 .
TCP 数据报 , 本身仍然是一个一个 “数据报” 这样的方式来传输的 .
应用层这里是感知不到从哪里到哪里是一个数据报的
(参考 2.2.1 TCP 协议报头 + 确认应答)
无标题.png
粘包问题 , 根本原因 , 是 TCP 面向字节流的原因 .
但是却是影响的应用层的代码

TCP 连接出现异常的时候 , 如何处理

  1. 主机关机 (正常关机)

按照程序关机 , 会先杀死所有的用户进程 (也就包括咱们自己写的 TCP 程序)
杀死进程就会去释放进程 PCB , PCB 上面有一个文件描述符表 , 就会释放文件描述符表上对应的文件资源
(相当于调用 close)
这个时候就会触发 FIN , 开启四次挥手的流程
如果四次挥手已经挥完了 , 继续关机 (没啥特殊的)
如果还没挥完 , 就已经关机了 , 重传 FIN 若干次 , 没有响应 , 也就放弃了

  1. 程序崩溃

同上 .
程序无论是正常关闭 , 还是异常崩溃 , 都会释放 PCB , 都会释放文件描述符表 (相当于调用 close)
也还是会正常四次挥手
(虽然进程没了 , 但是本身 TCP 连接是内核负责 , 内核仍然会继续完成后续的挥手过程)

  1. 主机掉电 (突然拔电源)

主机立刻掉电 , 肯定是来不及挥手的

  1. 接收方掉电 : 发送方尝试发送数据 , 发现没有 ack , 就会尝试进行重传

重传几次 , 仍然没有 ack
发送方就会尝试重新建立连接
如果重新建立也不成功 , 就认为是当前网络上出现了严重问题 , 也就自然放弃了

  2. 发送方掉电 : 接收方就在等待发送方发送数据 . 由于发送方没了 , 这个数据显然发不过来了

接收方不知道是对方还没发呢 , 还是对方出问题了
接收方如果一段时间没有收到数据 , 就会定期的给发送方发送 “心跳包”

接收方 , 给发送方发一个特殊的报文 (ping) , 对方返回一个特殊的报文 (pong)
如果 ping pong 是互通的 , 就认为对方是正常的状态 . 如果 ping 没有对应的 pong , 就认为对方挂了

心跳包的特点 : 周期性的、判定对方是否存活

比如 : 打电话时候对方突然没声了 , 我们就试探性的问问你还在不

  1. 网线断开 (突然拔网线) : 和主机掉电相同

在 TCP 中 , 我们介绍了很多机制
保证可靠性的机制 : 超时重传、连接管理
提高效率的机制 : 滑动窗口
保证可靠性的机制 : 流量控制、拥塞控制
提高效率的机制 : 延时应答、捎带应答
其他方面 : 粘包问题、异常处理


面试题 : 如何使用 UDP 实现可靠传输 ?
在应用层代码里面 , 参考 TCP 的策略来实现 .

TCP VS UDP

  1. 如果需要关注可靠性传输 , 优先考虑 TCP
  2. 传输的单个数据报比较大(UDP 报文上限 : 64 KB) , 优先考虑 TCP
  3. 对于可靠性要求不高 , 但是对于性能要求很高 , 使用 UDP

一个机房之间内部的主机之间的通信可以使用 UDP
网络环境简单 , 带宽充裕 , 并且希望主机之间的通信足够快

  1. 如果需要进行广播 , 优先考虑 UDP

广播 : 一个发送方 , N 个接收方
TCP 想要实现广播 , 就需要在应用层代码去实现打开多个连接的方式

那也有很多场景 , 既需要速度快 , 又需要可靠性
比如 : 对抗性网游 (LOL / 王者荣耀 …)
像这种场景 , 还有一些以他的传输层协议 , 比如 : KCP
image.png
传输层协议有很多 , 并不是只有 TCP 和 UDP


到这里 , 这篇文章就结束了
如果对你有帮助的话 , 请一键三连嗷~
在这里插入图片描述

相关文章:

Java Web 实战 17 - 计算机网络之传输层协议(2)

大家好 , 这篇文章继续给大家讲解 TCP 协议当中的一些操作 , 比如 : 滑动窗口、流量控制、拥塞控制、延时应答、捎带应答、面向字节流这几个提升 TCP 效率的操作 . 我们还会给大家分析 TCP 连接出现异常的时候 , 该如何处理 . 最后会将 TCP 和 UDP 进行比较 上一篇文章的链接也…...

MyBatis<3>:动态SQL的使用<if><trim><where><set><foreach>

动态SQL是MyBatis的强大特性之一&#xff0c;能够完成不同条件下不同的sql拼接。参考官方文档&#xff1a;https://mybatis.org/mybatis-3/zh/dynamic-sql.html<if>标签看这个场景&#xff0c;有必填字段 和 非必填字段 &#xff0c;当字段不确定是否传入的时候&#xff…...

【超好懂的比赛题解】暨南大学2023东软教育杯ACM校赛个人题解

title : 暨南大学2023东软教育杯ACM校赛 题解 tags : ACM,练习记录 date : 2023-3-26 author : Linno 文章目录暨南大学2023东软教育杯ACM校赛 题解A-小王的魔法B-苏神的遗憾C-神父的碟D-基站建设E-小王的数字F-Uziの真身G-电子围棋H-二分大法I-丁真的小马朋友们J-单车运营K-超…...

go-zero学习及使用中遇到的问题

go-zero学习及使用中遇到的问题1 go-zero入门--单体服务demo1.1 单体服务【官方示例】1.1.1 创建greet服务1.1.2 目录结构1.1.3 编写逻辑1.1.4 启动并访问服务1.2 修改GET入参1.2.1 去除options限制的入参值1.2.2 重启并访问服务1.3 添加post请求【新增方法】1.3.1 修改 greet/…...

CCF-CSP认证 202303 500分题解

202303-1 田地丈量&#xff08;矩阵面积交&#xff09; 矩阵面积交x轴线段交长度*y轴线段交长度 线段交长度&#xff0c;相交的时候是min右端点-max左端点&#xff0c;不相交的时候是0 #include<bits/stdc.h> using namespace std; int n,a,b,ans,x,y,x2,y2; int f(in…...

板内盘中孔设计狂飙,细密间距线路中招

一博高速先生成员&#xff1a;王辉东大风起兮云飞扬&#xff0c;投板兮人心舒畅。赵理工打了哈欠&#xff0c;伸了个懒腰&#xff0c;看了看窗外&#xff0c;对林如烟说道&#xff1a;“春天虽美&#xff0c;但是容易让人沉醉。如烟&#xff0c;快女神节了&#xff0c;要不今晚…...

面试热点题:回溯算法 递增子序列与全排列 II

前言&#xff1a; 如果你一点也不了解什么叫做回溯算法&#xff0c;那么推荐你看看这一篇回溯入门&#xff0c;让你快速了解回溯算法的基本原理及框架 递增子序列 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两…...

怎么找回回收站删除的文件

我们都知道&#xff0c;电脑文件都是放在桌面上的&#xff0c;单独存放或者一起存放在文件夹里。但总会有已用完或者是没用的文件&#xff0c;这让我们不得不对其进行清理。而清空回收站也是不可避免的。如果出现了清空文件中还有我们需要的文件&#xff0c;怎么找回回收站删除…...

dp-打家劫舍

你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。给定一个代表每个房屋存放金额的非…...

C++预处理连接

目录定义常量字符串前缀定义枚举类型Boost C库中常常使用预处理连接来定义宏和模板类Google开源的C单元测试框架gtest&#xff0c;使用预处理连接技术创建测试用例和测试方法C预处理连接&#xff08;Preprocessor Concatenation&#xff09;是一种宏定义技巧&#xff0c;用于将…...

3、DRF实战总结:基于类的视图APIView, GenericAPIView和GenericViewSet视图集(附源码)

前面介绍了什么是符合RESTful规范的API接口&#xff0c;以及使用了基于函数的视图(FBV)编写了对文章进行增删查改的API。在本篇文章将使用基于类的视图(Class-based View, CBV)重写之前的接口。 参考&#xff1a; 1、Django开发总结&#xff1a;Django MVT与MVC设计模式&…...

AutoSAR PduR -AutoSAR PDU常用的使用方式【发送,接收,网关】

总目录链接==>> AutoSAR入门和实战系列总目录 @学前问答: AutoSAR PDU在哪里全局定义的? AutoSAR PDU涉及到哪些模块? AutoSAR PDU网关怎么使用? 文章目录 1 AutoSAR PDU发送2 AutoSAR PDU接收3 AutoSAR PDU网关转发4 答疑解析AutoSAR PDU 怎么样通过PduR 实现与其…...

瑟瑟发抖吧~OpenAI刚刚推出王炸——引入ChatGPT插件,开启AI新生态

5分钟学会使用ChatGPT 插件&#xff08;ChatGPT plugins&#xff09;——ChatGPT生态建设的开端ChatGPT插件是什么OpenAI最新官方blog资料表示&#xff0c;已经在ChatGPT中实现了对插件的初步支持。插件是专门为以安全为核心原则的语言模型设计的工具&#xff0c;可帮助ChatGPT…...

脉诊(切脉、诊脉、按脉、持脉)之法——入门篇

认识脉诊何谓脉诊&#xff1f;脉诊的渊源脉诊重要吗&#xff1f;脉诊确有其事&#xff0c;还是故弄玄虚&#xff1f;中医科学吗&#xff1f;如何脉诊&#xff1f;寸口脉诊法何谓脉诊&#xff1f; 所谓脉诊&#xff0c;就是通过把脉来诊断身体健康状况的一种必要手段。 …...

【十二天学java】day09常用api介绍

1.API 1.1API概述 什么是API API (Application Programming Interface) &#xff1a;应用程序编程接口 java中的API 指的就是 JDK 中提供的各种功能的 Java类&#xff0c;这些类将底层的实现封装了起来&#xff0c;我们不需要关心这些类是如何实现的&#xff0c;只需要学习这…...

软件测试 - 测试用例常见面试题

1.测试用例的要素测试用例是为了实施测试而向被测试的系统提供的一组集合, 这组集合包含 : 测试环境, 操作步骤, 测试数据, 预期结果等要素.例如 : 在 B 站输入框输入一个空格, 检查结果测试用例标题 : 输入框输入空格测试环境 : Windows 系统, 谷歌浏览器-版本 111.0.5563.65&…...

几种常见的API接口分页方案

文章目录1 概述2 分页方案2.1 基于偏移量2.2 基于游标3 重复数据处理3.1 基于时间3.2 基于热度3.3 基于推荐1 概述 列表是互联网产品中很常见的一种内容排列形式&#xff0c;而且列表的数据集往往成千上万&#xff0c;一次性返回全量数据集的场景几乎不存在&#xff0c;所以出…...

【Object 类的方法】

在 Java 中&#xff0c;所有类都继承了 Object 类&#xff0c;因此 Object 类中的方法可以在所有 Java 对象中使用。下面是 Object 类中的一些常用方法介绍&#xff1a; equals(Object obj): 用于判断两个对象是否相等。默认情况下&#xff0c;该方法比较的是两个对象的地址是…...

留用户、补内容,在线音乐暗战不停

在线音乐在人们的日常生活中扮演着愈发重要的角色&#xff0c;尤其是在面临巨大压力时&#xff0c;人们往往更倾向于通过倾听一段音乐来缓解内心的紧张与焦虑。而随着在线音乐用户数量的增长以及付费意愿的增强&#xff0c;在线音乐行业也实现了稳步发展。 经过多年的发展&…...

python--exec

在Python中&#xff0c;eval和exec都是用来执行动态代码的内置函数&#xff0c;但它们的作用和使用方式有所不同。 eval(): 将字符串作为Python表达式进行求值&#xff0c;并返回结果。 exec(): 将字符串作为Python语句进行执行&#xff0c;没有返回值。 eval()的使用范围通常限…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...