java网络原理(四)----tcp特性

一.滑动窗口

滑动窗口:可以提高传输效率,准确的来说是让tcp在可靠传输的前提下,效率不要太拉胯。使用滑动窗口不能使tcp变的比UDP块,但能减少差距。
前面谈过tcp的传输数据的时,会把数据进行编号,每次传固定的长度。比如主机A给主机B发信息,信息经过应用层后到传输层,tcp会把应用层发来的信息通过每个字节进行编号,假设编号为1到3000,tcp会批量传输编号内容。设主机A第一次传输编号为1到1000的内容。主机B收到给A返回确认应答后,主机A才能接着发1001到2000的数据。
在这里插入图片描述
这样传输能够保证可靠性,但大量的时间都消耗在等ack上了。使用滑动窗口就是为了缩短等待时间。
在这里插入图片描述
一次性发出一组数据,发送一组数据的过程中不需要等待Ack,就直接往前发。此时就相当于使用一份等待时间等四个ACK。把一次发多少个数据,不用等ACK的大小称为滑动窗口。窗口越大此时批量发送的数据越多,效率就越高,但是窗口不能无限大,如果无限大,相当于完全不必等,此时就和不可靠传输一样。
在这里插入图片描述
主机A假设一次性传1-2000,2001-3000,3001-4000,4001-5000,这样的数据就需要4个ack,虽然一次性发了4条数据但是等主机B的4个ack都返回后在进行第二轮发送显然效率有点慢,可以等第一条数据的ACK收到后直接进行第二轮发送,发送50001-6000的数据,这样还是等4条ACK,窗口大小还是一样大,只是往后平移了一个格子。这样可以缩短时间,比之前能提升一定的效率。
如果按照滑动窗口传输数据丢包了咋办?
对于Tcp提高效率,必然不应该影响可靠性。2种情况数据丢了和Ack丢了。
1.ack丢了:
ack丢了,不用做任何处理,也是正确的。假设2001到3000数据的Ack丢了,但是4001到5000的Ack在说明4000之前的数据都发送成功了,此时并不需要重传。
2.数据丢了
假设1001到2000的数据丢了,3001到4000的数据到达了B,B返回的确认应答任然是1001,会一直向A索要1001到2000的数据,当A连续收到几次B的索要,A就明白1001到2000的数据丢失了,A就会重传1001到2000的数据。
在这里插入图片描述
如果接收缓冲区1001到2000少了。返回的Ack会始终索要这个数据,一旦1001这个数据报补上了,此时1001到2000后面的数据报都不必要重传了,接下来看后面的数据哪里有缺失,如果有补上,没有直接索要缓冲器的最后一个数据的下一个即可。

滑动窗口并不是使用tcp一定会涉及,通信双方大规模传输数据的时候会使用滑动窗口,如果数据较少仍然按照超时重传。

二.流量控制

滑动窗口,窗口越大,传输效率越高,但是窗口也不能无限大,如果窗口太大,就可能使双方处理不过来了,或者是中间的传输链路层处理不过来了。这样就会丢包,得重传,反而影响了效率。流量控制就是给滑动窗口刹车。
通过流量控制限制发送方发射窗口的速度。数据发送到缓存区后,此时就会把缓存区剩余空间大小,通过ack报文反馈给发送方,作为下一次发送数据,窗口大小的依据。
假设内存缓存区的空间大小为4000,A第一轮发送的数据占用4000大小的空间,缓冲区空间大小已满,这个时候A就不能继续发数据了,等B去消耗数据,A在等待的同时会时不时给B发送窗口探测包(不会携带具体数据),只是为了触发ACK(查询当前接收缓冲区的情况)。一旦发现内存空间释放了,就可以继续发送了。接收方可以根据窗口的大小就可以反向限制发送方传输速度了。

三.拥塞控制

传输数据的时候要经过很多线路,路由器,交换机。每个路由器交换机处理数据的能力不一样,如果中间某个节点处理数据的能力特别差,那么主机A发送数据的能力不能超过这里的阀值。总的传输效率是一个木桶效应,取决于最短板。
在这里插入图片描述
虽然中间的设备一般由运营商提供的企业级路由器/交换机,整体的转发的能力特别强,但如果量很大的话也会堵车。具体怎么衡量中间设备的转发能力呢?把中间的设备看做一个整体,采用实验的方式,动态调整,产生一个合适的大小。

1.使用一个较小的窗口,如果传输正常就增大窗口。
2.使用一个较小的窗口,如果丢包就减小窗口。

而拥塞窗口就是在拥塞机制下,采用的窗口大小。
tcp中拥塞控制具体是这样展开的:

1.慢启动,刚开始通信的时候,会使用一个较小的窗口来试水。
2.指数增长:在传输通畅的过程中,拥塞窗口会指数增长。
3.线性增长:当拥塞窗口指数增长到设定的阀值时,会线性增长。
4.拥塞窗口回归最小窗口:当窗口大小增长过程中,如果出现丢包,认为当前网络拥堵了。此时就会把窗口调整成最小的小窗口,继续回到指数增长加线性增长的过程中,另外会根据当前丢包的窗口大小,调整阀值。

