Ethereal-dev: Re: [Ethereal-dev] thoughts on reassembly...
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Noel Burton-Krahn <noel@xxxxxxxxxxxxxxxx>
Date: Fri, 01 Dec 2000 10:16:45 -0800
I wanted to add TCP stream reassembly/defragmenting to ethereal, until I found libnids (http://www.packetfactory.net/Projects/Libnids/) which uses linux-2.0.36 network cde to do just that. Perhaps it can be integrated into ethereal? --Noel > From: Guy Harris <gharris@xxxxxxxxxxxx> > To: "Neulinger, Nathan R." <nneul@xxxxxxx> > Cc: "'ethereal-dev@xxxxxxxxxxxx'" <ethereal-dev@xxxxxxxxxxxx> > Subject: Re: [Ethereal-dev] thoughts on reassembly... > Date: Fri, 1 Dec 2000 02:51:47 -0800 > > On Thu, Nov 30, 2000 at 08:35:10AM -0600, Neulinger, Nathan R. wrote: > > I had a thought pop into my head this morning on a relatively > > straightforward way to implement reassembly of packets/frags/etc. For what > > follows, I'm assuming UDP-style only, > > Presumably you mean "IP-style"; UDP has no fragmentation/reassembly - it > relies on IP to do that. *Most* fragemented IP datagrams are probably > UDP datagrams, but there's no reason in principle why there can never be > fragmented IP datagrams containing TCP segments, for example - and it's > IP that knows the fragment offsets of fragments. > > > although the basic approach would be the same. > > > > First, it depends on one thing - is there a way for dissectors to get at > > data from previous frames? > > It could explicitly read the frame in, using "wtap_seek_read()". It'd > have to allocate a buffer for that. We'd probably have a routine in > "file.c" to do that; the routine would take either a frame number or a > "frame_data" pointer as an argument. > > > The basic approach I was thinking of goes something like this: have a > > 'chunks' facility, similar to the conversations facility. When a dissector > > sees that is has a partial frame/fragment/etc that it knows is part of > > something larger, then it registers that sequence number/piece in the > > structure. > > I'm not sure how much of this would be usable both by IP and by > protocols running atop TCP (TCP itself knows nothing about higher-level > packet boundaries; it would probably do some reassembly work itself, so > that it can supply to higher-level dissectors, on the first pass through > the capture, an in-order, no-duplicates stream of packet data, but it > wouldn't know about in-stream byte counts, Content-Length MIME headers, > and the like). > > > As each frame comes in, if it sees that it's not whole, it looks up the > > piece in the structure, if it finds a corresponding record, it adds it to > > that record. It then passes that piece onto dissectors like always. Once > > that is done, it then checks the record for completeness - if all the pieces > > are registered, it then takes the data in that record, and creates a > > pseudo-frame that contains the data from all, and passes THAT along to the > > other dissectors. > > We'd need some way to handle "reassembly timeouts" and the like; if > nothing else, the end of the capture would cause an IP reassembly > timeout (if there are any incomplete fragmented datagrams by the end of > the capture, they're never going to be reassembled), and we might also > want to time out the reassembly after a certain amount of "time" (based > on the packet timestamps) has passed, if there's a risk that some other > unrelated IP datagram later in the capture would have the same IP > identification. Similarly, a FIN would "time out" any TCP stream > reassembly, and any reassembly of packets in the TCP stream, in that > direction of the connection. > > > i'd like to see it have some way of indicating in the display that this > > frame is a reconstructed object, not a on-the-wire-one-piece object. > > I'd actually like to be able to have a display that showed only frames > *but* that would, for frames that were part of a larger packet, added > "Continued in next frame" or "Continued from previous frame" indications > and showed the contents of fields that spanned frame boundaries. > > Another display option would be to show stuff only at the higher level, > so that frames that were part of larger packets wouldn't be shown - only > the larger packets would be shown (frames that *weren't* part of larger > packets would be shown as is), and the protocol tree probably wouldn't > show information for lower layers. > > You'd have an option to switch between the two different views. > > > As each piece came in, it would be stuck in the pieces array for the > > frameset, the check-for-completeness operation would look at the totalsize, > > and all of the pieces, and see if the entire frameset was found. If it was, > > it would allocate memory for the totalsize, > > ...or just create a composite tvbuff (that's what composite tvbuffs are > there for - handling reassembly). > > _______________________________________________ > Ethereal-dev mailing list > Ethereal-dev@xxxxxxxxxxxx > http://www.ethereal.com/mailman/listinfo/ethereal-dev
- Follow-Ups:
- Re: [Ethereal-dev] thoughts on reassembly...
- From: Guy Harris
- Re: [Ethereal-dev] thoughts on reassembly...
- References:
- Re: [Ethereal-dev] thoughts on reassembly...
- From: Guy Harris
- Re: [Ethereal-dev] thoughts on reassembly...
- Prev by Date: Re: [Ethereal-dev] self-defined protocol
- Next by Date: [Ethereal-dev] packet-lat.c
- Previous by thread: Re: [Ethereal-dev] thoughts on reassembly...
- Next by thread: Re: [Ethereal-dev] thoughts on reassembly...
- Index(es):