预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共56页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

第3讲TCP/IP实现 与Socket编程3.1.1Linux下TCP/IP框架BSD套接字是UNIX为网络编程提供的传输层编程接口,该接口并不考虑底层的网络通信协议,而是在所有的通信协议之上提供统一的接口函数。因此,不管编程用户使用何种底层网络协议,所使用的BSD套接字函数都是一致的。3.1.1.2BSDSocket接口套接字类型在不同的协议族中,具有各种不同性能、特色的传输层、网络层协议。在进行网络编程中,用户无需考虑具体的协议细节,仅仅知道该协议可以提供何种类型的服务。Raw类型套接字 —— TCP/IP协议族中的网络层协议以及底层协议套接字文件系统3.1.2Linux下TCP/IP启动3.1.3各种数据结构3.1.3.2核心数据结构sk_buff在IPOverEthernet中,TCP/IP协议族各层的协议数据单元之间的关系如下。Linux没有采用在各层之间通过数据包复制的方法实现各层次之间的数据传递,而是通过直接将数据包加入层次队列的方法实现,保证了协议数据包处理的快捷和高效。 Linux采用一种数据结构sk_buff在不同协议层及网络设备驱动程序之间传送数据,也就是说,网络设备发送与接收数据包所用的缓冲区是一个统一的数据结构sk_buff,并且这些结构一旦在内核中产生,无论在任何层次间传递,都始终保持有效,直至消亡。(注:sk_buff只在操作系统的内核空间中出现) 在使用sk_buff结构时,该结构链接到一个双向循环链表中,双向循环链表的作用在于很方便地实现插入与删除,这是Linux实现网络数据缓冲区的主要方式。sk_buff结构union { structtcphdr *th; structudphdr *uh; structicmphdr *icmph; structigmphdr *igmph; structiphdr *ipiph; structspxhdr *spxh; unsignedchar *raw; }h; union { structiphdr *iph; structipv6hdr *ipv6h; structarphdr *arph; structipxhdr *ipxh; unsignedchar *raw; }nh; union { structethhdr *ethernet; unsignedchar *raw; }mac;unsignedint len; /*此报文的长度,这是指网络报文在不同协议层中的长度,包括头部和数据。在协议栈的不同层,这个长度是不同的。*/ unsignedintdata_len; /*这个变量记录的是在frags和frag_list里面存储的报文的长度。*/ unsighedint true_size; /*truesize是sk_buff{}用来存放数据的缓冲区的长度,并不是指有效数据的长度。*/ unsignedchar *head; //指向被分配的内存空间的首地址 unsignedchar *data; //指向当前数据包的首地址 unsignedchar *tail; //指向当前数据包的末地址 unsignedchar *end; //指向被分配的内存空间的末地址 /*以上四个变量指向此报文存储区。*/ 四个指针变量frags是一个数组,frag_list是一个单向链表,它们所指向的存储空间是一个页的大小(即4k)。这些额外的存储空间并不是一开始就使用的,只有在data所指的存储空间不够用的情况下才使用这些存储空间。 在sk_buff里增加了一个变量data_len。这个变量记录的是在frags和frag_list里面存储的报文的长度。 在较早的版本中: skb->len=skb->tail–skb->data skb->turesize=skb->end–skb->head 在2.4.X内核中: skb->len=skb->tail–skb->data+skb->data_len skb->turesize=skb->end–skb->head+skb->data_lensk_buff_head的定义在Linux中,所有的外围设备被归结为三类:字符设备、块设备和网络设备; Linux对所有的物理网络设备进行抽象并定义了统一的概念——接口; 一个网络接口被看作是一个发送和接收数据包的实体; 对于每个网络接口,都用一个net_device的数据结构表示。Linux网络驱动程序的体系结构可以划分为四层: 协议接口层 网络设备接口层 设备驱动功能层 网络设备和网络媒介层3.2.2网卡初始化3.2.3数据包的发送与接收网卡即网络适配器,作为一种I/O接口卡插在主机板和数据总线的扩展