在这里插入图片描述
拥塞控制和流量控制共同限制了滑动窗口的大小,可以使滑动窗口在可靠性的机制下,提高传输效率。

四.延迟应答

是否有办法在滑动窗口的基础上再次提高效率?需要在返回ACK的时候,延迟一点时间,利用这个时间,就可以给应用程序腾出来更多的消费数据的时间。接收缓存区剩余空间就会更大了。
在这里插入图片描述
如果数据传过来,此时立刻返回ACK此时窗口的大小就是3kb,稍等500ms,此时在返回ack,就有可能在这500ms里面又消耗了2kb数据,此时返回的窗口大小就是5kb了。

五.捎带应答

稍带应答在延迟应答的基础上,让ack和响应一起返回,提高了效率。
在这里插入图片描述
数据从两个合并一个,效率会有明显的提升。主要还是因为这里每次传输数据都需要封装分用。
能合并的原因,一方面是时机是可以同时的,一方面ACK本身不需要带载荷,和正常的数据不冲突,完全可以让一个数据报,既能够携带载荷数据,又能带有ack信息。

六.面向字节流

在面向字节流的情况下会产生粘包问题。粘包问题是数据发送过来,tcp会把数据进行编号,根据编号每次发送一部分数据。那么数据报发过来,但是接收的时候怎么知道从哪里到哪里是一个完整的应用数据报,这就是粘包问题。
发送是2个包,读可能读了半个或者一个半,这个时候都会产生问题。
在这里插入图片描述
站在发送方的角度预期,aaa是一个应用层数据报,bbb是一个应用层数据报,ccc是一个应用层数据报。此处正确的做法是合理的设计应用层协议,这件事情在传输层很难解决,需要在应用层解决这个问题。

1.应用层协议中,引入分割符,区分包之间的边界。
2,应用层协议中,引入包长度,也能区分边界。

1.使用\n约定包之间的分隔符
在这里插入图片描述

2.使用包的长度区分
在这里插入图片描述
粘包问题不仅仅是tcp才有的,只要是面向字节流(文件)也有同样的问题,解决问题都是一样的,要么使用分割符号,要么使用长度。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

canvas跟随鼠标画有透明度的椭圆边框

提示&#xff1a;canvas跟随鼠标画有透明度的椭圆边框 文章目录 前言一、跟随鼠标画有透明度的椭圆边框总结 前言 一、跟随鼠标画有透明度的椭圆边框 test.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">&…

Ps:必须知道的四大混合模式

在 Photoshop 中有多达六组 27 种混合模式&#xff0c;不仅可应用于图层之间&#xff0c;在画笔等工具、图层样式等里面也都有&#xff0c;几乎可以说是无处不在。 有关混合模式的原理及说明&#xff0c;请参阅&#xff1a; 《Ps 混合模式&#xff08;合集&#xff09;》 在所有…

RN封装的底部向上弹出的弹出层组件

