深入理解网络原理4----TCP核心特性介绍(下)

文章目录

  • 前言
  • 一、拥塞控制
  • 二、延时应答
  • 三、捎带应答
  • 四、面向字节流
  • 五、异常处理


前言

随着时代的发展,越来越需要计算机之间互相通信,共享软件和数据,即以多个计算机协同⼯作来完成业务,就有了⽹络互连。


一、拥塞控制

虽然TCP有了滑动窗⼝这个⼤杀器, 能够⾼效可靠的发送⼤量的数据。 但是如果在刚开始阶段就发送⼤量的数据, 仍然可能引发问题。因为⽹络上有很多的计算机, 可能当前的⽹络状态就已经⽐较拥堵. 在不清楚当前⽹络状态下, 贸然发送⼤量的数据, 是很有可能引起雪上加霜的。
TCP引⼊ 慢启动 机制, 先发少量的数据, 探探路, 摸清当前的⽹络拥堵状态, 再决定按照多⼤的速度传输数据。

总的原则是流量控制和拥塞控制,谁产生的窗口大小更小,谁说了算,这个拥塞控制具体是怎么把这个窗口大小试出来的?

  1. 慢启动。刚开始传输的数据速率比较小,采用的窗口大小也比较小,此时,网络的拥堵情况未知,贸然发送⼤量的数据, 是很有可能引起雪上加霜的。
  2. 如果上述传输的数据,没有出现丢包,说明网络还是畅通的,就要增大窗口大小,此时增大方式是按照指数来增长。
  3. 指数增长。并不会一直持续保持,可能会增长太快,一下子就导致网络拥堵,这里引入了一个“阈值”,当拥塞窗口达到阈值之后,此时,指数增长就成了线性增长。
  4. 线性增长。积累了一段时间之后,传输的速度可能太快,此时还是会引起丢包。一旦出现丢包,就会把拥塞窗口重新设置成较小的值,回到最初的慢启动过程(又要重新指数增长),并且这里也会根据刚才丢包时的窗口大小,重新设置指数增长到线性增长的阈值。

在这里插入图片描述

拥塞控制, 归根结底是TCP协议想尽可能快的把数据传输给对方, 但是又要避免给网络造成太大压力的折中方案。

二、延时应答

同样是基于滑动窗口,要尽可能的再提高一点效率,结合滑动窗口以及流量控制,能够通过延时应答ack的方式,把反馈的窗口大小变大一些。
接收发收到数据之后,不会立即返回ack,而是稍微等待一下再返回ack,等待的时间就相当于给接收方的应用程序留出更多的时间来消费这里的数据。因此接收缓冲区的剩余空间就更大了。

在这里插入图片描述
⼀定要记得, 窗⼝越⼤, ⽹络吞吐量就越⼤, 传输效率就越⾼. 我们的⽬标是在保证⽹络不拥塞的情况下尽量提⾼传输效率。
那么所有的包都可以延迟应答么?
肯定也不是;
• 数量限制: 每隔N个包就应答⼀次;
• 时间限制: 超过最⼤延迟时间就应答⼀次;
具体的数量和超时时间, 依操作系统不同也有差异; ⼀般N取2, 超时时间取200ms。

三、捎带应答

在延迟应答的基础上, 我们发现, 很多情况下, 客⼾端服务器在应⽤层也是 “⼀发⼀收” 的. 意味着客户端给服务器说了 “How are you”, 服务器也会给客户端回⼀个 “Fine, thank you”;那么这个时候ack就可以搭顺风车, 和服务器回应的 “Fine, thank you” ⼀起回给客户端,从而提高传输效率。
在这里插入图片描述

四、面向字节流

创建⼀个TCP的socket, 同时在内核中创建⼀个 发送缓冲区 和⼀个 接收缓冲区; • 调⽤write时, 数据会先写⼊发送缓冲区中;
• 如果发送的字节数太⻓, 会被拆分成多个TCP的数据包发出;
• 如果发送的字节数太短, 就会先在缓冲区⾥等待, 等到缓冲区⻓度差不多了,或者其他合适的时机发送出去;
• 接收数据的时候, 数据也是从⽹卡驱动程序到达内核的接收缓冲区;
•然后应⽤程序可以调⽤read从接收缓冲区拿数据;
• 另⼀⽅⾯, TCP的⼀个连接, 既有发送缓冲区, 也有接收缓冲区, 那么对于这⼀个连接, 既可以读数据,也可以写数据,这个概念叫做 全双⼯。

由于缓冲区的存在, TCP程序的读和写不需要⼀⼀匹配, 例如:
• 写100个字节数据时, 可以调⽤⼀次write写100个字节, 也可以调⽤100次write, 每次写⼀个字节;
• 读100个字节数据时, 也完全不需要考虑写的时候是怎么写的, 既可以⼀次read 100个字节, 也可以⼀次read⼀个字节, 重复100次;

