文档库 最新最全的文档下载
当前位置:文档库 › IP包的碎片重组过程

IP包的碎片重组过程

IP包的碎片重组过程
IP包的碎片重组过程

(1) 当内核接收到本地的IP包, 在传递给上层协议处理之前,先进行碎片重组.IP包片段之间的标识号(id)是相同的.当IP包片偏量(frag_off)第14位(IP_MF)为1时, 表示该IP包有后继片段.片偏量的低13位则为该片段在完整数据包中的偏移量, 以8字节为单位. 当IP_MF位为0时,表示IP包是最后一块碎片.

(2) 碎片重组由重组队列完成, 每一重组队列对应于(daddr,saddr,protocol,id)构成的键值,它们存在于ipq结构构成的散列链之中. 重组队列将IP包按照将片段偏移量的顺序进行排列,当所有的片段都到齐后, 就可以将队列中的包碎片按顺序拼合成一个完整的IP包.

(3) 如果30秒后重组队列内包未到齐, 则重组过程失败, 重组队列被释放,同时向发送方以ICMP协议通知失败信息.重组队列的内存消耗不得大于256k(sysctl_ipfrag_high_thresh),

否则将会调用(ip_evictor)释放每支散列尾端的重组队列.

; net/ipv4/ip_input.c:

/*

* Deliver IP Packets to the higher protocol layers.

*/

int ip_local_deliver(struct sk_buff *skb)

{

struct iphdr *iph = skb->nh.iph;

/*

* Reassemble IP fragments.

*/

if (iph->frag_off & htons(IP_MF|IP_OFFSET)) {

skb = ip_defrag(skb);

if (!skb)

return 0;

}

return NF_HOOK(PF_INET, NF_IP_LOCAL_IN, skb, skb->dev, NULL,

ip_local_deliver_finish);

}

; net/ipv4/ip_fragment.c:

/* NOTE. Logic of IP defragmentation is parallel to corresponding IPv6

* code now. If you change something here, _PLEASE_ update ipv6/reassembly.c

* as well. Or notify me, at least. --ANK

*/

/* Fragment cache limits. We will commit 256K at one time. Should we

* cross that limit we will prune down to 192K. This should cope with

* even the most extreme cases without allowing an attacker to measurably

* harm machine performance.

*/

int sysctl_ipfrag_high_thresh = 256*1024; (256k字节)

int sysctl_ipfrag_low_thresh = 192*1024; (192k字节)

/* Important NOTE! Fragment queue must be destroyed before MSL expires.

* RFC791 is wrong proposing to prolongate timer each fragment arrival by TTL. */

int sysctl_ipfrag_time = IP_FRAG_TIME; (30秒)

struct ipfrag_skb_cb

{

struct inet_skb_parm h;

int offset;

};

#define FRAG_CB(skb) ((struct ipfrag_skb_cb*)((skb)->cb))

/* Describe an entry in the "incomplete datagrams" queue. */

struct ipq {

struct ipq *next; /* linked list pointers */

u32 saddr;

u32 daddr;

u16 id;

u8 protocol;

u8 last_in;

#define COMPLETE 4

#define FIRST_IN 2

#define LAST_IN 1

struct sk_buff *fragments; /* linked list of received fragments */

int len; /* total length of original datagram */

int meat;

spinlock_t lock;

atomic_t refcnt;

struct timer_list timer; /* when will this queue expire? */

struct ipq **pprev;

int iif; /* Device index - for icmp replies*/

};

/* Hash table. */

#define IPQ_HASHSZ 64

/* Per-bucket lock is easy to add now. */

static struct ipq *ipq_hash[IPQ_HASHSZ];

static rwlock_t ipfrag_lock = RW_LOCK_UNLOCKED;

int ip_frag_nqueues = 0;

/* Process an incoming IP datagram fragment. */

struct sk_buff *ip_defrag(struct sk_buff *skb)

{

struct iphdr *iph = skb->nh.iph;

struct ipq *qp;

struct net_device *dev;

IP_INC_STATS_BH(IpReasmReqds);

/* Start by cleaning up the memory. */

if (atomic_read(&ip_frag_mem) > sysctl_ipfrag_high_thresh)

ip_evictor();

dev = skb->dev;

/* Lookup (or create) queue header */

if ((qp = ip_find(iph)) != NULL) {

struct sk_buff *ret = NULL;

spin_lock(&qp->lock);

ip_frag_queue(qp, skb);

if (qp->last_in == (FIRST_IN|LAST_IN) && //首包与尾包已收到

qp->meat == qp->len) //队列中字节数恰好等于队列尾部ret = ip_frag_reasm(qp, dev); //重组碎片

spin_unlock(&qp->lock);

ipq_put(qp);

return ret;

}

IP_INC_STATS_BH(IpReasmFails);

kfree_skb(skb);

return NULL;

}

/*

* Was: ((((id) >> 1) ^ (saddr) ^ (daddr) ^ (prot)) & (IPQ_HASHSZ - 1))

*

* I see, I see evil hand of bigendian mafia. On Intel all the packets hit

* one hash bucket with this hash function. 8)

*/

static __inline__ unsigned int ipqhashfn(u16 id, u32 saddr, u32 daddr, u8 prot)

{

unsigned int h = saddr ^ daddr ;

h ^= (h>>16)^id ;

h ^= (h>>8)^prot ;

return h & (IPQ_HASHSZ - 1);

}

/* Find the correct entry in the "incomplete datagrams" queue for

* this IP datagram, and create new one, if nothing is found.

*/

static inline struct ipq *ip_find(struct iphdr *iph)

{

//为某个IP包在“不完整数据报队列”中寻找正确的项,如果没找到就新建一个__u16 id = iph->id;

__u32 saddr = iph->saddr;

__u32 daddr = iph->daddr;

__u8 protocol = iph->protocol;

unsigned int hash = ipqhashfn(id, saddr, daddr, protocol);

struct ipq *qp;

read_lock(&ipfrag_lock);

for(qp = ipq_hash[hash]; qp; qp = qp->next) {

if(qp->id == id&&

qp->saddr == saddr&&

qp->daddr == daddr &&

qp->protocol == protocol) {

atomic_inc(&qp->refcnt);

read_unlock(&ipfrag_lock);

return qp;

}

}

read_unlock(&ipfrag_lock);

return ip_frag_create(hash, iph); //创建一条IP片段队列

}

/* Add an entry to the 'ipq' queue for a newly received IP datagram. */

static struct ipq *ip_frag_create(unsigned hash, struct iphdr *iph)

{

struct ipq *qp;

if ((qp = frag_alloc_queue()) == NULL)

goto out_nomem;

qp->protocol = iph->protocol;

qp->last_in = 0;

qp->id = iph->id;

qp->saddr = iph->saddr;

qp->daddr = iph->daddr;

qp->len = 0;

qp->meat = 0;

qp->fragments = NULL;

qp->iif = 0;

/* Initialize a timer for this entry. */

init_timer(&qp->timer);

qp->timer.data = (unsigned long) qp; /* pointer to queue */

qp->timer.function = ip_expire; /* expire function */

qp->lock = SPIN_LOCK_UNLOCKED;

atomic_set(&qp->refcnt, 1);

return ip_frag_intern(hash, qp);

out_nomem:

NETDEBUG(printk(KERN_ERR "ip_frag_create: no memory left !\n"));

return NULL;

}

extern __inline__ struct ipq *frag_alloc_queue(void)

{

struct ipq *qp = kmalloc(sizeof(struct ipq), GFP_ATOMIC);

if(!qp)

return NULL;

atomic_add(sizeof(struct ipq), &ip_frag_mem);

return qp;

}

