JP Abgrall | 53f17a9 | 2014-02-12 14:02:41 -0800 | [diff] [blame] | 1 | # tcpdump |
The Android Open Source Project | 2949f58 | 2009-03-03 19:30:46 -0800 | [diff] [blame] | 2 | |
JP Abgrall | 53f17a9 | 2014-02-12 14:02:41 -0800 | [diff] [blame] | 3 | [](https://travis-ci.org/the-tcpdump-group/tcpdump) |
The Android Open Source Project | 2949f58 | 2009-03-03 19:30:46 -0800 | [diff] [blame] | 5 | |
Elliott Hughes | 9a98642 | 2017-12-19 14:49:10 -0800 | [diff] [blame] | 6 | To report a security issue please send an e-mail to security@tcpdump.org. |
The Android Open Source Project | 2949f58 | 2009-03-03 19:30:46 -0800 | [diff] [blame] | 7 | |
Elliott Hughes | 9a98642 | 2017-12-19 14:49:10 -0800 | [diff] [blame] | 8 | To report bugs and other problems, contribute patches, request a |
| 9 | feature, provide generic feedback etc please see the file |
| 10 | CONTRIBUTING in the tcpdump source tree root. |
The Android Open Source Project | 2949f58 | 2009-03-03 19:30:46 -0800 | [diff] [blame] | 11 | |
Elliott Hughes | 9a98642 | 2017-12-19 14:49:10 -0800 | [diff] [blame] | 12 | TCPDUMP 4.x.y |
| 13 | Now maintained by "The Tcpdump Group" |
| 14 | See www.tcpdump.org |
The Android Open Source Project | 2949f58 | 2009-03-03 19:30:46 -0800 | [diff] [blame] | 15 | |
JP Abgrall | 53f17a9 | 2014-02-12 14:02:41 -0800 | [diff] [blame] | 16 | Anonymous Git is available via: |
The Android Open Source Project | 2949f58 | 2009-03-03 19:30:46 -0800 | [diff] [blame] | 17 | |
JP Abgrall | 53f17a9 | 2014-02-12 14:02:41 -0800 | [diff] [blame] | 18 | git clone git://bpf.tcpdump.org/tcpdump |
| 19 | |
Elliott Hughes | 9a98642 | 2017-12-19 14:49:10 -0800 | [diff] [blame] | 20 | formerly from Lawrence Berkeley National Laboratory |
JP Abgrall | 53f17a9 | 2014-02-12 14:02:41 -0800 | [diff] [blame] | 21 | Network Research Group <tcpdump@ee.lbl.gov> |
| 22 | ftp://ftp.ee.lbl.gov/old/tcpdump.tar.Z (3.4) |
The Android Open Source Project | 2949f58 | 2009-03-03 19:30:46 -0800 | [diff] [blame] | 23 | |
| 24 | This directory contains source code for tcpdump, a tool for network |
| 25 | monitoring and data acquisition. This software was originally |
| 26 | developed by the Network Research Group at the Lawrence Berkeley |
| 27 | National Laboratory. The original distribution is available via |
JP Abgrall | 53f17a9 | 2014-02-12 14:02:41 -0800 | [diff] [blame] | 28 | anonymous ftp to `ftp.ee.lbl.gov`, in `tcpdump.tar.Z`. More recent |
The Android Open Source Project | 2949f58 | 2009-03-03 19:30:46 -0800 | [diff] [blame] | 29 | development is performed at tcpdump.org, http://www.tcpdump.org/ |
| 30 | |
| 31 | Tcpdump uses libpcap, a system-independent interface for user-level |
| 32 | packet capture. Before building tcpdump, you must first retrieve and |
| 33 | build libpcap, also originally from LBL and now being maintained by |
| 34 | tcpdump.org; see http://www.tcpdump.org/ . |
| 35 | |
| 36 | Once libpcap is built (either install it or make sure it's in |
JP Abgrall | 53f17a9 | 2014-02-12 14:02:41 -0800 | [diff] [blame] | 37 | `../libpcap`), you can build tcpdump using the procedure in the `INSTALL.txt` |
The Android Open Source Project | 2949f58 | 2009-03-03 19:30:46 -0800 | [diff] [blame] | 38 | file. |
| 39 | |
| 40 | The program is loosely based on SMI's "etherfind" although none of the |
| 41 | etherfind code remains. It was originally written by Van Jacobson as |
| 42 | part of an ongoing research project to investigate and improve tcp and |
| 43 | internet gateway performance. The parts of the program originally |
| 44 | taken from Sun's etherfind were later re-written by Steven McCanne of |
| 45 | LBL. To insure that there would be no vestige of proprietary code in |
| 46 | tcpdump, Steve wrote these pieces from the specification given by the |
| 47 | manual entry, with no access to the source of tcpdump or etherfind. |
| 48 | |
| 49 | Over the past few years, tcpdump has been steadily improved by the |
| 50 | excellent contributions from the Internet community (just browse |
JP Abgrall | 53f17a9 | 2014-02-12 14:02:41 -0800 | [diff] [blame] | 51 | through the `CHANGES` file). We are grateful for all the input. |
The Android Open Source Project | 2949f58 | 2009-03-03 19:30:46 -0800 | [diff] [blame] | 52 | |
| 53 | Richard Stevens gives an excellent treatment of the Internet protocols |
JP Abgrall | 53f17a9 | 2014-02-12 14:02:41 -0800 | [diff] [blame] | 54 | in his book *"TCP/IP Illustrated, Volume 1"*. If you want to learn more |
The Android Open Source Project | 2949f58 | 2009-03-03 19:30:46 -0800 | [diff] [blame] | 55 | about tcpdump and how to interpret its output, pick up this book. |
| 56 | |
| 57 | Some tools for viewing and analyzing tcpdump trace files are available |
| 58 | from the Internet Traffic Archive: |
| 59 | |
Elliott Hughes | 892a68b | 2015-10-19 14:43:53 -0700 | [diff] [blame] | 60 | * http://www.sigcomm.org/ITA/ |
The Android Open Source Project | 2949f58 | 2009-03-03 19:30:46 -0800 | [diff] [blame] | 61 | |
| 62 | Another tool that tcpdump users might find useful is tcpslice: |
| 63 | |
JP Abgrall | 53f17a9 | 2014-02-12 14:02:41 -0800 | [diff] [blame] | 64 | * https://github.com/the-tcpdump-group/tcpslice |
The Android Open Source Project | 2949f58 | 2009-03-03 19:30:46 -0800 | [diff] [blame] | 65 | |
| 66 | It is a program that can be used to extract portions of tcpdump binary |
| 67 | trace files. See the above distribution for further details and |
| 68 | documentation. |
| 69 | |
JP Abgrall | 53f17a9 | 2014-02-12 14:02:41 -0800 | [diff] [blame] | 70 | Current versions can be found at www.tcpdump.org. |
The Android Open Source Project | 2949f58 | 2009-03-03 19:30:46 -0800 | [diff] [blame] | 71 | |
| 72 | - The TCPdump team |
| 73 | |
| 74 | original text by: Steve McCanne, Craig Leres, Van Jacobson |
| 75 | |
| 76 | ------------------------------------- |
JP Abgrall | 53f17a9 | 2014-02-12 14:02:41 -0800 | [diff] [blame] | 77 | ``` |
The Android Open Source Project | 2949f58 | 2009-03-03 19:30:46 -0800 | [diff] [blame] | 78 | This directory also contains some short awk programs intended as |
| 79 | examples of ways to reduce tcpdump data when you're tracking |
| 80 | particular network problems: |
| 81 | |
| 82 | send-ack.awk |
| 83 | Simplifies the tcpdump trace for an ftp (or other unidirectional |
| 84 | tcp transfer). Since we assume that one host only sends and |
| 85 | the other only acks, all address information is left off and |
| 86 | we just note if the packet is a "send" or an "ack". |
| 87 | |
| 88 | There is one output line per line of the original trace. |
| 89 | Field 1 is the packet time in decimal seconds, relative |
| 90 | to the start of the conversation. Field 2 is delta-time |
| 91 | from last packet. Field 3 is packet type/direction. |
| 92 | "Send" means data going from sender to receiver, "ack" |
| 93 | means an ack going from the receiver to the sender. A |
| 94 | preceding "*" indicates that the data is a retransmission. |
| 95 | A preceding "-" indicates a hole in the sequence space |
| 96 | (i.e., missing packet(s)), a "#" means an odd-size (not max |
| 97 | seg size) packet. Field 4 has the packet flags |
| 98 | (same format as raw trace). Field 5 is the sequence |
| 99 | number (start seq. num for sender, next expected seq number |
| 100 | for acks). The number in parens following an ack is |
| 101 | the delta-time from the first send of the packet to the |
| 102 | ack. A number in parens following a send is the |
| 103 | delta-time from the first send of the packet to the |
| 104 | current send (on duplicate packets only). Duplicate |
| 105 | sends or acks have a number in square brackets showing |
| 106 | the number of duplicates so far. |
| 107 | |
| 108 | Here is a short sample from near the start of an ftp: |
| 109 | 3.00 0.20 send . 512 |
| 110 | 3.20 0.20 ack . 1024 (0.20) |
| 111 | 3.20 0.00 send P 1024 |
| 112 | 3.40 0.20 ack . 1536 (0.20) |
| 113 | 3.80 0.40 * send . 0 (3.80) [2] |
| 114 | 3.82 0.02 * ack . 1536 (0.62) [2] |
| 115 | Three seconds into the conversation, bytes 512 through 1023 |
| 116 | were sent. 200ms later they were acked. Shortly thereafter |
| 117 | bytes 1024-1535 were sent and again acked after 200ms. |
| 118 | Then, for no apparent reason, 0-511 is retransmitted, 3.8 |
| 119 | seconds after its initial send (the round trip time for this |
| 120 | ftp was 1sec, +-500ms). Since the receiver is expecting |
| 121 | 1536, 1536 is re-acked when 0 arrives. |
| 122 | |
| 123 | packetdat.awk |
| 124 | Computes chunk summary data for an ftp (or similar |
| 125 | unidirectional tcp transfer). [A "chunk" refers to |
| 126 | a chunk of the sequence space -- essentially the packet |
| 127 | sequence number divided by the max segment size.] |
| 128 | |
| 129 | A summary line is printed showing the number of chunks, |
| 130 | the number of packets it took to send that many chunks |
| 131 | (if there are no lost or duplicated packets, the number |
| 132 | of packets should equal the number of chunks) and the |
| 133 | number of acks. |
| 134 | |
| 135 | Following the summary line is one line of information |
| 136 | per chunk. The line contains eight fields: |
| 137 | 1 - the chunk number |
| 138 | 2 - the start sequence number for this chunk |
| 139 | 3 - time of first send |
| 140 | 4 - time of last send |
| 141 | 5 - time of first ack |
| 142 | 6 - time of last ack |
| 143 | 7 - number of times chunk was sent |
| 144 | 8 - number of times chunk was acked |
| 145 | (all times are in decimal seconds, relative to the start |
| 146 | of the conversation.) |
| 147 | |
| 148 | As an example, here is the first part of the output for |
| 149 | an ftp trace: |
| 150 | |
| 151 | # 134 chunks. 536 packets sent. 508 acks. |
| 152 | 1 1 0.00 5.80 0.20 0.20 4 1 |
| 153 | 2 513 0.28 6.20 0.40 0.40 4 1 |
| 154 | 3 1025 1.16 6.32 1.20 1.20 4 1 |
| 155 | 4 1561 1.86 15.00 2.00 2.00 6 1 |
| 156 | 5 2049 2.16 15.44 2.20 2.20 5 1 |
| 157 | 6 2585 2.64 16.44 2.80 2.80 5 1 |
| 158 | 7 3073 3.00 16.66 3.20 3.20 4 1 |
| 159 | 8 3609 3.20 17.24 3.40 5.82 4 11 |
| 160 | 9 4097 6.02 6.58 6.20 6.80 2 5 |
| 161 | |
| 162 | This says that 134 chunks were transferred (about 70K |
| 163 | since the average packet size was 512 bytes). It took |
| 164 | 536 packets to transfer the data (i.e., on the average |
| 165 | each chunk was transmitted four times). Looking at, |
| 166 | say, chunk 4, we see it represents the 512 bytes of |
| 167 | sequence space from 1561 to 2048. It was first sent |
| 168 | 1.86 seconds into the conversation. It was last |
| 169 | sent 15 seconds into the conversation and was sent |
| 170 | a total of 6 times (i.e., it was retransmitted every |
| 171 | 2 seconds on the average). It was acked once, 140ms |
| 172 | after it first arrived. |
| 173 | |
| 174 | stime.awk |
| 175 | atime.awk |
| 176 | Output one line per send or ack, respectively, in the form |
| 177 | <time> <seq. number> |
| 178 | where <time> is the time in seconds since the start of the |
| 179 | transfer and <seq. number> is the sequence number being sent |
| 180 | or acked. I typically plot this data looking for suspicious |
| 181 | patterns. |
| 182 | |
| 183 | |
| 184 | The problem I was looking at was the bulk-data-transfer |
| 185 | throughput of medium delay network paths (1-6 sec. round trip |
| 186 | time) under typical DARPA Internet conditions. The trace of the |
| 187 | ftp transfer of a large file was used as the raw data source. |
| 188 | The method was: |
| 189 | |
| 190 | - On a local host (but not the Sun running tcpdump), connect to |
| 191 | the remote ftp. |
| 192 | |
| 193 | - On the monitor Sun, start the trace going. E.g., |
| 194 | tcpdump host local-host and remote-host and port ftp-data >tracefile |
| 195 | |
| 196 | - On local, do either a get or put of a large file (~500KB), |
| 197 | preferably to the null device (to minimize effects like |
| 198 | closing the receive window while waiting for a disk write). |
| 199 | |
| 200 | - When transfer is finished, stop tcpdump. Use awk to make up |
| 201 | two files of summary data (maxsize is the maximum packet size, |
| 202 | tracedata is the file of tcpdump tracedata): |
| 203 | awk -f send-ack.awk packetsize=avgsize tracedata >sa |
| 204 | awk -f packetdat.awk packetsize=avgsize tracedata >pd |
| 205 | |
| 206 | - While the summary data files are printing, take a look at |
| 207 | how the transfer behaved: |
| 208 | awk -f stime.awk tracedata | xgraph |
| 209 | (90% of what you learn seems to happen in this step). |
| 210 | |
| 211 | - Do all of the above steps several times, both directions, |
| 212 | at different times of day, with different protocol |
| 213 | implementations on the other end. |
| 214 | |
| 215 | - Using one of the Unix data analysis packages (in my case, |
| 216 | S and Gary Perlman's Unix|Stat), spend a few months staring |
| 217 | at the data. |
| 218 | |
| 219 | - Change something in the local protocol implementation and |
| 220 | redo the steps above. |
| 221 | |
| 222 | - Once a week, tell your funding agent that you're discovering |
| 223 | wonderful things and you'll write up that research report |
| 224 | "real soon now". |
JP Abgrall | 53f17a9 | 2014-02-12 14:02:41 -0800 | [diff] [blame] | 225 | ``` |