结合WireShark工具学习TCP协议

来源:互联网 发布:怎样运营淘宝店铺 编辑:程序博客网 时间:2024/04/29 17:46

结合WireShark工具学习TCP协议

一、利用wireshark抓取包

1.通过在终端输入wireshark命令打开wireshark(如果不是root用户,则需要sudo wireshark命令才能打开此工具)2.抓取的配置如下:interface选择eth0Capture Filter选择tcp3.在另一个终端中执行如下命令,连接126邮箱的pop服务器,端口号为110
输入命令:root@yutao:~# telnet pop.126.com 110Trying 123.125.50.23...Connected to pop3.126.idns.yeah.net.Escape character is '^]'.+OK Welcome to coremail Mail Pop3 Server (126coms[96cf230d1dfd5e9799113d194aeefd37s])quit+OK core mailConnection closed by foreign host.root@yutao:~# 

dkjfkld

然后就停止wireshark对包的抓取,并保存结果,接下来就可以分析包了。

二、本机和服务器的基本信息获取

 1.获取本机ip和物理地址root@yutao:~# ifconfigeth0      Link encap:以太网  硬件地址 78:45:c4:01:fc:aa            inet 地址:192.168.33.72  广播:192.168.33.255  掩码:255.255.255.0          inet6 地址: fe80::7a45:c4ff:fe01:fcaa/64 Scope:Link          UP BROADCAST RUNNING MULTICAST  MTU:1500  跃点数:1          接收数据包:161448 错误:0 丢弃:0 过载:0 帧数:0          发送数据包:20966 错误:0 丢弃:0 过载:0 载波:0          碰撞:0 发送队列长度:1000           接收字节:39220604 (39.2 MB)  发送字节:2946869 (2.9 MB)          中断:27 基本地址:0x2000 lo        Link encap:本地环回            inet 地址:127.0.0.1  掩码:255.0.0.0          inet6 地址: ::1/128 Scope:Host          UP LOOPBACK RUNNING  MTU:16436  跃点数:1          接收数据包:1345 错误:0 丢弃:0 过载:0 帧数:0          发送数据包:1345 错误:0 丢弃:0 过载:0 载波:0          碰撞:0 发送队列长度:0           接收字节:644080 (644.0 KB)  发送字节:644080 (644.0 KB)通过ifconfig命令,可以得到本机如下主要信息:ip地址-- 192.168.33.72mac地址(硬件地址)-- 78:45:c4:01:fc:aa

 2.获取要访问的服务器的信息

root@yutao:~# host pop.126.compop.126.com is an alias for pop3.126.com.pop3.126.com is an alias for pop3.126.idns.yeah.net.pop3.126.idns.yeah.net has address 123.125.50.23通过host命令确定要访问的域名对应的ip地址:域名--pop.126.comip地址—123.125.50.23

 三、分析包信息

1.先看看包信息的截图

2.包信息分析

本文重点分析TCP连接的三次握手,对于断开连接的四次握手,这里还有一些疑问,所以暂时不分析。

首先,通过follow tcp stream可以看到如下内容,也就是显示在终端中的内容:

+OK Welcome to coremail Mail Pop3 Server (126coms[96cf230d1dfd5e9799113d194aeefd37s])
quit
+OK core mail

其次,概述这12条记录的内容

1-3正是建立TCP连接的三次握手;

4-9是本机与服务器的交互信息,其中包含一些携带ack的确认信息;

10-12是断开连接的相关信息

我们重点来研究前三条记录。

先来看第一条记录的详细信息,包括四个部分:框架、以太网协议(链路层)、IP协议(网络层)、TCP协议(传输层)。一共有74个字节的内容:



框架内容如下图所示:


包含的内容有一共多少个字节,到达具体的时间,精确到ns等信息。

以太网协议如下图所示


此部分内容一个占14个字节,分为三部分:目的物理地址(6个字节)、源的物理地址(6个字节)、类型(2个字节)


