tcpdump使用——分析tcp3次握手

为了使用tcpdump分析tcp三次握手协议,我们需要先写个简单的client和server程序,为了最简单快速,使用python

client程序:

from socket import *
import time

addr = ('127.0.0.1', 9988)
client = socket(AF_INET, SOCK_STREAM)
client.connect(addr)

server程序:

import socket
import sys
import os
addr = ('127.0.0.1', 9988)
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(addr)
server.listen(10)

while True:
        connection, address = server.accept()
        print 'connection ip:', address

先将server程序运行起来,然后运行client程序,在这个之间,我们运行我们的tcpdump来进行分析。

 

试验的步骤:

1、第一次直接运行tcpdump -n命令,会发现不能捕获到任何的数据包,原因是tcpdump默认捕获系统配置序号最小的网络,也就是eth0.

    而我们的程序是在回环网络上运行的,所以需要执行tcpdump -i lo

    如何查询本机的所有网络,使用命令tcpdump -D,我机器上得到了下面的结果

root@ubuntu:/workspace/cli_svr# tcpdump -D
1.eth0
2.usbmon1 (USB bus number 1)
3.usbmon2 (USB bus number 2)
4.any (Pseudo-device that captures on all interfaces)
5.lo

 

2、第二次运行tcpdump -i lo,然后重新开启client程序,得到下面的运行结果

14:52:58.815174 IP ubuntu.local.55812 > ubuntu.local.9988: Flags [S], seq 4071012105, win 32792, options [mss 16396,sackOK,TS val 10585595 ecr 0,nop,wscale 6], length 0

14:52:58.815200 IP ubuntu.local.9988 > ubuntu.local.55812: Flags [S.], seq 4071349707, ack 4071012106, win 32768, options [mss 16396,sackOK,TS val 10585595 ecr 10585595,nop,wscale 6], length 0

14:52:58.815224 IP ubuntu.local.55812 > ubuntu.local.9988: Flags [.], ack 1, win 513, options [nop,nop,TS val 10585595 ecr 10585595], length 0

前2条记录,符合我们对三次握手的认识, 第一条client给server发送了一个SYN包,序号是4071012105。

然后第二条,server给client发送了一个 ACK包,ack的序号是4071012106(4071012105 + 1)

不过第三条,客户端ack的序号显示是1。 为什么显示会是1呢? 查看一下tcpdump文档,会知道答案。

This means that sequence numbers after the first can  be
       interpreted  as  relative  byte positions in the conversation's data stream (with the
       first data byte each direction being `1').

tcp在收到第一条数据包之后,后续的数据包,是使用之前数据包的偏移来显示的,这个“1” 就是seq 4071349707的偏移1,也就是4071349708.

如果一开始不习惯这样,同时验证这个说法,我们可以使用tcpdump -i lo -S 来打印出绝对序列号

3、tcpdump -i lo -S打印绝对序列号

运行结果如下:

14:59:56.185719 IP ubuntu.local.41505 > ubuntu.local.9988: Flags [S], seq 2038267769, win 32792, options [mss 16396,sackOK,TS val 10689937 ecr 0,nop,wscale 6], length 0

14:59:56.185757 IP ubuntu.local.9988 > ubuntu.local.41505: Flags [S.], seq 2029840673, ack 2038267770, win 32768, options [mss 16396,sackOK,TS val 10689937 ecr 10689937,nop,wscale 6], length 0

14:59:56.185772 IP ubuntu.local.41505 > ubuntu.local.9988: Flags [.], ack 2029840674, win 513, options [nop,nop,TS val 10689937 ecr 10689937], length 0

这次可以看到,第三条的ack不是1了,而是第二天seq + 1的值

 

小结:

通过tcpdump,我们能详细的看出tcp三次握手协议的内容,以及一些基础的tcpdump用法

posted @ 2012-08-29 16:45  lovemychobits  阅读(1408)  评论(0)    收藏  举报