组件代码 import React from react; import { View, StyleSheet, Modal, TouchableOpacity, Text, TouchableWithoutFeedback } from react-native;const BottomPopup ({ visible, onClose, children, leftButtonTitle, rightButtonTitle, onLeftButtonPress, onRightButtonP…

day5-QT

widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QFontDialog> //字体对话框类 #include<QFont> //字体类 #include<QMessageBox> //消息对话框类 #include<QColorDialog> //颜色对话框类 #include<QColor> //颜…

sqlite3嵌入式开发板命令行方式使用

如何在编译嵌入式版本的sqlite3&#xff0c;请看我上一篇文章 sqlite3 交叉编译-CSDN博客 一、sqlite3命令行方式使用 假如我将编译好的嵌入式的sqlite3放置在如下路径&#xff1a; 进入bin目录进行操作 1.运行sqlite3 运行sqlite3有两种方式 1&#xff09;直接在内存里面…

使用npm i进行admin依赖安装的时候出现问题

提示&#xff1a; npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to https://registry.npm.taobao.org/string-width failed, reason: certificate has expired 切换淘宝源到http或者更换其他国内镜像 npm config set registry http:/…

vue2 export default写法,computed、methods的使用

<template><div><h2>{{nameAll}}</h2><h2>{{method}}</h2><h2>{{tt()}}</h2><h2>{{firstName}}</h2><h2>更新后赋值数据&#xff1a;{{lastName}}</h2><h2>赋值数据:{{writeValue}}</h2>…

张驰咨询:光伏产业新质生产力提升咨询方案

光伏产业新质生产力提升咨询方案 一、光伏行业目前发展现状及特点 1、高度竞争 2、技术驱动 3、绿色发展 二、光伏发展新质生产力面临的痛点 1、成本压缩与效率提升并存挑战 2、新技术应用与推广难度 3、国际贸易摩擦影响 4、市场需求波动大 5、政策与补贴依赖性 三、…

C++初步认识

一.开发环境 Dev-C是一个Windows环境下适合于初学者使用的轻量级C/C 集成开发环境&#xff08;IDE&#xff09;&#xff0c;它是一款自由软件&#xff0c;遵守GPL许可协议分发源代码。 Dev-C 使用MingW64/TDM-GCC编译器&#xff0c;遵循C 11标准&#xff0c;同时兼容C98标准。开…

排序(冒泡/快速/归并)

冒泡排序 时间复杂度为 O(n^2) 原理 比较相邻的元素. 如果第一个比第二个大,就交换他们两个.依次比较每一对相邻的元素—>结果 : 最后的元素是这组数中最大的重复上述步骤 , 除了最后一个[]因为最后一个已经是排好序的了(这组数中最大的那个)]持续对越来越少的元素进行如上…

如何备考2025年AMC8竞赛?吃透2000-2024年600道真题(免费送题)

最近有家长朋友问我&#xff0c;现在有哪些类似于奥数的比赛可以参加&#xff1f;我的建议可以关注下AMC8的竞赛&#xff0c;类似于国内的奥数&#xff0c;但是其难度要比国内的奥数低一些&#xff0c;而且比赛门槛更低&#xff0c;考试也更方便。比赛的题目尤其是应用题比较有…

面试经典150题【101-110】

文章目录 面试经典150题【101-110】9.回文数61.加一172.阶乘后的069.x的平方根50.Pow(x,n)149.直线上最多的点数52.N皇后II120.三角形最小路径和64.最小路径和63.不同路径II 面试经典150题【101-110】 6道偏数学的题和4道二维dp 9.回文数 一开始想转为字符串再判断。后来发现…

1.5T数据惨遭Lockbit3.0窃取,亚信安全发布《勒索家族和勒索事件监控报告》

本周态势快速感知 本周全球共监测到勒索事件93起&#xff0c;近三周攻击数量呈现持平状态。 本周Lockbit3.0是影响最严重的勒索家族&#xff0c;Blacksuit和Ransomhub恶意家族紧随其后&#xff0c;从整体上看Lockbit3.0依旧是影响最严重的勒索家族&#xff0c;需要注意防范。 …

【python】flask模板渲染引擎Jinja2,通过后端数据渲染前端页面

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

基于SpringBoot和Leaflet的行政区划地图掩膜效果实战

目录 前言 一、掩膜小知识 1、GIS掩膜的实现原理 2、图层掩膜流程 二、使用插件 1、leaflet-mask介绍 2、核心代码解释 三、完整实例实现 1、后台逻辑实现 2、省级行政区划查询实现 3、行政区划定位及掩膜实现 4、成果展示 总结 前言 在之前的博客提过按空间矢量…

web服务应用术语

一、HTTP 协议详解 TCP 协议与 HTTP 协议 TCP 协议主要用于数据传输控制&#xff0c;而 HTTP 协议主要用于应用层面的数据交互。 HTTP 属于应用层协议&#xff0c;是建立在 TCP 协议基础之上的&#xff0c;HTTP 协议以客户端请求和服务器端响应为标准&#xff0c;浏览器通常称…

智慧公厕,让数据和技术更好服务社会生活

智慧公厕&#xff0c;作为智慧城市建设中不可忽视的一部分&#xff0c;正逐渐受到越来越多人的关注。随着科技的不断进步&#xff0c;智能化公厕已经成为一种趋势&#xff0c;通过数据的流转和技术的整合&#xff0c;为社会生活带来了更好的服务。本文以智慧公厕源头实力厂家广…

C#学习笔记3:Windows窗口计时器

今日继续我的C#学习之路&#xff0c;今日学习自己制作一个Windows窗口计时器程序&#xff1a; 文章提供源码解释、步骤操作、整体项目工程下载 完成后的效果大致如下&#xff1a;&#xff08;可选择秒数&#xff0c;有进度条&#xff0c;开始计时按钮等&#xff09; &#xf…

宝塔面板操作一个服务器域名部署多个网站

此处记录IP一样&#xff0c;端口不一样的操作方式&#xff1a; 宝塔面板操作&#xff1a; 1、创建第一个网站&#xff1a; 网站名用IP地址&#xff0c;默认80端口。 创建好后&#xff0c;直接IP访问就可以了。看到自带的默认首页 2、接下来部署第二个网站&#xff1a; 仍然是…

HCIP—BGP路由发布

R1和R2&#xff0c;R4和R5建立EBGP对等体 R1和R2&#xff08;R4和R5&#xff09;之间属于EBGP对等体&#xff0c;可以使用直连物理接口建立对等体关系&#xff0c;TTL值默认1。由于使用直连物理接口方式建立&#xff0c;刚好一跳到达。 [R1]bgp 100 [R1-bgp]router-i…