ip包流量分析程序_道路千万条,安全第一条——TCP/IP协议一致性测试排雷攻略...

a30bb7fd6e11ad22e180499e57968d73.png

随着汽车电子技术的发展,汽车通信对带宽的要求变得越来越高。域控制器、自动驾驶、V2X、OTA......这些新的电子电气技术及其发展趋势背后,都离不开高速车内通讯技术的快速发展。汽车以太网的高带宽、低成本优势,快速成为现代汽车通信的焦点技术,而TCP/IP协议簇作为以太网技术的核心协议,是了解汽车以太网技术的基础。汽车的TCP/IP协议栈与传统IT行业的要求不同,车内的短距离传输和高实时性对TCP/IP协议栈提出了新的要求。

那么,排“雷”之前先复习以下几个概念吧~

TCP/IP协议简介

TCP/IP协议概述

TCP/IP(Transmission ControlProtocol/Internet Protocol)是传输控制协议和网络协议的简称,它定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。TCP/IP不是一个协议,而是一个协议簇的统称,包括了IP协议、ICMP协议、TCP协议以及http、ftp、pop3、https协议等。网络中的计算机都采用这套协议簇进行互联。

TCP/IP协议OSI七层模型

90186e2892c37949f41f1b125ebdeeb1.png
OSI与TCP/IP参考模型(图片来源于网络)

OSI七层模型是现代通信的理论基础,而TCP/IP协议与之相比,将物理层和数据链路层合并成网络接口层,而将会话层、表示层和应用层合并成应用层。

TCP/IP协议四层模型

01452453101db8f1bf67e49726bc1120.png
TCP/IP四层模型(图片来源于网络)

应用层:应用层在TCP/IP四层模型中处于最高层,它利用传输层的数据传输功能发送自己的数据到对端的应用层中。应用层也具有选择传输层协议的作用,不同的传输层协议代表着不同的传输速度和传输可靠性,而二者往往不可兼得。所以每个应用程序需要选择最合适的传输服务类型,使双方之间的数据传输达到最佳效果。同时,在应用层之间传输数据是端到端的一种传输模式,每个应用程序会使用端口号来进行识别。应用层中常见的协议有HTTP、FTP、SMTP和POP3协议。

传输层:传输层的主要协议有两个:TCP和UDP。一般应用层进行端到端通信时可供选择的传输层协议就这两个。

  • TCP协议是面向连接的,需要经过建立连接、传输数据、最后断开连接这三个步骤,带来的好处是TCP协议具有传输可靠和网络流量控制的特性,而缺点则是传输机制比较复杂,传输成本高。
  • UDP协议是一种无连接传输协议,意思是传输数据的两端可以直接进行数据传输,而不需要在传输行为之前进行告知,所以UDP协议不保证传输的可靠性,当然也无法进行流量控制,而优点则是传输成本低,也可以进行一对多的数据传输(组播和广播)。

网络层:网络层负责在主机之间的通信中选择数据报的传输路径(即路由)。当网络层接收到来自传输层发来的数据分组后,他会把分组封装在IP数据报中,填入数据报的首部,使用路由算法来确定是直接交付数据报,还是把它传递给路由器,然后把数据报交给适当的网络接口进行传输。网络层还要负责处理传入的数据报,并检验其有效性,然后判断该数据报是否是给本机的,如果不是,则使用路由算法将数据报发出转发;如果是,网络层需要除去数据报中的数据首部得到数据分组,然后将数据分组递交给传输层。

网络接口层:这是TCP/IP协议的最底层,主要负责网络上数据帧的接收和发送,数据帧是底层网络传输的基本单元。由于网络接口有不同的实现方式(有线或者是无线),所以数据帧有不同的实现方式(帧结构、发送速率等不同)。网络接口层一方面将网络层的数据组成自己特定的数据帧结构并发送,一方面接收网络发送给自己的数据帧,解析后交给上层。

下面,跟着怿星一起深度剖析TCP/IP协议一致性测试中可能会遇到的那些“雷”吧~

TCP/IP协议中的那些雷

零窗口探针