/* Creation primitives. */

static struct ipq *ip_frag_intern(unsigned int hash, struct ipq *qp_in)

{

struct ipq *qp;

write_lock(&ipfrag_lock);

#ifdef CONFIG_SMP

/* With SMP race we have to recheck hash table, because

* such entry could be created on other cpu, while we

* promoted read lock to write lock.

*/

for(qp = ipq_hash[hash]; qp; qp = qp->next) {

if(qp->id == qp_in->id &&

qp->saddr == qp_in->saddr &&

qp->daddr == qp_in->daddr &&

qp->protocol == qp_in->protocol) {

atomic_inc(&qp->refcnt);

write_unlock(&ipfrag_lock);

qp_in->last_in |= COMPLETE;

ipq_put(qp_in);

return qp;

}

}

#endif

qp = qp_in;

if (!mod_timer(&qp->timer, jiffies + sysctl_ipfrag_time))

atomic_inc(&qp->refcnt); //安装重组队列超时监视器

atomic_inc(&qp->refcnt);

if((qp->next = ipq_hash[hash]) != NULL)

qp->next->pprev = &qp->next;

ipq_hash[hash] = qp;

qp->pprev = &ipq_hash[hash];

ip_frag_nqueues++;

write_unlock(&ipfrag_lock);

return qp;

}

/*

* Oops, a fragment queue timed out. Kill it and send an ICMP reply.

*/

static void ip_expire(unsigned long arg)

{

struct ipq *qp = (struct ipq *) arg;

spin_lock(&qp->lock);

if (qp->last_in & COMPLETE)

goto out;

ipq_kill (qp); //将重组队列从散列中删除

IP_INC_STATS_BH (IpReasmTimeout);

IP_INC_STATS_BH(IpReasmFails);

if ((qp->last_in&FIRST_IN) && qp->fragments != NULL) {

struct sk_buff *head = qp->fragments;

/* Send an ICMP "Fragment Reassembly Timeout" message. */

if ((head->dev = dev_get_by_index(qp->iif)) != NULL) {

icmp_send(head, ICMP_TIME_EXCEEDED, ICMP_EXC_FRAGTIME, 0);

dev_put(head->dev);

}

}

out:

spin_unlock(&qp->lock);

ipq_put(qp); //释放重组队列成员

}

/* Kill ipq entry. It is not destroyed immediately,

* because caller (and someone more) holds reference count.

*/

static __inline__ void ipq_kill(struct ipq *ipq)

{

if (del_timer(&ipq->timer))

atomic_dec(&ipq->refcnt);

if (!(ipq->last_in & COMPLETE)) {

ipq_unlink(ipq);

atomic_dec(&ipq->refcnt);

ipq->last_in |= COMPLETE;

}

}

static __inline__ void __ipq_unlink(struct ipq *qp)

{

if(qp->next)

qp->next->pprev = qp->pprev;

*qp->pprev = qp->next;

ip_frag_nqueues--;

}

static __inline__ void ipq_put(struct ipq *ipq)

{

if (atomic_dec_and_test(&ipq->refcnt))

ip_frag_destroy(ipq);

}

/* Complete destruction of ipq. */

static void ip_frag_destroy(struct ipq *qp)

{

struct sk_buff *fp;

BUG_TRAP(qp->last_in&COMPLETE);

BUG_TRAP(del_timer(&qp->timer) == 0);

/* Release all fragment data. */

fp = qp->fragments;

while (fp) {

struct sk_buff *xp = fp->next;

frag_kfree_skb(fp);

fp = xp;

}

/* Finally, release the queue descriptor itself. */

frag_free_queue(qp);

}

/* Memory Tracking Functions. */

extern __inline__ void frag_kfree_skb(struct sk_buff *skb)

{

atomic_sub(skb->truesize, &ip_frag_mem);

kfree_skb(skb);

}

extern __inline__ void frag_free_queue(struct ipq *qp)

{

atomic_sub(sizeof(struct ipq), &ip_frag_mem);

kfree(qp);

}

/* Memory limiting on fragments. Evictor trashes the oldest

* fragment queue until we are back under the low threshold.

*/

static void ip_evictor(void) //重组队列驱逐器

{

int i, progress;

do {

if (atomic_read(&ip_frag_mem) <= sysctl_ipfrag_low_thresh) return;

progress = 0;

/* FIXME: Make LRU queue of frag heads. -DaveM */

for (i = 0; i < IPQ_HASHSZ; i++) {

struct ipq *qp;

if (ipq_hash[ i ] == NULL)

continue;

write_lock(&ipfrag_lock);

if ((qp = ipq_hash[ i ]) != NULL) {

/* find the oldest queue for this hash bucket */

while (qp->next)

qp = qp->next; //取每个散列的最后一项

__ipq_unlink(qp);

write_unlock(&ipfrag_lock);

spin_lock(&qp->lock);

if (del_timer(&qp->timer))

atomic_dec(&qp->refcnt);

qp->last_in |= COMPLETE;

spin_unlock(&qp->lock);

ipq_put(qp);

IP_INC_STA TS_BH(IpReasmFails);

progress = 1;

continue;

}

write_unlock(&ipfrag_lock);

}

} while (progress);

}

/* Add new segment to existing queue. */

static void ip_frag_queue(struct ipq *qp, struct sk_buff *skb) {

struct iphdr *iph = skb->nh.iph;

struct sk_buff *prev, *next;

int flags, offset;

int ihl, end;

if (qp->last_in & COMPLETE)

goto err;

offset = ntohs(iph->frag_off); //取片偏移量描述字

flags = offset & ~IP_OFFSET; //取片标志

offset &= IP_OFFSET; //求片偏移量

offset <<= 3; /* offset is in 8-byte chunks */

ihl = iph->ihl * 4;

/* Determine the position of this fragment. */

end = offset + (ntohs(iph->tot_len) - ihl); //求该片段尾部的数据偏移量

/* Is this the final fragment? */

if ((flags & IP_MF) == 0) { //最后一片段

/* If we already have some bits beyond end

* or have different end, the segment is corrrupted.

*/

if (end < qp->len || //最后一个片段的未尾小于队列内最大的未尾((qp->last_in & LAST_IN) && end != qp->len))

goto err;

qp->last_in |= LAST_IN;

qp->len = end; //设取队列最大未尾

} else { //是中间某个片段

if (end&7) { //如果片段尾部不在8字节上对齐end &= ~7;

if (skb->ip_summed != CHECKSUM_UNNECESSARY)

skb->ip_summed = CHECKSUM_NONE; 不计算校验和}

if (end > qp->len) { //该片段比队列内其它成员位置要大/* Some bits beyond end -> corruption. */

if (qp->last_in & LAST_IN)

goto err;

qp->len = end;

}

}

if (end == offset) //片段的数据区长度为零goto err;

/* Point into the IP datagram 'data' part. */

skb_pull(skb, (skb->nh.raw+ihl) - skb->data); //删除IP包的头部

skb_trim(skb, end - offset); //去队尾部可能的衬垫

/* Find out which fragments are in front and at the back of us

* in the chain of fragments so far. We must know where to put

* this fragment, right?

*/

prev = NULL; //扫描重组队列中的包片段,取偏移大于或等于当前

包偏移的前一成员作为插入位置

for(next = qp->fragments; next != NULL; next = next->next) {

if (FRAG_CB(next)->offset >= offset)

break; /* bingo! */

prev = next;

}

//当前偏移的包

/* We found where to put this one. Check for overlap with

* preceding fragment, and, if needed, align things so that

* any overlaps are eliminated.

*/

if (prev) {

int i = (FRAG_CB(prev)->offset + prev->len) - offset; //求prev尾部与当前偏移之差if (i > 0) { //插入点成员尾部大于当前包开始, 说明当前包与前一包重叠offset += i; //当前包起点后移

if (end <= offset)

goto err;

skb_pull(skb, i); //删除当前包前部i字节.

if (skb->ip_summed != CHECKSUM_UNNECESSARY)

skb->ip_summed = CHECKSUM_NONE;

}

}

//next是当前包的后一包

while (next && FRAG_CB(next)->offset < end) { //后一包与当前包有重叠int i = end - FRAG_CB(next)->offset; /* overlap is 'i' bytes */

if (i < next->len) { //当前包尾部小于后一包尾部

/* Eat head of the next overlapped fragment

* and leave the loop. The next ones cannot overlap.

*/

FRAG_CB(next)->offset += i; //后一包起点后移

skb_pull(next, i); //删除后一包i字节

qp->meat -= i; meat //为队列已容纳的总字节数

if (next->ip_summed != CHECKSUM_UNNECESSARY)

next->ip_summed = CHECKSUM_NONE;

break;

} else { //当前包尾部大于或等于后一包尾部, 则删除后一包

struct sk_buff *free_it = next;

/* Old fragmnet is completely overridden with

* new one drop it.

*/

next = next->next;

if (prev)

prev->next = next;

else //说明next包是队列首包

qp->fragments = next;

qp->meat -= free_it->len;

frag_kfree_skb(free_it);

}

}

FRAG_CB(skb)->offset = offset; //在skb的cb[]块上记录当前包代表的数据位移/* Insert this fragment in the chain of fragments. */

skb->next = next;

if (prev)

prev->next = skb;

else

qp->fragments = skb; //作为首包

if (skb->dev)

qp->iif = skb->dev->ifindex; //取包的输入设号号

skb->dev = NULL;

qp->meat += skb->len;

atomic_add(skb->truesize, &ip_frag_mem); //truesize为包描述结构与数据区总长

if (offset == 0) 首包

qp->last_in |= FIRST_IN;

return;

err:

kfree_skb(skb);

}