粘包问题
此处的“包”是指“TCP的载荷中的应用数据包”。
tcp传输的数据到了接收方之后,接收方要根据socket api来read出来,read出来的结果就是应用层数据包,由于整个read过程非常灵活,可能会使代码中无法区分出当前的数据从哪到哪是一个完整的应用数据包。
粘包问题不是TCP独有的问题,只要是面向字节流的都有同样的问题。

那么如何避免粘包问题呢?
归根结底就是⼀句话, 明确两个包之间的边界
• 对于定⻓的包, 保证每次都按固定⼤⼩读取即可;例如上⾯的Request结构, 是固定⼤⼩的, 那么就从缓冲区从头开始按sizeof(Request)依次读取即可;
• 对于变⻓的包,可以在包头的位置, 约定⼀个包总⻓度的字段, 从⽽就知道了包的结束位置;
• 对于变⻓的包,还可以在包和包之间使⽤明确的分隔符(应⽤层协议, 是程序猿⾃⼰来定的, 只要保证分隔符不和正⽂冲突即可);

思考: 对于UDP协议来说, 是否也存在 “粘包问题” 呢? • 对于UDP, 如果还没有上层交付数据, UDP的报⽂⻓度仍然在.。同时,
UDP是⼀个⼀个把数据交付给应⽤层,就有很明确的数据边界。 • 站在应⽤层的站在应⽤层的⻆度, 使⽤UDP的时候,
要么收到完整的UDP报⽂, 要么不收。 不会出现"半个"的情况。

五、异常处理

考虑丢包更严重的情况,甚至是网络直接出现故障的情况,如何处理?
1)进程终⽌: 进程终止会释放⽂件描述符, 仍然可以发送FIN,和正常关闭没有什么区别。
2)机器重启: 和进程终止的情况相同。
3)机器掉电/网线断开: 接收端认为连接还在, ⼀旦接收端有写⼊操作, 接收端发现连接已经不在了, 就会进⾏reset。即使没有写⼊操作, TCP⾃⼰也内置了⼀个保活定时器, 会定期询问对方是否还在。如果对方不在, 也会把连接释放。
另外, 应⽤层的某些协议, 也有⼀些这样的检测机制. 例如HTTP⻓连接中, 也会定期检测对⽅的状态. 例如QQ, 在QQ断线之后, 也会定期尝试重新连接。


最后,码字不易,如果觉得对你有帮助的话请点个赞吧,关注我,一起学习,一起进步!

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

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

相关文章

使用memcache 和 redis 、 实现session 会话复制和保持

一、NoSQL介绍 NoSQL是对Not Only SQL、非传统关系型数据库的统称 NoSQL一词诞生于1998年,2009年这个词汇再次提出指非关系型、分布式、不提供ACID的数据库设计模式 随着互联网时代的数据爆发时增长、数据库技术发展的日新月异,要适应新的业务需求&am…

