在Linux下使用tcpdump抓包分析

使用Linux的tcpdump工具对telent www.baidu.com 80进行抓包。在ubuntu终端1键入:
sudo tcpdump tcp –vX –i eth0
在终端2键入命令:
telnet www.baidu.com 80
等待终端1上出现建连包的信息如下图:

linux-tcpdump-get-package-1
图中有三个包信息:
1. 从本地计算机到远端,标志为[S],即设置SYN,建连,seq为3238467418;
2. 从远端到本地计算机,标志为[S.],即设置SYN且带ACK为3238467419,正好是前一个包seq+1,是远端回应本地计算机的建连信息;
3. 从本地计算机到远端,ACK为1,三次握手完成。
三次握手成功,连接成功,终端2出现信息如下图:
linux-tcpdump-get-package-2

在这次连接之前,还做过测试,远端使用的IP是119.75.217.109,但是后来抓根页面的时候并没有返回信息,但有时候也会返回数据。
在终端2键入GET / HTTP/1.1(并Enter一次),终端2上成功获得根内容(推测应该就是www.baidu.com的主页内容),并打印出来,如下图所示(因为内容冗杂,故略去中间部分):
linux-tcpdump-get-package-3
linux-tcpdump-get-package-4
……(中间图片略)
linux-tcpdump-get-package-5

同时,终端1上出现大量包信息,起始如下图:
linux-tcpdump-get-package-6

上图是第一个从本地计算机向远端发送的包,即“GET / HTTP/1.1”的指令(其实并非什么指令,是http的请求头而已,使用版本为1.1的http的get方法,获取/目录下的默认文件),seq为1:17,checksum经过多次测试均为incorect,并没发现对后面操作造成影响。紧接着之后的包是本地计算机和远端的数据传送,数据如下:
linux-tcpdump-get-package-7
linux-tcpdump-get-package-8
linux-tcpdump-get-package-9

之后大量数据包内容都是两端间的数据传送,类型完全相同,所以略去,只用关心最后拆连的数据包,上面图片组的信息分析如下图所示:
linux-tcpdump-get-package-10

可以看出,A开始到D均是本地计算机向远端发送数据,远端都只是确认包,从E开始,远端开始向本地计算机发送大量数据。在终端2中键入“Ctrl+]”并即出telnet,如下图所示:
linux-tcpdump-get-package-11

与此同时,终端1出现拆连包的信息,具体如下图:
linux-tcpdump-get-package-12
分析数据包可以发现,是本地计算机首先发起的拆连包。
1. 本地计算机发起拆连,seq为21,ack为10763;
2. 远端向本地计算机发送确认包,ack为22,正好是1.中seq+1;
3. 远端发送拆连包,seq为10763,ack为22;
4. 本地计算向远端发送确认包,ack为10764,正好是3.中seq+1。
连接断开。

这是我在互联网程序设计这门课交的一个作业,希望CV代码的朋友一定要注意这个问题,并且能够理解我的补充这么一句话的意思。

本文《在Linux下使用tcpdump抓包分析》来自 www.juwends.com ,欢迎转载或CV操作,但请注明出处,谢谢!