http://blog.csdn.net/haoahua/article/details/2933305
1: 使用Ethereal学习TCP/IP协议
操作系统为Windows2000 server 版,因为在寝室里只有一台电脑,而且没有网卡(只有一个56K 的老猫),所以安装了虚拟机VMware-workstation( 网上很多地方可以下载,这里就不提供下载了,安装也很简单); 虚拟操作系统是RedHat 8.0 ,为了节省空间和加快速度,没有安装图形界面。关于虚拟系统的安装可以在Google 上搜一下。
这里说一下 Virtual Networks 的设置,如图1-1:
图1-1 设置虚拟网络
两个虚拟网络分别是VMnet1 地址为192.168.126.0 和VMnet8 地址为192.168.216.0,主操作系统windows2000, 安装了两个虚拟网卡,地址分别是192.168.126.1 和192.168.216.1, 主操作系统和虚拟系统的网络关系是Custom 模式,如图1-2:
图1-2 设置虚拟机网卡
打开虚拟机,以root 用户登录redhat,输入setup,设置虚拟机IP 地址为192.168.126.128, 如图1-3:
图1-3 设置Linux IP 地址
好了,设置完了。当然,这只是因为条件限制才如此的,在局域网中就不用这么麻烦了。
实验目的: 巩固对Ethernet II 封包、ARP 分组及IP、ICMP 数据包的认识
嗯,现在开始了。打开Ethereal,在菜单Capture 下点击Interfaces, 选取要抓包的网卡, 这里选取地址为192.168.126.1 的这个网卡抓取数据包,如图1-4:
图1-4 选择抓取数据包网卡
之后在主操作系统中使用ping 192.168.126.128 –t 的命令,来ping 虚拟机。好,我们来看看抓取的数据包。
图1-5 ARP 广播包
从Ethereal 的第一栏中,我们看到这是个ARP 解析的广播包,如图1-5。由于这个版本的Ethereal 使用的是Ethernet II 来解码的,我们先看看Ethernet II 的封装格式。如下图1-6:
图1-6 以太网封包格式
注意这个和802.3 是有区别的,802.3 的封包格式如图1-7:
图1-7 802.3 封包格式
尽管Ethernet II 和802.3 的封包格式不同,但Ethereal 在解码时,都是从“类型”字段来判断一个包是IP 数据报还是ARP 请求/应答或RARP 请求/应答。
从Ethernet II 知道了是ARP 解析以后,我们来看看Ethereal 是如何判断是ARP 请求呢还是应答的。
我们先复习一下以太网的ARP 请求和应答的分组格式,如图1-8。
图1-8 分组格式
从上图中我们了解到判断一个ARP 分组是ARP 请求还是应答的字段是“op”,当其值为0×0001 时是请求,为0×0002 时是应答。如图1-9、1-10。
图1-9 ARP 请求
图1-10 ARP 应答
我们看看第三个帧的内容。第三帧“类型”显示是IP 数据报,如图1-11:
图1-11 ICMP ping 包
同样,我们先复习一下IP 包的封包格式,如图1-12:
图1-12 IP 封包格式
关于IP 封包各字段的内容及意义,这里就不再详述了,可以参见三卷本的TCP/IP, www.cnpaf.net 的“资源共享”版里有下载。
我们主要看看TTL,从图1-13 和1-14 的比较来看,图1-13 中的TTL 是128,而图1-14 中的TTL 却是64,什么原因呢?
原来图1-13 中的主机是Windows2000 ,而1-14 中的主机是Linux,看来不同操作系统的TTL 是不同的。
图1-13 Windows 主机的TTL
图1-14 Linux 主机的TTL
好了我们来看看ICMP 报文吧,先看看它的封包格式,如图1-15:
图1-15 ICMP 封包类型
关于ICMP 的“类型”和“代码”字段,这里有一个表,如图1-16:
图1-16 ICMP 报文类型
ICMP 报文,我们主要对照图1-16 看抓包的情况。
图1-17 ping 请求
图1-18 ping 应答
二: IP协议(RFC791)-IP包格式
IP协议是在网络层的协议.它主要完成数据包的发送作用. 下面这个表是IP4的数据包格式,IP封包格式(IPv4包首部长度为20字节)
|0......4........8..............16....................................32 ------------------------------------------------------------------------- |版本4.|首部长度|服务类型(优先级|数据包总长............................| ------------------------------------------------------------------------- |标识...........................|RF|DF|MF|碎片偏移.....................| ------------------------------------------------------------------------- |生存时间TTL....|协议(TCP/UDP)..|首部较验和............................| ------------------------------------------------------------------------- |源IP地址..............................................................| ------------------------------------------------------------------------- |目的IP地址............................................................| ------------------------------------------------------------------------- |选项..................................................................| ========================================================================= |数据..................................................................| ------------------------------------------------------------------------- |
Version (4) Internet Header Length (4) Type of Service (8) Total Length (16)
Identification (16) Flags (3) Fragment Offset (13)
Time To Live (8) Protocol (8) Header checksum (16)
Source Address (32)
Destination Address (32)
Options (Variable) Padding (0-24)
Data
....
IP包字段含义
|
下面我们看一看IP的结构定义
struct ip
{
#if __BYTE_ORDER == __LITTLE_ENDIAN
unsigned int ip_hl:4; /* header length */
unsigned int ip_v:4; /* version */
#endif
#if __BYTE_ORDER == __BIG_ENDIAN
unsigned int ip_v:4; /* version */
unsigned int ip_hl:4; /* header length */
#endif
u_int8_t ip_tos; /* type of service */
u_short ip_len; /* total length */
u_short ip_id; /* identification */
u_short ip_off; /* fragment offset field */
#define IP_RF 0x8000 /* Reserved Fragment flag */
#define IP_DF 0x4000 /* Don't Fragment flag即第二位为1(不可分包) */
#define IP_MF 0x2000 /* More Fragments flag即二三位为00(可分包,此为最后一个包)或01(还有后继包) */
#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */
u_int8_t ip_ttl; /* time to live */
u_int8_t ip_p; /* protocol */
u_short ip_sum; /* checksum */
struct in_addr ip_src, ip_dst; /* source and dest address */
};
ip_v IP协议的版本号,这里是4,现在IPV6已经出来了
ip_hl IP包首部长度,这个值以4字节为单位.IP协议首部的固定长度为20个字节,如果IP包没有选项,那么这个值为5.
ip_tos服务类型,说明提供的优先权.
ip_len说明IP数据的长度.以字节为单位.
ip_id标识这个IP数据包.
ip_off碎片偏移,这和上面ID一起用来重组碎片的.
ip_ttl生存时间.没经过一个路由的时候减一,直到为0时被抛弃.
ip_p协议,表示创建这个IP数据包的高层协议.如TCP,UDP协议.
ip_sum首部校验和,提供对首部数据的校验.
ip_src,ip_dst发送者和接收者的IP地址
关于IP协议的详细情况,请参考 RFC791
三 :TCP协议-TCP包格式
TCP协议也是建立在IP协议之上的,不过TCP协议是可靠的.按照顺序发送的.TCP的数据结构比前面的结构都要复杂.
行 0.......4.......8..10...........16..............24..............32 ------------------------------------------------------------------ 1|.........源端口.src-port.......|.........目的端口.dst-port.....| ------------------------------------------------------------------ 2|............................序列号.seq.........................| ------------------------------------------------------------------ 3|............................确认号.ack_seq.....................| ------------------------------------------------------------------ |........|..........|U|A|P|R|S|F|...............................| 4|首部长度|.保留(6)..|R|C|S|S|Y|I|.......窗口.window.............| |..doff..|..........|G|K|H|T|N|N|...............................| ------------------------------------------------------------------ 5|........校验和.check...........|........紧急指针.urg_ptr.......| ------------------------------------------------------------------ |.......................选项....................|....填充字节...| ------------------------------------------------------------------ |
Source Port (16) | Destination Port (16) Sequence Number (32) Acknowledgment Number (32) Data Offset(4) | Reserved (6)|UGR|ACK|PSH|RST|SYN|FIN|Window(16) Checksum (16) | Urgent Pointer (16) Options (0 or more 32 bit words + padding) DATA |
TCP的结构在中定义为:.
struct tcphdr {
u_int16_t source;
u_int16_t dest;
u_int32_t seq;
u_int32_t ack_seq;
#if __BYTE_ORDER == __LITTLE_ENDIAN
u_int16_t res1:4;
u_int16_t doff:4;
u_int16_t fin:1;
u_int16_t syn:1;
u_int16_t rst:1;
u_int16_t psh:1;
u_int16_t ack:1;
u_int16_t urg:1;
u_int16_t res2:2;
#elif __BYTE_ORDER == __BIG_ENDIAN
u_int16_t doff:4;
u_int16_t res1:4;
u_int16_t res2:2;
u_int16_t urg:1;
u_int16_t ack:1;
u_int16_t psh:1;
u_int16_t rst:1;
u_int16_t syn:1;
u_int16_t fin:1;
#endif
u_int16_t window;
u_int16_t check;
u_int16_t urg_prt;
};
source发送TCP数据的源端口
dest接受TCP数据的目的端口
seq标识该TCP所包含的数据字节的开始序列号,正常情况下,每次的seq为上次的seq加上上次发送的数据字节数(数据字节数=IP包总长-IP头长-TCP头长)。
ack_seq确认序列号,表示接受方下一次接受的数据序列号。以最后接收的seq+接收的数据字节数。
doff数据首部长度.和IP协议一样,以4字节为单位.一般的时候为5
urg如果设置紧急数据指针,则该位为1
ack如果确认号正确,那么为1
psh如果设置为1,那么接收方收到数据后,立即交给上一层程序
rst为1的时候,表示请求重新连接
syn为1的时候,表示请求建立连接
fin为1的时候,表示亲戚关闭连接
window窗口,告诉接收者可以接收的大小(字节数)
check对TCP数据进行较核
urg_ptr如果urg=1,那么指出紧急数据对于历史数据开始的序列号的偏移值
关于TCP协议的详细情况,请查看 RFC793
7.6 TCP连接的建立
TCP协议是一种可靠的连接,为了保证连接的可靠性,TCP的连接要分为几个步骤.我们把这个连接过程称为"三次握手".
下面我们从一个实例来分析建立连接的过程.
第一步客户机向服务器发送一个TCP数据包,表示请求建立连接. 为此,客户端将数据包的SYN位设置为1,并且设置序列号seq=1000(我们假设为1000).
第二步服务器收到了数据包,并从SYN位为1知道这是一个建立请求的连接.于是服务器也向客户端发送一个TCP数据包.因为是响应客户机的请求,于是服务器设置ACK为1,ack_seq=1001(对方的序列号1000+1)同时设置自己的序列号.seq=2000(我们假设为2000).
第三步客户机收到了服务器的TCP,并从ACK为1和ack_seq=1001知道是从服务器来的确认信息.于是客户机也向服务器发送确认信息.客户机设置ACK=1,和ack_seq=2001(对方的序列号2000+1),seq=1001,发送给服务器.至此客户端完成连接.
最后一步服务器受到确认信息,也完成连接.
通过上面几个步骤,一个TCP连接就建立了.当然在建立过程中可能出现错误,不过TCP协议可以保证自己去处理错误的.
说一说其中的一种错误.
听说过DOS吗?(可不是操作系统啊).今年春节的时候,美国的五大网站一起受到攻击.攻击者用的就是DOS(拒绝式服务)方式.概括的说一下原理.
客户机先进行第一个步骤.服务器收到后,进行第二个步骤.按照正常的TCP连接,客户机应该进行第三个步骤.
不过攻击者实际上并不进行第三个步骤.因为客户端在进行第一个步骤的时候,修改了自己的IP地址,就是说将一个实际上不存在的IP填充在自己IP数据包的发送者的IP一栏.这样因为服务器发的IP地址没有人接收,所以服务端会收不到第三个步骤的确认信号,这样服务务端会在那边一直等待,直到超时.
这样当有大量的客户发出请求后,服务端会有大量等待,直到所有的资源被用光,而不能再接收客户机的请求.
这样当正常的用户向服务器发出请求时,由于没有了资源而不能成功.于是就出现了春节时所出现的情况.
四: UDP协议-UDP包格式
UDP协议是建立在IP协议基础之上的,用在传输层的协议.UDP和IP协议一样是不可靠的数据报服务.UDP的头格式为:
0...............16...............32 ------------------------------------- |UDP源端口.......|UDP目的端口......| ------------------------------------- |UDP数据报长度...|UDP数据报校验....| ------------------------------------- |
五: ICMP协议-ICMP包格式
ICMP是消息控制协议,也处于网络层.在网络上传递IP数据包时,如果发生了错误,那么就会用ICMP协议来报告错误.
ICMP包的结构如下:
0.......8........16..............32 ------------------------------------ |类型....|代码....|校验和..........| ------------------------------------ |数据.............|数据............| ------------------------------------ |
ICMP在中的定义是
struct icmphdr
{
u_int8_t type; /* message type */
u_int8_t code; /* type sub-code */
u_int16_t checksum;
union
{
struct
{
u_int16_t id;
u_int16_t sequence;
} echo; /* echo datagram */
u_int32_t gateway; /* gateway address */
struct
{
u_int16_t __unused;
u_int16_t mtu;
} frag; /* path mtu discovery */
} un;
};
关于ICMP 的“类型”和“代码”字段,这里有一个表,如图1-16:
关于ICMP协议的详细情况可以查看 RFC792
六: EAP,EAPOL协议-数据包格式
http://rfc.net/rfc2284.html
Packet Format
Exactly one PPP EAP packet is encapsulated in the Information field
of a PPP Data Link Layer frame where the protocol field indicates
type hex C227 (PPP EAP). A summary of the EAP packet format is shown
below. The fields are transmitted from left to right.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Code | Identifier | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data ...
+-+-+-+-+
Code
The Code field is one octet and identifies the type of EAP packet.
EAP Codes are assigned as follows:
1 Request
2 Response
3 Success
4 Failure
Identifier
The Identifier field is one octet and aids in matching
responses with requests.
Length
The Length field is two octets and indicates the length of the
EAP packet including the Code, Identifier, Length and Data
fields. Octets outside the range of the Length field should
be treated as Data Link Layer padding and should be ignored on
reception.
Data
The Data field is zero or more octets. The format of the Data
field is determined by the Code field.
2.2.1. Request and Response
A summary of the Request and Response packet format is shown below.
The fields are transmitted from left to right.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Code | Identifier | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Type-Data ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Code
1 for Request;
2 for Response.
Identifier
The Identifier field is one octet. The Identifier field MUST be
the same if a Request packet is retransmitted due to a timeout
while waiting for a Response. Any new (non-retransmission)
Requests MUST modify the Identifier field. If a peer recieves a
duplicate Request for which it has already sent a Response, it
MUST resend it's Response. If a peer receives a duplicate Request
before it has sent a Response to the initial Request (i.e. it's
waiting for user input), it MUST silently discard the duplicate
Request.
Length
The Length field is two octets and indicates the length of the EAP
packet including the Code, Identifier, Length, Type, and Type-Data
fields. Octets outside the range of the Length field should be
treated as Data Link Layer padding and should be ignored on
reception.
Type
The Type field is one octet. This field indicates the Type of
Request or Response. Only one Type MUST be specified per EAP
Request or Response. Normally, the Type field of the Response
will be the same as the Type of the Request. However, there is
also a Nak Response Type for indicating that a Request type is
unacceptable to the peer. When sending a Nak in response to a
Request, the peer MAY indicate an alternative desired
authentication Type which it supports. An initial specification of
Types follows in a later section of this document.
Type-Data
The Type-Data field varies with the Type of Request and the
associated Response.
2.2.2. Success and Failure
A summary of the Success and Failure packet format is shown below.
The fields are transmitted from left to right.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Code | Identifier | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Code
3 for Success;
4 for Failure.
Identifier
The Identifier field is one octet and aids in matching replies to
Responses. The Identifier field MUST match the Indentifier field
of the Response packet that it is sent in response to.
Length
4