即时通讯开发之TCP 交互数据流、成块数据流

news2024/11/14 16:32:30

目前建立在 TCP 协议上的网络协议特别多,有 telnet,ssh,有 ftp,有 http 等等。

 

这些协议又可以根据数据吞吐量来大致分成两大类:

    交互数据类型:例如 telnet,ssh,这种类型的协议在大多数情况下只是做小流量的数据交换,比如说按一下键盘,回显一些文 字等等。
    数据 成块类型:例如 ftp,这种类型的协议要求 TCP 能尽量的运载数据,把数据的吞吐量做到最大,并尽可能的提高效率。


针对这两种情况,TCP 给出了两种不同的策略来进行数据传输。

TCP 的交互数据流

对于交互性要求比较高的应用,TCP 给出两个策略来提高发送效率和减低网络负担:

    捎带 ACK。
    Nagle 算法(一次尽量多 的发数据)。


通常,在网络速度很快的情况下,比如用 lo 接口进行 telnet 通信,当按下字母键并要求回显的时候,客户端和服务器将经 历 发送按键数据->服务器发送按键数据的 ack -> 服务器端发送回显数据->客户端发送回显数据的 ACK 的过程,而其中的数据流量将 是40bit + 41bit+41bit+40bit = 162bit,如果在广域网里面,这种小分组的 TCP 流量将会造成很大的网络负担。即时通讯聊天软件app开发可以加蔚可云的v:weikeyun24咨询

 

捎带 ACK 的发送方式

这个策略是说,当主机收到远程主机的 TCP 数据报之后,通常不马上发送 ACK 数据报,而是等上一个短暂的时间,如果这段时 间里面主机还有发送到远程 主机的 TCP 数据报,那么就把这个 ACK 数据报“捎带”着发送出去,把本来两个 TCP 数据报整合成一个发 送。一般的,这个时间是200ms。可以明显地看 到这个策略可以把 TCP 数据报的利用率提高很多。

Nagle 算法

上过 bbs 的人应该都会有感受,就是在网络慢的时候发贴,有时键入一串字符串以后,经过一段时间,客户端“发疯”一样突然回 显出很多内容,就好像数据一下子传过来了一样,这就是 Nagle 算法的作用。

Nagle 算法是说,当主机 A 给主机 B 发送了一个 TCP 数据报并进入等待主机 B 的 ACK 数据报的状态时,TCP 的输出缓冲区里面 只能有一个 TCP 数 据报,并且,这个数据报不断地收集后来的数据,整合成一个大的数据报,等到 B 主机的 ACK 包一到,就把这些 数据“一股脑”的发送出去。虽然这样的描述有些 不准确,但还算形象和易于理解,我们同样可以体会到这个策略对于低减网络负担的 好处。

在编写插口程序的时候,可以通过 TCP_NODELAY 来关闭这个算法。并且,使用这个算法看情况的,比如基于 TCP 的 X 窗口协议,如果处理鼠标事件时还是用这个算法,那么“延迟”可就非常大了。

TCP 的成块数据流

对于 FTP 这样对于数据吞吐量有较高要求的要求,将总是希望每次尽量多的发送数据到对方主机,就算是有点“延迟”也无所谓。 TCP 也提供了一整套的策略来支持这样的需求。TCP 协议中有16个 bit 表示“窗口”的大小,这是这些策略的核心。

传输数据时 ACK 的问题

在解释滑动窗口前,需要看看 ACK 的应答策略,一般来说,发送端发送一个 TCP 数据报,那么接收端就应该发送一个 ACK 数 据报。但是事实上却不是这 样,发送端将会连续发送数据尽量填满接受方的缓冲区,而接受方对这些数据只要发送一个 ACK 报文来 回应就可以了,这就是 ACK 的累积特性,这个特性大大减 少了发送端和接收端的负担。

滑动窗口

滑动窗口本质上是描述接受方的 TCP 数据报缓冲区大小的数据,发送方根据这个数据来计算自己最多能发送多长的数据。如果发 送方收到接受方的窗口大小 为0的 TCP 数据报,那么发送方将停止发送数据,等到接受方发送窗口大小不为0的数据报的到来。书中的 P211和 P212很好的解释了这一点。

