版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1SIP压力测试
SIP协议是IMS/NGN主要通信协议,是一种比较复杂的协议。该文档介绍
kylinPET工具如何进行S1P协议测试:提供易用的SIP业务流程脚本编辑,支持SIP鉴
权,支持复杂SIP流程。
1.1高效创建脚本
通过抓包工具录制SIP业务交互过程后的文件创建SIP业务交互流程图,自动关联
特定参数(如CSeq、Call-ID等),大大减少手工操作脚本,高效、精确创建业务模拟脚
本。
1.2图形化表示SIP流程
图形化直观表示SIP业务交互流程,直观描述SIP状态机。并提供第二状态机
"Unexpected"流程图实现心跳、错误流程处理。
1.3支持音视频媒体发送与指标监控
支持录制音视频,由媒体代理器模拟发送音视频流;支持监控每路RTP媒体流的
指标统计,包括每秒吞吐量、抖动、丢包、延时等等指标数据。
1.4虚拟IP
每个SIP用户一个虚拟IPo配置路山方法参照《kylinPET三种典型组网介绍IP欺
骗与路由设置》文档。
1.5详细日志,方便问题定位
业务运行错误,将输出详细的日志信息,方便用户定位业务错误或失败原因。如输
出业务运行的轨迹及最后失败时发送与收到的报文。
1.6支持调用外部JAVA类
通过调用外部JAVA类,实现私有算法(加密、解密)或工具无法完成的功能。需
要用户自己实现处理逻辑的JAVA代码,实现参照《kylinPET调用外部iava类实现扩展》
文档.
1.7支持业务
1)基于SIP的VoIP业务,包括音频、视频、短消息
2)支持UDP或TCP方式;支持SIPOverTLS
3)支持使用SIP承载的业务,包括Message、INFO、订阅等业务
1.8SIP提供解析关联参数列表
参数名描述
从接收到的消息获取Call-ID头域的值,并作为参数
Call-ID
名为Call-ID的值,后续通过{Call-ID}引用
从接收到的消息获取Contact头域的值,并作为参数
Contact-URI
名为URI的值,后续通过{URI}引用
从接收到的消息获取CSeq头域的值,并作为参数名
CSeq
为CSeq的值,后续通过{CSeq}引用
从接收到的消息获取From头域的Tag值,并作为参
From-Tag
数名为From-Tag的值,后续通过{From-Tag}引用
从接收到的消息获取To头域的Tag值,并作为参数
To-Tag
名为To-Tag的值,后续通过{To-Tag}引用
从接收到的消息获取Via头域的Branch值,并作为
Branch
参数名为Branch的值,后续通过{Branch}引用
从接收到的消息获取From头域的值,并作为参数名
From
为From的值,后续通过{From}引用
从接收到的消息获取T。头域的值,并作为参数名为
To
To的值,后续通过{To}引用
从接收到的消息获取Via头域的值,并作为参数名为
Via
Via的值,后续通过{Via}引用
从接收到的消息获取SDP内容的c行的媒体IP,并
SDP-IP
作为参数名为SDP-IP的值,后续通过{SDP-IP}引用
SDP-AudioPort从接收到的消息获取SDP内容的m行的语音端口,
并作为参数名为SDP-AudioPort的值,后续通过
{SDP-AudioPort}引用
从接收到的消息获取SDP内容的m行的视频端口,
SDP-VideoPort并作为参数名为SDP-VideoPort的值,后续通过
{SDP-VideoPort}引用
从接收到的消息获取Route头域的值,并作为参数名
Route
为Route的值,后续通过{Route}引用
从接收到的消息获取Record-Route头域的值,并作为
Record-Route参数名为Record-Route的值,后续通过{Record-
Route}引用
从接收到的消息获取RSeq头域的值,并作为参数名
RSeq
为RSeq的值,后续通过{RSeq}引用
从接收到的401或407消息获取WWW-Authenticate
realm头域的realm值,并作为参数名为realm的值,后续
通过{realm}引用
从接收到的401或407消息获取WWW-Authenticate
nonce头域的nonce值,并作为参数名为nonce的值,后续
通过{nonce}引用
1.9SIP自动生成与处理的参数
参数名描述
自动生成Call-ID参数的值,作为主叫的Call-ID,发
Call-ID送的消息里将通过{CalLID}引用该值。无需用户配置
该参数列表
自动生成CSeq参数的值,作为主叫的CSeq,发送的
CSeq消息里将通过{CSeq}引用该值。无需用户配置该参
数列表
自动生成From-Tag参数的值,作为主叫的From-
From-TagTag,发送的消息里将通过{From-Tag)引用该值。无
需用户配置该参数列表
自动生成To-Tag参数的值,作为主叫的To-Tag,发
To-Tag送的消息里将通过{To-Tag}引用。无需用户配置该参
数列表
自动生成Branch参数的值,作为主叫的Branch,发
Branch送的消息里将通过{Branch}引用。无需用户配置该参
数列表
用户在Controller启动虚拟IP,则该值与用户配置的
IP对应。如果没使用IP,则工具自动获取系统IP,
From-IP但如果系统存在多IP,可能出错,可以通过手动配
置参数列表解决。
发送的消息里将通过{From-IP}引用
用户在Controller配置的源端口对应。发送的消息里
From-Port
将通过{From-Port}引用
如果在Controller配置“代理之间”的IP,则To-IP
To-IP对应配置的值;否则对应Scripter配置的域名(服务
器),发送的消息里将通过{To-IP}引用
如果在Controller配置“代理之间”的端口,则To-
To-PortPort对应配置的值;否则对应Scripter配置的服务器
端口,发送的消息里将通过{To-Port}引用
对应{From-IP}的值,作为发送消息的SDP的c行里
Media-lP
的媒体IP地址
Media-Port自动设置为43210值
Content-Length工具自动根据发送消息的内容设置该值
注意:
1、上面参数有工具自动生成,可以作为主叫流程替换消息里对应的参数值,而不需要用户在
Scripter界面配置参数列表,减少工作量.如果用户配置了参数列表,则按用户配置覆盖工
具自动生成的值。
2简单的主被叫会话流程
Controller
IAgcrit*>
通过该例子,介绍如何使用工具完成SIP业务测试,及介绍工具的界面使用方法。
操作步骤:
注意:
1.该例子为主叫与被叫直接交互,中间没有经过SIP服务器(IMS),目的只是介绍SIP业务
的操作指导.如果中间有SIP服务器,通过Scripter配置主叫脚本的SIP服务器的IP地址,
另外,不需要通过Controller配置“代理之间”(代理之间表示是两个agent直接交互)
2.1使用抓包工具录制业务
使用wireshark或ethereal工具通过抓包方式(嗅探)录制SIP业务交互流程,然
后保存为以cap或pcap后缀的文件名。
filterExpression...ClearApply
No.TimeSourceDestinationProtocolInfo
10.000000SiP/SDfRequest:INVITEsip:O2O878OOOO2@kylinP£T.com,withsessiondescription
20.010208SIPStatus:180Ringing
31.995964SIPStatus:200OK
41.997352SIPRequest:ACKsip:10.10.10.1:10001
56.997944SIPRequest:BYEsip:10.10.10.1:10001
<1________________________I”___________________________________________________
EthernetII,src:wistronl_18:8b:fl(20:6a:8a:18:8b:fl),Dst:vmware_03:48:d0(00:0c:29:03:48:d0)
EBinternetProtocol,Src:(),Dst:()
2userDatagramProtocol,srcport:scp-config(10001),Dstport:scp-config(10001)
E)sessioninitiationprotocol
土Request-Line:INVITEsip:O2O878OOOO2GkylinPET.comSIP/2.0
曰MessageHeader
via:SIP/2.0/U0P:10001;branch-z9hG4bK0000
call-ID:CAl1Idl0001@
UFrom:<sip:02078700001<3kyl1nP£T.com>;tag-tAgOtO
±iTo:<sip:02087800002©ky1inP£T.com>
iCSeq:1INVITE
7iContact:<sip:02078700001@:10001>
Allow:INVITE,ACK.OPTIONS,BYE.CANCEL,REGISTER,PRACK,SUBSCRIBE,NOTIFY.UPDATE
User-Agent:kylinPET
Supported:lOOrel.precondition
Max-Forwards:70
Content-Length:272
content-Type:appHcatlon/sdp
aMessageBody
sip.cap
注意:
1、手工编辑业务流程工作量大,因此使用抓包方式录制业务交互流程再生成业务脚本,提高
效率。
2、保存文件名及目录只能为英文,而不能为其他语言,如中文
3、kylinPET工具提供过滤功能,因此不需要对抓包进行过滤,但如果UDP报文存在分片时,
需要注意过滤时不能把分片过滤。
2.2Scripter创建主叫流程脚本
2.2.1新建业务脚本
点击“文件”->“新建”或者“工具栏”的“新建”口按钮。
2.2.2录制J设置
点击“工具”->“录制”或者“工具栏”的“录制”画按钮,然后,在弹出
的录制配置窗口选择录制方式为“CapFile”(抓包文件方式),输入过滤规则。
产逋过录制创建脚本流程'
协议:成.........:▼:录制方式:匚apF—▼
文件名:C:\Users\Adiiiixiistrator\Desktop\sip.c^p
过速规则
Protocol:UDP▼
MAC:
用户工P:
端口:二
Call-ID:
确定取消
注意:
1.SIP承载在TCP上时,抓包文件保存时不能只过滤SIP报文,需要把整个TCP交互过程都保存
到文件(SYN-->SYN_ACK->ACK).可通过IP与端口过滤保存业务交互过程
2.2.3产生业务脚本流程
<Start)
SendJ^INVITE
180
CZ5<Bce've2oo
双击“INVITE”查看消息:
率SendDialog
双击“180”查看消息:
注意:
1.Contact-URI表示从Contact头域获取值,可用于后续发送消息替换{URI}
2.To-Tag表示从接收消息获取To头域的Tag值,可用于后续发送消息替换{To-Tag}
发送节点消息如果需要支持每个用户不同的值(参数化),则需要在消息设置参数
名,然后在这里添加该参数名的取值。例如:
RequestOptions
URI:sip:{To-Name}@{domain}
则需要在参数列表配置To-Name与domain参数及它的值。
说明:
1.每个协议工具都提供了默认的参数值(不可见,由工具自动设置,如{From-IP),如果IP
欺骗则不需要配置{From-IP),工具自动根据每个用户的源IP替换它;如果没有启用虚拟
IP,则需要配置{From-IP)参数),这些参数不需要用户在参数列表配置;如果用户需要修
改默认参数值,则在参数列表添加该参数即可覆盖.所以协议默认有:From-IP,From-Port,
To-IP,To-Port;SIP协议还包括Call-ID,From-Tag,To-Tag,Branch,CSeq,Media-IP,Media-
Port;
2.如果发送的消息里面出现有参数没替换(如{domain}),则可能有两种情况:1)该参数需
要在前面的响应消息里获取它的值,则检查是否没配置参数关联或者配置但获取失败;2)
表示该参数没在参数列表配置,需要添加该参数(如domain参数).
3.录制产生的SIP脚本,默认会根据SIP协议流程将某些内容关联为参数,如IP地址
1(X).100.100」关联为{From-IP}参数;另外,接收消息会自动生成获取参数值,如获取To-
Tag参数值(后续主叫流程发送的消息需要包括接收消息里的To-Tag值)
2.2.4编辑脚本流程
1.编辑流程图
(Start>start
Y
Send,INVITE
180
(^Receive|200
Send^^ACK
(^Receive200
2.替换脚本内容为参数(关联参数)
点击“编辑”:"字符串替换为参数”或者“工具栏”的无按钮,弹出窗
口输入参数名。
替换02087800002为From-Name,替换kylinPET.com为domain
件替换字符创为参数(创建参数)I-wn-l
发送消息INVITE替换后:
售SendDialog
请求消息选项
URL|sip:(Io-lTame}e{domain)|导入涧鼠"
域名m|2001方法”口通过查询DBS负载均衡匚外部调用
头域管理
头域值
>IP/2.O/UDP{Fro«-IP}:{Fro®-Port),branch=(Branch)4
(Call-ID)
from<sip:{Fran-ITame}®{domain}/;tag={From-Tag)
Io<sip:{To-Fame}(3{domain)>
:S.q{CStq}IDVIIE
Contact<sip:{Fro«-name}®{From-IP}:(From_Port)>▼
消息体
ff=0
o=kylinPEI456981167617869IHIP4{From-IP}
s=SipTool
c=INIP4{From-IP)
t=00
l*=audio20000RIP/AVP801518101
a=rtpmap:8PCMA/8000
a=rtpmap:0PCMU/8000
a=rtpmap:15G728/8000
a=rtpmap:18G729/8000
a=rtpmap:101telephone-event/8000
a=sendrecv
2.2.5配置参数列表
参数配置可以参照《kylinPET参数配置》文档
参数列表值用于业务模拟时替换对应的参数,实现不同用户不同的参数值。
产参数列表
2.2.6Scripter保存脚本
点击“文件”。“保存”或者“工具栏”的H按钮。如脚本保存为caller.spet
2.3Scripter创建被叫流程脚本
2.3.1新建业务脚本
操作见主叫流程“新建业务脚本”
2.3.2录制设置
点击“工具”“录制”或者“工具栏”的“录制”画按钮,然后,在弹出
的录制配置窗口选择录制方式为“CapFile”(抓包文件方式),输入过滤规则。
,仍通过录制创葬本流程
协议:SIP▼录制方式:CapFile
文件名:C:UsersAdministrator\Desktop\sip.cap
过速规则
;……艇………取消
被叫为
2.3.3产生业务脚本流程
<Start)
^ReceiveINVITE
▼
Send〉180
Send1200
SendJ^)200
双击“INVITE”查看消息:
双击“180”查看消息:
KSendDialog
说明:
1.每个协议工具都提供了默认的参数值(不可见),这些参数不需要用户在参数列表配置;
如果用户需要修改默认参数值,则在参数列表添加该参数即可覆盖.所以协议默认有:
From-IP,From-Port.To-IP,To-Port;SIP协议还包括Call-ID,From-Tag,To-Tag,Branch,CSeq,
Media-IP,Media-Port;
2.如果发送的消息里面出现有参数没替换(如{domain}),则可能有两种情况:1)该参数需
要在前面的响应消息里获取它的值,则检查是否没配置参数关联或者配置但获取失败;2)
表示该参数没在参数列表配置,需要添加该参数(如domain参数)。
3.录制产生的SIP脚本,默认会根据SIP协议流程将某些内容关联为参数,如Via头域,
From头域(协议标准是后面发送的From头域为收到会话的From头域);另外,发送消
息会自动关联参数,如CSeq值自动关联为{CSeq}参数
2.3.4编辑脚本流程
1.编辑流程图
<Start>start
(^ReceiveINVITE
(Receive〔ACK
(^ReceiveJBYE
Send)200
2.替换脚本内容为参数(关联参数)
操作类似录制主叫流程的“编辑脚本流程”
2.3.5配置参数列表
参数配置可以参照《kylinPET参数配置》文档
参数列表值用于业务模拟时替换对应的参数,实现不同用户不同的参数值。
236配置被叫流程使用主动方式(默认不需要)
默认测试场景包括主被叫流程,主叫流程按Controller配置的并发模型运行虚拟
用户,但被叫流程并不按照配置的并发模型运行(工具自动将第一个被叫节点的
超时时间修改为65535秒,且在启动50个被叫流程),而是在主叫流程运行前则
启动50个被叫池(配置被叫池个数参照《kylinPET帮助指导》文档的“463高
级设置”的"other");
如果希望被叫流程按照并发模型运行,即每秒启动多少个被叫用户,则配置“被
动变主动”,但此时需要确保被叫用户在对应的主叫用户前运行。
设置窗口
一般建议不需要勾选“被动变主动”,但如果出现错误日志为主叫没收到被叫响应,
且被叫没收到主叫第一个消息,则可能是被叫启动速率低于主叫并发速率(只在
资源不足情况下才可能发生)。
2.3.7Scripter保存脚本
点击“文件”->“保存”或者“工具栏”的H按钮。如脚本保存为callee.spet
2.4Scripter调试(回放)脚本
点击“工具栏”的零按钮运行脚本,通过日志调试脚本是否正确。虚拟IP的脚
本调试可通过Controller的“调试脚本”实现场景调试。
A■。3修工)比较length=16017
令A为运行按钮,点击运行脚本进行调试
令■为停止按钮,点击停止运行脚本
令》为上一个错误
令以为下一个错误
今为导出日志按钮,如果日志太多,需要查找或过滤(如过滤Error或
Excepiton关键字找出错误日志),可导出到文件,然后通过UE或
NotePad++等软件分享。
令W比较弹出窗口,显示回放||志与录制的比较,不一样内容显示红色,
方便用户快速定位问题,或验证回放是否表示业务执行成功。
令length=16017显示文本区域的内容长度
2)回放日志内容区域
1)红色代表错误或异常
日志内容包含:“Error:"或"Exception:"关键字
2)黑色为业务消息日志
如发送日志或响应日志
3)蓝色为分隔信息或统计信息
令runTime:表示整个脚本运行时间
令requests:请求(发送)消息个数
<responses:响应(接收)消息个数
令throughput:吞吐量
令Transaction:脚本中事务统计
令responsecode:响应码统计
2.5回放与录制日志比较验证业务是否执行成功
回放与录制11志比较也可以作为关联参数的一种方式,关联参数可以参照
《kylinPET关联参数》文档;
同时,当脚本出问题时,可以用来定位问题。
如果脚本是通过录制创建的,点击回放窗口的书比较按钮,弹出比较窗口。
2.5.1背景
1)脚本回放成功,但实际没有成功。而导致测试无效,对于性能经验不足的测试
人员经常发生这样的事情。
例:由于获取call-id失败,导致后面发送的SIP携带错误的call-id导致服务器
处理失败,但仍然回复正常的响应码,导致测试工具认为成功(没有设置检查
点情况)。
2)脚本回放失败,但是不知道是什么原因导致,而不会配置脚本或花很长时间解
决问题
例:测试工具提交数据或参数,但服务器回复400或500等错误响应,需要测
试人员定位提交数据是否错误,可能是由于编解码配置错误导致,经验不足的
测试人员往往花费很长时间解决问题。
面,这点跟前面的图片不一样。
2.5.2回放与录制比较窗口
M.录制长度=13102回放长度=15156不f*22
«T/4aHTTP"0074KTTP/11
Accept•/•Accept
Accept-L*a<a«f«thrcnMcept-Lta^uag。ih-cn
Us«r-Ac«ntMotillV40(cflibl,BSIE60.Win4»«<IT5t.SV1;(nwb6€00.VUs«r-A4«ntNonlla/40(cc*»»Ubl«;ISIE60.YiaiotnVT5I.SV1.rnvb6«00.
Kost19216812:8080Host192168128080
KTTP/11302>»v«dT«r>p«r*rilyKTTP/l1302R»v«dT«npar«rily
S«rv«rAp»ch«~Coyot«/11S«rv・r^*ch«~Cojr»t«/lt
L«c«livnhttp/Zt92166126060/出in/Uc«t>«n//I92168I28060/Mn/
DatoSat.Illay201303:42:41(3KTr*asf«r-£a.cod:a{chaakad
C»nn«cli4ncl«>«DMtS3.IIRty2013II5600-3MT
GIT/Uma/MTT?/l0由147WT?/tI
Accept•/•Ace«pt•/•
Aecept-Ltatut4«drcftAcc«pi-L*aci*c«rh~cn
Us«r-Ac«ntHo<iU«/4.0KIZ6.0.YindoxIT51.SV1;mb6£00.ICUs«r-M»t0(c<*p*tibl«;KSIE60;V>a4ovsIT51.SV1,wb6600;
K«i1192168128000K«st192168126080
xnr/ii200OKHTTP“I200OK
ServerA^*che~€o)rote/1.1Server.林<che-Coyote/1.1
Tr*<>»*N«-CTCIMPr«c>**Ko-c“b・
Cache-Control:ao-c0cheCache-Controlno-cache
IxpirttTira.OiJg1770080000CSTExpirehq01Jg19T0060000CST
S«t-C»oki«JSKSIOIID=I588M294TOCAC72SH262I»B7B993*2P3/4SS«t-C*oki«JSKSIOIID=157;k8C3BCC336DF696FreiBS50074801FtO=/*^>in
CMitent-Typ*tut/hVnl;eb«rt«t:utf~8Ceatuit-Typtt«xt/htnl.eh«rs«t=ntf-6
C«am”L«&cth26292629
Dtt«Sat,11lay201303:4241(XTD«t«Sat,11l«y2013115800GMT
C«tui«etion
按钮介绍
修。G录制长度=13102回放长度=15156不同个数=22
令V为上一个差异
令-为下一个差异
令修为导出当前比较窗口的回放日志按钮,可।J后血controller调试导出
日志进行比较,验证正常执行时业务是否成功。
令录制长度=13102,左边为录制内容,显示录制内容的长度
令回放长度=15156,右边为回放内容,显示回放内容的长度
令不同个数=22显示录制与回放内容的不同总数
2)内容区域
M/«<hinKHP/10
GETKHP/I1
Acc«pt:Accept♦/♦
Accept-Lan^oage:zh-cnAccept-Langaage:zh-cn
Us«r-A(«ntNozilla/40(co«p*tibl«.USIl60.WindovsMT51.SV1.zn«b6600.NUs«r**A(«ntlozillt/M0(coap*tibl«.HSIE60.VindowsNT*
Host:1921681.28080Host19216812:8080
HTTP/1.1302lov«dT««poru*ilyKTTP/1.1302lovedT«apor«rxly
Server.Apach«-Coyot«/l.1Server:Aj>ache-Coyot«/l.1
Location:http://1921681.28080/t<bin/Locationhttp://1921681.28080/td»in/
D«t«:S3,11May201303<241G«TTrtnsf«r-Encodincchunked
ConnectioncloseDateSat,11Iky201311:58:00GMT
红色代表不同之处
黑色代表相同
代表录制不存在该资源,但回放有该资源(工具自动识别内嵌资源)
3)比较内容
最下面的比较内容
录制(16):GET/admin/HTTP/1.0
回放(16):〔GET/admin/KTTP/1.1
当选择录制或回放某•行内容忖,将在这里显示录制与回放对应的行,以便
比较。
2.6Controller创建测试场景
2.6.1创建执行代理器
点击“工具”,“执行代理器”或者“工具栏”的J按钮,添加执行代理器
叵EmZA■•尸w
产代理器
名称IP地址端口状态
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026上海对外经贸大学财务处会计招聘备考题库及答案详解1套
- 2025广西钦州市北部湾职业技术学校招聘历史、地理、物理和化学类教师5人备考题库及参考答案详解
- 2026中铁四局集团有限公司招聘备考题库完整参考答案详解
- 2026年湖南邵阳邵阳县社会工作事务中心选调1人备考题库及完整答案详解
- 2026内蒙古赤峰市宁城县八里罕中学招聘公益性岗位人员1人备考题库及答案详解参考
- 2025广西北海市海城区创建全国文明城市工作指挥部办公室招聘编外工作人员2人备考题库及参考答案详解一套
- 2025河南医学高等专科学校招聘高层次人才2人备考题库及答案详解(夺冠系列)
- 2026年度商丘市市直机关遴选公务员15人备考题库及完整答案详解1套
- 2026国家汇添富基金招聘备考题库有答案详解
- 2026年1月浙江嘉兴市海宁市教育系统事业单位招聘教师90人备考题库及一套参考答案详解
- 2025年重庆高考高职分类考试中职语文试卷真题(含答案详解)
- 电商预算表格财务模板全年计划表格-做账实操
- 委托付款管理办法
- 煤矿后勤管理办法
- 《英耀篇》全文文档
- 中职数学高等教育出版社
- ab股权协议书范本
- 工程造价审计服务投标方案(技术方案)
- 蟹苗买卖合同协议
- 胸外科手术围手术期的护理
- 科技领域安全风险评估及保障措施
评论
0/150
提交评论