信令传送协议-SCTP协议解析_第1页
信令传送协议-SCTP协议解析_第2页
信令传送协议-SCTP协议解析_第3页
信令传送协议-SCTP协议解析_第4页
信令传送协议-SCTP协议解析_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

信令传送协议-SCTP协议解析SCTP是传送协议,⼀种可靠的传输协议,提供类似于TCP提供的服务。⼀⽅⾯SCTP要完成对等层偶联的管理,另⼀⽅⾯要完成应⽤数据的承载。我们可以理解为SCTP对等层之间的控制协议能⼒和⽤于数据承载协议的能⼒。SCTP协议虽然SCTP协议包含承载能⼒和控制能⼒,SCTP协议的数据报⽂仍然采⽤统⼀的结构。我们来看看SCTP通⽤头格式和SCTP数据单元。Wireshark抓包SCTPSCTP数据报⽂结构由统⼀的SCTP公共消息头和后继的⼀个或者多个SCTP数据单元(SCTPChunk)组成。对于Wireshark抓取的SCTP数据报⽂,公共消息头包含以下四个字段:源端⼝(SourcePort):⽤于描述⽬标端点的端⼝号。⽬标端⼝(DestinationPort):⽤于描述⽬标端点的端⼝号。验证字(VerificationTag):⽤于标识数据的发送者。校验和(Checksum):⽤于校验消息内容是否在传送中有损坏。校验和的取值为Checksum字段取值为0时的数据报⽂执⾏CRC32c计算的结果。每⼀个数据单元(Chunk)代表⼀条SCTP的控制协议指令,或者SCTP承载的⽤户数据的⽚段。数据单元由统⼀的数据单元消息头和⽤户数据组成,数据单元消息头有以下三个字段:数据单元类型(ChunkType):数据单元类型标识了该数据单元所携带的⽤户数据类型,SCTP将按照数据单元类型构造和解析数据单元携带的⽤户数据。数据单元标识(ChunkFlags):取值与数据单元类型相关。数据单元的长度(ChunkLength):数据单元长度是包括类型、标识的数据单元的总长度。SCTP数据单元类型对于数据单元类型,可以分为两个类型,数据传送消息和管理类消息。1.数据传送类型数据单元类型取值(0):PayloadData(DATA)⽤于SCTP⽤户数据的承载,承载数据的发送请求数据单元类型取值(3):SelectiveAcknowledgement(SACK)⽤于对DATA请求发送的数据单元进⾏请求,以表明是否正确发送到⽬标端2.管理类消息数据单元类型取值(1):Initiation(INIT)⽤于发起SCTP建⽴请求数据单元类型取值(2):InitiationAcknowledgement(INITACK)SCTP偶联建⽴应答数据单元类型取值(4):HeartbeatRequest(HEARTBEAT)⼼跳检查请求数据单元类型取值(5):HeartbeatAcknowledgement(HEARTBEATACK)⼼跳检查应答数据单元类型取值(6):Abort(ABORT)⽴即关闭偶联通知数据单元类型取值(7):Shutdown(SHUTDOWN)正常关闭偶联通知数据单元类型取值(8):ShutdownAcknowledgement(SHUTDOWNACK)关闭偶联应答数据单元类型取值(9):OperationError(ERROR)操作错误通知数据单元类型取值(10):StateCookie(COOKIEECHO)Cookie验证请求数据单元类型取值(11):CookieAcknowledgement(COOKIEACK)Cookie验证应答数据单元类型取值(12):ReservedforExplicitCongestionNotificationEcho(ECNE)为明确拥塞通知响应(ECNE)预留数据单元类型取值(13):ReservedforCongestionWindowReduced(CWR)为降低拥塞窗⼝(CWR)预留数据单元类型取值(14):ShutdownComplete(SHUTDOWNCOMPLETE)偶联关闭完成DATA数据单元结构定义DATA数据单元定义如下图所⽰:Wireshark抓包分析:数据单元类型取值固定为0,对于U、B、E可以简单这样理解。U如果置位则代表这个数据单元是⼀个要求顺序的数据单元。B如果置位则代表这个要求顺序的数据单元是第⼀个数据单元。E如果置位则代表这个要求顺序的单元是最后⼀个单元。传送序号(TSN)是⼀个32bit序列号,是该数据单元在整个SCTP传送过程中的唯⼀标识,接收端将基于TSN数据单元进⾏证实。流标识(SI:StreamIdentifier)是数据单元所使⽤的流编号流内序号(StreamSequenceNumber)是数据单元所使⽤的流内序号,接收端将基于SSN判断所接收到的数据报⽂顺序,完成数据单元所使⽤的流编号。净荷协议标识(PayloadProtocolIdentifier)是数据单元所携带的净荷内容的类型标识,由于SCTP承载的⽤户数据是信令,因此这个净荷协议标识指的是所承载的协议。净荷内容是变长的,是承载的应⽤协议具体内容。INIT数据单元结构定义偶联建⽴请求的数据单元结构定义如下:这⾥需要注意的是,只有INIT数据单元的验证字(VerficationTag)可以取值为0,其他请求都需要携带正确的验证字,否则接收端可能会拒绝处理。Wireshark抓包分析:INIT请求数据单元类型取值固定1初始验证字(InitiateTag)⽤于设置向本端点发送的数据报⽂所要携带的验证字接收窗⼝(AdvertisedReceiverWindowCredit(a_rwnd))⽤于设置本端发送数据报⽂的时候建议的数据发送窗⼝⼤⼩。发送流数量(NumberofOutboundStreams)⽤于设置发送的流数量接收流数量(NumberofInboundStreams)⽤于设置接收的流数量初始TSN(InitialTSN)⽤于设置接收到的第⼀条DATA消息的TSN取值。INIT可以携带多种可选参数,每个可选参数都由可选参数类型和可选参数长度组成的可选参数头和可选参数内容组成。#defineSCTP_DATA_CHUNK_ID#defineSCTP_INIT_CHUNK_ID01#defineSCTP_INIT_ACK_CHUNK_ID#defineSCTP_SACK_CHUNK_ID#defineSCTP_HEARTBEAT_CHUNK_ID234#defineSCTP_HEARTBEAT_ACK_CHUNK_ID5#defineSCTP_ABORT_CHUNK_ID6#defineSCTP_SHUTDOWN_CHUNK_ID7#defineSCTP_SHUTDOWN_ACK_CHUNK_ID8#defineSCTP_ERROR_CHUNK_ID9#defineSCTP_COOKIE_ECHO_CHUNK_ID#defineSCTP_COOKIE_ACK_CHUNK_ID1011#defineSCTP_ECNE_CHUNK_ID#defineSCTP_CWR_CHUNK_ID1213#defineSCTP_SHUTDOWN_COMPLETE_CHUNK_ID14#defineSCTP_AUTH_CHUNK_ID#defineSCTP_NR_SACK_CHUNK_ID#defineSCTP_I_DATA_CHUNK_ID15160x400x800x810x820x84#defineSCTP_ASCONF_ACK_CHUNK_ID#defineSCTP_PKTDROP_CHUNK_ID#defineSCTP_RE_CONFIG_CHUNK_ID#defineSCTP_PAD_CHUNK_ID#defineSCTP_FORWARD_TSN_CHUNK_ID0xC0#defineSCTP_ASCONF_CHUNK_ID#defineSCTP_I_FORWARD_TSN_CHUNK_ID0xC2#defineSCTP_IETF_EXT0xC10xFF#defineHEARTBEAT_INFO_PARAMETER_ID#defineIPV4ADDRESS_PARAMETER_ID#defineIPV6ADDRESS_PARAMETER_ID#defineSTATE_COOKIE_PARAMETER_ID#defineUNREC_PARA_PARAMETER_ID#defineCOOKIE_PRESERVATIVE_PARAMETER_ID#defineHOSTNAME_ADDRESS_PARAMETER_ID0x00010x00050x00060x00070x00080x00090x000b0x000c#defineSUPPORTED_ADDRESS_TYPES_PARAMETER_ID#defineOUTGOING_SSN_RESET_REQUEST_PARAMETER_ID0x000d#defineINCOMING_SSN_RESET_REQUEST_PARAMETER_ID0x000e#defineSSN_TSN_RESET_REQUEST_PARAMETER_ID0x000f#defineRE_CONFIGURATION_RESPONSE_PARAMETER_ID0x0010#defineADD_OUTGOING_STREAMS_REQUEST_PARAMETER_ID0x0011#defineADD_INCOMING_STREAMS_REQUEST_PARAMETER_ID0x0012#defineECN_PARAMETER_ID0x8000#defineNONCE_SUPPORTED_PARAMETER_ID#defineRANDOM_PARAMETER_ID0x80010x80020x8003#defineCHUNKS_PARAMETER_ID#defineHMAC_ALGO_PARAMETER_ID0x8004#defineSUPPORTED_EXTENSIONS_PARAMETER_ID#defineFORWARD_TSN_SUPPORTED_PARAMETER_ID0x80080xC000#defineADD_IP_ADDRESS_PARAMETER_ID#defineDEL_IP_ADDRESS_PARAMETER_ID0xC0010xC002#defineERROR_CAUSE_INDICATION_PARAMETER_ID#defineSET_PRIMARY_ADDRESS_PARAMETER_ID0xC0030xC004#defineSUCCESS_REPORT_PARAMETER_ID0xC005#defineADAP_LAYER_INDICATION_PARAMETER_ID0xC006structchunk{u_charu_charu_shorttype;flags;length;};structmy_sctphdr{/*Thedatatypes/sizesweneedtouseare:unsignedchar-1byte(8bits),unsignedshortint-2bytes(16bits)andunsignedint-4bytes(32bits)*/u_shortsport;u_shortdport;unsignedintunsignedintveriftag;checksum;//chunkfollowsstructchunkchnk;};voiddissect_init_ack_chunk(u_char*sctp_data,intoffset,intchunk_length){intadv_rec_window_credit=0;uint16_tnumber_of_outbound_streams=0;uint16_tnumber_of_inbound_streams=0;intlength=0;uint16_ttype=0;in_addrip;if(chunk_length<INIT_CHUNK_FIXED_PARAMTERS_LENGTH)return;offset+=INIT_CHUNK_INITIATE_TAG_LENGTH;adv_rec_window_credit=ntohl(*(uint32_t*)(sctp_data+offset));printf("Advertisedreceiverwindowcredit(a_rwnd):%d\n",adv_rec_window_credit);offset+=INIT_CHUNK_ADV_REC_WINDOW_CREDIT_LENGTH;number_of_outbound_streams=ntohs(*(uint16_t*)(sctp_data+offset));printf("Outboundstreams:%d\n",number_of_outbound_streams);offset+=INIT_CHUNK_NUMBER_OF_OUTBOUND_STREAMS_LENGTH;number_of_inbound_streams=ntohs(*(uint16_t*)(sctp_data+offset));printf("inboundstreams:%d\n",number_of_inbound_streams);offset+=INIT_CHUNK_NUMBER_OF_INBOUND_STREAMS_LENGTH;offset+=INIT_CHUNK_INITIAL_TSN_LENGTH;while(offset<chunk_length){type=ntohs(*(uint16_t*)(sctp_data+offset));//printf("type:%x\n",type);offset+=PARAMETER_TYPE_LENGTH;length=ntohs(*(uint16_t*)(sctp_data+offset));if(type==SUPPORTED_ADDRESS_TYPES_PARAMETER_ID)offset+=8;switch(type){caseIPV4ADDRESS_PARAMETER_ID:caseIPV4ADDRESS_PARAMETER_ID:printf("----ipv4------\n");//printf("%x%x%x%x\n",sctp_data[offset],sctp_data[offset+1],sctp_data[offset+2],sctp_data[offset+3]);offset+=2;memcpy(&ip.s_addr,sctp_data+offset,sizeof(ip.s_addr));printf("IPv4addressparameter:%s\n",inet_ntoa(ip));break;default:break;}}offset+=length;}voiddissect_sctp(u_char*sctp_data,intoffset){structmy_sctphdrsctp_packet;uint16_ttotal_length=0;printf("sctp_data0x%.2X,0x%.2X,0x%.2X,0x%.2X,0x%.2X\n",sctp_data[0],sctp_data[1],sctp_data[2],sctp_data[3],sctp_data[4]);sctp_packet.sport=ntohs(*(uint16_t*)(sctp_data+offset));printf("sport:%d\n",sctp_packet.sport);offset+=SOURCE_PORT_LENGTH;sctp_packet.dport=ntohs(*(uint16_t*)(sctp_data+offset));printf("dport:%d\n",sctp_packet.dport);offset+=DESTINATION_PORT_LENGTH;sctp_packet.veriftag=ntohl(*(uint32_t*)(sctp_data+offset));printf("vtag:0x%x\n",sctp_packet.veriftag);offset+=VERIFICATION_TAG_LENGTH;sctp_packet.checksum=ntohl(*(uint32_t*)(sctp_data+offset));printf("vtag:0x%x\n",sctp_packet.checksum);offset+=CHECKSUM_LENGTH;if(offset<12)/*不能⼩于SCTP头长度*/return;sctp_packet.chnk.type=sctp_data[offset];printf("type:%d\n",sctp_packet.chnk.type);offset+=CHUNK_TYPE_LENGTH;sctp_packet.chnk.flags=sctp_data[offset];offset+=CHUNK_FLAGS_LENGTH;/*提取块长度并计算填充字节数*/sctp_packet.chnk.length=ntohs(*(uint16_t*)(sctp_data+offset));printf("length:%d\n",sctp_packet.chnk.length);//total_length=ADD_PADDING(sctp_packet.chnk.length);//printf("total_length:%d\n",total_length);offset+=CHUNK_LENGTH_LENGTH;switch(sctp_packet.chnk.type){caseSCTP_INIT_CHUNK_ID:printf("===SCTP_INIT_CHUNK_ID===\n");dissect_init_ack_chunk(sctp_data,offset,sctp_packet.chnk.length);break;default:/*unknownchunk*/break;}}}运⾏结果在建⽴SCTP偶联连接过程中,当服务接收到客户端发起的INIT请求,会建⽴SCTP数据结构,保存对端的端⼝、本地端⼝、对端验证字、本地验证字、发送流数量、接收流的数量等等。数据单元的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论