关于滑动窗口协议,书上还介绍了三个术语,分别是:

    窗口合拢: 当窗口从左边向右边靠近的时候,这种现象发生在数据被发送和确认的时候。
    窗口张开: 当窗口的右边沿向右边移动的时候,这种现象发生在接受端处理了数据以后。
    窗口收缩: 当窗口的右边沿向左边移动的时候,这种现象不常发生。


TCP 就是用这个窗口,慢慢的从数据的左边移动到右边,把处于窗口范围内的数据发送出去(但不用发送所有,只是处于窗口内的数据可以发送。)。这就 是窗口的意义。

数据拥塞

上面的策略用于局域网内传输还可以,但是用在广域网中就可能会出现问题,最大的问题就是当传输时出现了瓶颈(比如说一定 要经过一个 slip 低速链 路)所产生的大量数据堵塞问题(拥塞),为了解决这个问题,TCP 发送方需要确认连接双方的线路的数据最 大吞吐量是多少。这,就是所谓的拥塞窗口。

拥塞窗口的原理很简单,TCP 发送方首先发送一个数据报,然后等待对方的回应,得到回应后就把这个窗口的大小加倍,然后连 续发送两个数据报,等到对 方回应以后,再把这个窗口加倍(先是2的指数倍,到一定程度后就变成现行增长,这就是所谓的慢启动), 发送更多的数据报,直到出现超时错误,这样,发送端 就了解到了通信双方的线路承载能力,也就确定了拥塞窗口的大小,发送方就 用这个拥塞窗口的大小发送数据。要观察这个现象是非常容易的,我们一般在下载数据 的时候,速度都是慢慢“冲起来的”。

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

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

相关文章

【JavaScript】常见的事件(鼠标、键盘、表单等)

💻【JavaScript】常见的事件 🏠专栏:JavaScript 👀个人主页:繁星学编程🍁 🧑个人简介:一个不断提高自我的平凡人🚀 🔊分享方向:目前主攻前端&…

Xilinx 7系列FPGA之Artix-7产品简介

数字化革命改变了对新手和有丰富经验的 FPGA 设计人员的期望。为了在航空航天和国防、通信基础设施、医疗、工业和消费电子等对成本敏感的市场中竞争,需要在广泛的密度范围内提供强大的高性能功能组合。在不牺牲性能的情况下,开发人员必须能够扩展使用模…

python和netlogo软件模拟病毒传播仿真模型(一)

目前国内在网络舆情仿真建模中所使用的仿真平台主要有 Netlogo、Anylogic、Matlab、Vensim 等,netlogo软件是一款比较通用的。 但是他是由logo语言构成,语言逻辑很让人抓马。 这里python 中的mesa可以实现其中一部分,这里看一下病毒传播仿真模…

WPF 笔记3——在XAML中给对象属性赋值

看B站刘铁猛老师视频学习WPF XAML语言是从xml文件派生而来,是声明式语言,一个标签就表示声明了一个对象。 对象的值可以存储在对象的字段中,也可存储在对象的属性中; 通过给对象的属性赋值,可以在赋值时检查值的合法…

Redis6学习笔记【part2】基本数据类型与常用命令

一.单线程多路IO复用技术 Redis是单线程多路IO复用技术。多路复用是指使用一个线程来检查多个文件描述符(Socket)的就绪状态,比如调用 select 和 poll 函数,传入多个文件描述符,如果有一个文件描述符就绪,则…

【make、makefile】

前言 打怪升级第:26天 | make、Makefile make是一条命令,Makefile是一个文件, make是一个命令工具,是一个解释Makefile文件中指令的命令工具。 makefile是一个围绕依赖关系和依赖方法构造的一个自动化编程工具, 一个…

博客部署教程

1:安装Docker yum install -y yum-utils device-mapper-persistent-data lvm2 //安装必要工具yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo //设置yum源yum install -y docker-ce //下载dockersystemctl start docker //启…

excel函数技巧:两个查询函数的用法比较 下篇

VLOOKUP和LOOKUP这对高频函数的较量注定是场持久战。在前两个回合的较量中,VLOOKUP占据上风,此番更要乘胜追击。新一轮较量,即刻开战!***ROUND 03 交叉查询什么是交叉查询?我们可以通过一个查找值查找多个字段。如果被…

Android 深入系统完全讲解(26)