/* Build a new IP datagram from all its fragments.

*

* FIXME: We copy here because we lack an effective way of handling lists * of bits on input. Until the new skb data handling is in I'm not going

* to touch this with a bargepole.

*/

static inline unsigned int csum_add(unsigned int csum, unsigned int addend) {

csum += addend;

return csum + (csum < addend);

}

static struct sk_buff *ip_frag_reasm(struct ipq *qp, struct net_device *dev) {

struct sk_buff *skb;

struct iphdr *iph;

struct sk_buff *fp, *head = qp->fragments;

int len;

int ihlen;

ipq_kill(qp); //将队列从散列中删除

BUG_TRAP(head != NULL);

BUG_TRAP(FRAG_CB(head)->offset == 0);

/* Allocate a new buffer for the datagram. */

ihlen = head->nh.iph->ihl*4; //取队列头IP包头长度

len = ihlen + qp->len; //总长度

if(len > 65535)

goto out_oversize;

skb = dev_alloc_skb(len);

if (!skb)

goto out_nomem;

/* Fill in the basic details. */

skb->mac.raw = skb->data;

skb->nh.raw = skb->data;

FRAG_CB(skb)->h = FRAG_CB(head)->h; //复制IP选项信息skb->ip_summed = head->ip_summed;

skb->csum = 0;

/* Copy the original IP headers into the new buffer. */

memcpy(skb_put(skb, ihlen), head->nh.iph, ihlen);

/* Copy the data portions of all fragments into the new buffer. */ for (fp=head; fp; fp = fp->next) {

memcpy(skb_put(skb, fp->len), fp->data, fp->len);

if (skb->ip_summed != fp->ip_summed)

skb->ip_summed = CHECKSUM_NONE;

else if (skb->ip_summed == CHECKSUM_HW)

skb->csum = csum_add(skb->csum, fp->csum);

}

skb->dst = dst_clone(head->dst);

skb->pkt_type = head->pkt_type;

skb->protocol = head->protocol;

skb->dev = dev;

/*

* Clearly bogus, because security markings of the individual

* fragments should have been checked for consistency before

* gluing, and intermediate coalescing of fragments may have

* taken place in ip_defrag() before ip_glue() ever got called.

* If we're not going to do the consistency checking, we might

* as well take the value associated with the first fragment.

* --rct

*/

skb->security = head->security;

#ifdef CONFIG_NETFILTER

/* Connection association is same as fragment (if any). */

skb->nfct = head->nfct;

nf_conntrack_get(skb->nfct);

#ifdef CONFIG_NETFILTER_DEBUG

skb->nf_debug = head->nf_debug;

#endif

#endif

/* Done with all fragments. Fixup the new IP header. */

iph = skb->nh.iph;

iph->frag_off = 0;

iph->tot_len = htons(len);

IP_INC_STATS_BH(IpReasmOKs);

return skb;

out_nomem:

NETDEBUG(printk(KERN_ERR

"IP: queue_glue: no memory for gluing queue %p\n",

qp));

goto out_fail;

out_oversize:

if (net_ratelimit())

printk(KERN_INFO

"Oversized IP packet from %d.%d.%d.%d.\n",

NIPQUAD(qp->saddr));

out_fail:

IP_INC_STATS_BH(IpReasmFails);

return NULL;

}

解析IP数据包课程设计

课程设计任务书

目录1.实验目的2.实验要求3.预备知识4.课程设计分析5.实现过程6.程序流程图7.相关扩展8.实习体会9.参考文献

一.实验目的: 设计一个解析IP数据包的程序,并根据这个程序,说明IP数据包的结构及IP协议的相关问题,从而IP层的工作原理有更好的理解和认识. 二.实验要求: 本设计的目标是捕获网络中数据包,解析数据包的内容,将、结果显示在标准输出上,并同时写入日志文件. 程序的具体要求如下: 3)以命令行形式运行:ipparse logfile,其中ipparse是程序名,而logfile则代表记录结果的日 志文件. 4)在标准输出和日志文件中写入捕获的IP数据包的版本,头长度,服务类型,数据包总长度, 数据包标识,分段标志,分段偏移值,生存时间,上层协议类型,头校验和,源IP地址和目的IP地址等内容. 当程序接收到键盘输入Ctrl+C时退出. 三.预备知识 互联网络层是TCP/IP协议参考模型中的关键部分.IP协议把传输层送来的消息组装成IP数据包,并把IP数据包传送给数据链层.IP协议在TCP/IP协议族中处于核心地位,IP协议制定了统一的IP数据包格式,以消除个通信子网中的差异,从而为信息发送方和接收方提供了透明的传输通道.编制本程序前,首先要对IP包的格式有一定了解,图1给出了IP协议的数据包格式. IP数据包的第一个字段是版本字段,其度是4位,表示所使用的IP协议的版本.目前的版本是IPV4,版本字段的值是4,下一代版本是IPV6,版本字段值是6.本程序主要针对版本是IPV4的数据包的解析. 报头标长字段为4位,它定义了以4B为一个单位的IP包的报文长度.报头中除了选项字段和填充域字段外,其他各字段是定长的.因此,IP数据包的头长度在20—40B之间,是可变的. 0 4 8 16 19 24 图1 IP数据包的格式 服务类型字段共8位,用于指示路由器如何处理该数据包.该字段长度由4位服务类型(TOS)子域和3位优先级子域组成,1位为保留位,该字段结构如图2所示. B7 b6 b5 b4 b3 b2 b1 b0