TCP协议的数据传输特点是流控制。在使用TCP协议传输数据报文,出现以下情况时,接收方的缓冲区被数据完全填充:

  • 发送方的发送速度大于接收方的接收速度。
  • 接收方的应用程序未能及时从接收缓冲区中读取数据。

当接收方的接收缓冲区被塞满以后,会把响应报文中的接收窗口字段置为0,从而阻止发送方的继续发送,为探测对端接收数据的能力,发送方实现了一个零窗口探针的定时器,当接收方的接收窗口为0时,每隔一段时间发送方会主动发送探测包,通过接收方发回的回复报文来主动探测对端的窗口是否打开。

在TC8 v3.0中,Generation of Zero Window Probes这组测试用例对TCP协议中的零窗口探针机制进行了测试。根据TC8规范中的要求,测试方发送带有零接收窗口的报文,DUT作为主动探测方去发送零窗口探针报文。根据RFC 1122 s4.2.2.17 p92和RFC 793 s3.7 p42描述,DUT需发送带有一个字节的零窗口探针报文。

但是对比各协议栈后,发现其对于零窗口探针的实现方式并不相同,实现方式分别如下图所示。

bb49b9f485d5f76d0b46dc785df09c47.png
零窗口探针-QNX实现

d0ec46f5780cc5c53f1129c18d563848.png
零窗口探针-Linux实现

QNX系统的实现方式是按照RFC1122、RFC793的定义实现。而Linux系统在零窗口探针的实现方式不完全遵从RFC1122、RFC793文档,其设计是通过调用与keepalive相同接口来实现零窗口探测,并通过将Sequence减1的方式发送到对端。若按照严格TC8要求,Linux实现的方式不正确,但Linux通过自身的行为探测了对端的窗口值,其实现方式也满足了探测窗口的需求。

NAGLE算法

在TCP协议中,应用进程把数据传送到发送方的发送缓存后,有TCP协议来控制报文段的发送时机。目前为止有三种发送报文段的机制:

  1. TCP维持一个变量MSS(MAXIMUM SEGMENT SIZE)。只要缓存中存放的数据达到MSS字节时,就组装成一个TCP报文段发送出去。
  2. 由发送方的应用进程指定要求发送的报文段。由TCP报文中的PUSH字段控制。
  3. 达到发送方计时器期限之后,将已有的缓存数据(长度小于MSS)发送出去。

TCP协议会通过NAGLE算法来控制报文段的发送时机,而NAGLE算法的目的是提高传输效率。NAGLE算法含义:

若发送方的应用进程把数据逐个字节的发送到发送方的缓存中,则发送方就把第一个数据字节先发送出去,并把后面达到的数据字节都缓存起来。当发送方收到接收方对第一个数据字节的确认回复之后,再把发送缓存中的所有数据组装成一个尽可能大的报文段发送出去,同时继续缓存后续到达缓存的数据。这边尽可能大的报文段指的是,当缓存中的数据长度达到MSS长度时,会自动发送这个数据报文。换一个说法也就是,只有最后一个数据报文的长度小于MSS,这样就能够充分的利用网络资源,提高传输效率。

d7d25d0ca61fb60be5ce223e707295ac.png
Nagle算法示意图

在TC8 v3.0中,Nagle Algorithm这组测试用例对NAGLE算法进行了测试。分别测试了“小段”报文(长度小于MSS)的发送和“大段”报文(BUFFER中数据长度大于或等于MSS)的发送机制。所以NAGLE 算法适用于发送方需要发送大批量数据, 并且接收方会及时作出回应的场合, 这种算法通过减少传输数据的次数来提高通信效率。

滑动窗口

在传输层协议中,UDP和TCP协议是最被熟知的两个协议。UDP和TCP都可以实现数据传输的功能,根据有无建立连接的机制决定了TCP协议可以提供一个可靠的、流控的数据传输,而滑动窗口机制能够部分实现TCP可靠传输和流量控制的传输特点。

  1. 可靠性(Reliability):TCP的传输要保证数据能够准确到达目的地,如果不能,需要检测出来并且重新发送数据。
  2. 流量控制(Data Flow Control):提供TCP的流控特性,管理发送数据的速率,不要超过设备的承载能力。

