ZWeily的小品文——《Something about TCP/IP》系列(1)
ZWeily的小品文——《Something about TCP/IP》系列(1) Something about TCP/IP
引言
也许有不少朋友看过我的小品文系列(好像比较臭美了一点,呵呵),不过那一系列已经停滞了很久了,一直没有再写新的了,原因也许很多吧,不过自己比较懒也是一个原因。不过现在我既然做了ABP这边网络版块的斑竹么,应该稍微用功一点,多写点东西给大家分享。由于目前我平时一直和网络相关的东东打交道,所以就想把自己比较了解的一些知识写下来,我想总会有读者感觉有点收获的。
这个“Something about TCP/IP”么,按照我自己现在的想法,打算还是构成一个系列的文章吧,虽然不知道我会写多少,我想我应该尽量写吧,最好是从下层的ARP一直写到上层的应用协议。不过我不会像那些专业书籍那样一点点细细道来,我会按照自己的想法和思路,挑一些比较有意思或者有价值的东西来讲。所以这一系列的文章不会讲的很详细,不过每篇的相关主题总有一点比较详细讨论的地方,也会尽量结合一些有价值的例子来讲述。现在我只有第一篇的想法,也就是谈一点关于ARP的东东。以后么,一点点来吧,只要有点灵感,我就会来好好写一篇。
哦,这里还有一个讲述的形式问题,我还是比较喜欢那种小品文的对话形式,所以我也尽量用这种方式来写。不过这种方式可能对我来说写起来还是有些难度的,毕竟需要设计一些场景、人物、具体的事件等等。这个么,等大家开始看第一篇的时候就会知道了。^_^
一、 Something about ARP
画外音:Young已经到我们小组有段时间了,C++的一些基本的东西也学得差不多了,因为我们这里也常会有一些网络相关的项目,于是我就给Young一个新的任务——自学一些网络的基本知识,丢给他的书么,就是Stevens的那个三卷套的第一卷。在Young刚拿到这本书的时候,那种久违的“无辜”的眼神又一次出现了……
“真郁闷,这程序似乎还是有一些小问题……”我看着满屏幕的代码,在那里一个人自言自语,“算了,先放一下,去泡杯红茶吧。”
于是我就拿起杯子,往饮水机的方向走去。在经过Young桌子的时候,发现这家伙居然在聊天,给她的那本书摊在桌上,好像没看多少的样子。嗯,该稍微整整她。
泡好了我的红茶,回到了自己的位子上,“得好好谋划一下如何整整Young,给她一点小小的教训”,我正在考虑这个问题的时候,同事Kevin跑了过来,打断了我的思路。
“我们什么时候开始做压力测试?”Kevin问道。
“这个么,等功能测试都完成了之后再做吧。”我顺口答道。“稍等,你说的‘压力测试’?”我的灵感来了,哈哈。
“对啊,压力测试,有什么问题吗?”Kevin一脸疑惑的样子。
“咳,没啥事情。只是确认一下而已。嗯,我有个建议,在给那块开发板作压力测试之前,我们先拿PC作一下同样的测试,看看PC的情况如何,这样也好有个对照嘛。”
“这主意不错,是该这么做一下。那么我们怎么个测法呢?用哪台机器来测呢?”Kevin边问这个问题,边扫视四周,似乎在寻找没人用的机器。
“不用找了,那边有1台机器,本来是Pisces用的,这段日子她出差去了,没人用,就拿她的机器作为测试对象吧。这个测试么只要能开机进系统就行,所以不需要知道她的密码,只要用我们域的public帐号登陆就可以了。你去准备你的测试工具,我去开Pisces的机器,好了我再叫你。”
说完这些,我起身往Pisces的机器走去。起来的时候,我还留意了一下Young,这家伙居然开了5个MSN窗口在聊,真是#$%@$%……
我按照计划,做好了准备工作,然后就让Kevin开始测试。看到Kevin点了Start按钮后,我就知道,不出10分钟,Young就会受到惩罚了,嘿嘿~~
大约过了5分钟……
“咦,我的机器怎么这么卡?”我听到了Young在那里一个人嘀咕。
大约又过了1分钟……
“Weily,你能过来帮我看一下吗?”Young似乎解决不了问题,开始向我求救了。
“有啥问题啊?我这边有点忙,稍等一会儿吧。”嘿嘿,你就再多接受一会儿教训嘛。
Young似乎没那么好的耐心,一溜小跑跑到我这边,然后就在我边上不依不饶了,“师傅,过来看一下嘛,人家的机器好像出问题了,不能动了嘛,快点来救救我吧。怎么说,英雄也应该救美的嘛……”
“好吧,好吧,怎么说,我也算是英雄了,看到需要帮助的,即使不是美人也应该帮一把的嘛,那我就随你过去看看到底是啥问题吧。”我知道Young这个家伙最能磨,基本上没几个人能受得了的,我还是快点过去,省得被她烦死。
到了她那台机器跟前,我装作啥都不知道的样子,在那边按按键盘,动动鼠标,呵呵,果然机器卡得非常厉害,反应迟钝得很啊,而且很明显的是,那五个最小化了的MSN窗口都在那边闪着,但就是点不开,哈哈,我的目的算是达成了。
“你这台机器好像出问题了嘛,是不是中病毒了?”我继续装作啥都不知道。
“没有吧,我都没装过什么东东啊,就刚才一会儿就变成这样了。而且前面我也调出任务管理器看过,没有可疑进程啊,都是常见的进程。”Young越说越无辜了,看她那副可怜的样子,算了,那就饶了她吧,不过在停止之前,我还是先给她上一课吧。
“你稍等一下,我去我的机器上抓一下包看看。”说完,我立马回到自己机器上,打开了Ethereal,用混合模式抓了一下包,装作思考了一番,然后跑到Kevin那里打了个招呼,再走到Young那里。没过几分钟,一切就都正常了。
“师傅啊,这是怎么回事啊?怎么现在就好了呢?”Young一脸疑惑。
“其实,这个的根本原因在于你的机器由于网络负荷过重,导致性能大幅下降,说白了呢,也就是你的机器受到了攻击。”
“啊?不会吧?连我的机器都会被黑客看中?”Young更加不解了。
“这个不一定是黑客,也可能是一些程序错误引起的嘛。从我刚才抓包的情况来看,发现很多报文都往你的机器发了,而你的机器不断地接收这些报文,然后由于这些报文的IP地址不是你的,再把这些报文丢弃。就是这些报文造成你的机器速度变慢的。”
“咦?为啥目的地址不是我IP地址的报文会发到我这里呢?”
“在回答你这个问题之前,我先问你一个问题,我给你的那本书你看了多少了?”
“这个……”Young吐了吐舌头,做了个鬼脸,“第一章还没看完……”
“那你今天都干啥了?”我得对她严厉一点,拷问拷问。
“这个么…… 我在和朋友聊天嘛……”Young似乎知道自己错了,那个表情我不知道用无辜来形容好,还是用诚恳来形容好。
“算了,看你还算老实,我就给你上这么一课吧。其实今天你遇到的情况和所谓的‘ARP欺骗’有关。关于ARP协议的知识,在给你的那本书的第4章有详细的讲解。我就简单地给你讲一些基本的东西。”
“好呀好呀!这样我可以省点力了,嘻嘻!”Young一听到有可以偷懒的机会,就开心得很啊。
“你不要开心得太早,等我给你上完这堂课,会给你布置任务的……”打击Young也是我平时生活中的一大乐趣,嘿嘿!
“师傅啊,什么是ARP?”Young似乎总在关键的时候打断我。
“ARP的全称么,是Address Resolution Protocol。在TCP/IP协议族里,这是最基本的协议。从名字上就可以看出来,它是用来作地址解析的。”
“地址解析?你是说IP地址解析?不是有DNS之类的可以将域名解析为IP地址的嘛,还要ARP做啥啊?”Young又在那里不懂装懂了。
“你就少在那里丢人现眼了,好好听讲。”
“遵命!”
“你的网络知识真该好好补补了。你要知道,在IP地址之下,还有一个物理地址,也就是通常所说的网卡的MAC地址。在TCP/IP协议栈中,IP层位于主机-网络层之上,因此IP地址是一种逻辑上的地址。而在实际网络传输的时候,需要一个实际的物理地址,该地址才是报文真正发送的源地址和目的地址。就好比我们这个局域网里,你的IP地址是192.168.0.123,而你网卡的MAC地址是00-0E-27-59-AD-46。这个MAC地址你可以在Windows的命令行方式下,用ipconfig /all来查看的。”
“哦?好像蛮有意思的,让我去试试看。”她又兴匆匆地跑到自己的机器前,打开了命令行方式,然后就傻在那里了。“师傅,你说的那个命令怎么拼来着?”
我晕!“I-P-C-O-N-F-I-G,空格,斜杠,A-L-L”我就一个字母一个字母地报给她,在我报的时候,听到了几个同事在偷笑,呵呵,看来大家以后又有茶余饭后的谈资了。
“Young,看好了就快过来,继续刚才的话题。”
“来了!马上!”Young边说边跑过来。
“好,我们继续。刚才讲到IP地址和MAC地址。其实在发送一个IP报文的时候,必须得知目的方的MAC地址,这样才能正确地发送。例如我们这种以太网内,所有的报文都是在链路上广播的,也就是只要有一个报文在链路上出现,每台机器都会收到。因此,一台机器接收到一个报文的时候,网卡先判断目的MAC地址是不是自己,如果不是,就丢掉该报文,否则,就收到下该报文,作一些处理之后,交给IP层作进一步地处理。这么一说你就应该知道MAC地址的重要性了吧?”
“嗯。了解了。那么ARP协议也就是将IP地址解析为MAC地址咯?”Young似乎明白了什么。
“对,简单的说就是这个作用。当IP层要发送一个报文的时候,就交给链路层,链路层调用ARP,来获得目的IP对应的目的MAC地址,然后构造成一个数据帧,发送到物理链路上。但这里的关键就在于ARP如何获得目的IP对应的MAC地址。”
“是啊。而且我觉得ARP协议肯定有问题,否则刚才那些不是发给我机器的报文怎么都发到我这里来了呢?”
“不要急,让我先解释一下ARP如何得到MAC地址的。其实这个过程分为两步,首先ARP先查找本地的ARP Cache表,如果在这个表中查到了目的IP对应的MAC地址,那么就将该MAC地址作为目的MAC地址。如果在这个表中没有找到,那么就会发送一个ARP Request报文,该报文是链路层的广播,目的IP匹配的那台机器收到这个报文的时候,就会发送对应的ARP Reply报文,将自己的MAC地址发给源端,然后源端收到该ARP Reply报文后,将其中包含的数据读出,将该MAC作为目的MAC,并在本地的ARP Cache中建立一条新的表项,以便下次发送的时候能够直接查找到,省去了Request/Reply的过程。”
“我有个问题,在ARP Cache中建立了新的表项之后,以后就一直不会发送对于该目的IP的ARP Request报文了吗?万一以后大家的IP地址改了,比如你的机器用我原来的那个IP,那岂不是就会发生前面我遇到的那种攻击了吗?”
“嗯,你说的对,不过你说的这个问题ARP的设计者已经考虑进去了。ARP要求本地保留的每条ARP信息都有一个超时时间,如果一段时间没有更新过该表项的话,这条表项就会被删除。这个时间在Windows系统中是2到10分钟左右。”
“哦?那么我刚才遇到的那个问题到底是怎么发生的呢?”Young似乎又糊涂了。
“你遇到的是ARP欺骗的情况。这里要说明ARP存在的一个问题。ARP协议设计的时候,充分考虑了效率问题,所以当一台机器收到一个ARP报文,无论是Request还是Reply报文,都会将其中包含的IP地址与物理地址的映射信息保存到本地的ARP Cache表中。这么做的好处在于可以减少ARP报文的发送,提高效率。但是,问题在于如果收到的ARP报文中的信息是错误的,那么也就将错误的信息保存到了本地ARP Cache表中了。”
“你的意思是刚才我就遇到了这种情况?”Young瞪着大眼睛望着我。
“对的。前面我抓包的情况来看,Kevin的机器在发送大量的报文,这些报文的目的IP地址是192.168.0.125,而目的MAC地址却是你机器的MAC地址。然后我去问了一下Kevin,原来他在拿Pisces的机器作压力测试,快速地发送大量的报文,而Pisces的IP就是192.168.0.125。于是,凡是应该发给Pisces机器的数据包都发到你那里去了。后来我叫他清空了一下他机器的ARP Cache表,就好了。”
“是Kevin在捣鬼!我去找他算账!!”Young气冲冲的样子,似乎要把Kevin撕成两半,这个样子的Young我还是第一次见到。
“别!你先听我继续讲下去。其实Kevin是无辜的,他只是开着那个测试工具而已,而且他也在那里郁闷为啥测试报文发出去都没有回应。你应该记得我刚跟你说过的那个ARP表项的有效性问题吧。如果那条ARP信息是Kevin用Windows的arp命令手工添加的话,过了一段时间也会失效的。依我的判断,应该是某台机器的一个程序以较短的时间间隔往Kevin的机器发送ARP Reply报文,该报文包含的信息就是Pisces的IP和你的MAC。因此,Kevin机器上的ARP表项在每次失效之前,就又得到了更新,这就是引起他总把报文发送到你那里的原因。至于那个程序么,可能是有一个有错的程序在某台机器上运行着,所以,Kevin是无辜的啦。”
“哦,关于ARP的基本概念就这些了吧?我都听明白了。只是不知道是不是有谁故意在整我,这个让我很郁闷,下次让我抓到的话,我一定不放过他!”Young似乎还没有消气,看来我还是继续装无辜为好。
“今天给你上课么,就这些内容了,但这么讲都是很概要的,具体ARP报文的格式,以及其他一些相关的网络知识要你自己去看了。”
“嗯,我会好好看看的。”Young有时候还真的是很听话,不过就我的了解,这些都是表面现象…… 所以,得给她施加一点压力。
“慢点,你先别走,课上完了,课后作业还没布置呢。回去你把那本书的前4章看完,给我写一份报告,后天一早交给我。”
“啊?时间这么紧啊?我怕来不及……”Young又开始装可怜了。
“你有空在那里聊天,就没空看书吗?交不出来的话,下次再给你一点颜色瞧瞧。”呀,我好像说漏嘴了……
“下次??难道今天的事情都是你在搞鬼?你!你!你!!”Young的火又上来了。我看我还是走为上策……
注:
1.这里说的“那本书”么,就是W. Richard. Stevens那套“TCP/IP Illustrated”的第一卷“The Protocol”,中译本叫“TCP/IP详解 卷一:协议”。
2.其实文中所说的Young受到的攻击,也算是一种DoS的攻击。
3.关于文中提到的那个我用来整Young的那个发ARP Reply报文的工具,我会在写Winpcap教程的时候会有详细的程序,大家期待一下吧。^_^