AudioTrack 构造过程 每一个音频流对应着一个 AudioTrack 类的一个实例,每个 AudioTrack 会在创建时注册到 AudioFlinger 中,由 AudioFlinger 把所有的 AudioTrack 进行混合(Mixer),然后输送到 AudioHardware 中进行播…

spice auth过程分析

1、客户端选择认证方法 Client authentication method selection抓包分析{Authentication selected by client: Spice (1)}代码分析spice_channel_send_link(channel);if (!spice_channel_recv_link_hdr(channel) ||!spice_channel_recv_link_msg(channel) ||!spice_channel_re…

Allegro如何设计线圈操作指导

Allegro如何设计线圈操作指导 在做PCB设计的时候,在特殊场合时候需要设计线圈,Allegro支持快速设计出线圈,如下图 具体操作如下 选择File选择Change Editor

实现树莓派homeassistant OS远程控制内网穿透--ddnsto教程

一、两种穿透服务 1、molohub 一种是论坛提供的molohub,但是可能因为自己这边的网络原因在配置过程中一直无法连接到服务器,无法绑定github,因此放弃molohub的方法。如下图所示。molohub教程如下,不再赘述。 molohub的Github教程…

ejson4cpp——一个使用极致简单且性能可比rapidjson的C++json解析库

文章目录ejson4cpp快速开始要求安装与引入开始使用常见用法API介绍通过命名风格识别API宏定义FROM_JSON_FUNC&FROM_JSON_FRIEND_FUNCTO_JSON_FUNC&TO_JSON_FRIEND_FUNCAUTO_GEN_NON_INTRUSIVE&AUTO_GEN_INTRUSIVEENABLE_JSON_COUTFromJSON系列函数参数说明使用示例…

WireShark从入门到精通

一、什么是WireShark?Wireshark 是一个开源抓包工具或者叫网络嗅探器,用于分析网络流量和分析数据包。其实WireShark以前的名字不叫WireShark,以前都叫做Ethereal,于1998 年首次开发,直到 2006 年才改为 Wireshark。Wi…

powerdns 系列之二 PowerDNS Authoritative Server

PowerDNS Authoritative Server 权威服务器,直接查询数据库去尝试解析,数据库中若不存在此记录,则直接返回空结果。 os: centos 7.8.2003 pnds: 4.7.3 安装 pdns 安装 pdns auth yum install epel-release yum-plugin-priorities curl -o…

Alibaba微服务组件Nacos注册中心学习笔记

1. 什么是 Nacos 什么是 Nacos官方网站:什么是 Nacos 官方:一个更易于构建云原生应用的动态服务发现(Nacos Discovery )、服务配置(Nacos Config)和服务管理平台。 集 注册中心配置中心服务管理 平台 Nacos 的关键特性包括: 服务发现和服务健康监测 动态配置服…

Vue前端项目【尚品汇】

Vue前端项目【尚品汇】1. 说明2. 对项目创建3.结构4. 项目运行起来时,浏览器自动打开5.关闭ESLint校验功能1. 说明 学习完了Vue后并没有一个整体的项目,让我明白前端的工程化开发。因此在B站找了一个开源的项目进行练手,并在这里进行记录。 …

深度学习理论介绍

在机器学习理论介绍中说过,深度学习是机器学习的一种技术,下面我们具体来看下。 1、 定义 深度学习首先是一种机器学习。深度学习的基础,叫做神经网络,这本身就是一种机器学习算法。 深度神经网络(Deep Neural Netwo…

产品小白如何从模仿开始学习Axure

​有一些小伙伴有这样的疑问,如果想学习产品经理的知识,但是从来对产品经理完全没有认识,该怎样去开始学习呢? 对于这种情况的小伙伴,有个建议是可以先从axure的学习入手。 那么问题又来了,应该如何开始axu…

只靠石墨烯电池,撑不起两轮电动车的“高端梦”

文|智能相对论作者|陈明涛在两轮电动车上,“石墨烯”电池已经成为品牌标配。雅迪、爱玛、台铃等都有搭载石墨烯电池的车型,雅迪的TTFAR石墨烯电池已经迭代到第4代,而第3代Plus电池搭载在冠能3 E9 PRO上完成量产上市;爱玛、台铃都和…