为了实现以上两点特性,TCP协议实现了很多细节的功能来保证数据传输,而滑动窗口机制就能起到可靠传输和流量控制这两个作用。

在TCP协议中,在接收方和发送方都会设置一个缓存区域。通过商定包的重传机制等一系列操作,来解决不可靠的问题,那么就会出现以下三个问题:

  1. 在滑动窗口协议之前,如何保证发送方和接收方之间,每个包都能被收到,并且是按顺序收到的呢?
  2. 如何提高网络资源的使用率?
  3. 滑动窗口的实现是如何运作的?

那我们就跟着这三个问题的解答,一起来了解一下TCP协议中的滑动窗口。

TCP协议中有一个停止等待的机制来控制报文的发送。根据下面的示意图,发送包1之后,会开启一个计时器(Timer),如果发送方接收不到对于包1的确认报文,在计时器超时之后,会进行包1的重传。所以TCP协议通过报文的发送和确认来保证发送方和接收方之间每个报文数据都能被收到。

那第二个问题就来了,如果前一个报文未被确认,那么下一个报文就无法发出,这种情况下网络在大部分时间里是空闲的,导致了网络资源的浪费。为了解决这个问题,我们可以考虑多个报文一起发出,比如一次性发出两个报文,从而将网络利用率能提高两倍。到这一步,已经有了数据发送窗口的影子,因为每次发送出去的报文数量我们可以定义为窗口,由这个窗口来进行流量控制。

但是最后一个问题就来了,我们如何去控制这个窗口的大小,使之成为一个最优解?因为窗口过小,网络利用率太低;而窗口过大会导致网络承载压力过大。滑动窗口机制很好的解决了这个问题。

608e3338a70dd54bfe50d386d28f14cb.png
滑动窗口示意图

免费ARP

免费ARP是一个比较冷门的概念,我们先看一下它的官方概念:

Gratuitous ARP也称为免费ARP、无故ARP。Gratuitous ARP不同于一般的ARP请求,它并非期待得到IP对应的MAC地址,而是当主机启动的时候,将发送一个Gratuitous ARP请求,即请求自己的IP地址的MAC地址。

免费ARP通常发生在系统引导期间进行接口配置的时候,其被设计出来的目的主要有两个方面:

  • 一个主机可以通过它来确定另一个主机是否设置了相同的IP地址。源主机并不期望对此请求有一个回答。但是如果收到回复报文,意味着在同一网段中,源主机的MAC地址有对应的重复的IP地址。这样可以通过报错机制告知系统管理员,此系统中有不正确的MAC-IP配置。
  • 如果源主机正好改变了MAC地址(例如主机关机更换接口卡,然后重新启动),免费ARP就可以使其他主机高速缓存中旧的MAC地址进行相应的更新。因为免费ARP是以广播的形式进行发送,而根据比较著名的一个ARP协议事实,如果主机收到某个IP地址的ARP请求,而且它已经存在接收者的ARP缓存中时,那么就要用ARP请求中的发送MAC地址对ARP缓存中相应的内容进行更新。主机收到任何ARP请求都要完成这个操作,所以当进行免费ARP的动作时,同一网段上的所有主机都要进行ARP缓存表的更新。

da51025a2247bcd497cf4cd9fad22e8d.png
免费ARP示意图

在TC8最新版本中加入了对免费ARP的测试需求,其中有一个测试用例(ARP_04)是让测试仪发送免费ARP的Reply类型报文,发送形式为广播形式发送,被测件需要学习和更新ARP缓存表,将测试仪的IP地址和MAC地址加入自身的缓存表中。

通过这篇文章的讲解,相信大家对TCP/IP协议族和其协议一致性测试有了更加深刻的了解。TCP/IP协议簇作为以太网技术的核心,有非常多巧妙又复杂的机制,以上介绍了测试遇到问题最频繁的一些技术点,包括滑动窗口、NAGLE算法、零窗口探针等,受篇幅限制不能进行更多详细的介绍,希望这篇文章可以起到抛砖引玉的作用,大家可以自行探索TCP/IP更有趣、更丰富的功能,也期待大家在下方留言区与我们进行交流。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值