1.通过在终端输入wireshark命令打开wireshark(如果不是root用户,则需要sudo wireshark命令才能打开此工具) 2.抓取的配置如下: interface选择eth0;Capture Filter选择tcp; 3.在另一个终端中执行如下命令,连接126邮箱的pop服务器,端口号为110:
输入命令: root@yutao:~# telnet pop.126.com 110 Trying 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 mail Connection closed by foreign host. root@yutao:~#
dkjfkld
然后就停止wireshark对包的抓取,并保存结果,接下来就可以分析包了。
1.获取本机ip和物理地址 root@yutao:~# ifconfig eth0 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.72 mac地址(硬件地址)-- 78:45:c4:01:fc:aa
root@yutao:~# host pop.126.com pop.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.com ip地址—123.125.50.23
本文重点分析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操作的关系导致的。