网络数据包的捕获与分析毕业设计

网络数据包的捕获与分析 【摘要】网络数据包的捕获对于网络安全有着巨大的作用,为我们更好的分析网络中的数据流提供了帮助。本论文是基于Windows下开发一个网络监听工具,侧重点在于实现网络数据包的捕获,然后分析并显示捕获到的数据包信息这部分功能的实现,如分析:IP首部协议类型、源IP、目的IP和端口号等。采用的是Winpcap(Windows Packet Capture)来实现的抓包功能。通过VC++6.0中MFC编程实现通过一个完整界面来控制调用Winpcap中的函数来实现对网卡信息的捕获和循环捕获数据包,然后通过预先对于IP、TCP、UDP等数据包的定义和TCP/IP等协议来解析其中包含的内容并返回显示捕获到数据包的信息,当然也可以保存捕获到的数据包到指定地点以便进一步分析。 【关键词】Winpcap;数据包;捕获;分析

The Capture and Analysis of Network Data Packets Wang Hang (Grade 11,Class 1, Major Network Engineering, Scho ol of Mathematics and Computer Science Dept, Shaanxi University of Technology, Hanzhong 723003, Shaanxi) Tutor: Jia Wei Abstract: The capture of network data packets plays an important part in network security, which is helpful for our better analysis of network data flow.This paper is about a network monitoring tool based on Windows system, which emphasizes particularly on realizing the capture and analysis of network data packets and then displays them. Take analysis as an example, it will check the type of the IP protocol, the source address of IP, the destination address of IP and the port https://www.wendangku.net/doc/5b5008439.html,e the Winpcap(Windows Packet Capture)to capture of data packets. In MFC programming of VC++6.0, the capture of network data packets can be realized via the invoking and control of the functions through a full control panel, and then the analysis of IP ,TCP,UDP and TCP/IP will be done before they are displayed. Certainly the information captured can be saved to the appointed destination in order to go through an advanced analysis. Key words:Winpcap;Data Packets;Capture;Analysis

以太网数据包格式

时隙在一般的数字通信原理中是这样定义的: 由各个消息构成的单一抽样的一组脉冲叫做一帧,一帧中相邻两个脉冲之间是时间间隔叫做时隙. 而以太网的时隙有它自己的特定意义. (1)在以太网CSMA/CD规则中,若发生冲突,则必须让网上每个主机都检测到。但信号传播到整个介质需要一定的时间。 (2)考虑极限情况,主机发送的帧很小,两冲突主机相距很远。在A发送的帧传播到B的前一刻,B开始发送帧。这样,当A的帧到达B时,B检测到了冲突,于是发送阻塞信号。 (3)但B的阻塞信号还没有传输到A,A的帧已发送完毕,那么A就检测不到冲突,而误认为已发送成功,不再发送。 (4)由于信号的传播时延,检测到冲突需要一定的时间,所以发送的帧必须有一定的长度。这就是时隙需要解决的问题。 这里可以把从A到B的传输时间设为T,在极端的情况下A要在2T的时间里才可以检测到有冲突的存在 1,电磁波在1KM电缆的传输时延约为5us(这个数字应该记下来~~~),如果在理想情况下 2,在10Mbps的以太网中有个5-4-3的问题:10 Mb/s以太网最多只能有5个网段,4个转发器,而其中只允许3个网段有设备,其他两个只是传输距离的延长。按照标准,10Mbps以太网采用中继器时,连接最大长度为2500米! 那么在理想的情况下,时隙可以为2500/1000*5*2us=25us,但是事实上并非如此简单.实际上的 时隙一定会比25us大些.接下来说明一下~~~ 3,在以太网在,时隙也可以叫做争用期,只有经过争用期这段时间没有检测到冲突碰撞,发送端才能肯定这次发送不会发生碰撞.然后当发生了碰撞而停止之后,以太网上的机器会再次侦听,再发送,这就有个再 次碰撞的可能性,这里以太网使用了截断二进制指数类型的退避算法来解决,在碰撞之后,会推迟一个随机时间(具体略),这也会对争用期的选择有些影响. 而这个截断二进制指数类型的退避算法的有关说明,可以看看我回的这个帖子~

TCPIP实验之IP数据包分析--

TCP/IP协议与编程实验 姓名: 班级: 学号: 实验题目用Wireshark抓包分析ip数据包 一、实验目的 1、了解并会初步使用Wireshark,能在所用电脑上进行抓包 2、了解IP数据包格式,能应用该软件分析数据包格式 3、查看一个抓到的包的内容,并分析对应的IP数据包格式 二、实验内容 Wireshark 是网络包分析工具。网络包分析工具的主要作用是尝试捕获网络包,并尝试显示包的尽可能详细的情况。 实验步骤: 1、打开wireshark,选择接口选项列表。或单击“Capture”,配置“option” 选项。

2、设置完成后,点击“start”开始抓包: 3、显示结果: 3、选择某一行抓包结果,双击查看此数据包具体结构。

4、捕捉IP数据报。 ① 写出IP数据报的格式。 IP数据报首部的固定部分中的各字段含义如下: (1)版本占4位,指IP协议的版本。通信双方使用的IP协议版本必须一致。目前广泛使用的IP协议版本号为4(即IPv4)。 (2)首部长度占4位,可表示的最大十进制数值是15。请注意,这个字段所表示数的单位是32位字长(1个32位字长是4字节),因此,当IP的首部长度为1111时(即十进制的15),首部长度就达到60字节。当IP分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充。因此数据部分永远在4字节的整数倍开始,这样在实现IP协议时较为方便。首部长度限制为60 字节的缺点是有时可能不够用。但这样做是希望用户尽量减少开销。最常用的首部

3)区分服务占8位,用来获得更好的服务。这个字段在旧标准中叫做服务类型,但实际上一直没有被使用过。1998年IETF把这个字段改名为区分服务 DS(Differentiated Services)。只有在使用区分服务时,这个字段才起作用。 (4)总长度总长度指首部和数据之和的长度,单位为字节。总长度字段为16位,因此数据报的最大长度为216-1=65535字节。长度就是20字节(即首部长度为0101),这时不使用任何选项。 (5)标识(identification) 占16位。IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。但这个“标识”并不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。当数据报由于长度超过网络的MTU而必须分片时,这个标识字段的值就被复制到所有的数据报的标识字段中。相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报。 (6)标志(flag) 占3位,但目前只有2位有意义。 标志字段中的最低位记为MF(More Fragment)。MF=1即表示后面“还有分片”的数据报。MF=0表示这已是若干数据报片中的最后一个。 标志字段中间的一位记为DF(Don’t Fragment),意思是“不能分片”。只有当DF=0时才允许分片。 7)片偏移占13位。片偏移指出:较长的分组在分片后,某片在原分组中的相对位置。也就是说,相对用户数据字段的起点,该片从何处开始。片偏移以8 个字节为偏移单位。这就是说,每个分片的长度一定是8字节(64位)的整数倍。 (8)生存时间占8位,生存时间字段常用的的英文缩写是TTL(Time To Live),表明是数据报在网络中的寿命。由发出数据报的源点设置这个字段。其目的是防止无法交付的数据报无限制地在因特网中兜圈子,因而白白消耗网络资源。最初的设计是以秒作为TTL的单位。每经过一个路由器时,就把TTL减去数据报在路由器消耗掉的一段时间。若数据报在路由器消耗的时间小于1秒,就把TTL值减1。当TTL值为0时,就丢弃这个数据报。 #TTL通常是32或者64,scapy中默认是64 (9)协议占8位,协议字段指出此数据报携带的数据是使用何种协议,以便使目的主机的IP层知道应将数据部分上交给哪个处理过程。(在scapy中,下层的这个protocol一般可以从上曾继承而来,自动填充,我们一般可以省略不填此项) (10)首部检验和占16位。这个字段只检验数据报的首部,但不包括数据部分。这是因为数据报每经过一个路由器,路由器都要重新计算一下首部检验和

