这是N多年前的在刚刚踏入这行的时候在第一家公司做的第一个性能测试的脚本。整理的时候还是很想念当年的朋友,同事和领导。祝linkwise一帆风顺。
一、RTSP协议是什么?实时流协议,流媒体协议的一种。电信的手机电视用的就是这个协议在做的在线播放(其实也就是我的第一个项目,当时还是联通的)。具体的不说了,那没有意义。您可以参考rfc2326来对这个协议有更深的了解。
二、本文的目的
目的就一个:结合loadrunner介绍RSTP连接的模拟
三、正文
1、loadrunner对rtsp的支持
loadrunner有两个现成的流媒体协议的支持,一个mms,一个real。但都不是我们需要的。也就是没有现成的rtsp协议支持。显然对于这种应用层的没有现成支持的协议。我们的选择就是windows sockets。
2、脚本制作过程
思路还是一样,拿到一个新协议首先是用sockets录制一下。把客户端发起的东西根据需要参数化一下。把变化的东西关联一下。基本就ok了。几乎不需要对协议有深入的了解。关键是需要一个验证的方法来确认虚拟用户有效,很多方法。比如数据库的记录,带宽,等等。
a、录制
录制的东西就是下面这些:
Action() { lrs_create_socket("socket0", "TCP", "LocalHost=0", "RemoteHost=192.168.0.7:554", LrsLastArg);
lrs_send("socket0", "buf0", LrsLastArg);
lrs_receive("socket0", "buf1", LrsLastArg);
lrs_send("socket0", "buf2", LrsLastArg);
lrs_receive("socket0", "buf3", LrsLastArg);
lrs_send("socket0", "buf4", LrsLastArg);
lrs_receive("socket0", "buf5", LrsLastArg);
lrs_save_param("socket0",NULL,"newsession",178,19);
lr_output_message("session is:%s",lr_eval_string(""));
lrs_send("socket0", "buf6", LrsLastArg);
/* lrs_receive("socket0", "buf7", LrsLastArg);
lrs_create_socket("socket1", "UDP", "LocalHost=6972", LrsLastArg);
lrs_create_socket("socket2", "UDP", "LocalHost=6973", LrsLastArg);
lrs_receive("socket1", "buf8", LrsLastArg);
lrs_send("socket2", "buf9", "TargetSocket=192.168.0.7:6971", LrsLastArg);
lrs_receive("socket2", "buf10", LrsLastArg);
......
lrs_close_socket("socket2");
lrs_close_socket("socket1");
*/
lrs_disable_socket("socket0", DISABLE_SEND); lrs_close_socket("socket0");
return 0;
}
其中最关键的部分是buf5,就是这里传送过来了session id
recv buf5 486
"RTSP/1.0 200 OK\r\n" "Server: DSS/5.5 (Build/489.7; Platform/Linux; Release/Darwin; )\r\n" "Cseq: 2\r\n" "Last-Modified: Thu, 22 Dec 2005 01:59:56 GMT\r\n" "Cache-Control: must-revalidate\r\n" "Session: 2347936984390074812\r\n" "Date: Thu, 22 Dec 2005 12:27:08 GMT\r\n" "Expires: Thu, 22 Dec 2005 12:27:08 GMT\r\n" "Transport: RTP/AVP;unicast;source=192.168.0.7;client_port=6972-6973;server" "_port=6970-6971;ssrc=401DA4CB\r\n" "x-Transport-Options: late-tolerance=0.400000\r\n" "x-Retransmit: our-retransmit\r\n" "x-Dynamic-Rate: 1;rtt=68\r\n" "\r\n"
2 参数化
这个脚本中没有参数化的内容。使用打开同一个媒体文件。参数化比较平常就不说了。
3 关联
正如1中说的,关键就是buf5的sessionid.所以抓下来,关联一把。然后把之后的buf中的sessionid替换一下就好了。其实整个过程中变化的内容还有很多。比如Cseq之类的。流媒体服务器根据这个依次处理请求。为了更真实的模拟播放过程。可以对他们都参数化一下。这里没有做,因为我的目标就是让流媒体服务器工作起来,往我这里发包就好了。关联的语句就是上面脚本中的
lrs_save_param("socket0",NULL,"newsession",178,19);
lr_output_message("session is:%s",lr_eval_string(""));
跟web_reg_save_param不同的是socket中的关联是写在接受buf语句的后面。这里也就是写在receive buf5的后面的。下面那句就是把关联到的打出来看看。没什么。
4 确认脚本正确性
这次确认用ethereal(wireshark)抓本地网卡流经的包。同协议规定内容一致,建立起了连接然后通过rtp协议收到了来自服务器的大量udp包。尝试并发n个vuser。网卡占用的贷款基本=媒体文件的码率*n。ok基本就是这样了。
ps。在发送了buf6之后rtsp连接建立起来了。服务器开始通过rtp协议向客户端发送流。您可以在它下面弄点逻辑控制的语句来控制它在什么时候去执行断开连接。这根据需要加就好了。