[C#] Visual Studio开发工具编译出错匹配目标平台x86或x64架构问题解决

使用Visual Studio开发工具的NuGet管理包插件时,开发者常常会遇到编译错误。尤其是在切换目标平台架构(如AnyCPU、x86或x64)时,有时会发现切换似乎不起作用,导致编译仍然出错。 文章目录 You need to specify platform…

英语复习之英语形近词总结(二)

接着总结形近词 单词释义例句 impress 英 /ɪmˈpres/ 美 /ɪmˈpres/ vt.盖印;强征;传送;给予某人深刻印象 vi.给人印象。印象,印记;特征,痕迹 1.It didnt impress me as a good place to live. 那地方…

uniapp 自定义相机插件(组件版、缩放、裁剪)组件 Ba-CameraView

自定义相机插件(组件版、缩放、裁剪) Ba-CameraView 简介(下载地址) Ba-CameraView 是一款自定义相机拍照组件,支持任意界面,支持裁剪 支持任意自定义界面支持手势缩放支持裁剪(手势拖动、比…

Leetcode—1396. 设计地铁系统【中等】

2024每日刷题(127) Leetcode—1396. 设计地铁系统 实现代码 class UndergroundSystem { public:typedef struct Checkin {string startStation;int time;} Checkin;typedef struct Checkout{int tripNum;int totalTime;} Checkout;UndergroundSystem()…

器件配置比特流或 PDI 设置-Zynq-7000 比特流设置

Zynq-7000 比特流设置 下表所示 Zynq -7000 器件的器件配置设置可搭配 set_property <Setting> <Value> [current_design] Vivado 工具 Tcl 命令一起使用。 注释 &#xff1a; 用于加密的比特流设置对 Zynq-7000 器件无效。

HNU-人工智能-实验2-简单CSP问题

人工智能-实验2 计科210x 甘晴void 一、实验目的 求解约束满足问题 使用回溯搜索算法求解八皇后问题 二、实验平台 课程实训平台https://www.educoder.net/paths/369 三、实验内容 3.0 题目要求 回溯搜索算法 搜索与回溯是计算机解题中常用的算法&#xff0c;很多问…

Redis__数据持久化

文章目录 &#x1f60a; 作者&#xff1a;Lion J &#x1f496; 主页&#xff1a; https://blog.csdn.net/weixin_69252724 &#x1f389; 主题&#xff1a;Redis__数据持久化 ⏱️ 创作时间&#xff1a;2024年05月01日 ———————————————— 这里写目录标题…

3.10设计模式——Template Method 模版方法模式(行为型)

意图 定义一个操作中的算法骨架&#xff0c;而将一些步骤延迟到子类中&#xff0c;Template Method 使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。 结构 AbstractClass&#xff08;抽象类&#xff09;定义抽象的原语操作&#xff0c;具体的子类将重定…

幼猫粮适合几个月的猫?

关于幼猫粮的选择&#xff0c;你是否有过疑惑呢&#xff1f;幼猫粮适合几个月的猫呢&#xff1f;今天&#xff0c;就让我来为大家详细解答这个问题吧&#xff01;&#x1f43e; 首先&#xff0c;我们要明确一点&#xff0c;幼猫粮是为4-12个月大的小猫咪特别设计的。在这个阶段…

[Java EE] 多线程(六):线程池与定时器

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (90平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;Java …

功能描述如何逻辑

assign相当于连线&#xff0c;注意每个assign独立&#xff0c;如果有变化立刻变化

CSS选择器、字体文本属性、三大特性、盒子模型等

目录 导入css简介HTML的局限性CSS-网页美化CSS语法规范CSS代码风格 选择器基础选择器复合选择器 CSS字体属性字体系列字体大小字体粗细文字样式字体复合属性 CSS文本属性文本颜色对齐文本装饰文本文本缩进行间距(即行高) CSS的引入方式emmet语法元素显示模式什么是&#xff1f;…

python:dict(字典、映射)使用解析

列表使用&#xff1a;[] 元组使用&#xff1a;() 字符串使用&#xff1a;"" 集合使用&#xff1a;{} 字典&#xff1a;{key:value} 生活中的字典&#xff1a;记录大量的字与含义&#xff1b; python中的字典&#xff1a;通过key去找到对应的value;[key]:value …

Vue 工程化开发入门

Vue开发的两种方式&#xff1a; 核心包传统开发模式&#xff1a;基于html/css/js文件&#xff0c;直接引入核心包&#xff0c;开发Vue工程化开发模式&#xff1a;基于构建工具的环境中开发Vue 这里选择Vue cli脚手架 进行开发&#xff0c;搜索教程自行下载。 组件化开发 一个页…

STM32入门学习之ADC

1.ADC在STM32进行数据采集时十分重要。通过ADC可以将外界的数字信号转换为模拟信号&#xff0c;以满足采样的需求。(资料参考于正点原子) STM32 拥有 1~3 个 ADC &#xff08; STM32F101/102 系列只有 1 个 ADC &#xff09;&#xff0c;这些 ADC 可以独立使用&#…

苍穹外卖,接入redis cache后,新增套餐有问题

终端报错&#xff1a; java.lang.IllegalArgumentException: Null key returned for cache operation (maybe you are using named params on classes without debug info?) Builder[public com.sky.result.Result com.sky.controller.admin.SetmealController.save(com.sky.d…

虚拟机网络实现桥接模式

虚拟机网络实现桥接模式 虚拟化软件&#xff1a;VMware 17 Linux&#xff1a;rocky8_9 主机&#xff1a;Win10 文章目录 虚拟机网络实现桥接模式1. 桥接模式介绍2. 查看Win本机的网络信息&#xff08;以笔记本电脑以WiFi联网为例&#x…

保姆级教程申请地理位置接口都给我去试

小程序地理位置接口有什么功能&#xff1f; 目前小程序的地理位置接口已经调整为审核制了&#xff0c;也就是说我们开发者如果小程序需要用到getlocation等接口的话&#xff0c;需要先在小程序后台进行开通申请&#xff0c;提交相关证明材料才可以获得接口使用权限。 小程序地理…

Fourier 测试时间自适应与多级一致性用于鲁棒分类

文章目录 Fourier Test-Time Adaptation with Multi-level Consistency for Robust Classification摘要方法实验结果 Fourier Test-Time Adaptation with Multi-level Consistency for Robust Classification 摘要 该研究提出了一种名为 Fourier 测试时间适应&#xff08;FTT…