最近收到一个某地区拨打电话失败的概率性问题,据测试部门的同事反馈,发生的概率为 1/10。即拨打10次电话,基本上就会出现一次,出现问题后,再次拨打又好了,没啥规律,没有必现路径,真是奇怪了。每次遇到这样的问题,作为终端开发者,想到的就是网络问题。。。

好了,话不多说,基本上每次遇到这样的问题,首先想到的就是对比其他型号的情况,以确认是否共性或者网络问题。

  • 前提条件:同个地方,同样的卡
  • 请测试我厂的其他型号是否也有这样的问题,如果我厂的其他型号也有这个问题,那么是共性问题。
  • 如果我厂的机子都有问题,那么也请测试友商的机子,是否存在同样的问题,以判断是否网络问题。

经过几次邀请测试,我厂其他型号不存在这个问题,友商的机子测试也没发现有问题,这下尴尬了。

为了寻找问题发生的可能原因,我按照下面的思路打开tcpdump进行分析:

  1. NR SA网络下,拨打电话后是否能够正常EPS Fallback。
  2. EPS Fallback到LTE后,正常和异常情况下,小区信息是否一样。
  3. 对比正常和异常的SIP信令是否一样。
  4. 通过tcpdump调查SIP信令是否有发出去。
  5. 当前手机信号情况如何,是否信号差。

通过仔细对比,发现其中第1,2,3,5点,正常和异常的log都基本一致,未发现可疑的地方。唯独第4点,从tcpdump看到SIP信令已经发给了Modem,但是一直在重复确认和虚假重传。涉及到这种重传的问题,首先想到的就是找Modem的同事确认信令是否成功发给基站了。

Modem同事分析后淡定的表示,问题发生的时间点手机信号强度正常,信令发给了基站并且基站回了ACK,所以信令已经正常发出去了。最后给的结论是终端测未发现异常,建议调查网络侧的IMS服务器。

结果意料之中,要网络侧去查,就必须邀请运营商一起联调,但是测试的结果又是其他型号正常,只有这个型号不正常。这要简单粗暴的说是网络问题也说不过去。。。

再次仔细确认log,确认没有可疑的地方后,只能把问题给了运营商接口人去分析看看,毕竟人家是邀请运营商联调的人,各种疑难杂症可能都见过。

得到的回复是:正常和异常log中,MSS大小不一样,估计这个会导致问题,需要调查为什么会不一样?

MSS?心想MSS变小不是通过的概率更大吗?怎么会导致问题呢?
既然MSS可能有问题,那就整理一下MSS相关的知识以及分析tcpdump时,自己心中的一些疑问。

MSS是什么,怎么配置的,两个手机的MSS为什么会不一样?

MSS是TCP协议的一个概念,表示最大分段大小。也就是除去IP和TCP头部之后,一个网络包TCP数据部分的最大长度。TCP协议三次握手阶段会协商MSS值,MSS的值决定了每个TCP报文数据段的最大长度。这里还设计MTU的概念,MTU是一个网络包的最大长度,以太网中一般为1500字节,网络包超过MTU大小需要在网络层进行分片。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那么这两个又有什么关系呢?

如果网络包MSS大小超过MTU,那么一个数据包就会在IP层进行分片,每一片都小于MTU。分片后由目标主机的IP层进行重组,再交给TCP层。但是如果在传输过程中,有一个IP分片丢失了,那么整个数据包都得重传,这样效率非常低。

为了提高传输效率,TCP协议在建立连接的时候通常需要协商双方的MSS,使得数据包在发给IP层之前已经在TCP层按照MSS大小来分段,使得分段之后形成的数据包不会大于MTU,这样就不会再IP层分片了。如果传输过程中发生丢包,进行重发时也是以MSS为单位,不用重传所有的分段,大大提高了传输效率。

MSS的大小取协商时较小的值,从下图可以看出,手机MSS是1240,Server是1312,最终TCP分段MSS是1240。协商后,可以看到REGISTER信令被分为两个包:6426, 6427。


知道了MSS是什么后,那么手机MSS=1240又是怎么来的呢?
终端在建立IMS PDN时,网络会回复MTU大小,这个问题当时网络的回复是MTU=1300,那么默认情况下MSS就是按照下面的公式计算:

MSS = MTU(1300) - TCP header(20) - IPV6 header(40) = 1240。

为什么两个手机的MSS不一样呢?

那是因为另一台手机与网络三次握手时,网络回复的MSS小了,从下图看到网络回应MSS是1120,所以后续TCP报文是按照1120来进行分片,可以看包1357,1358。

奇怪的是,有时候建立IMS PDN网络回复的MTU是1432,但是在三次握手时SYN带出去的MSS却是1300。理论上的MSS大小应该是

MSS = MTU(1432) - TCP header(20) - IPV6 header(40) = 1372。

