成都理工计算机网络2期末考试重点

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

数据存储与字节序-什么是大端字节序将数据高有效位存放在低内存地址的方式,而数据低有效位存放于高内存地址。-什么是小端字节序将数据低有效位存放在低内存地址的方式,而数据高有效位存放于高内存地址。-什么是网络字节序网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用大端字节序排序方式。Linux内核通用链表-内核通用链表的定义structlist_head{structlist_head*next,*prev;};-怎样创建链表LIST_HEAD(my_list);-怎样向链表添加元素(1)在指定的head后插入新节点,常用于堆栈数据结构的实现//@newsk:即将添加的新链表节点//@head:在此节点后添加list_add(structlist_head*new,structlist_head*head);(2)在指定的head前插入新节点,常用于队列数据结构的实现//@newsk:即将添加的新链表节点//@head:在此节点前添加list_add_tail(structlist_head*new,structlist_head*head);-怎样从链表删除元素(3)从链表中删除一个指定节点//@entry:要从链表中删除的节点list_del(structlist_head*entry);-怎样遍历链表(4)遍历链表//@pos:遍历链表时用于指示正在遍历的链表节点的指针//@head:链表头list_for_each(pos,head);-list_entry(…)宏的实现原理宏list_entry的定义如下:#definelist_entry(ptr,type,member)\((type*)((char*)(ptr)-(unsignedlong)(&((type*)0)-member)))1)((type*)0)将0转型为type类型指针,这里就是list_user类型。2)((type*)0)-member访问结构中的数据成员member,即list成员。3)&((type*)0)-member)取出数据成员member的地址,即list的地址。4)(unsignedlong)(&((type*)0)-member))将上一步的地址进行类型转换得到一个unsignedlong型的数,也就是member所在结构实例的偏移地址,即得到list成员在list_user宿主中的偏移。5)(char*)(ptr)将宿主中list的地址转换为char*型,便于按字节进行计算。6)ptr的值减去list在该宿主中的偏移,得到该宿主的首地址的值。7)对上一部的结果进行(type*)转型,获得宿主首地址,即list_user节点的地址。Linux内核通用哈希链表-内核通用哈希链表的定义structhlist_head{structhlist_node*first;};structhlist_node{structhlist_node*next,**pprev;};-怎样创建哈希链表创建具有16个元素的哈希链表的方法如下:structhlist_headuser_hash[16];-怎样给哈希链表添加节点(1)在指定的哈希链表头h所指向的链表头插入新节点//@n:要添加的新哈希链表节点//@h:在此哈希链表头节点后添加hlist_add_head(structhlist_node*n,structhlist_head*h);-怎样查找哈希链表(2)根据当前哈希链表节点指针ptr获得哈希链表宿主节点指针//@ptr:structhlist_node类型的指针//@type:哈希链表节点所在的宿主节点的类型//@member:嵌入宿主的哈希链表节点的变量名hlist_entry(ptr,type,member);-怎样删除哈希链表节点(3)从链表中删除一个指定节点//@entry:要从链表中删除的节点hlist_del(structhlist_head*entry);-怎样全部输出哈希链表的所有节点(3)遍历哈希链表中某个key值所对应的链表//@tpos:哈希链表宿主节点指针//@pos:哈希链表节点指针//@head:哈希链表中某key所对应的链表的头指针//@member:嵌在哈希链表宿主节点中的哈希链表节点的变量名hlist_for_each_entry(tpos,pos,head,member);IP协议首部C语言定义-首部各个字段的含义-参考教材P113-114重点要掌握的内容-IP报文分段原理及实现-IP报文重组原理及实现教材第九章中重点要理解的函数-append_data()-msg_fragment()-msg_find()-msg_frag_intern()-msg_frag_queue()教材第九章中重点要掌握的数据结构-structusermap-structmfq-structmsg_hdr协议分析实例0x0000001B11A6BE540018-F3DD4369080045000x00100020D55600008001-59B2C0A8008DCA730x0020802B08001B390400-140061626364协议分析示例-该以太帧源MAC地址和目的MAC地址分别是多少?源MAC地址0018F3DD4369目的MAC地址001B11A6BE54-该以太帧的什么字节位置的值表示其承载的是IP报文?第13、14字节0800表示其是IP报文-该IP报文的头部有选项内容吗?由头部长度ihl为5得知头部长度为最小20字节,所以没有选项内容。-该IP报文分段了吗,为什么?由分段标识frag为000,得知该报文为可以分割的报文且后面没有报文,由片偏移为0000000000000,得知这是第一个报文,所以得知这个报文没有被分割。-该IP报文的头部和数据各是多少字节?由头部长度ihl为5得知头部长度为5×4=20字节。总长度字段tot_len为0x0020得总长度32字节。数据长度=总长度-(ihl×4)=12。-该IP报文的检验和按主机字节序表示,应是多少?检验和check字段为59B2,由于主机采用小端字节序,所以主机字节序为B259。-该IP报文的ID是多少?由标识号D556得知该报文ID为54614-该IP报文的服务类型(typeofservice)是多少?由区分服务00得知服务类型是00.表示没有服务。intip_rcv(structsk_buff*skb,structnet_device*dev,structpacket_type*pt){structiphdr*iph;if(skb-pkt_type==PACKET_OTHERHOST)……………………………………………(1)gotodrop;…,if(!pskb_may_pull(skb,sizeof(structiphdr)))……………(2)gotoinhdr_error;iph=ip_hdr(skb);if(iph-ihl5||iph-version!=4)…………………………………...(3)gotoinhdr_error;if(!pskb_may_pull(skb,iph-ihl*4))…………………………………………(4)gotoinhdr_error;iph=ip_hdr(skb);if(unlikely(ip_fast_csum((u8*)iph,iph-ihl)))gotoinhdr_error;len=ntohs(iph-tot_hen);…………………..(5)if(skb-lenlen)…………………………………….(6){IP_INC_STATS_BH(IPSTATS_MIB_INTRUNCATEDPKTS);gotodrop;}elseif(len(iph-ihl*4))…………………………………………(7)gotoinhdr_error;if(pskb_trim_rcsum(skb,len)){…………………………………………(8)IP_INC_STATS_BH(IPSTATS_MIB_INDISCARDS);gotodrop;}returnNF_HOOK(PF_INET,NF_IP_PRE_ROUTING,skb,dev,NULL,ip_rcv_finish);…}(1)过滤送往其他主机的数据包。pkt_type表示报文类型。PACKET_OTHERHOST表示非去往本机但是在特定模式下被接受的报文。(2)跳过数据包的以太头,取IP头。(3)IP头的长度是否至少为5,是否是IPV4.(4)检查报头长度与包头描述是否一致。(5)取出ip头中标明的数据包总度,且和收到的数据包长度相比较(6)确保skb的数据长度大于等于IP头部中指示的IP数据包总长度(7)数据包总长度必须大于等于IP头部长度。(8)去除掉空数据,把skb-len和len统一起来defraginip_local_deliverintip_local_deliver(structsk_buff*skb){if(ip_hdr(skb)-frag_off&htons(IP_MF|IP_OFFSET)){skb=ip_defrag(skb,IP_DEFRAG_LOCAL_DELIVER);if(!skb)return0;}returnNF_HOOK(PF_INET,NF_IP_LOCAL_IN,skb,skb-dev,NULL,ip_local_deliver_finish);}IP_MF|IP_OFFSET的结果是:0011111111111111因此,只要(skb)-frag_off和上述结果相等不为0则要么是MF位不为0,表示后续还有其他分段;要么是MF为0,但至少13bit偏移量中有一位不为0,表示该skb是某个IP原始报文的最后一个分段。因此需要调用ip_defrag进行重组处理。

1 / 5
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功