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

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

对交互数据流的处理

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搭建和管理企业级网站应用
目录
相关文章
|
14天前
|
存储 网络协议 算法
UDP 协议和 TCP 协议
本文介绍了UDP和TCP协议的基本结构与特性。UDP协议具有简单的报文结构,包括报头和载荷,报头由源端口、目的端口、报文长度和校验和组成。UDP使用CRC校验和来检测传输错误。相比之下,TCP协议提供更可靠的传输服务,其结构复杂,包含序列号、确认序号和标志位等字段。TCP通过确认应答和超时重传来保证数据传输的可靠性,并采用三次握手建立连接,四次挥手断开连接,确保通信的稳定性和完整性。
46 1
UDP 协议和 TCP 协议
|
15天前
|
传感器 C# Android开发
深度解析Uno Platform中的事件处理机制与交互设计艺术:从理论到实践的全方位指南,助您构建响应迅速、交互流畅的跨平台应用
Uno Platform 是一款开源框架,支持使用 C# 和 XAML 开发跨平台原生 UI 应用,兼容 Windows、iOS、Android 及 WebAssembly。本文将介绍 Uno Platform 中高效的事件处理方法,并通过示例代码展示交互设计的核心原则与实践技巧,帮助提升应用的用户体验。事件处理让应用能响应用户输入,如点击、触摸及传感器数据变化。通过 XAML 或 C# 添加事件处理器,可确保及时反馈用户操作。示例代码展示了一个按钮点击事件处理过程。此外,还可运用动画和过渡效果进一步增强应用交互性。
127 57
|
21天前
|
存储 缓存 Java
什么是线程池?从底层源码入手,深度解析线程池的工作原理
本文从底层源码入手,深度解析ThreadPoolExecutor底层源码,包括其核心字段、内部类和重要方法,另外对Executors工具类下的四种自带线程池源码进行解释。 阅读本文后,可以对线程池的工作原理、七大参数、生命周期、拒绝策略等内容拥有更深入的认识。
什么是线程池?从底层源码入手,深度解析线程池的工作原理
|
25天前
|
开发工具
Flutter-AnimatedWidget组件源码解析
Flutter-AnimatedWidget组件源码解析
|
21天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
178 37
|
1天前
|
网络协议 Linux 网络性能优化
Linux基础-socket详解、TCP/UDP
综上所述,Linux下的Socket编程是网络通信的重要组成部分,通过灵活运用TCP和UDP协议,开发者能够构建出满足不同需求的网络应用程序。掌握这些基础知识,是进行更复杂网络编程任务的基石。
8 1
|
13天前
|
编解码 开发工具 UED
QT Widgets模块源码解析与实践
【9月更文挑战第20天】Qt Widgets 模块是 Qt 开发中至关重要的部分,提供了丰富的 GUI 组件,如按钮、文本框等,并支持布局管理、事件处理和窗口管理。这些组件基于信号与槽机制,实现灵活交互。通过对源码的解析及实践应用,可深入了解其类结构、布局管理和事件处理机制,掌握创建复杂 UI 界面的方法,提升开发效率和用户体验。
64 12
|
13天前
|
存储 网络协议 算法
UDP & TCP 超详解
本文详细介绍了UDP与TCP协议的相关知识。首先阐述了UDP协议结构,包括其报文格式、各字段含义及其CRC校验和机制。接着深入探讨了TCP协议,涵盖其协议结构、确认应答机制、超时重传策略、三次握手与四次挥手过程,以及滑动窗口、流量控制和拥塞控制等关键技术。最后分析了TCP在异常情况下的处理机制,如进程崩溃、主机关机、掉电和网线断开等情况。
75 5
|
18天前
|
网络协议
TCP和UDP区别
简介: TCP和UDP区别
|
9天前
|
网络协议
最简单的tcp客户端和服务端 还有udp
最简单的tcp客户端和服务端 还有udp

热门文章

最新文章

推荐镜像

更多
下一篇
无影云桌面