libjingle源码解析(4)-【PseudoTcp】建立UDP之上的TCP(2):对交互数据流的处理

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介:

对交互数据流的处理

TCP包含两类数据流,交互数据流和成块数据流。交互数据流的特点是每个报文数据字节数比较小,大部分是10字节一下,而成块数据流的特点是大部分报文是满长度的,一般能达到MSS

本文先介绍一些TCPPTCP对交互数据流的处理。

交互式输入

    Rlogin是典型的交互数据流应用,每一按键都会产生数据分组,使客户端传输一个报文,接连总共产生4个报文:

    a.C传输交互按键数据

    b.S确认C的数据

    c.S回显C的按键

    d.C确认S的回显

    上面的报文b,c可能会同时包含在一个报文段。而对于TCP报文-40个字节的头部的协议报文来说每次只传输一个字节是个极大的浪费,此外Rlogin这类应用会在短时间内按N个字符,按如上的方式,至少要传输3*N个报文。

经受时延的确认

    经受时延的确认考虑了时间有关的细微之处,对于交互类应用,短时间内会产生多个报文。对于TCP,当接收数据时,并不立即发送确认,而先缓存,延迟发送,以便在短时间如果有该方向的数据需要发送,则一同发送,这样能减少ACK报文的个数,提高报文的利用率。TCP通常等待200ms后发送ACK

    对于PTCP来说,也支持延时确认,默认延时时长为100ms,可以通过选项OPT_ACKDELAY更改延时时间。不另外,如果出现连续两个不含数据的ACK需要发送,则不会等到100ms,直接会发送ACK报文。PTCP发送ACK的时机如下:

    A. 和SEND数据一起发送

    B. 等到超时(100ms后没有数据时)时发送

    C. 出错时发送(如发现对方传来的数据和预期的不一致,或者ACK被丢失)

    虽然PTCP是等到100ms后发送ACK,但没有提供任何定时器,只提供了下次需要被提醒的时间(通过方法GetNextClock),然后由业务层来实现定时器并通知到时(通过方法NotifyClock)。这样,业务层就会有灵活的方式设置定时器,比如通过消息循环,等待事件,完成端口等等。

Nagle算法

    Nagle算法是为了避免在广域网上出现大量的TCP小分组报文段。该算法要求一个TCP连接上最多只有一个未被确认的小分组。当已经发送的一个分组没有被确认前,该算法积累所有需要发送的数据,等到未被确认的分组确认了,一同发送,这样在短时间内出现的小分组合并成一个报文发送,提高了报文的利用率。这个算法是自适应的,得到确认越快,则发送频率越高。伪代码如下:

    if there is new data to send

      if the window size >= MSS and available data is >= MSS

        send complete MSS segment now

      else

        if there is unconfirmed data still in the pipe

          enqueue data in the buffer until an acknowledge is received

        else

          send data immediately

        end if

      end if

    end if

    PTCP也支持Nagle算法,可以通过选项OPT_NODELAY开启或者关闭。Nagle算法的实现比较简单,当尝试发送数据时,发现如果有未确认的数据且等待发送的数据长度小于MSS,则延迟发送,如下:

    

[cpp]   view plain copy
  1. void PseudoTcp::attemptSend(SendFlags sflags) {  
  2.     ......  
  3.         // Nagle's algorithm.  
  4.         // If there is data already in-flight, and we haven't a full segment of  
  5.         // data ready to send then hold off until we get more to send, or the  
  6.         // in-flight data is acknowledged.  
  7.         if (m_use_nagling && (m_snd_nxt > m_snd_una) && (nAvailable < m_mss))  {  
  8.           return;  
  9.         }  
  10.     ......  
  11.     }  

窗口大小通告

    TCPPTCP都通过头部的window字段通告接收缓冲区的可用窗口大小。当客户端收到服务器的数据,并有等待发送的数据时(开启Nagle算法时会经常出现此情况),通告给服务器的窗口大小总是小于接收缓冲区的大小,是因为,应用层还没有拿取刚从服务获取的数据之前,就会尝试发送被缓冲的数据。

    PTCP的实现如下:

    当PTCP接收对方发送的数据时会调用NofifyPacket->parse->process,在Process先调用attemptSend发送缓冲的数据,然后通知应用层有可读数据。