实验4_IP协议分析

实验4 IP协议分析 在这个实验里,我们将研究IP协议,通过执行traceroute程序来分析IP数据包发送和接收的过程。我们将研究IP数据包的各个字段,详细学习IP数据包的分片。 一、捕获traceroute 为了产生一个IP数据包,我们将使用traceroute程序来向一些目的地发送不同大小的数据包,这个软件我们在第一个实验已作过简单的尝试了。 但我们试图在IP头部首先发送一个或者更多的具有TTL的数据包,并把TTL的值设置为1;然后向同一个目的地发送一系列具有TTL值为2的数据包;接着向同一个目的地发送一系列具有TTL值为3的数据包等等。路由器在每次接收数据包时消耗掉一个TTL,当TTL达到0时,路由器将会向源主机返回一个ICMP的消息(类型为11的TTL溢出),这样一个TTL值为1的数据包将会引起路由器从发送者发回一个ICMP的TTL溢出消息产生一跳,TTL值为2的数据包发送时会引起路由器产生两跳,TTL值为3的数据包则会引起路由器产生3跳。基于这种方式,主机可以执行traceroute观察ICMP的TTL溢出消息,记录每个路由器的ICMP的溢出消息的源IP地址,即可标识出主机和目的地之间的所有路由器。 我们要运行traceroute让它发送多种长度的数据包,由Windows提供的tracert程序不允许改变由tracert程序发送的ICMP的回复请求消息的大小,在Windows下比较好的一个是pingplotter,它可以在以下网站下载共享版本(现在已下载好存在共享文件夹的压缩包中): 安装pingplotter标准版(你有一个30天的试用期),通过对你所喜欢的站点执行一些traceroute来熟悉这个工具。ICMP回复请求消息的大小可以在pingplotter中设置:Edit-> Options->Default Setting->enginet,在packet size字段中默认包的大小是56字节。pingplotter 发送一系列TTL值渐增的包时,Trace时间间隔的值和间隔的个数在pingplotter中能够设置。按下面步骤做: 1启动Iris,开始包捕获; 2启动pingplotter,然后在“Address to Trace”窗口输入目的地目标的名字: 172.16.1.1 (1岛输入172.16.6.1) 在“# of times to Trace”区域输入3。然后选择Edit-> Options->Default Setting->engine,确认在packet size字段的值为56,点OK。然后按下 Trace按钮。你看到的pingplotter窗口类似如上:

数据包捕获与解析

数据包捕获与解析课程设计报告 学生姓名:董耀杰 学号:1030430330 指导教师:江珊珊

数据包捕获与分析 摘要本课程设计通过Ethereal捕捉实时网络数据包,并根据网络协议分析流程对数据包在TCP/IP各层协议中进行实际解包分析,让网络研究人员对数据包的认识上升到一个感性的层面,为网络协议分析提供技术手段。最后根据Ethereal的工作原理,用Visual C++编写一个简单的数据包捕获与分析软件。 关键词协议分析;Ethereal;数据包;Visual C++ 1引言 本课程设计通过技术手段捕获数据包并加以分析,追踪数据包在TCP/IP各层的封装过程,对于网络协议的研究具有重要的意义。Ethereal是当前较为流行的图形用户接口的抓包软件,是一个可以用来监视所有在网络上被传送的包,并分析其内容的程序。它通常被用来检查网络工作情况,或是用来发现网络程序的bugs。通过ethereal对TCP、UDP、SMTP、telnet和FTP等常用协议进行分析,非常有助于网络故障修复、分析以及软件和协议开发。,它以开源、免费、操作界面友好等优点广为世界各地网络研究人员使用为网络协议分析搭建了一个良好的研究平台。 1.1课程设计的内容 (1)掌握数据包捕获和数据包分析的相关知识; (2)掌握Ethreal软件的安装、启动,并熟悉用它进行局域网数据捕获和分析的功能; (3)设计一个简单的数据包捕获与分析软件。 1.2课程设计的要求 (1)按要求编写课程设计报告书,能正确阐述设计结果。 (2)通过课程设计培养学生严谨的科学态度,认真的工作作风和团队协作精神。 (3)学会文献检索的基本方法和综合运用文献的能力。 (4)在老师的指导下,要求每个学生独立完成课程设计的全部内容。

IP数据报格式

IP数据报格式 TCP/IP协议定义了一个在因特网上传输的包,称为IP 数据报(IP Datagram)。这是一个与硬件无关的虚拟包, 由首部和数据两部分组成,其格式如图所示。首部的前一部分是固定长度,共20字节,是所有IP数据报必须具有的。在首部的固定部分的后面是一些可选字段,其长度是可变的。首部中的源地址和目的地址都是IP协议地址 1、IP数据报首部的固定部分中的各字段 (1)版本占4位,指IP协议的版本。通信双方使用的IP 协议版本必须一致。目前广泛使用的IP协议版本号为4(即IPv4)。 (2)首部长度占4位,可表示的最大十进制数值是15。请注意,这个字段所表示数的单位是32位字长(1个32位字长是4字节),因此,当IP的首部长度为1111时(即十进制的15),首部长度就达到60字节。当IP分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充。因此数据部分永远在4字节的整数倍开始,这样在实现IP 协议时较为方便。首部长度限制为60 字节的缺点是有时可能不够用。但这样做是希望用户尽量减少开销。最常用的首部长度就是20字节(即首部长度为0101),这时不使用任何