前面已经用ifconfig命令查到了本机的mac(物理)地址为78:45:c4:01:fc:aa,所以这里前6个字节是目的的物理地址,而接下来的6个字节就是本机的物理地址,紧接着的两个字节0x0800代表了接下来的类型是IP数据报,若为0806则表示是ARP请求/应答,若为8035则代表RARP请求/应答。

接下来的20字节内容代表IP首部,这是一个标准的IP首部,不包含选项字段。

第一个字节45包含两部分内容,4代表IP协议版本号是4,即IPv4;5代表IP首部的长度(1单位为4个字节,所以5代表此IP首部长度为20个字节);

第二个字节代表服务类型,10可以代表telnet;

接下来两个字节代表整个IP数据报的总长度(注:后面的TCP首部及数据都包含在IP数据报内),所以74个字节中,减去14个字节代表以太网协议,剩下的都是IP数据报的内容,为60个字节(1单位代表1个字节,与前面的首部长度的单位不同);

然后的两个字节表示标识;然后的两个字节包含一个3位标志和13位片偏移;然后的一个字节40代表生存时间为64;

部分省略.....最后的8个字节分别表示源IP地址和目的IP地址,前面我们已经知道,本机IP地址为192.168.33.72,目的IP地址为123.125.50.23,将其转为16进制后就是看到的数据了。


终于到了我们的TCP数据报了,这部分就是最后的内容,包含40个字节,其中20个字节是TCP首部,另外20个字节是选项数据,所以这整个数据报都没有包含任何数据信息。这里我们重点分析前20个字节的首部信息,选项数据略过。

前4个字节是端口号:2字节源端口号46367 + 2字节目的端口号110(我们在之前的telnet命令中已经指定);b5 1f(46376)    00 6e(110)

之前的IP地址,加上现在的端口号,这正是socket编程中通讯必须的数据。

接下来是4个字节的序号和4个字节的确认序号,不过确认序号只有在标志ACK为1时才有意义,这个数据报中ACK为0,所以它无意义。本数据报的SYN为1,

SYN是同步序号,表示发起一个连接。当前的序号是97 c9 06 5b,后面当服务器返回ACK确认信息时,这个值会加1,它称为ISN(Initial Sequence Number),

它的产生是随时间变化的,RFC793中它每4ms加1.

接下来是4位TCP首部长度,也就是a0中的a,a代表10,所以它代表首部长度为10*4字节,也就是40个字节,20+20(选项)。

这里的标志位只有SYN为1,代表要建立连接;

后面的6个字节忽略之:分别为2字节窗口大小、2字节检验和、2字节紧急指针。

我们已经分析完了第一条数据报,这是本机向服务器发出的建立连接的申请,第二条数据报则应该是服务器发回的确认受到第一条数据报的信息,以及服务器也想要建立连接的请求,第三条就是本机发给服务器,告诉服务器我们已经受到你刚才发过来的第二条数据报了。

主要需要留意的几点在标志位和序号及确认序号的不同。

看第二条数据报的这些内容:

留意三点:

1. 5e d2 95 89 这是服务器发来的序号,当然它也是一个随时间变化的,这里看不出什么规律,但后面它会加1;

2.紧接着的确认序号:97 c9 06 5c ,对比之前第一条发往服务器的数据报的序号97 c9 06 5b,它已经加1;

3.标志位中ACK--Acknowledgement: Set和SYN都为1,ACK代表服务器确认收到了第一条数据报,而且正确接收了(利用检验和判断),

同时SYN代表服务器也希望能够建立一条连接。


再看第三条数据报内容:

看点同样有三个:

1.确认序号为5e d2 95 8a,对比前一个数据报的序号(拿现在的“确认序号”与之前的“序号”相比,而不是两个数据报的“确认序号”或“序号”相比),正好加1

2.现在的序号97 c9 06 5c正是之前的确认序号

3.只有ACK标志为1,表明确认正常接收到服务器传来的信息。


至此,TCP连接的三次握手算是成功了。对于终止连接的四次握手,这里有疑问,怎么我这里看到的数据报只有三条呢? 还请高人指点,不知是否是我的telnet操作的关系导致的。