协议分析工具学习TCP/IP(一)
一、前言
曾在赛迪网发过一篇《用协议分析工具学习TCP/IP》(以下简称"学习"),看到"希望能够再次提供其它的补充"的留言就一直考虑补充些什么,要补充的东西很多,毕竟TCP/TP协议簇是Internet的根基,不管在网上跑什么服务,归根结底都是建立在TCP/TP协议的基础上,要学的东西很多,"学习"一文概述了数据的传送过程,讲到了TCP标志位的变化,本文重点阐述TCP 的状态变迁的情况,如果对TCP协议还不熟悉请参阅"学习"一文,前文讲过的本文不再赘述。
二、为什么要学习TCP的状态变迁
要说清楚为什么,先说说状态,打个简单的比方,一般来说一个人"笑"是"高兴"的状态,"哭"是"悲伤"的状态,"怒吼"是"发怒"的状态等等,也就是说一个人在做某个动作时就处于一定的状态,其实,网络中的计算机在相互通讯时,在不同的阶段就处于不同的状态,"学习"一文中讲到的数据的几个传送过程(建立连接、数据传送、结束连接),在各个过程中,TCP分别处于不同的状态,由此可以看出,只有非常熟悉TCP的状态,才能知道目前你的计算机在网络中处于什么状态,是正在连接别人的计算机?还是不怀好意的人偷偷连入你的机器窃取你的东西?是否受到了攻击?哪些端口处于开放状态?中木马了吗?等等诸如此类的问题都与TCP的状态有关,这就是学习TCP状态的原因。
三、学习要点
1、要有"动"的概念
状态是随着不同的情况而发生变化的,还用上面的比方,一个人"笑"是处于"高兴"的状态,他笑着笑着不笑了也就从"高兴"的状态变为别的状态了。状态是随着条件的不同而变化的,是动的,从下面的学习可以看出,在不同的阶段,TCP协议的标志位各不相同,反映出来的现象就是状态的变化。
2、要分清楚哪些是客户端的状态,哪些是服务器端的状态
何谓客户端和服务器端,你正在上网时,你的计算机就是客户端,而你访问的网站的服务器就是服务器端。如果你在你的机器中提供了一个www服务,那此时你的机器就是服务器端,访问你的计算机是客户端。可见一台计算机即可作为客户端也可作为服务器端。
有些状态是客户端独有的,有些是服务器端独有的,有些是都有的,在下面的学习中一定要注意区别。
3、TCP的状态实际上就是某个端口的状态
"学习"一文提到TCP协议在通讯时用到源端口和目的端口,源端口是本机打开的,目的端口是正在和本机通信的另一台计算机的端口,源端口分主动打开的客户端口和被动连接的服务端口两种。本机提供一个服务就打开一个端口,例如:提供www服务默认打开80端口,提供E_mail 服务默认打开25端口,提供FTP服务默认打开21端口,服务端口号一般是固定的,当有其它
的计算机访问你的www服务时,那台计算机要随机开个端口(1024以上)与你的80端口进行通讯,此时你的80端口的TCP状态将会随着不同的阶段而发生变化,而此时21、25等服务端口在没有被访问的情况下是不会发生变化的。
学习时一定要清楚TCP的状态实际上就是某个端口的状态这句话的含义。
四、测试环境
测试环境请参见用协议分析工具学习TCP/IP一文。
测试工具:协议分析工具IRIS、Sniffer pro
协议分析工具有很多,也有免费的,只要能把包抓下来就行了。Windows 系统自带的网络监视器和Linux自带的TCPDUMP也是不错的工具。
TCP状态观察工具TCPview,该软件很小只有93KB,而且是个绿色软件,不用安装。下载地很多,到华军down一个吧/soft/3483.htm。
五、概述
图1和图2都是在《TCP/IP祥解》一书中截取的非常经典的TCP的状态变迁图,这两张图非常清晰地显示了TCP状态变迁的详细过程。希望能在看完此文后在懂得TCP状态的基础上将这两张图烧到你的脑子里。
图1中,虚线是服务器端的正常状态变化:
从CLOSED->LISTIN->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED->LISTIN
粗实线是客户端的正常状态变化:
从CLOSED->SEND_SENT->ESTABLISHED->FIN_WAIT_1-> FIN_WAIT_2->TIME_WAIT->CLOSED
其中CLOSED状态是个开始状态,在实际观察中是看不到的(本人观点)
细实线是数据传输过程中可能出现的一些情况的状态。
图2是将客户端和服务器端分开的状态显示。
这两张图在下面的学习中要常常用到。
图1 TCP的状态变迁图
图2 TCP正常连接建立和终止所对应的状态
六、如何查看TCP的状态
1、命令方式
下面以Windows XP为例看看新安装的系统都开了那些端口,也就是说都预留了那些门,不借助任何工具来查看端口的命令是netstat,方法如下:
a、在"开始"的"运行"处键入cmd,回车
b、如图3在dos命令界面,键入netstat -na,图3显示的就是打开的服务端口,其中Proto代表协议,该图中可以看出有TCP和UDP两种协议。Local Address代表本机地址,该地址冒号后的数字就是开放的端口号。Foreign Address代表远程地址,如果和其它机器正在通信,显示的就是对方的地址,State代表状态,显示的LISTENING表示处于侦听状态,就是说该端口是开放的,等待连接,但还没有被连接。就像你房子的门已经敞开了,但此时还没有人进来。以第一行为例看看它的意思。
TCP 0.0.0.0:135 0.0.0.0:0 LISTENING
这一行的意思是本机的135端口正在等待连接。注意:只有TCP协议的服务端口才能处于LISTENING状态。其它状态稍后讲。
图3
2、用TCPView工具
为了更好的分析端口,最好用TCPView这个软件,它是动态的。
图4是TCPView的运行界面。第一次显示时字体有些小,在"Options"->"Font"中将字号调大即可。TCPView显示的数据是动态的。图3中Local Address显示的就是本机开放的哪个端口(:号后面的数字),TCPView可以看出哪个端口是由哪个程序发起的。从图3可以看出445、139、1025、135、5000等端口是开放的,445、139等端口都是system发起的,135等都是SVCHOST发起的。