————清华大学出版
网络协议分析系列之一:IP首部分析
[复制本帖链接] 晕呀晕呀也就习惯了
发表于 2008-11-19 18:24:35
[此帖被浏览 1675 次,回复 7 次]
最后由 晕呀晕呀也就习惯了 于 2008-11-19 18:30:26 修改 本主题由 Q-Gen 于 2008-11-19 18:37:03 设为精华1 如果有时间的话,本人会陆续放上一系列的教程。 其实也不能说是教程吧,就是一些乱七八糟的东西。
好东西当然是要拿出来给大家一起分享的,构造网络的初衷也是这样的吧。 另外如果文章中有什么不妥之处,欢迎大家来指正!
废话不多说,下面开始我们这个系列的第一帖:IP首部的分析
要用到的工具:
1、活人一个 (当然就是偶了)
2、思科路由器N台(当然是虚拟的了,因为用CISCO的路由器来做的话,比用unix做简单的多,不论是从架设还是其他方面)
3、OmniPeek (强大的报文分析工具,渐渐有超越sniffer的趋势) 4、visio (这个只用来做top图)
参考资料:
TCP/IP Illustracted Volume 1:The Protocols
向伟大的W.Richard Stevens致敬!
————————————————————————————————————————————————
图1:实验要用到的TOP图
假设R1的fa0/0口的IP地址是12.1.1.1/24 R2的fa0/0口的IP地址是12.1.1.2/24
在R1上做telnet 12.1.1.2 (具体内容不做详述)
因为TELNET使用TCP协议,而TCP正是封装在IP数据包里的,所以用telnet的过程来分析这个IP报文。
图2:tcp/ip的封装
图3:IP首部
如图3所示,人们都说IP首部是20字节,20字节的。但是很多人不明白这20字节到底是怎么回事,我这个帖子的目的就是通过抓包、分析包来让大家了解这20字节。
前面的准备工作都做好了,下面我们就来具体分析一下IP 20字节的首部。
图4:ip20字节的首部分析
好,我们把图3和图4放在一起来分析:
①首先是版本号:4 (相信大家也都听过ipv6,如果是ipv6的话,那么这个地方就是6),这个没什么好说的。
②接下来是首部长度字段,这个首部长度是这样规定的:首部长度是指首部占32bit字的数目。
一般来说32bit就是4个字节,也就是说,这个首部长度的内容也就是有多少个4字节。按我们图3所示,首部长度是20字节,所以图4中Header Length的内容就是5。当然首部长度不一定就是20,因为首部长度字段一共有8位,所以IP首部最大可达60字节。
③8位服务类型在当今来说几乎不怎么用,即使用也不是原来设计那样,所以这里不做介绍。
④16位总长度字段是指整个IP数据报的长度,以字节为单位。因为总长度字段是16位,所以可以传送一个长达65535字节的IP数据报,当然在实际应用中不可能传这样长度的一个报文,因为涉及一个IP包分片的问题。 ⑤标识字段唯一的标识主机发送的每一份数据报。通常每发送一份数据报这个值就会加1。在数据报分片的时候,标识字段相同的分组会重组装成一个数据报。 ⑥3位标识和13位的偏移字段都与数据报的分片有关,这里偷下懒,等以后再说。其实说简单了就是:标识字段标识了这个分组后面还有没有分组以及是否分片,而偏移字段则标识了分组的先后顺序问题。
⑦8位的生存时间,虽然是生存时间,但这个字段不是以时间来计数的,一开始设计的时候的确是以时间来计数,后来由于种种原因,就变成了以跳数来计数了。 也就是说,这个生存时间字段设置了数据报可以经过的最多路由器数,每经过一个路由器,这个值都要减1。而当TTL值变为0时,路由器就要丢弃这个数据报,返回给发送主机一个ICMP报文。cisco路由器上的traceroute命令就是依靠TTL来实现的。
为什么要设计这个TTL值呢,就是为了防止数据报在网络中无休止的传送。 ⑧协议字段,这个字段的目的是为了区分上层的协议,是TCP?UDP?ICMP?IGMP?这里的值是6,代表上层协议是TCP,而17代表UDP,1代表ICMP。。。
⑨首部校验和字段,首部校验和,顾名思义,是对IP首部进行计算的检验和,不对首部后面的数据进行计算。而ICMP、IGMP、UDP和TCP在它们各自的首部中均含有同时覆盖首部和数据的校验和。这点IP和他们不同,需要注意一下。 ⑩最后两个字段很清楚啦,源IP和目的IP。从哪来的,要到那里去。94这么简单,嘻嘻!
55555!!!
打了这么多字,好累。 其他的东西留待下次吧。
网络协议分析系列之二:ARP报文分析
[复制本帖链接] 晕呀晕呀也就习惯了
发表于 2008-11-20 20:17:13
[此帖被浏览 1993 次,回复 1 次]
最后由 晕呀晕呀也就习惯了 于 2008-11-20 20:20:24 修改 本主题由 Q-Gen 于 2008-11-20 21:52:52 设为精华1
链接:
网络协议分析系列之一:IP首部分析
本文将对ARP报文加以分析,让大家对ARP报文有个初步的了解。 废话不多说,直接进入主题:
图1:arp报文格式
图2:arp request报文
图3:arp response报文
由图2、图3可以看出,ARP报文是封装在以太网帧里面的,下面我们就来分析一下具体内容。
先说ARP报文的格式:
①硬件类型:指明硬件的类型,以太网是1。
②协议类型:指明发送者映射到数据链路标识的网络层协议的类型;IP对应0x0800。
③硬件地址长度:也就是MAC地址的长度,单位是字节,这里是6。
④协议地址长度:网络层地址的长度,即IP地址长度,单位是字节,这里为4。 ⑤操作:指明是ARP请求(1)还是ARP应答(2),这个可以在图2和图3中相应位置看出。
⑥剩下的字段都很简单啦,不具体说了。
接下来我们来具体分析一下图2和图3的内容,在数据链路层,或者说在一个局域网内两台主机的互相通信是通过硬件地址(MAC地址)来完成的,在主机A(在图2中对应IP为192.168.1.122的主机)刚开启时,它的ARP缓存是空的,如果主机A想和局域网中的主机B(对应IP为192.168.1.1)通信,它要知道主机B的MAC地址才可以,这里主机A已经知道主机B的IP地址了,那么怎么才能知道主机B的MAC地址呢,这也就是arp协议要完成的内容。
arp的作用是:从ip地址到mac地址的一个转换,大家看图2,主机A向同一个局域网内的所有主机(即广播)发送arp请求报文:我的IP是192.168.1.122,我的mac地址是00-E0-B0-E3-1C-B5,请问IP地址为192.168.1.1的MAC地址是什么?
局域网中所有主机都会都到这个arp请求报文,但ip地址是非192.168.1.1的主机发现这份报文不是发给自己的,于是就丢弃掉这份报文,而主机
192.168.1.1检测到这份arp请求报文是发给它的,所以它就发送回一个arp应答报文,具体内容见图3。
要注意的是,arp应答报文不是广播,是单播回给192.168.1.122的,主机192.168.1.122收到这份arp应答报文后,双方就可以通信了。 当然,这里省略了很多细节方面,大家可以查阅下相关的资料。
在这里我说下arp欺骗的内容,相信大家会很感兴趣,其实说穿了,arp欺骗很简单:
arp欺骗分为主机欺骗和网关欺骗,一般来说,我们的网络环境都是N台主机通过网关的NAT功能出去连接Internet的。也就是说所有的数据包都要流经网关。 现在假设有网关、主机A和主机B,主机A是欺骗者,而主机B当然就是被欺骗者了。
先 说主机欺骗,主机A通过某种手段向主机B发送ARP报文:小样儿的你听好了,网关的MAC地址是xx-xx-xx-xx-xx-xx,而这个地址是主机A 随便写的一个mac地址,主机B听到了这个消息后,以后所有的报文都忘这个虚假的地址发送,因为这个地址本身就是不存在的,所以主机B理所当然得也就找不 到网关了,现象就是掉线啦!
再说网关欺骗,过程和上面的也差不多,不过主机A是把报文扔给网关了,内容就是:老大啊,主机B的mac地址 是yy-yy-yy-yy-yy-yy,这个地址当然也是不存在的啦,那网关听信了主机A的虚假内容,于是从Internet发来给主机B的所有数据包, 网关都发往这个虚假的yy-yy-yy-yy-yy-yy,而主机B还在那边张着嘴等着网关送给它的报文呢,不过网关可不管这个,一直把主机A告诉给它的 虚假地址当作是主机B的地址,于是乎,可怜的主机B又断线了!
网络协议分析系列之三:TCP报文分析
[复制本帖链接] 晕呀晕呀也就习惯了
发表于 2008-11-21 21:51:26
[此帖被浏览 1982 次,回复 8 次]
最后由 晕呀晕呀也就习惯了 于 2008-11-21 22:21:09 修改 本主题由 思多雅[天行健] 于 2008-11-21 21:58:05 设为精华1 网络协议分析系列之一:IP首部分析 网络协议分析系列之二:ARP报文分析
书接上回,这次我们来分析TCP报文,相信大家都听过什么TCP的三次握手,四次挥手。
今天我们就来分析一下这个三次握手,四次挥手到底是个什么东西。
下面开始正文: TCP:传输控制报文,向应用提供了可靠的、面向连接的服务,具体请参阅RFC793。 那么什么是面向连接,什么又是无连接呢? 打个比方,你打电话就是面向连接,想想我们打电话需要拨号,通话,然后挂断。 而发短信就是无连接的,反正信息我是给你发过去了,收不收的到我就不知道了。
好啦,然后我们来看TCP首部的结构:
图1:TCP首部
我们先来分析一下TCP的头部,然后再分析三次握手和四次挥手。
①源端口和目的端口:字段长度均为16位,它们标识了源和目的应用程序。我们通常所说的端口号是指目的端口来说的,而源端口一般来说是个随机的值。 ②序列号:字段长度为32位,序列号用来确定发送方发送的数据流中被封装的数据所在的位置。打个比方:如果当前这段数据的序列号为1000,且数据段长100个字节,那么下一段数据段的序列号就应该为1000+100+1=1101。
③确认号:字段长度为32位,确认号确定了源点下一次希望从目标接受的序列号。
④报头长度:长度为4位,报头长度和ip的首部长度相类似,同样是包含4字节的位数,这里不做描述。
⑤保留:4位,保留的东西还需要说么?(*^__^*) 嘻嘻……(另外貌似我的图画的有毛病耶,大家见谅啊!)
⑥标记:8位,后6位分别是URG(紧急指针)、ACK(确认序号有效)、PSH(接收方应该尽快将这个报文段交给应用层)、RST(重建连接)、SYN(同步序号用来发起一个连接)、FIN(发送端完成发送任务)。
⑦窗口大小:窗口大小为16位,这个值是接收端正期望接受的字节。因为窗口大小是一个16bit字段,因而窗口大小最大为65535字节。 ⑧校验和:16位,覆盖了TCP的报头和数据部分。
⑨紧急指针:这个字段只有当URG标记置位时才被使用。 ⑩可选项:此字段指明TCP的发送进程要求的选项。常用的可选项是最大段长度,用来指明本端所能接收的最大长度的报文段。
好啦,下面我们就来看看三次握手的内容:
图2:TCP建立连接的第1次握手
TCP UDP报文解析
1 UDP报文:
UDP报文比较简单,由四个字段组成,每个字段2个字节: (1) 源端口 source port
(2) 目的端口 destination port
(3) 长度 :UDP用户数据报的长度 (4) 检验和 checksum
scapy中定义的UDP类(参数一一对应) >>> ls(UDP)
sport : ShortEnumField = (53) dport : ShortEnumField = (53) len : ShortField = (None) chksum : XShortField = (None) >>>
我们用这个发一个完整的UDP数据包。 定义:
>>> eth=Ether()
>>> ip=IP(dst='10.104.4.13')
>>> udp=UDP(sport=4321,dport=4321)
>>> udpPacket=eth/ip/udp/'This is an UDP datagram' >>> sendp(udpPacket) .
Sent 1 packets.
>>> udpPacket.show() ###[ Ethernet ]###
dst= 00:11:85:ae:03:3b src= 00:22:15:27:69:16 type= 0x800 ###[ IP ]### version= 4 ihl= None tos= 0x0 len= None id= 1 flags= frag= 0 ttl= 64 proto= udp chksum= 0x0 src= 10.104.4.23 dst= 10.104.4.13 options= '' ###[ UDP ]###
sport= 4321 dport= 4321 len= None chksum= 0x0 ###[ Raw ]###
load= 'This is an UDP datagram' >>>
成功发送,而且我们发现一些参数是默认填充和计算的。
>>> len(udpPacket) 65 >>>
UDP中的UDP用户数据报长度是31,正好是总长度65-20(IP头)-14(ethernet头)=31 这个checksum长度就是UDP头(8字节固定)+后面的Data长度
2 TCP报文:
TCP首部比较复杂,分为两大部分,前20个字节是大小固定的,后面的选项部分大小不固定。
首部固定部分各段意义:
(1) 源端口 source port 2个字节
(2) 目的端口 destination port 2个字节
(3) 序号:sequence number,TCP传送的是面向连接的连续的数据流,所传送的数据每一个字节都编上一个序号,首部的这个序号指的是本报文段所发送的数据的第一个字节的序号,占4个字节
(4) 确认号:Ack number,是期望受到对方的下一个报文段的数据的第一个字节的序号,也就是期望收到的下一个报文段首部的序号字段的值,占4个字节 (5)数据偏移:占4位,(单位是4字节),类似于IP包头的首部长度,他是指TCP报文段首部的长度,由于存在长度不确定的选项字段,所以此值最小为20字节,最大为60字节 (6)保留:6bit,目前没用,设为0
(7)这里的6位是说明本报文段性质的,下面再详细说
(8)窗口:window,占2个字节,用来控制对方发送的数量
(9)检验和:checksum,2个字节,检验范围为首部加数据两部分 下面看看那6位的控制部分各位的含义:
SYN:该标志位用来建立连接,让连接双方同步序列号. FIN:表示发送端已经没有数据要求传输了,希望释放连接.
RST:用来复位一个连接.RST标志置位的数据包称为复位包.一般情况下,如果TCP收到的一个分段明显不是属于该主机上的任何一个连接,则向远程发送一个复位包.
URG:为紧急数据标志.如果他为1,表示本数据包中包含紧急数据.此时紧急数据指针有效.
ACK:为确认标志位.如果为1,表示包中的确认号时有效的.否则,包中的确认号无效.
PSH:如果置位,接收端应尽快把数据传诵给应用层. 看个实际抓的一个包:
前面2位是保留,第三位是URG,第四位是ACK,第五位是PSH,第六位是RST,第七位是SYN,第八位是FIN。
可变部分就是选项和填充:长度可变。
>>> ls(TCP)
sport : ShortEnumField = (20) #2字节源端口 dport : ShortEnumField = (80) #2字节目的端口
seq : IntField = (0) #4字节sequence number ack : IntField = (0) # 4byte ack number dataofs : BitField = (None) #首部长度,4bit reserved : BitField = (0)
flags : FlagsField = (2) #控制位,1字节,前两位为0,后面为6个控制 window : ShortField = (8192) #2字节 chksum : XShortField = (None) #2字节 urgptr : ShortField = (0) #紧急指针 options : TCPOptionsField = ({})
其中flags的取值,可以以URG,ACK,PSH,RST,SYN,FIN的首字母来代替 下面是一个具体的TCP报文,
可以很清楚的看到TCP段每个字节的取值情况。可以看到flags值为S,所以这是个SYN位为1,ACK=0,表明这是个连接请求报文,紧跟这个报文的下一个数据报如下图:可见其falgs=SA,即,SYN=1,ACK=1,这说明对方同意连接,而发回的响应报文。
关于TCP三次握手以后再说。
七层与四层模型的功能及协议类型 无网不胜
因篇幅问题不能全部显示,请点此查看更多更全内容