为什么不是1372呢?是因为IMS在建立Socket时,上层会去设置TCP_MAXSEG选项,大小是1300。

TCP_MAXSEG这个选项,它设置或接收最大出站 TCP 数据段尺寸。如果这个选项在建立连接前的设置,它将改变发送到另一端初始信息包中的 MSS 值。这个值大于 MTU 接口值将被忽略而不起作用

所以MSS是两者中小的值:

min(TCP_MAXSEG value, MTU - TCP header - IPV6 header)

回到前面,建立IMS PDN时网络回复MTU是1300的情况,TCP_MAX_SEG也是设置1300,最后三次握手时SYN发出去的MSS是1240,也就解释的通了。

发生问题时,为啥PRACK信令是用UDP进行传输而不是TCP?

这个是运营商的规范,如下:

所以在IMS的配置文件中指定的mss大小,它有两个作用:

  1. 它是用来选择采用哪种方式传输的判断依据。
  2. 用来设置socket的TCP_MAXSEG选项,也就是MSS。

UDP不是不会进行重传的吗?为啥从tcpdump看PRACK能进行重传呢?

用户数据报协议(UDP)是基于IP网络层协议的传输层协议。它提供高效的数据报文传输服务。UDP的缺点不能保证信息的交付,也不能防止信息重复,但UDP的简易性减少了传输协议的开销。UDP是不可靠的协议,它没有TCP的重传机制。

如下图所示,tcpdump中PRACK信令一直在重传。

既然UDP协议本身不支持重传,那么这里PRACK进行重传是在上层APP控制的,根据log看出确实是在APP控制重传:

10-23 14:24:05.944 2936 3491 D TimerQueue.cxx:50 | Adding timer: Timer E1 tid=6edfedcfed08cb3e ms=2000
10-23 14:24:07.947 2936 3491 D TimerQueue.cxx:50 | Adding timer: Timer E1 tid=6edfedcfed08cb3e ms=4000
10-23 14:24:11.951 2936 3491 D TimerQueue.cxx:50 | Adding timer: Timer E1 tid=6edfedcfed08cb3e ms=8000
10-23 14:24:19.958 2936 3491 D TimerQueue.cxx:50 | Adding timer: Timer E1 tid=6edfedcfed08cb3e ms=16000
10-23 14:24:35.970 2936 3491 D TimerQueue.cxx:50 | Adding timer: Timer E1 tid=6edfedcfed08cb3e ms=16000

TCP重传的类型,发生重传的可能原因有哪些?

在网络环境中,数据包丢失是非常常见的事情。TCP协议有内建的处理机制来保证网络数据的传输正确。在Wireshark中,根据特性有几种TCP重传的分类,下面是几种TCP重传的分类:

  • TCP Retransmission,这是一种单纯的重传,如果发送端等待接收端发送的ACK超过了TCP所设置的RTO,那么此时发送端便会重传刚发的数据包。
  • TCP Fast Retransmission,主机在检测到原始数据包丢失后立即重新发送数据包,而不是等待完整的重传计时器到期。通常是发送方从接收方收到3个相同序列号的重复ACK时,就会触发TCP Fast Retransmission.
  • TCP Spurious Retransmission(虚假重传),这标记着发送端发出的一个数据重传,实际上已经被接收者ACK过。由于一些原因,发送方认为一个数据包丢失,所以重新发送。

    从图中可以看出发生了虚假重传,手机在包10388 ACK服务器后,服务器似乎没有收到,所以包10393,10399,10406,10413,10429都是重传,都被定义为虚假重传。与之相对应的包10394,10400,10407,10414,10430,都是手机侧进行确认应答。

那么发生虚假重传的可能性有哪些呢?

  • 在超时之前手机侧的ACK没有发送到服务器,可能在传输的过程丢包了。
  • 服务器的TCP协议栈有问题,导致没有处理接收到的ACK。

那么到这里,通过这个问题的log发散出来,整理了MSS,MTU,TCP,UDP相关的一些知识点,下次碰到类似的问题,就会有一个比较全面的概念,最后这个问题按照上面的分析提供了TR,还需要网络侧一起排查是什么原因导致服务器一直收不到数据包。

参考文档
https://www.chappell-university.com/post/spurious-retransmissions-a-concern
http://bbs.chinaunix.net/thread-4155778-1-1.html
https://blog.csdn.net/Victordas/article/details/101534276
https://linux.die.net/man/7/tcp
https://blog.csdn.net/Victordas/article/details/101534276
https://linux.die.net/man/7/tcp
图解系统-亮白风格-小林coding-v1.0.pdf

