使用JMeter测试TCP协议

本文主要介绍如何使用JMeter对TCP协议进行测试
1、TCP概念
2、TCP协议的三次握手
3、TCP取样器参数介绍
4、Wireshark抓包和开发TCP脚本

  • 一、TCP概念
    TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内另一个重要的传输协议。数据传输时,应用程序向TCP层发送数据流,TCP就会将接受到的数据流切分成报文段(会根据当前网络环境来调整报文段的大小),然后经过下面的层层传递,最终传递给目标节点的TCP层。为了防止丢包,TCP协议会在数据包上标有序号,对方收到则发送ACK确认,未收到则重传。这个步骤就是我们通常所说的TCP建立连接的三次握手。同时TCP会通过奇偶校验和的方式来校验数据传输过程中是否出现错误。
  • 二、TCP协议的三次握手
  1. 第一次握手:客户端发送syn包(seq=x)到服务器,并进入SYN_SEND状态,等待服务器确认;

  2. 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;

  3. 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

  4. 握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。


    image
  5. 实际抓包验证:在16734 -> 808中,16734是本地(客户端)端口,808是服务器的端口。808端口和16734端口之间的三次来回就是"三次握手"过程。
    注意到”第一次握手”客户端发送的TCP报文中以[SYN]作为标志位,并且客户端序号Seq=0;
    接下来”第二次握手”服务器返回的TCP报文中以[SYN,ACK]作为标志位;并且服务器端序号Seq=0;确认号Ack=1(“第一次握手”中客户端序号Seq的值+1);
    最后”第三次握手”客户端再向服务器端发送的TCP报文中以[ACK]作为标志位;


    image
  • 三、TCP取样器参数介绍
  1. 打开jmeter,点击测试计划》添加》配置元件》TCP取样器配置


    image
  2. TCP Sampler提供了3个报文编码类型的实现,分别是
    org.apache.jmeter.protocol.tcp.sampler. TCPClientImp
    org.apache.jmeter.protocol.tcp.sampler. BinaryTCPClientImpl
    org.apache.jmeter.protocol.tcp.sampler. LengthPrefixedBinaryTCPClientImpl
    1)TCPClientImpl以文本编辑器中所编辑的纯文本为内容进行发送。
    2)BinaryTCPClientImpl以文本编辑器中所编辑的16进制字符(hex)内容为基础转换为二进制的
    字节内容进行发送。
    3)LengthPrefixedBinaryTCPClientImpl在BinaryTCPClientImpl基础上默认以发送内容的长度为
    字节前缀进行填充。


    image
  3. 1)Re-use connection: 如果选中,连接会一直处于打开状态,否则读取到数据之后就关闭。
    2)Close connection: 如果选中,在TCP Sampler运行完毕之后就会被关闭。
    3)SO_LINGER:该配置项用于控制在关闭连接之前是否要等待缓冲区中的数据发送完成。如果SO_LINGER选项指定了
    值,则在得到关闭连接的请求之后还会等待指定的秒数以完成缓冲区中数据的发送,在指定的SO_LINGER秒数完成后,
    关闭连接。因此,如果你把该选项设置成0,那么所有连接在收到关闭连接的时候都会立即关闭,避免产生很多处于
    TIME_WAIT状态的套接字。
    4)End of line(EOL) byte value:响应数据的最后2位,转换为10进制的值。取值区间[-128,127]
    5)Connect Timeout:与服务器套接字应用连接超时时间(毫秒)。
    6)Response Timeout:响应超时时间(毫秒),这个值的设置跟End of line(EOL) byte value有
    关系,如果End of line(EOL) byte value中的值设置不正确,会导致JMeter一直在等待无法结束,
    但是如果指定了Response Timeout这个值的话,在到达这个值的时候就关闭连接。
    7)设置无延迟:是否需要使用该选项,需要跟实际的业务情况结合。


    image
  • 四、Wireshark抓包和开发TCP脚本
  1. 打开Wireshark,然后双击网络为Microsoft:WLAN wifi网络


    image
  2. 然后打开需要抓包的系统,执行登录、查询操作,抓包的请求如下
    1)显示过滤器:用于过滤,可以依据IP和TCP流来做过滤需要的请求;
    2)封包列表:显示抓取到的封包,显示有源地址和目标地址,端口号。 列表颜色不同,代表不同协议;
    3)封包详细信息: 显示选取行封包中的字段;
    4)16进制数据:显示选取行封包详细信息对应的16进制数据;


    image
  3. 可以在抓包页面添加过滤器,点击+按钮,输入标签、过滤器,点击OK,该过滤器就会显示在过滤器右侧,方便下次使用,下图ip.dst==10.16.24.165,代表过滤目标服务器ip为10.16.24.165的请求数据


    image
  4. 选中过滤好的TCP请求,右键点击》追踪流》TCP流


    image
  5. 追踪TCP流,显示和保存数据选择原始数据(16进制请求)


    image
  6. 首先在Jmeter TCP取样器配置公共信息,由抓包信息可知,TCPClient 需要填写BinaryTCPClientImpl 服务器ip为10.16.24.165,端口为808,End of line为01


    image

    image
  7. 追踪TCP流,左下角选择从客户端(本地ip)发送到服务器的请求进行过滤,这样显示的请求就是TCP发送的请求,把请求一条条复制到TCP取样器即可


    image

    image
  8. 线程组》添加》Sample》TCP取样器,将请求复制到要发送的文本即可,因为系统特殊性,第一条TCP请求信息的响应结尾与其他不同,故第一个TCP取样器的EOL值不同,需要单独申明,下图只截图2条TCP请求


    image

    image

    image
  9. 可以根据返回的结果,通过在线转换得到End of line,转换地址https://tool.oschina.net/hexconvert/
    image

    image

    image
  10. 全部的请求添加完毕,执行结果如下,经过和实际抓包的响应结果对比,结果一致


    image

    image
  11. 也可以添加断言,从抓包的查询结果中copy一段进行断言即可,如下图


    image
  12. 如果需要对查询TCP请求进行参数化,只需要提前把请求参数转换成16进制,然后使用CSV参数化即可

如果文章对你有帮助,欢迎关注本人公众号,公众号与本平台文章同步,方便大家查阅,本人会持续推出与测试有关的文章,与大家分享测试技术,每一篇原创文章都是用心编写,杜绝抄袭复制


QQ技术交流群:加群请输入验证信息
              

在这里插入图片描述


微信二维码关注公众号:

在这里插入图片描述

关注之后,回复资源下载,即可获取本人共享的各种资源下载地址

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dkyHNY2D-1569554485737)(https://s1.51cto.com/images/blog/201908/06/2e62f8806e1dc1c391c4332ac7fd70b1.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)]

你可能感兴趣的:(使用JMeter测试TCP协议)