选项。 (#我们一般看到的版本和首部长度两个字段是十六进制45,就是版本号version=4,headlength=5,也就是首部长度是60个字节) (3)区分服务占8位,用来获得更好的服务。这个字段在旧标准中叫做服务类型,但实际上一直没有被使用过。1998年IETF把这个字段改名为区分服务DS(Differentiated Services)。只有在使用区分服务时,这个字段才起作用。 (4)总长度总长度指首部和数据之和的长度,单位为字节。总长度字段为16位,因此数据报的最大长度为 216-1=65535字节。 #可以看这个以太网frame总长为336字节,而IP数据包Total length=322,336-322=14正好是Ethernet包头的长度,所以就可以看出这IP数据包总长度一值就是除去Ethernet头的剩余长度,也就是IP包头加数据的长度。 在IP层下面的每一种数据链路层都有自己的帧格式,其中包括帧格式中的数据字段的最大长度,这称为最大传送单元MTU(Maximum Transfer Unit)。当一个数据报封装成链路层的帧时,此数据报的总长度(即首部加上数据部分)一定不能超过下面的数据链路层的MTU值。 (5)标识(identification)占16位。IP软件在存储器中维

Ip数据包捕获设计报告

解析IP数据包程序设计与实现 学生姓名:梁帅指导老师:谢晓巍 摘要现如今,计算机网络已经彻彻底底地改变了人们的生活。大量的数据都是经过计算机网络传输的,而TCP/IP协议是计算机网络中最重要的协议之一。计算机网络中绝大多数数据都是以IP数据包的形式发送和接受的。所以IP数据包的捕获是很多计算机安全技术的基础。本课程设计实现了可以捕获流经本地网卡的IP数据包并将其头部信息解析输出的程序。 关键词TCP/IP;IP数据包;计算机网络;捕获

Design and implementation of IP data packet Student name: LIANG Shuai Advisor:XIE Xiao-wei Abstract Nowadays, computer network has completely changed people's life. A large amount of data is transmitted through computer networks, and the TCP/IP protocol is one of the most important protocols in computer networks. Most of the data in the computer network are sent and received in the form of IP data packets. So IP packet capture is the basis of many computer security technology. This course is designed to capture the IP data packet that flows through the local network card and the program to parse the output of its head. Key words TCP/IP;IP data packet;Computer network;Capture

解析IP数据包课程设计报告

成绩评定表

课程设计任务书

目录 1 课程设计目的 (1) 2 课程设计要求 (2) 3 相关知识 (3) 4 课程设计分析 (6) 5 程序代码 (11) 6 运行结果与分析 (18) 7 参考文献 (18)

1 课程设计目的 IP数据包是网络成传输的基本数据单元,熟悉IP数据包结构对于理解网络工作原理具有重要意义。本课程设计的主要目的是通过接受与解析IP数据包,了解IP数据包的基本结构与IP协议的基本功能。

2 课程设计要求 根据后面介绍的IP数据包结构,编写程序接收并解析IP数据包。 1)以命令行形式运行; ParsePacket log_file 其中,ParsePacket为程序名,log_file为日志文件名。 2)输出内容:IP数据包的各字段值,包括版本、头部长度、服务类型、总长度、标识、分段标志、分段偏移值、生存时间、上层协议类型、头校验和、源IP地址 和目的IP地址等。 3)当程序接收到键盘输入Ctrl+C时退出。

3相关知识 互联网络层是TCP/IP协议参考模型中的关键部分.IP协议把传输层送来的消息组装成IP数据包,并把IP数据包传送给数据链层.IP协议在TCP/IP协议族中处于核心地位,IP 协议制定了统一的IP数据包格式,以消除个通信子网中的差异,从而为信息发送方和接收方提供了透明的传输通道.编制本程序前,首先要对IP包的格式有一定了解,图1给出了IP 协议的数据包格式. IP数据包的第一个字段是版本字段,其度是4位,表示所使用的IP协议的版本.目前的版本是IPV4,版本字段的值是4,下一代版本是IPV6,版本字段值是6.本程序主要针对版本是IPV4的数据包的解析. 报头标长字段为4位,它定义了以4B为一个单位的IP包的报文长度.报头中除了选项字段和填充域字段外,其他各字段是定长的.因此,IP数据包的头长度在20—40B之间,是可变的. 0 4 8 16 19 24 31(位) 图3.1 IP数据包的格式 服务类型字段共8位,用于指示路由器如何处理该数据包.该字段长度由4位服务类型(TOS)子域和3位优先级子域组成,1位为保留位,该字段结构如图2所示. 图3.1 服务类型字段结构

IP及IPSEC协议数据包的捕获与分析

IP及IPSEC协议数据包的捕获与分析

IP及IPSEC协议数据包的捕获与分析 为了掌握掌握IP和IPSEC协议的工作原理及数据传输格式,熟悉网络层的协议。我进行了以下实验:首先用两台PC互ping并查看其IP报文,之后在两台PC上设置IPSEC互ping并查看其报文。最终分析两者的报文了解协议及工作原理。 一、用两台PC组建对等网: 将PC1与PC2连接并分别配置10.176.5.119和10.176.5.120的地址。如图1-1所示。 图1-1 二、两PC互ping: IP数据报结构如图1-2所示。 图1-2 我所抓获的报文如图1-3,图1-4所示:

图1-3 请求包 图1-4 回应包 分析抓获的IP报文: (1)版本:IPV4 (2)首部长度:20字节 (3)服务:当前无不同服务代码,传输忽略CE位,当前网络不拥塞

(4)报文总长度:60字节 (5)标识该字段标记当前分片为第1367分片 (6)三段标志分别指明该报文无保留、可以分段,当前报文为最后一段 (7)片偏移:指当前分片在原数据报(分片前的数据报)中相对于用户数据字段 的偏移量,即在原数据报中的相对位置。 (8)生存时间:表明当前报文还能生存64 (9)上层协议:1代表ICMP (10)首部校验和:用于检验IP报文头部在传播的过程中是否出错 (11)报文发送方IP:10.176.5.120 (12)报文接收方IP:10.176.5.119 (13)之后为所携带的ICMP协议的信息:类型0指本报文为回复应答,数据部分 则指出该报文携带了32字节的数据信息,通过抓获可看到内容为:abcdefghijklmnopqrstuvwabcdefghi 三、IPSec协议配置: 1、新建一个本地安全策略。如图1-5。 图1-5 2、添加IP安全规则。如图1-6.

IP及IPSEC协议数据包的捕获与分析分析

IP及IPSEC协议数据包的捕获与分析 为了掌握掌握IP和IPSEC协议的工作原理及数据传输格式,熟悉网络层的协议。我进行了以下实验:首先用两台PC互ping并查看其IP报文,之后在两台PC上设置IPSEC互ping并查看其报文。最终分析两者的报文了解协议及工作原理。 一、用两台PC组建对等网: 将PC1与PC2连接并分别配置10.176.5.119和10.176.5.120的地址。如图1-1所示。 图1-1 二、两PC互ping: IP数据报结构如图1-2所示。 图1-2 我所抓获的报文如图1-3,图1-4所示:

图1-3 请求包 图1-4 回应包 分析抓获的IP报文: (1)版本:IPV4 (2)首部长度:20字节 (3)服务:当前无不同服务代码,传输忽略CE位,当前网络不拥塞

(4)报文总长度:60字节 (5)标识该字段标记当前分片为第1367分片 (6)三段标志分别指明该报文无保留、可以分段,当前报文为最后一段 (7)片偏移:指当前分片在原数据报(分片前的数据报)中相对于用户数据字段 的偏移量,即在原数据报中的相对位置。 (8)生存时间:表明当前报文还能生存64 (9)上层协议:1代表ICMP (10)首部校验和:用于检验IP报文头部在传播的过程中是否出错 (11)报文发送方IP:10.176.5.120 (12)报文接收方IP:10.176.5.119 (13)之后为所携带的ICMP协议的信息:类型0指本报文为回复应答,数据部分 则指出该报文携带了32字节的数据信息,通过抓获可看到内容为:abcdefghijklmnopqrstuvwabcdefghi 三、IPSec协议配置: 1、新建一个本地安全策略。如图1-5。 图1-5 2、添加IP安全规则。如图1-6.

实验1:网络数据包的捕获与协议分析

实验报告 ( 2014 / 2015 学年第二学期) 题目:网络数据包的捕获与协议分析 专业 学生姓名 班级学号 指导教师胡素君 指导单位计算机系统与网络教学中心 日期2015.5.10

实验一:网络数据包的捕获与协议分析 一、实验目的 1、掌握网络协议分析工具Wireshark的使用方法,并用它来分析一些协议; 2、截获数据包并对它们观察和分析,了解协议的运行机制。 二、实验原理和内容 1、tcp/ip协议族中网络层传输层应用层相关重要协议原理 2、网络协议分析工具Wireshark的工作原理和基本使用规则 三、实验环境以及设备 Pc机、双绞线、局域网 四、实验步骤 1.用Wireshark观察ARP协议以及ping命令的工作过程: (1)打开windows命令行,键入“ipconfig -all”命令获得本机的MAC地址和缺省路由器的IP地址;结果如下: (2)用“arp -d”命令清空本机的缓存;结果如下 (3)开始捕获所有属于ARP协议或ICMP协议的,并且源或目的MAC地址是本机的包。(4)执行命令:ping https://www.wendangku.net/doc/5b5008439.html,,观察执行后的结果并记录。