一个mss大小引发的思考相关推荐

  1. 一个小程序引发的思考

    既然是一个小程序引发的思考,那么我们就先看看这个小程序,看看他有何神奇之处: namespace ConsoleApplication1 {class Program{static void Main ...

  2. 一个分组查询引发的思考

    一个分组查询引发的思考 我们在看项目代码或者SQL语句时, 往往会看到很多非常复杂的业务或者SQL 那么问题来了. 复杂SQL是如何写成的? 下面通过一个数据展示的需求来体会到复杂的SQL是如何书写的 ...

  3. 负载均衡故障诊断:一个MSS值引发的疑案

    负载均衡设备位于客户端和真实服务器之间,一旦访问发生问题,在客户经过简单诊断后,负载均衡设备往往会成为首要被怀疑的对象.客户一般这样质疑:为什么我直接访问服务器没有问题,通过你的设备访问就不行了呢? ...

  4. MVC系列——一个异常消息传递引发的思考

    前言:最近在某个项目里面遇到一个有点纠结的小问题,经过半天时间的思索和尝试,问题得到解决.在此记录一下解决的过程,以及解决问题的过程中对.net里面MVC异常处理的思考.都是些老生常谈的问题,不多说, ...

  5. 一个小需求引发的思考

    此文已由作者肖凡授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 最近接了一个看上去很小,很容易实现的需求,然而在做的过程中发现有些问题如果思考不全就很容易导致问题,这里给大家 ...

  6. 一个嵌入式初学者引发的思考(jesse谈自己的经验体会) 【转】

    我目前再跟几个朋友合伙一起做点开源的硬件小产品,随后就成立了一个论坛,也就是现在的armjishu.com,那时候我们在一起商量着怎么让我们的广大初学者能够更快的进入到嵌入式领域,我们琢磨了很长时间, ...

  7. 一个播放器引发的思考——谈谈React跨组件通信

    在我们react项目日常开发中,往往会遇到这样一个问题:如何去实现跨组件通信? 为了更好的理解此问题,接下来我们通过一个简单的栗子说明. 实现一个视频播放器 假设有一个这样的需求,需要我们去实现一个简 ...

  8. 一个mysql事务引发的思考(血案)

    #问题简述 大家都知道mysql是支持ACID,支持事务的,事务是非常重要的一个特性,要不都执行成功,要不都不成功.我们在coding时也会大量用到,但是随着业务代码的累加与使用人数的增加,系统有某些 ...

  9. Spring之LoadTimeWeaver——一个需求引发的思考---转

    原文地址:http://www.myexception.cn/software-architecture-design/602651.html Spring之LoadTimeWeaver--一个需求引 ...

最新文章

  1. MVC5 + EF6 完整入门教程三
  2. 「AI大牛」陶大程出任京东探索研究院院长!曾连续6年入选全球高被引科学家...
  3. mysql约束条件整型_MySQL 数据类型(整型,浮点型,字符类型,日期类型,枚举和集合) 约束条件 自增...
  4. X1000应用程序打包流程
  5. [Eclipse插件] Eclipse设置Tab键为空格(ctrl+shirt+f格式化生效)!
  6. 【BZOJ2588】Count on a tree,主席树维护链+ST表求LCA
  7. 想知道你能不能挣到大钱吗?
  8. 上海学计算机编程,上海自学计算机编程入门
  9. 京东登录界面html css,css制作京东登录页面 css样式,京东店面装修怎么写CSS样式?...
  10. Excel单元格区域快速导出为PDF
  11. 【verbs】ibv_get_device_name()|ibv_get_device_list()
  12. 计算机桌面空白图标如何删除,桌面上有两个i空白文件的图标删不掉怎么办急急急...
  13. 高性能JSON框架之FastJson的简单使用
  14. linux编辑框软键盘自动弹出,带输入框的Dialog自动弹出软键盘
  15. 用户调查显示,Rust语言很难学习和使用
  16. php上传公众号临时素材-微信开发素材管理6
  17. 资料: 颜色RGB基础定义
  18. 21-CSS中的3D属性
  19. 解决./XXX: symbol lookup error: /home/root/shenyl/lib/libxxx.so: undefined symbol: _ZN3VRC18AppP
  20. 记录docker文件夹下的overlay2下文件被删,致使gitlab的持续集成(ci)构建过程异常的一次排查过程

热门文章

  1. 初中计算机基础知识考试题,初中计算机基础知识练习题集锦(学生)
  2. docker打开2375
  3. DRG/DIP支付方式改革,助力“医保患企”进入快车道!
  4. 从雪球抓取金融资产数据
  5. MTU从网络接口传输的数据包的最大大小
  6. KERNELBASE.dll错误的解决方法
  7. 1123: 4102 气球升起来
  8. Idea的常见插件和快捷键
  9. fatal: 不是git 仓库(或者任何父目录):.git 解决办法
  10. 计算机机房安全风险防控规范,中心机房安全风险分析一览表.doc