Ethereal-dev: Re: [Ethereal-dev] Heuristic decode of RTP packets
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Guy Harris <gharris@xxxxxxxxx>
Date: Thu, 1 Jul 2004 00:24:02 -0700
On Wed, Jun 30, 2004 at 11:59:45PM -0700, Guy Harris wrote: > On Wed, Jun 30, 2004 at 07:04:45PM +0200, Ruud Linders wrote: > > Here is an updated patch, it is against last night's (2004-06-30) tar file. > > Checked in. Here's some mail from Ethereal lists discussing heuristics for recognizing RTP, some of which mention additional tests that *might* strengthen the heuristics enough to make them the default (or perhaps they're strong enough now). RTCP is also mentioned. From: andreas.sikkema@xxxxxxxxxxx To: ethereal-dev@xxxxxxxxxxxx Subject: [Ethereal-dev] Re: [Ethereal-users] How to make ethereal recognise RTP,RTCP,SCTP over UDP Date: Thu, 27 Jun 2002 09:22:34 +0200 > RTP and RTCP don't have standard port numbers, and nobody's figured out > any heuristic to guess whether a UDP packet is an RTP or RTCP packet or > not; Hmm, I was just thinking, - Check if the version is in the correct range (0-3 or something) - Check if the length of the received UDP data is the same as the length the RTP/RTCP message says it is - For RTP you could also check if the mediatype is in the correct range. - For RTCP you could check if walking the SSRC parts ends up at the end of the message (or at the start of padding) - Check if the padding stuff also matches? This one I'm not sure about. This is all from the head, no RFC on hand at the moment, so.... But I don't have enough experience with heuristics to be able to predict how precise this is. -- Andreas Sikkema andreas.sikkema@xxxxxxxxxxx "While you're waiting, read the free novel we sent you. It's a Spanish story about a guy named `Manual'" - Dilbert _______________________________________________ Ethereal-dev mailing list Ethereal-dev@xxxxxxxxxxxx http://www.ethereal.com/mailman/listinfo/ethereal-dev From: Feyaerts Johan <Johan.Feyaerts@xxxxxxxxxxxxxxx> To: "'andreas.sikkema@xxxxxxxxxxx'" <andreas.sikkema@xxxxxxxxxxx> Cc: ethereal-dev@xxxxxxxxxxxx Subject: RE: [Ethereal-dev] Re: [Ethereal-users] How to make ethereal reco gnise RTP,RTCP,SCTP over UDP Date: Thu, 27 Jun 2002 09:30:36 +0200 I think the RFC also say somewhere that RTP runs on an even and RTCP on an odd port number one higher than the RTP stream. (most implementations follow this standard) Checking sequence numbers that increase may also help but you'd have to look at more than 1 packet then. It is possible to detect RTP/RTCP by means of heurisics. The Terayon Highlink router (former radwiz) does it via some proprietary algorithm in real time. So I think it should be possible to do a similar thing offline in ethereal. _______________________________________________ Ethereal-dev mailing list Ethereal-dev@xxxxxxxxxxxx http://www.ethereal.com/mailman/listinfo/ethereal-dev Subject: RE: [Ethereal-dev] Re: [Ethereal-users] How to make ethereal reco gnise RTP,RTCP,SCTP over UDP From: Ed Warnicke <hagbard@xxxxxxxxxxxxxxxxxxx> To: Feyaerts Johan <Johan.Feyaerts@xxxxxxxxxxxxxxx> Cc: "'andreas.sikkema@xxxxxxxxxxx'" <andreas.sikkema@xxxxxxxxxxx>, ethereal-dev@xxxxxxxxxxxx Date: 27 Jun 2002 09:02:48 -0400 You can't count on the RTP odd port RTCP even port as part of a=20 heuristic. There are a LOT of RTP implementations that have decided that RTCP isn't really necessary ( I happen to believe this means their=20 broken, but it gets done a lot ). Also I seem to recall discussion=20 floating around about allowing the specification of port for RTCP=20 which are not the next port after the RTP traffic. =20 This Terayon Highlink router... are you sure it is recognizing the=20 RTP via a heuristic and not just watching the signalling traffic ( H323, MGCP, SIP, RTSP etc ) to determine where to look? Ed On Thu, 2002-06-27 at 03:30, Feyaerts Johan wrote: > > > I think the RFC also say somewhere that RTP runs on an even and RTCP on an > odd port number one higher than the RTP stream. (most implementations follow > this standard) > Checking sequence numbers that increase may also help but you'd have to look > at more than 1 packet then. > > > It is possible to detect RTP/RTCP by means of heurisics. The Terayon > Highlink router (former radwiz) does it via some proprietary algorithm in > real time. So I think it should be possible to do a similar thing offline > in ethereal. _______________________________________________ Ethereal-dev mailing list Ethereal-dev@xxxxxxxxxxxx http://www.ethereal.com/mailman/listinfo/ethereal-dev From: Feyaerts Johan <Johan.Feyaerts@xxxxxxxxxxxxxxx> To: "'Ed Warnicke'" <hagbard@xxxxxxxxxxxxxxxxxxx> Cc: "'ethereal-dev@xxxxxxxxxxxx'" <ethereal-dev@xxxxxxxxxxxx> Subject: RE: [Ethereal-dev] Re: [Ethereal-users] How to make ethereal reco gnise RTP,RTCP,SCTP over UDP Date: Fri, 28 Jun 2002 09:28:12 +0200 I'm almost sure the router works via pure RTP heuristics because they claimed independence of the signaling protocol. I don't know what heuristic they used but it worked quite well when I did some tests in the lab. They certainly do not look deep into the signaling messages like e.g. a packeteer box does. Looking at the standard H.323 and SIP ports for presence of signalling messages may also be used as an additional check for detecting RTP, but I don't think that's really necessary. > You can't count on the RTP odd port RTCP even port as part of a > heuristic. There are a LOT of RTP implementations that have decided > that RTCP isn't really necessary ( I happen to believe this > means their > broken, but it gets done a lot ). If they claim standard compliancy they can only use even ports on RTP. I know some of the old radvision stacks were not compliant. Probably you're right that RTCP cannot be used because the standards give a lot of freedom to when to send RTCP to the implementors. Some may indeed not even bother about sending RTCP. If you want to use the presence of RCTP packets for the heuristic it probably would be good to have a switch to disable this check. Same probably applies for even RTP port numbers. > Also I seem to recall discussion > floating around about allowing the specification of port for RTCP > which are not the next port after the RTP traffic. > > > _______________________________________________ Ethereal-dev mailing list Ethereal-dev@xxxxxxxxxxxx http://www.ethereal.com/mailman/listinfo/ethereal-dev From: "Martin Regner" <martin.regner@xxxxxxxxx> To: "Ubaldi Fabio" <ubaldi@xxxxxxxxxx> Cc: <ethereal-users@xxxxxxxxxxxx> Subject: Re: [Ethereal-users] RTP implementation by Ethereal Date: Mon, 31 Mar 2003 20:15:20 +0200 Ubaldi Fabio wrote: <I am using Ethereal (version 0.9.9) to capture packets from a video streaming transmission on the <client side. The streaming server is the Darwin one, and the player is QuickTime. <I'd like to know your opinion about the fact that Ethereal cannot display RTP/RTSP packets < (embedded in UDP packets), even if such protocols are enabled on the server side and inside Ethereal. http://www.ethereal.com/faq.html#q5.21 Ethereal should recognize RTSP packets if they are sent on tcp port 554. It seems that Ethereal doesn't support RTSP over UDP. Ethereal may decode RTP/RTCP packets automatically if it sees the RTSP/SDP messages (or H.323 signalling in case of H.323 traffic). Otherwise you normally have to select one of those packages and use the menu item "Decode As..." and select RTP as protocol (or RTCP). I'm a bit tired on this, so I have written a plugin that does some heuristic checks on UDP packets and calls the RTP/RTCP dissectors for packets that meets certain heuristics: -Only packets with version bits equal to RTP version 2 are considered as possible RTP/RTCP packets. -It is configurable if only RTP packets with CSRC counter value 0 shall be considered or if other values also should be considered. -It is configurable if only packets without Extension Header shall be considered or if also packets with Extension header should be considered. -It is configurable if only RTP packets on even port numbers should be considered, and odd port numbers for RTCP. -Source and destination port values should be in certain ranges (configurable from preferences). -RTP Payload should have certain values (configurable as a string "0;8;31;34;"). -The payload size should have certain normal values for e.g. G.711, GSM and G.723.1 (this check is possible to turn-off). -It is also possible to configure a list of ip-address that will need to match source and/or destination. -For RTCP packets there are some more heuristic checks that can be done. -The huristic dissection is possible to turn off with a preference setting. I will send the source code to the list when I have added some more checks, cleaned the code up a bit and tested it more. Is there someone that has some more ideas of how to do heuristic checks on certain payloads or similar? <I have just written an e-mail few seconds ago about RTP support by Ethereal. <I forgot an important detail: I am doing streaming using MPEG-4 coding, and <RTP version is done according to RFC 3016. The MPEG-4 payload will however not be decoded. There is no MPEG4 dissector in Ethereal. MPEG-4 is a dynamic payload so it's probably not possible to determine that it is MPEG-4 by just looking at the RTP packets. It could however be possible to determine this from the RTSP/SDP messages, but currently this information is not passed to the RTP dissector (but I guess it could be done in some way). _______________________________________________ Ethereal-users mailing list Ethereal-users@xxxxxxxxxxxx http://www.ethereal.com/mailman/listinfo/ethereal-users From: Guy Harris <guy@xxxxxxxxxxxx> Subject: Re: [Ethereal-users] How do I decode RTP ? Date: Thu, 28 Aug 2003 11:21:11 -0700 To: Chet Seligman <cseligman@xxxxxxxxxxxxx> Cc: ethereal-users@xxxxxxxxxxxx On Thursday, August 28, 2003, at 8:13 AM, Chet Seligman wrote: > I have captured a few VoIP calls and the decode only shows them to be > UDP. > I have done a "decode as" and selected a pair of ports as RTP (they > probably > are but I'm not certain) and I get a decode. > > Is this the proper methodology? > > Is there a way to get ethereal to recognize which packets are RTP and > without me knowing what ports are involved? http://www.ethereal.com/faq.html#q5.26 If somebody can come up with a "good" heuristic to implement 2) from the list in that FAQ, where "good" means "recognizes as many RTP packets as possible as being RTP *AND* mis-recognizes as *FEW* *NON*-RTP packets as possible as being RTP even though they aren't", we could add that to the RTP dissector. Unfortunately, the "(they probably are but I'm not certain)" suggests that it wasn't obvious to you, from looking at the packet, whether it was RTP; if it's hard for a human to figure that out, it might be hard for a computer to do it as well.... There don't seem to be a lot of fields in the RTP fixed header that would always have the same value, or a value within a given range. There's the "V" field, although that's only 2 bits, so other packets might well have binary 10 in those two bits, and there's the "PT" field, for which we could require that it be a *known* payload type. Ethereal heuristics have to look at the packet in isolation (a cross-packet heuristic would be much more complicated - we'd have to implement some sort of "look-ahead", but, in the general case, I'm not sure you can implement a form of look-ahead that could recognize packets as being UDP and thus potential RTP packets without having to dissect those packets, in which case we'd have to worry about that dissection affecting packet state), so the sequence number doesn't seem to be usable. _______________________________________________ Ethereal-users mailing list Ethereal-users@xxxxxxxxxxxx http://www.ethereal.com/mailman/listinfo/ethereal-users From: "Chet Seligman" <cseligman@xxxxxxxxxxxxx> To: "Guy Harris" <guy@xxxxxxxxxxxx> Subject: RE: [Ethereal-users] How do I decode RTP ? Date: Thu, 28 Aug 2003 11:50:15 -0700 Cc: ethereal-users@xxxxxxxxxxxx Every RTP packet should have a payload type that lists the codec used. In my case it would be G.729A or G.711, there are 3 or 4 other common ones After I guessed which ports were used by RTP, I examined the decodes and saw the G.729 payload - that's how I knew I was correct. What I didn't know was whether I got all the packets. Not getting all packet makes jitter measurements not terribly meaningful. You speak of a "look-ahead" - could that be where the payload type is used? BTW: Agilent Advisor and Radcom can identify RTP & RTCP without human help - I don't know how they do it. From: Guy Harris <guy@xxxxxxxxxxxx> Subject: Re: [Ethereal-users] How do I decode RTP ? Date: Thu, 28 Aug 2003 12:14:34 -0700 To: Chet Seligman <cseligman@xxxxxxxxxxxxx> Cc: ethereal-users@xxxxxxxxxxxx On Thursday, August 28, 2003, at 11:50 AM, Chet Seligman wrote: > Every RTP packet should have a payload type that lists the codec used. Yes, that's what I said: > There's the "V" field, although that's only 2 bits, so other packets > might well have binary 10 in those two bits, and there's the "PT" > field, for which we could require that it be a *known* payload type. Perhaps checking for "V" being 2, and the payload type being one of the values in the "rtp_payload_type_vals[]" table, would be a sufficiently-strong heuristic, accepting few, if any, non-RTP packets. (It means that we wouldn't recognize packets with a payload type we don't yet know about, but that's life.) > After I guessed which ports were used by RTP, I examined the decodes > and saw > the G.729 payload - that's how I knew I was correct. What I didn't > know was > whether I got all the packets. Not getting all packet makes jitter > measurements not terribly meaningful. There's not much Ethereal can do about that, other than recognizing sequence number gaps. > You speak of a "look-ahead" - could that be where the payload type is > used? "Could" in what sense? It's not where we use it, as we don't have any heuristics, much less ones involving look-ahead. I don't know whether any of the dissectors that recognize RTP and RTCP without human help *AND* without seeing session setup packets (which, for at least some protocols, Ethereal dissects *and* uses to identify subsequent packets as RTP) use look-ahead or not. The payload type could be used without look-ahead if you just check for a known value. It could also be used *if* look-ahead were done, by checking to make sure it's the same in the later packets. Note, however, that using the sequence number in a look-ahead scheme would require a "window" so that we don't get confused by lost packets, i.e. look for the N+1'st packet in that UDP stream having a sequence number no more than W greater than the Nth packet. However, as far as I know, doing a look-ahead scheme would be very difficult, perhaps impossible; I don't plan to spend any time looking into it (I don't have the time to do so). > BTW: Agilent Advisor and Radcom can identify RTP & RTCP without human > help - > I don't know how they do it. I'm aware that several analyzers do it. That doesn't mean it's necessarily easy to figure out a good way to do it - maybe they do something simple that's easy to figure out, maybe they do something simple that was *hard* to figure out but easy to implement, and maybe they do something that's hard to implement. _______________________________________________ Ethereal-users mailing list Ethereal-users@xxxxxxxxxxxx http://www.ethereal.com/mailman/listinfo/ethereal-users From: Guy Harris <guy@xxxxxxxxxxxx> Subject: Re: [Ethereal-users] How do I decode RTP ? Date: Thu, 28 Aug 2003 11:21:11 -0700 To: Chet Seligman <cseligman@xxxxxxxxxxxxx> Cc: ethereal-users@xxxxxxxxxxxx On Thursday, August 28, 2003, at 8:13 AM, Chet Seligman wrote: > I have captured a few VoIP calls and the decode only shows them to be > UDP. > I have done a "decode as" and selected a pair of ports as RTP (they > probably > are but I'm not certain) and I get a decode. > > Is this the proper methodology? > > Is there a way to get ethereal to recognize which packets are RTP and > without me knowing what ports are involved? http://www.ethereal.com/faq.html#q5.26 If somebody can come up with a "good" heuristic to implement 2) from the list in that FAQ, where "good" means "recognizes as many RTP packets as possible as being RTP *AND* mis-recognizes as *FEW* *NON*-RTP packets as possible as being RTP even though they aren't", we could add that to the RTP dissector. Unfortunately, the "(they probably are but I'm not certain)" suggests that it wasn't obvious to you, from looking at the packet, whether it was RTP; if it's hard for a human to figure that out, it might be hard for a computer to do it as well.... There don't seem to be a lot of fields in the RTP fixed header that would always have the same value, or a value within a given range. There's the "V" field, although that's only 2 bits, so other packets might well have binary 10 in those two bits, and there's the "PT" field, for which we could require that it be a *known* payload type. Ethereal heuristics have to look at the packet in isolation (a cross-packet heuristic would be much more complicated - we'd have to implement some sort of "look-ahead", but, in the general case, I'm not sure you can implement a form of look-ahead that could recognize packets as being UDP and thus potential RTP packets without having to dissect those packets, in which case we'd have to worry about that dissection affecting packet state), so the sequence number doesn't seem to be usable. _______________________________________________ Ethereal-users mailing list Ethereal-users@xxxxxxxxxxxx http://www.ethereal.com/mailman/listinfo/ethereal-users
- References:
- Re: [Ethereal-dev] Heuristic decode of RTP packets
- From: Guy Harris
- Re: [Ethereal-dev] Heuristic decode of RTP packets
- Prev by Date: Re: [Ethereal-dev] Heuristic decode of RTP packets
- Next by Date: Re: [Ethereal-dev] Libethereal version
- Previous by thread: Re: [Ethereal-dev] Heuristic decode of RTP packets
- Next by thread: Re: [Ethereal-dev] Use of NO_PORT2 for dissecting conversations
- Index(es):