[cpp]   view plain copy
  1. bool PseudoTcp::process(Segment& seg) {  
  2. ......  
  3.         attemptSend(sflags);  
  4.          // If we have new data, notify the user  
  5.          if (bNewData && m_bReadEnable) {  
  6.               m_bReadEnable = false;  
  7.               if (m_notify) {  
  8.                 m_notify->OnTcpReadable(this);  
  9.               }  
  10.               //notify(evRead);  
  11.            }  
  12.          return true;  
  13. }  
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
16天前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
16天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
16天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是"将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为5种:单例模式、工厂方法模式抽象工厂式、原型模式、建造者模式。
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
18天前
|
网络协议
TCP报文格式全解析:网络小白变高手的必读指南
本文深入解析TCP报文格式,涵盖源端口、目的端口、序号、确认序号、首部长度、标志字段、窗口大小、检验和、紧急指针及选项字段。每个字段的作用和意义详尽说明,帮助理解TCP协议如何确保可靠的数据传输,是互联网通信的基石。通过学习这些内容,读者可以更好地掌握TCP的工作原理及其在网络中的应用。
|
18天前
|
监控 网络协议 网络性能优化
不再困惑!一文搞懂TCP与UDP的所有区别
本文介绍网络基础中TCP与UDP的区别及其应用场景。TCP是面向连接、可靠传输的协议,适用于HTTP、FTP等需要保证数据完整性的场景;UDP是无连接、不可靠但速度快的协议,适合DNS、RIP等对实时性要求高的应用。文章通过对比两者在连接方式、可靠性、速度、流量控制和数据包大小等方面的差异,帮助读者理解其各自特点与适用场景。
|
27天前
|
存储 网络协议 安全
用于 syslog 收集的协议:TCP、UDP、RELP
系统日志是从Linux/Unix设备及网络设备生成的日志,可通过syslog服务器集中管理。日志传输支持UDP、TCP和RELP协议。UDP无连接且不可靠,不推荐使用;TCP可靠,常用于rsyslog和syslog-ng;RELP提供可靠传输和反向确认。集中管理日志有助于故障排除和安全审计,EventLog Analyzer等工具可自动收集、解析和分析日志。
111 2
|
2月前
|
缓存 监控 Java
Java线程池提交任务流程底层源码与源码解析
【11月更文挑战第30天】嘿,各位技术爱好者们,今天咱们来聊聊Java线程池提交任务的底层源码与源码解析。作为一个资深的Java开发者,我相信你一定对线程池并不陌生。线程池作为并发编程中的一大利器,其重要性不言而喻。今天,我将以对话的方式,带你一步步深入线程池的奥秘,从概述到功能点,再到背景和业务点,最后到底层原理和示例,让你对线程池有一个全新的认识。
60 12
|
1月前
|
PyTorch Shell API
Ascend Extension for PyTorch的源码解析
本文介绍了Ascend对PyTorch代码的适配过程,包括源码下载、编译步骤及常见问题,详细解析了torch-npu编译后的文件结构和三种实现昇腾NPU算子调用的方式:通过torch的register方式、定义算子方式和API重定向映射方式。这对于开发者理解和使用Ascend平台上的PyTorch具有重要指导意义。
|
17天前
|
安全 搜索推荐 数据挖掘
陪玩系统源码开发流程解析,成品陪玩系统源码的优点
我们自主开发的多客陪玩系统源码,整合了市面上主流陪玩APP功能,支持二次开发。该系统适用于线上游戏陪玩、语音视频聊天、心理咨询等场景,提供用户注册管理、陪玩者资料库、预约匹配、实时通讯、支付结算、安全隐私保护、客户服务及数据分析等功能,打造综合性社交平台。随着互联网技术发展,陪玩系统正成为游戏爱好者的新宠,改变游戏体验并带来新的商业模式。
|
2月前
|
监控 网络协议 网络性能优化
网络通信的核心选择:TCP与UDP协议深度解析
在网络通信领域,TCP(传输控制协议)和UDP(用户数据报协议)是两种基础且截然不同的传输层协议。它们各自的特点和适用场景对于网络工程师和开发者来说至关重要。本文将深入探讨TCP和UDP的核心区别,并分析它们在实际应用中的选择依据。
68 3

推荐镜像

更多