此时,Wireshark所观察到的现象是:(截图表示) 2.设计一个用Wireshark捕获HTTP实现的完整过程,并对捕获的结果进行分析和统计。(截 图加分析) 3.设计一个用Wireshark捕获ICMP实现的完整过程,并对捕获的结果进行分析和统计。要求:给出捕获某一数据包后的屏幕截图。以16进制形式显示其包的内容,并分析该ICMP 报文。(截图加分析) 4. 设计一个用Wireshark捕获IP数据包的过程,并对捕获的结果进行分析和统计(截图加分析) 要求:给出捕获某一数据包后的屏幕截图。以16进制形式显示其包的内容,并分析在该数据包中的内容:版本首部长度、服务类型、总长度、标识、片偏移、寿命、协议、源Ip地址、目的地址 五、实验总结

IP数据包格式简介

IP 数据包格式 IP 数据包是网络传输的信封,它说明了数据发送的源地址和目的地址,以及数据传输状态。一个完整的数据包由首部和数据两部分组成。首部前20字节属于固定长度,是所有IP 数据包必须有的,后面是可选字段,其长度可变,首部后面是数据包携带的数据,见图5.3.1。 48 16 19 31 版本号 标志 生存时间 协 议标 识 服务类型数据包总长度 段偏移首 部 检 验 和 源地址目 的地址可 选字段+ 填 充位首部长度 数 据部 分 数 据 首部首部 IP 数据包 发送 图5.3.1 IP 数据包格式 1. 版本号(4bit ) 版本号占4位,是IP 协议所使用的版本号,目前是广泛使用的是第四版本,即IPv4。 2. 首部长度(4bit ) 首部长度用于指出IP 包头长度,用于标识数据包头在何处结束,所携带的数据在何处开始。首部长度占四位,数值范围5~15,以4字节为单位,则IP 首部长度为20字节~60字节。如假设首部长度取值“1010”,转换为十进制为“10”,表示IP 包头长度为10×4=40字节,数据从第41字节开始。 3. 服务类型(8bit ) 服务类型用于获得更好服务,大多数情况下并不使用。当网络流量较大时,路由器会根据不同数据包服务类型取值决定哪些先发送,哪些后发送,见图5.3.2。 D 优先级T R C 未用 0 1 2 3 4 5 6 7 图5.3.2 服务类型格式 (1)前3个bit 表示优先级,取值范围0~7共8个优先级,数值越低优先级越高。 (2)后四位是服务类型子字段,用于标识QOS 质量服务。 D :表示要求更低时延 T :表示要求更多吞吐量 R :表示要求更多可靠性 C :表示要求更小路径开销 注:DTRC 默认4位值都为0,表示一般服务;

计算机网络课程设计-IP数据包解析实验报告

< 解析IP数据报实验报告 - … (

目录 目录 (2) 1、课程设计目的 (2) 2、课程设计要求 (2) < 3、相关知识 (2) 4、课程设计分析 (6) 网卡设置 (6) 使用套接字 (7) 接收数据包 (7) 定义IP头部的数据结构 (8) IP包的解析 (9) 协议的定义 (9) ; 捕获处理 (9) 5、运行结果 (10) 6、总结 (11) 7、课程设计参考资料 (11) 8、源程序代码 (11) , /

, 1、课程设计目的 本课程设计的目的就是设计一个解析IP数据包的程序,并根据这个程序,说明IP数据包的结构及IP协议的相关问题,从而对IP层的工作原理有更好的理解和认识。 2、课程设计要求 本设计的目标是捕获网络中的IP数据包,解析数据包的内容,将结果显示在标准输出上,并同时写入日志文件。 程序的具体要求如下: 1)以命令行形式运行:ipparse logfile,其中ipparse是程序名, 而logfile 则代表记录结果的日志文件。 2)在标准输出和日志文件中写入捕获的IP包的版本、头长度、服务类型、数据包总长度、数据包标识、分段标志、分段偏移值、生存时间、上层协议类型、头校验和、源IP地址和目的IP地址等内容。 3)当程序接收到键盘输入Ctrl+C时退出。 3、相关知识 互联网络层是TCP/IP协议参考模型中的关键部分.IP协议把传输层送来的消息组装成IP数据包,并把IP数据包传送给数据链层.IP协议在TCP/IP协议族

中处于核心地位,IP协议制定了统一的IP数据包格式,以消除个通信子网中的差异,从而为信息发送方和接收方提供了透明的传输通道.编制本程序前,首先要对IP包的格式有一定了解,图1给出了IP协议的数据包格式. - IP数据包的第一个字段是版本字段,其度是4位,表示所使用的IP协议的版本.目前的版本是IPV4,版本字段的值是4,下一代版本是IPV6,版本字段值是6.本程序主要针对版本是IPV4的数据包的解析. 报头标长字段为4位,它定义了以4B为一个单位的IP包的报文长度.报头中除了选项字段和填充域字段外,其他各字段是定长的.因此,IP数据包的头长度在20—40B之间,是可变的. 0 4 8 16 19 24 31 图1 IP数据包的格式 服务类型字段共8位,用于指示路由器如何处理该数据包.该字段长度由4位服务

计算机网络实验八 Sniffer Pro数据包捕获与协议分析汇编

惠州学院《计算机网络》实验报告 实验08 Sniffer Pro数据包捕获与协议分析 1. 实验目的 (1)了解Sniffer的工作原理。 (2)掌握SnifferPro工具软件的基本使用方法。 (3)掌握在非交换以太网环境下侦测、记录、分析数据包的方法。 2. 实验原理 数据在网络上是以很小的被称为“帧”或“包”的协议数据单元(PDU)方式传输的。以数据链路层的“帧”为例,“帧”由多个部分组成,不同的部分对应不同的信息以实现相应的功能,例如,以太网帧的前12个字节存放的是源MAC地址和目的MAC地址,这些数据告诉网络该帧的来源和去处,其余部分存放实际用户数据、高层协议的报头如TCP/IP 的报头或IPX报头等等。帧的类型与格式根据通信双方的数据链路层所使用的协议来确定,由网络驱动程序按照一定规则生成,然后通过网络接口卡发送到网络中,通过网络传送到它们的目的主机。目的主机按照同样的通信协议执行相应的接收过程。接收端机器的网络接口卡一旦捕获到这些帧,会告诉操作系统有新的帧到达,然后对其进行校验及存储等处理。 在正常情况下,网络接口卡读入一帧并进行检查,如果帧中携带的目的MAC地址和自己的物理地址一致或者是广播地址,网络接口卡通过产生一个硬件中断引起操作系统注意,然后将帧中所包含的数据传送给系统进一步处理,否则就将这个帧丢弃。 如果网络中某个网络接口卡被设置成“混杂”状态,网络中的数据帧无论是广播数据帧还是发向某一指定地址的数据帧,该网络接口卡将接收所有在网络中传输的帧,这就形成了监听。如果某一台主机被设置成这种监听(Snfffing)模式,它就成了一个Sniffer。 一般来说,以太网和无线网被监听的可能性比较高,因为它们是一个广播型的网络,当然无线网弥散在空中的无线电信号能更轻易地截获。 3. 实验环境与器材 本实验在虚拟机中安装SnifferPro4.7版本,要求虚拟机开启FTP、HTTP等服务,即虚拟机充当服务器,物理机充当工作站。 物理机通过Ping命令、FTP访问及网页访问等操作实验网络数据帧的传递。 4. 实验内容 介绍最基本的网络数据帧的捕获和解码,详细功能请参阅本教材辅助材料。 (1)Sniffer Pro 4.7的安装与启动 1)启动Sniffer Pro 4.7。在获取Sniffer Pro 4.7软件的安装包后,运行安装程序,按要求输入相关信息并输入注册码,若有汉化包请在重启计算机前进行汉化。完成后重启计算机,点击“开始”→“程序”→“Sniffer Pro”→“Sniffer”,启动“Sniffer Pro 4.7”程序。 2)选择用于Sniffer的网络接口。如果计算机有多个网络接口设备,则可通过菜单“File”→“Select Settings”,选择其中的一个来进行监测。若只有一块网卡,则不必进行此步骤。

