Muduo 网络编程示例之五: 测量两台机器的网络延迟

陈硕 (giantchen_AT_gmail)

Blog.csdn.net/Solstice  t.sina.com.cn/giantchen

这是《Muduo 网络编程示例》系列的第五篇文章。

Muduo 全系列文章列表: http://blog.csdn.net/Solstice/category/779646.aspx

本文介绍一个简单的网络程序 roundtrip,用于测量两台机器之间的网络延迟,即“往返时间 / round trip time / RTT”。这篇文章主要考察定长 TCP 消息的分包,TCP_NODELAY 的作用。

本文的代码见 http://code.google.com/p/muduo/source/browse/trunk/examples/roundtrip/roundtrip.cc

测量 RTT 的办法很简单:

  • host A 发一条消息给 host B,其中包含 host A 发送消息的本地时间
  • host B 收到之后立刻把消息 echo 回 host A
  • host A 收到消息之后,用当前时间减去消息中的时间就得到了 RTT。

NTP 协议的工作原理与之类似,不过,除了测量 RTT,NTP 还需要知道两台机器之间的时间差 (clock offset),这样才能校准时间。

以上是 NTP 协议收发消息的协议,RTT = (T4-T1) – (T3-T2),时间差 = ((T4+T1)-(T2+T3))/2。NTP 的要求是往返路径上的单程延迟要尽量相等,这样才能减少系统误差。偶然误差由单程延迟的不确定性决定。

在我设计的 roundtrip 示例程序中,协议有所简化:

简化之后的协议少取一次时间,因为 server 收到消息之后立刻发送回 client,耗时很少(若干微秒),基本不影响最终结果。

我设计的消息格式是 16 字节定长消息:

T1 和 T2 都是 muduo::Timestamp,一个 int64_t,表示从 Epoch 到现在的微秒数。

为了让消息的单程往返时间接近,server 和 client 发送的消息都是 16 bytes,这样做到对称。

由于是定长消息,可以不必使用 codec,在 message callback 中直接用

while (buffer->readableBytes() >= frameLen) { ... } 就能 decode。

请读者思考,如果把 while 换成 if 会有什么后果?

client 程序以 200ms 为间隔发送消息,在收到消息之后打印 RTT 和 clock offset。一次运作实例如下:

这个例子中,client 和 server 的时钟不是完全对准的,server 的时间快了 850 us,用 roundtrip 程序能测量出这个时间差。有了这个时间差就能校正分布式系统中测量得到的消息延迟。

比方说以上图为例,server 在它本地 1.235000 时刻发送了一条消息,client 在它本地 1.234300 收到这条消息,直接计算的话延迟是 –700us。这个结果肯定是错的,因为 server 和 client 不在一个时钟域(这是数字电路中的概念),它们的时间直接相减无意义。如果我们已经测量得到 server 比 client 快 850us,那么做用这个数据一次校正: -700+850 = 150us,这个结果就比较符合实际了。当然,在实际应用中,clock offset 要经过一个低通滤波才能使用,不然偶然性太大。

请读者思考,为什么不能直接以 RTT/2 作为两天机器之间收发消息的单程延迟?

这个程序在局域网中使用没有问题,如果在广域网上使用,而且 RTT 大于 200ms,那么受 Nagle 算法影响,测量结果是错误的(具体分析留作练习,这能测试对 Nagle 的理解),这时候我们需要设置 TCP_NODELAY 参数,让程序在广域网上也能正常工作。

转载于:https://www.cnblogs.com/Solstice/archive/2011/04/20/2021859.html

