Reassembly Made Easier
By using our latest 3.4.2455 release of the parsers and using a simple filter, you can now view reassembled traffic more easily for certain protocols. Normally when you reassemble a trace you see all the original frames plus the newly inserted reassembled frames. Using a filter with a brand new property, you can now see only the complete frames; whether or not they were fragmented to begin with.
Overview of Reassembly
For a full explanation of Reassembly, you can check out our Reassembly Blog. In short, the resulting reassembled view of the data contains both the original frames and fragments, and the newly inserted frames for each protocol that might fragment its payload. For instance, all the TCP frames that have been fragmented are reassembled and inserted into a new frame in the trace with a special header, PayloadHeader. Additionally if those reassembled TCP frames are also fragments at a higher layer protocol, like HTTP, new frames are also inserted for those. The result is Frame Summaries that seem to show as duplicates, but they are similar versions with a complete payload.
New Properties for Filtering
If you are interested in complete frames for a specific layer, it would be convenient to filter out all the fragments. To make this possible, we’ve added new properties into the parsers which tag frames that are complete for that protocol. By filtering on this property you can see all the complete frames for the layer in question. We have enabled this property for TCP, NBTSS, and HTTP. NBTSS is important because SMB uses it as a transport.
An Example of HTTP Fragmentation
If this first example, I’ll filter on HTTP traffic before it’s reassembled. Notice the last shaded frame below, it is a payload and thus an HTTP fragment of the frame above it. To see the entire HTTP frame we need to reassemble this trace.
HTTP:Request, GET /ads/7945/0000007945_000000000000000607478.gif |
HTTP:Response, HTTP/1.1, Status: Ok, URL: /ads/7945/0000007945_000000000000000607478.gif - GIF: Version=GIF89a, Width=300, Length=250 |
HTTP:Request, GET /ads/7945/0000007945_000000000000000607449.gif |
HTTP:Response, HTTP/1.1, Status: Ok, URL: /ads/7945/0000007945_000000000000000607449.gif - GIF: Version=GIF89a, Width=300, Length=250 |
HTTP:HTTP Payload, URL: /ads/7945/0000007945_000000000000000607449.gif - GIF: Version= tÀ„‑, Width=8195, Length=49568 |
After reassembly, we filter on HTTP. Now you see the two sets of original traffic paired with their inserted responses (shaded in two colors below). The newly inserted responses are also bolded.
Summary Description |
Notes |
HTTP:Request, GET /ads/7945/0000007945_000000000000000607478.gif |
Original Frame |
HTTP:Response, HTTP/1.1, Status: Ok, URL: /ads/7945/0000007945_000000000000000607478.gif - GIF: Version=GIF89a, Width=300, Length=250 |
Original Frame |
HTTP:Response, HTTP/1.1, Status: Ok, URL: /ads/7945/0000007945_000000000000000607478.gif - GIF: Version=GIF89a, Width=300, Length=250 |
Inserted TCP frame from TCP Fragments |
HTTP:Request, GET /ads/7945/0000007945_000000000000000607449.gif |
Original Frame |
HTTP:Response, HTTP/1.1, Status: Ok, URL: /ads/7945/0000007945_000000000000000607449.gif - GIF: Version=GIF89a, Width=300, Length=250 |
Original Frame |
HTTP:Response, HTTP/1.1, Status: Ok, URL: /ads/7945/0000007945_000000000000000607449.gif - GIF: Version=GIF89a, Width=300, Length=250 |
Inserted TCP Frame from TCP Fragments. Also the start of an HTTP Fragment |
HTTP:HTTP Payload, URL: /ads/7945/0000007945_000000000000000607449.gif |
Original Frame, HTTP End Fragment |
HTTP:Response, HTTP/1.1, Status: Ok, URL: /ads/7945/0000007945_000000000000000607449.gif - GIF: Version=GIF89a, Width=300, Length=250 |
Inserted HTTP Fragment |
As you can see this is confusing because each bolded inserted frame is actually a duplicate. There are 3 inserted frames because of fragmentation at both the TCP and HTTP layers. Due to this the final response is there two extra times: the first time because TCP has fragmented the data and the second because HTTP has also fragmented its payload.
Now perhaps you might think that I could simply filter out only those frames that have been reassembled. In the table below I’ve done that using the filter “PayloadHeader”
HTTP:Response, HTTP/1.1, Status: Ok, URL: /ads/7945/0000007945_000000000000000607478.gif - GIF: Version=GIF89a, Width=300, Length=250 |
HTTP:Response, HTTP/1.1, Status: Ok, URL: /ads/7945/0000007945_000000000000000607449.gif - GIF: Version=GIF89a, Width=300, Length=250 |
HTTP:Response, HTTP/1.1, Status: Ok, URL: /ads/7945/0000007945_000000000000000607449.gif - GIF: Version=GIF89a, Width=300, Length=250 |
And you can see this isn’t helpful because not all frames are fragmented. So now let’s use the new Property and apply a filter:
Property.HTTPCompleteFrame == 1
HTTP:Request, GET /ads/7945/0000007945_000000000000000607478.gif |
HTTP:Response, HTTP/1.1, Status: Ok, URL: /ads/7945/0000007945_000000000000000607478.gif - GIF: Version=GIF89a, Width=300, Length=250 |
HTTP:Request, GET /ads/7945/0000007945_000000000000000607449.gif |
HTTP:Response, HTTP/1.1, Status: Ok, URL: /ads/7945/0000007945_000000000000000607449.gif - GIF: Version=GIF89a, Width=300, Length=250 |
And Voila! We now see only complete HTTP frames and the trace we actually wanted.
To dive into how this works. The parser marks each complete frame as it reads it. Since the Requests were never fragmented, they’re marked as complete and display. The Responses were fragmented and in the case of the last frame, only the last HTTP reassembled frame is considered a complete HTTP frame. The corresponding TCP reassembled frame is not displayed because from HTTP’s perspective, it wasn’t complete.
NBTSSCompleteFrame Property
We have enabled the same functionality for NBTSS. Since SMB relies on this as a transport, this makes viewing SMB traffic over NBTBSS also display in the same way as the HTTP example above.
TCP Fragmentation
In some cases a protocol is fragmented by TCP, but no further fragmentation occurs in the protocol layers above. In this case we don’t know what a complete frame is at the protocol layer, but you can use a property at the TCP layer to find all completed TCP frames. When you add this to those frames that have a payload header, this will provide you with a list of all complete TCP frames or frames which were originally fragmented. This filter would look like this:
Property.CompleteFrame == 1 OR PayloadHeader
For instance, for SMB2 traffic over TCP, this does a decent job of showing you the traffic you. The only caveat here is that since SMBOverTCP can fragment data, you see those extra fragments. Still the results are much easier to look at that the unfiltered reassembled trace.
Here’s an example of a reassembled SMB2 trace where you can see the original READ plus the inserted reassembled frame.
SMB2:C READ (0x8), FID=0xFFFFFFFF00000041 (dataWebGuide4_4109-VISTA.exe@#4848) , 0x7600 bytes from offset 4296704 (0x419000) |
SMB2:R READ (0x8), File=dataWebGuide4_4109-VISTA.exe@#4848, 0x7600 bytes read |
SMB2:R READ (0x8), File=dataWebGuide4_4109-VISTA.exe@#4848, 0x7600 bytes read |
SMB2:C READ (0x8), FID=0xFFFFFFFF00000041 (dataWebGuide4_4109-VISTA.exe@#4848) , 0x8000 bytes from offset 32768 (0x8000) |
SMB2:R READ (0x8), File=dataWebGuide4_4109-VISTA.exe@#4848, 0x8000 bytes read |
SMB2:R READ (0x8), File=dataWebGuide4_4109-VISTA.exe@#4848, 0x8000 bytes read |
SMB2:C READ (0x8), FID=0xFFFFFFFF00000041 (dataWebGuide4_4109-VISTA.exe@#4848) , 0x8000 bytes from offset 73728 (0x12000) |
SMB2:R READ (0x8), File=dataWebGuide4_4109-VISTA.exe@#4848, 0x8000 bytes read |
SMB2:R READ (0x8), File=dataWebGuide4_4109-VISTA.exe@#4848, 0x8000 bytes read |
SMB2:C READ (0x8), FID=0xFFFFFFFF00000041 (dataWebGuide4_4109-VISTA.exe@#4848) , 0x2000 bytes from offset 65536 (0x10000) |
SMB2:R READ (0x8), File=dataWebGuide4_4109-VISTA.exe@#4848, 0x2000 bytes read |
SMB2:R READ (0x8), File=dataWebGuide4_4109-VISTA.exe@#4848, 0x2000 bytes read |
Now using the above filter you see all the SMB Read fragments disappear.
SMB2:C READ (0x8), FID=0xFFFFFFFF00000041 (dataWebGuide4_4109-VISTA.exe@#4848) , 0x7600 bytes from offset 4296704 (0x419000) |
SMB2:R READ (0x8), File=dataWebGuide4_4109-VISTA.exe@#4848, 0x7600 bytes read |
SMB2:C READ (0x8), FID=0xFFFFFFFF00000041 (dataWebGuide4_4109-VISTA.exe@#4848) , 0x8000 bytes from offset 32768 (0x8000) |
SMB2:R READ (0x8), File=dataWebGuide4_4109-VISTA.exe@#4848, 0x8000 bytes read |
SMB2:C READ (0x8), FID=0xFFFFFFFF00000041 (dataWebGuide4_4109-VISTA.exe@#4848) , 0x8000 bytes from offset 73728 (0x12000) |
SMB2:R READ (0x8), File=dataWebGuide4_4109-VISTA.exe@#4848, 0x8000 bytes read |
SMB2:C READ (0x8), FID=0xFFFFFFFF00000041 (dataWebGuide4_4109-VISTA.exe@#4848) , 0x2000 bytes from offset 65536 (0x10000) |
SMB2:R READ (0x8), File=dataWebGuide4_4109-VISTA.exe@#4848, 0x2000 bytes read |
Enabling Additional Layers
An advantage of extensible parsers is that we can continue to deliver functionality and improvements without having to release a new version of Network Monitor. If there are other layers you would like to see enabled, please feel free to comment below. And remember to use these properties when looking at Reassembled traffic.
Comments
Anonymous
January 01, 2003
For LDAP, you should be able to use the "Property.CompleteFrame == 1 OR PayloadHeader" filter mentioned above. I tested this with an LDAP trace and indeed the resulting reassembled trace displayed the complete TCP at the LDAP layer or anything LDAP that has been reassembled. If you still can't get this to work, you could create a thread on our forums: social.technet.microsoft.com/.../threadsAnonymous
January 01, 2003
thanksAnonymous
November 09, 2010
The comment has been removed