<?xml version="1.0" encoding="ISO-8859-1"?>
<rss version='2.0' xmlns:lj='http://www.livejournal.org/rss/lj/1.0/'>
	<channel>
		<title>The Corelatus Blog - Entries from August 2009</title>
		<description>Entries from August 2009</description>
                <link>../../../</link>

	
	<item>
		<title>Capturing SS7 with wireshark or tshark</title>
		<link>../../../Capturing_SS7_with_wireshark_or_tshark.html</link>        
		<guid isPermaLink="true">../../../Capturing_SS7_with_wireshark_or_tshark.html</guid>
                <pubDate>Mon, 10 Aug 2009 20:40:39 +0200</pubDate>
		<description>&lt;p&gt;
I often use wireshark to look at SS7 signalling on E1 links. Up until
today, I&#39;ve always done that by capturing the signalling (from a GTH),
then converting the captured data to libpcap format and finally
loading the file into wireshark.
&lt;/p&gt;

&lt;p&gt;
Someone showed me a better way today: wireshark can read from a pipe
or from standard input. That lets me see and filter the packets in
wireshark in real time. Here&#39;s how to do it, using the save_to_pcap
demo program (included in &lt;a
href=&quot;http://www.corelatus.com/gth/api/gth_c_examples.zip&quot;&gt;gth_c_examples&lt;/a&gt;):
&lt;/p&gt;

&lt;pre&gt;
&gt; ./save_to_pcap gth21 1A 2A 16 - | wireshark -k -i -
capturing packets, press ^C to abort
saving capture to stdout
&lt;/pre&gt;

The same thing works for tshark:

&lt;pre&gt;
 &gt;./save_to_pcap gth21 1A 2A 16 - | tshark -V -i -
capturing packets, press ^C to abort
saving capture to stdout
Capturing on -
Frame 1 (15 bytes on wire, 15 bytes captured)
    Arrival Time: Aug 10, 2009 20:38:29.388000000
...
   Message Transfer Part Level 2
    .000 1101 = Backward sequence number: 13
    1... .... = Backward indicator bit: 1
    .011 1000 = Forward sequence number: 56
    1... .... = Forward indicator bit: 1
    ..00 0000 = Length Indicator: 0
    00.. .... = Spare: 0
...
&lt;/pre&gt;

&lt;h3&gt;Works on *nix and Windows&lt;/h3&gt;

&lt;p&gt;
Piping standard output to wireshark/tshark works on all the *nixes,
i.e. linux, BSD, OSX, Solaris. On Windows, things are a bit different,
you have to use &#39;named pipes&#39; instead, like this:
&lt;pre&gt;
 start save_to_pcap 172.16.1.10 1A 2A 16 \\.\pipe\ss7.1
 wireshark -k -i \\.\pipe\ss7.1
&lt;/pre&gt;

&lt;/p&gt;

&lt;p&gt;
On some older (as of August 2009) versions of wireshark, possibly in
combination with older libraries, the &quot;-i -&quot; switch doesn&#39;t work, at
least according to google, even though the tshark version works.
&lt;/p&gt;
</description>
	</item>
	
	<item>
		<title>How does TCP behave on an interrupted network?</title>
		<link>../../../How_does_TCP_behave_on_an_interrupted_network_.html</link>        
		<guid isPermaLink="true">../../../How_does_TCP_behave_on_an_interrupted_network_.html</guid>
                <pubDate>Thu, 27 Aug 2009 23:24:22 GMT</pubDate>
		<description>&lt;p&gt;
GTH E1/T1 modules are always controlled by a general-purpose server,
usually some sort of unix machine. The server and GTH are connected by
ethernet and communicate using TCP sockets. Normally, that ethernet
connection is chosen to be simple and reliable, for instance by
putting the server and the GTH in the same rack, connected to the same
ethernet switch.
&lt;/p&gt;

&lt;p&gt;
I experimented a bit to see what happens when that network gets
interrupted. I interrupted the network in a reproduceable way by
disabling and re-enabling the server&#39;s ethernet port for a known
length of time while running a &amp;lt;recorder&amp;gt;. (A &amp;lt;recorder&amp;gt;
sends all the data, typically someone talking, from an E1 timeslot to
the server over a TCP socket, 8000 octets per second.)
&lt;/p&gt;

&lt;h3&gt;Capturing the ethernet packets&lt;/h3&gt;

&lt;p&gt;
Here&#39;s what I did to capture traffic and interrupt the ethernet:
&lt;/p&gt;

  &lt;pre&gt;
  tcpdump -w /tmp/capture.pcap -s 0 not port 22
  sudo ifconfig eth0 down; sleep 5; sudo ifconfig eth0 up
  &lt;/pre&gt;

&lt;h3&gt;A trace where traffic recovers in time to prevent an overrun&lt;/h3&gt;

&lt;p&gt;
The GTH buffers about two seconds of timeslot traffic. So a &#39;sleep&#39; of
about a second won&#39;t result in an overrun. Here&#39;s what it looks like
in wireshark:
&lt;/p&gt;

&lt;table&gt;
&lt;tr&gt;&lt;td&gt;Packet&lt;/td&gt;&lt;td&gt;Time&lt;/td&gt;&lt;td&gt;Direction&lt;/td&gt;&lt;td&gt;Flags&lt;/td&gt;&lt;td&gt;Seq. #&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;5&quot;&gt;&lt;hr /&gt;&lt;/td&gt;

&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;133 &lt;/td&gt;&lt;td&gt;  7.596 &lt;/td&gt;&lt;td&gt;  GTH -&amp;gt; server&lt;/td&gt;&lt;td&gt; [PSH, ACK] &lt;/td&gt;&lt;td&gt;59393&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;134 &lt;/td&gt;&lt;td&gt;  7.633 &lt;/td&gt;&lt;td&gt;  server -&amp;gt; GTH&lt;/td&gt;&lt;td&gt; [ACK]      &lt;/td&gt;&lt;td&gt;1    &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;135 &lt;/td&gt;&lt;td&gt;  7.724 &lt;/td&gt;&lt;td&gt;  GTH -&amp;gt; server&lt;/td&gt;&lt;td&gt; [PSH, ACK] &lt;/td&gt;&lt;td&gt;60417&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;136 &lt;/td&gt;&lt;td&gt;  7.761 &lt;/td&gt;&lt;td&gt;  server -&amp;gt; GTH&lt;/td&gt;&lt;td&gt; [ACK]      &lt;/td&gt;&lt;td&gt;1	       &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;137 &lt;/td&gt;&lt;td&gt;  7.852 &lt;/td&gt;&lt;td&gt;  GTH -&amp;gt; server&lt;/td&gt;&lt;td&gt; [PSH, ACK] &lt;/td&gt;&lt;td&gt;61441&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;138 &lt;/td&gt;&lt;td&gt;  7.889 &lt;/td&gt;&lt;td&gt;  server -&amp;gt; GTH&lt;/td&gt;&lt;td&gt; [ACK] &lt;/td&gt;&lt;td&gt;1	       &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;139 &lt;/td&gt;&lt;td&gt;  7.980 &lt;/td&gt;&lt;td&gt;  GTH -&amp;gt; server&lt;/td&gt;&lt;td&gt; [PSH, ACK] &lt;/td&gt;&lt;td&gt;62465&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;140 &lt;/td&gt;&lt;td&gt;  8.017 &lt;/td&gt;&lt;td&gt;  server -&amp;gt; GTH&lt;/td&gt;&lt;td&gt; [ACK] &lt;/td&gt;&lt;td&gt;1	       &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;141 &lt;/td&gt;&lt;td&gt;  8.108 &lt;/td&gt;&lt;td&gt;  GTH -&amp;gt; server&lt;/td&gt;&lt;td&gt; [PSH, ACK] &lt;/td&gt;&lt;td&gt;63489&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;142 &lt;/td&gt;&lt;td&gt;  8.145 &lt;/td&gt;&lt;td&gt;  server -&amp;gt; GTH&lt;/td&gt;&lt;td&gt; [ACK] &lt;/td&gt;&lt;td&gt;1	       &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;143 &lt;/td&gt;&lt;td&gt;  8.236 &lt;/td&gt;&lt;td&gt;  GTH -&amp;gt; server&lt;/td&gt;&lt;td&gt; [PSH, ACK] &lt;/td&gt;&lt;td&gt;64513&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;144 &lt;/td&gt;&lt;td&gt;  8.273 &lt;/td&gt;&lt;td&gt;  server -&amp;gt; GTH&lt;/td&gt;&lt;td&gt; [ACK] &lt;/td&gt;&lt;td&gt;1	       &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;145 &lt;/td&gt;&lt;td&gt;  8.364 &lt;/td&gt;&lt;td&gt;  GTH -&amp;gt; server&lt;/td&gt;&lt;td&gt; [PSH, ACK] &lt;/td&gt;&lt;td&gt;65537&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;146 &lt;/td&gt;&lt;td&gt;  8.401 &lt;/td&gt;&lt;td&gt;  server -&amp;gt; GTH&lt;/td&gt;&lt;td&gt; [ACK] &lt;/td&gt;&lt;td&gt;1	       &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;147 &lt;/td&gt;&lt;td&gt; 10.151 &lt;/td&gt;&lt;td&gt;  GTH -&amp;gt; server&lt;/td&gt;&lt;td&gt; [PSH, ACK] &lt;/td&gt;&lt;td&gt;66561&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;148 &lt;/td&gt;&lt;td&gt; 10.151 &lt;/td&gt;&lt;td&gt;  server -&amp;gt; GTH&lt;/td&gt;&lt;td&gt; [ACK] &lt;/td&gt;&lt;td&gt;1	       &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;149 &lt;/td&gt;&lt;td&gt; 10.151 &lt;/td&gt;&lt;td&gt;  GTH -&amp;gt; server&lt;/td&gt;&lt;td&gt; [ACK] &lt;/td&gt;&lt;td&gt;67585     &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;150 &lt;/td&gt;&lt;td&gt; 10.151 &lt;/td&gt;&lt;td&gt;  server -&amp;gt; GTH&lt;/td&gt;&lt;td&gt; [ACK] &lt;/td&gt;&lt;td&gt;1         &lt;/td&gt;&lt;/tr&gt;

&lt;/table&gt;

&lt;p&gt;
Everything up to packet 146 is normal: the GTH (172.16.2.5) sends 8000
octets every second and the server (172.16.2.1) acks them. It happens
to be in chunks of 1024 octets about eight times per second. After
packet 146, about 8.4 seconds after the capture started, the ethernet
interface went down and stayed down for 1s. The TCP stream started up
again after about 1.5s and then &#39;caught up&#39; by sending many packets in
quick succession.
&lt;/p&gt;

&lt;h3&gt;A trace where traffic didn&#39;t recover&lt;/h3&gt;

&lt;p&gt;
I took a second trace similar to the first one, except this time, I
disabled ethernet for about five seconds:
&lt;/p&gt;

&lt;pre&gt;
Packet Time     Source IP     Dest IP    SPort   DPort
----------------------------------------------------------------------
 28   1.040083  172.16.2.5 -&amp;gt; 172.16.2.1 54271 &amp;gt; 45195 [PSH, ACK] Seq=7169
 29   1.040095  172.16.2.1 -&amp;gt; 172.16.2.5 45195 &amp;gt; 54271 [ACK] Seq=1
 30   1.168065  172.16.2.5 -&amp;gt; 172.16.2.1 54271 &amp;gt; 45195 [PSH, ACK] Seq=8193
 31   1.168078  172.16.2.1 -&amp;gt; 172.16.2.5 45195 &amp;gt; 54271 [ACK] Seq=1 
 32   1.296067  172.16.2.5 -&amp;gt; 172.16.2.1 54271 &amp;gt; 45195 [PSH, ACK] Seq=9217
 33   1.296079  172.16.2.1 -&amp;gt; 172.16.2.5 45195 &amp;gt; 54271 [ACK] Seq=1 
 34   1.424068  172.16.2.5 -&amp;gt; 172.16.2.1 54271 &amp;gt; 45195 [PSH, ACK] Seq=10241
 35   1.424081  172.16.2.1 -&amp;gt; 172.16.2.5 45195 &amp;gt; 54271 [ACK] Seq=1
 36   7.782851  172.16.2.5 -&amp;gt; 172.16.2.1 54271 &amp;gt; 45195 [PSH, ACK] Seq=11265
 37   7.782863  172.16.2.1 -&amp;gt; 172.16.2.5 45195 &amp;gt; 54271 [ACK] Seq=1
 38   7.783406  172.16.2.5 -&amp;gt; 172.16.2.1 54271 &amp;gt; 45195 [ACK] Seq=12289
 39   7.783413  172.16.2.1 -&amp;gt; 172.16.2.5 45195 &amp;gt; 54271 [ACK] Seq=1
 40   7.783569  172.16.2.5 -&amp;gt; 172.16.2.1 54271 &amp;gt; 45195 [ACK] Seq=13737
...
 50   7.784962  172.16.2.5 -&amp;gt; 172.16.2.1 54271 &amp;gt; 45195 [FIN, PSH, ACK] Seq=23873
 51   7.784972  172.16.2.1 -&amp;gt; 172.16.2.5 45195 &amp;gt; 54271 [ACK] Seq=1
 52   7.785026  172.16.2.1 -&amp;gt; 172.16.2.5 45195 &amp;gt; 54271 [FIN, ACK] Seq=1
 53   7.785348  172.16.2.5 -&amp;gt; 172.16.2.1 54271 &amp;gt; 45195 [ACK] Seq=25322
&lt;/pre&gt;

&lt;p&gt; Everything is normal up to packet 35. Then, ethernet is suspended
for five seconds and TCP takes a further second to recover, which
causes a buffer overrun on the GTH (172.16.2.5). The GTH closes the
socket at packet 50 and also sends an overrun event to the application
so that it knows why the socket was closed.
&lt;/p&gt;

&lt;h3&gt;Bottom line&lt;/h3&gt;

&lt;p&gt;
GTH uses IP for control and traffic. It is important that the IP link
between the GTH and the server is simple and reliable. Ideally the GTH
and server should be in the same rack and be connected by an ethernet
switch.
&lt;/p&gt;

&lt;p&gt; It&#39;s possible for a system to survive a short interruption (less
than a second) to the ethernet traffic without pre-recorded calls
getting interrupted. For longer interruptions, all bets are off.  &lt;/p&gt;

&lt;p&gt; (Interruptions aren&#39;t the only type of network problem, e.g. radio
networks such as 802.11 can suffer significant packet loss, which can
trigger TCP congestion avoidance. But that&#39;s another
topic.) &lt;/p&gt;
</description>
	</item>
	
        </channel>
</rss>