Muduo 网络编程示例之五: 测量两台机器的网络延迟相关推荐

  1. 测量两台机器的的网络延迟和时间差

    一.roundtrip 用于测量两台机器之间的网络延迟,即"往返时间(round trip time,RTT)",其主要考察定长TCP消息的分包与TCP_NNODELY作用 代码: ...

  2. Muduo 网络编程示例之零:前言

    陈硕 (giantchen_AT_gmail) Blog.csdn.net/Solstice Muduo 全系列文章列表: http://blog.csdn.net/Solstice/category ...

  3. Muduo 网络编程示例之三:定时器

    陈硕 (giantchen_AT_gmail) Blog.csdn.net/Solstice 这是<Muduo 网络编程示例>系列的第三篇文章. Muduo 全系列文章列表: http:/ ...

  4. Muduo 网络编程示例之四:Twisted Finger

    陈硕 (giantchen_AT_gmail) Blog.csdn.net/Solstice 这是<Muduo 网络编程示例>系列的第四篇文章. Muduo 全系列文章列表: http:/ ...

  5. Muduo 网络编程示例之十:socks4a 代理服务器

    Muduo 网络编程示例之十:socks4a 代理服务器 陈硕 (giantchen_AT_gmail) Blog.csdn.net/Solstice  t.sina.com.cn/giantchen ...

  6. JavaEE 网络编程示例1 UDP套接字数据报编程 == 一发一收

    鲁吼呀,胶己人! 文章目录 JavaEE & 网络编程示例1 & UDP套接字数据报编程 ==> 一发一收 1. 协议分层(回顾) 2. 套接字 Socket 2.1 UDP与T ...

  7. 网络编程懒人入门(二):快速理解网络通信协议(下篇)

    1.前言 本文上篇<网络编程懒人入门(一):快速理解网络通信协议(上篇)>分析了互联网的总体构思,从下至上,每一层协议的设计思想.基于知识连贯性的考虑,建议您先看完上篇后再来阅读本文. 本 ...

  8. 网络编程懒人入门(一):快速理解网络通信协议(上篇)

    1.写在前面 论坛和群里常会有技术同行打算自已开发IM或者消息推送系统,很多时候连基本的网络编程理论(如网络协议等)都不了解,就贸然定方案.写代码,显得非常盲目且充满技术风险. 即时通讯网论坛里精心整 ...

  9. 【Java 18】网络编程 - 概述、网络编程要素、IP和端口号、网络协议、TCP、UDP、URL

    网络编程 - 概述.网络编程要素.IP和端口号.网络协议.TCP.UDP.URL 网络编程 1 网络编程概述 2 网络通信要素概述 3 通信要素1:IP和端口号 3.1 内容 3.2 InetAddr ...

最新文章

  1. 用composer安装laravel-bjyblog
  2. 58一面:Redis数据更新,是先更新数据库还是先更新缓存?
  3. 常考数据结构和算法:合并有序链表
  4. Python使用lxml模块和Requests模块抓取HTML页面的教程
  5. java 头尾 队列_探索JAVA并发 - 并发容器全家福
  6. 多线程相关的一些知识点
  7. Centos 7 搭建nginx 服务 使得别人能够访问自己的个人网站
  8. JAVA中线程同步的方法
  9. IDEA 生成时序图、类图
  10. 社会生存的75条忠告----胜读十年书【转】
  11. 学而思网校python助手_学而思网校直播课堂
  12. 从单体架构迁移到微服务,8个关键的思考、实践和经验
  13. Spring Boot + WebMagic 实现网页爬虫,写得太好了!
  14. 盘点前 10 名的免费跨浏览器测试工具
  15. C#+AE 地图制图(二)
  16. RS232 RS422 RS485通讯原理
  17. HDMI接口 PCB布线指南-4层板为例
  18. .NET Conf China 2022 第一批讲师阵容大揭秘!整个期待了!
  19. 报表生成(POI,jquery.table2excel.js,Echarts)
  20. 基于AI的自然语言处理

热门文章

  1. js 查错_7年前端开发经验的我,写了本Vue.js实战开发,开源高清PDF下载
  2. 详解各类以太网标准10BASE-T/100BASE-T4/100BASE-FX/1000BASE-X等
  3. 单片机期末不挂科,看这一篇就够了
  4. c/c++里面的变长参数的实现
  5. 概率占据图(POM)算法理解
  6. css餐厅_餐厅的评分预测
  7. 使用composer_在Google Cloud Composer(Airflow)上使用Selenium搜寻网页
  8. 民间借贷利息多少才合法?
  9. 阿里云物联网平台,三要素生成hmacmd5,hmacsha1和hmacsha256,password算法+hashmd5,hashsha1,hashsha256算法
  10. Tableau上面地图与条形图结合_何为计算的详细级别,认识Tableau中的Level of Detail...