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用法

浙公网安备 33010602011771号