IP 数据报捕获与分析实验报告

实验报告 专业班级成绩评定______ 学号姓名教师签名______ 实验题目IP 数据报捕获与分析实验时间 一、实验目的: 1.掌握IP数据报格式。 2.理解IP协议的工作原理及工作过程。 3.掌握使用wireshark捕获IP等数据报并分析。 二、实验环境:以太网。 三、实验内容: 1.熟悉WinPcap的体系构架和提供的函数。 2.学习IP数据报校验和计算方法。 3.掌握使用wireshark捕获IP等数据报。 4.对捕获的IP数据报进行分析。 四、实验步骤: 1.在PING之前先运行wireshark熟悉页面并进行一些设置

a.单击Capture Filter过滤器:可以设置捕捉一些特殊规则 的数据报。 b.在选中Capture packets in promiscuous mode:可以设置 为混合全处理模式。 c.可以点击Start开始捕捉。过一段时间后,点击Stop停止, 观察捕捉到的数据报,并进行分析。 2.使用wireshark捕获和分析IP数据包。 a.打开wireshar并开始捕获数据包。 b.然后在系统的“开始”—“运行”—输入“CMD”命令,进 入DOS命令窗口,并输入“ping”命令测试网络的情况. c.如“ping 192.168.0.1”。 Ping 命令的使用

d.再回到wireshar点击停止后查看捕获到的数据,双击打开 “ping”后的数据包,分析数据包的内容。 分片的数据包 (以下图片全部通过wireshark捕获数据包,然后用QQ中的截图功能截取) IP协议节点

IP协议节点 上面节点说明如下: 3.进制数据包窗口 16进制数据包窗口将数据包的所有内容以16进制的形式显示出来,如下所示:

解析IP数据包课程设计

课程设计任务书 目录 1.实验目的 2.实验要求 ) 3.预备知识 4.课程设计分析 5.实现过程 6.程序流程图 ! 7.相关扩展 8.实习体会

9.参考文献 一.实验目的: 设计一个解析IP数据包的程序,并根据这个程序,说明IP数据包的结构及IP协议的相 关问题,从而IP层的工作原理有更好的理解和认识. 、 二.实验要求: 本设计的目标是捕获网络中数据包,解析数据包的内容,将、结果显示在标准输出上, 并同时写入日志文件. 程序的具体要求如下: 3)以命令行形式运行:ipparse logfile,其中ipparse是程序名,而logfile则代表记录 结果的日志文件. 4)在标准输出和日志文件中写入捕获的IP数据包的版本,头长度,服务类型,数据包总长 度,数据包标识,分段标志,分段偏移值,生存时间,上层协议类型,头校验和,源IP地址 和目的IP地址等内容. 当程序接收到键盘输入Ctrl+C时退出. ~ 三.预备知识 互联网络层是TCP/IP协议参考模型中的关键部分.IP协议把传输层送来的消息组装成IP数据包,并把IP数据包传送给数据链层.IP协议在TCP/IP协议族中处于核心地 位,IP协议制定了统一的IP数据包格式,以消除个通信子网中的差异,从而为信息发送 方和接收方提供了透明的传输通道.编制本程序前,首先要对IP包的格式有一定了解, 图1给出了IP协议的数据包格式. IP数据包的第一个字段是版本字段,其度是4位,表示所使用的IP协议的版本.目前的版本是IPV4,版本字段的值是4,下一代版本是IPV6,版本字段值是6.本程序主要 针对版本是IPV4的数据包的解析. 报头标长字段为4位,它定义了以4B为一个单位的IP包的报文长度.报头中除了选项字段和填充域字段外,其他各字段是定长的.因此,IP数据包的头长度在20—40B 之间,是可变的. 0 4 8 16 19 24 31

ip数据包的捕获与解析代码

// PackCaptureDlg.h:header file #define IPV4_WERSION 4 #define IPV6_WERSION 6 #define ICMP_PACKET 1 #define IGMP_PACKET 2 #define TCP_PACKET 6 #define EGP_PACKET 8 #define UDP_packet 17 #define OSPF_PACKET 89 class CPackCaptureDlg:public CDialog { public: //{{AFX_DATA(CFindHostDlg) enum {IDO=IDO_PACKCAPTURE_DIALOG}; int m_Count; CString m_Packet; //}}AFX_DATA protected: //{{AFX_MSG(CFindHostDlg) afx_msg void OnCapture(); //}}AFX_MSG private: typedef struct IP_HEAD //IP头部结构 { union { unsigned char Version; //版本(字节前四位) unsigned char HeadLen; //头部长度(字节后四位) }; unsigned char ServiceType; //服务类型 unsigned short TotalLen; //总长度 unsigned short Identifier; //标识符 union { unsigned short Flags; //标志位(字前三位) unsigned short FragOffset;

解析ip数据包

目录 一、课程设计的目的 (1) 二、课程设计要求 (1) 三、需求分析 (1) 1.先对网卡进行编程,以便连接IP层的数据包。 (1) 2.预先创建一个logfile文件来保存所解析的IP数据包。 (1) 3.使用recv函数实现接收数据包的功能。 (1) 四、设计分析 (1) 4.1 网卡设置 (1) 4.2 使用套接字 (2) 五、程序测试 (3) 六、小结 (5) 七、附录 (5)

一、课程设计的目的 本章课程设计的目的就是设计一个解析IP数据包的程序,并根据这个程序,说明IP数据包的结构及IP协议的相关问题,从而对IP层的工作原理有更好的理解和认识。 二、课程设计要求 本设计的目标是捕获网络中的IP数据包,解析数据包的内容,将结果显示在标准输出上,并同时写入日志文件。 程序的具体要求如下: 1)以命令行形式运行:ipparse logfile,其中ipparse是程序名, 而logfile 则代表记录结果的日志文件。 2)在标准输出和日志文件中写入捕获的IP包的版本、头长度、服务类型、数据包总长度、数据包标识、分段标志、分段偏移值、生存时间、上层协议类型、头校验和、源IP地址和目的IP地址等内容。 3)当程序接收到键盘输入Ctrl+C时退出。 三、需求分析 1.先对网卡进行编程(使用套接字进行编程),以便连接IP层的数据包。 2.预先创建一个logfile文件来保存所解析的IP数据包。 3.使用recv函数实现接收数据包的功能。 4.编写ipparse函数解析捕获的数据包的版本、头长度、服务类型、数据包总长度、数据包标识、分段标志、分段偏移值、生存时间、上层协议类型、头校验和、源IP地址和目的IP地址等内容。 四、设计分析 4.1 网卡设置

相关文档
相关文档 最新文档