linux协议栈分析
⑴ linux 网络路径中网络协议栈有几种
1.总述
Linux中用户空间的网络编程,是以socket为接口,一般创建一个sockfd = socket(family,type,protocol),之后以该sockfd为参数,进行各种系统调用来实现网络通信功能。其中family指明使用哪种协议域(如INET、UNIX等),protocol指明该协议域中具体哪种协议(如INET中的TCP、UDP等),type表明该接口的类型(如STREAM、DGRAM等),一般设protocol=0,那么就会用该family中该type类型的默认协议(如INET中的STREAM默认就是TCP协议)。
Linux中利用mole机制,层次分明地实现了这套协议体系,并具有很好的扩展性,其基本模块构成如下:
先看右边,顶层的socket模块提供一个sock_register()函数,供各个协议域模块使用,在全局的net_family[]数组中增加一项;各个协议域模块也提供一个类似的register_xx_proto()函数,供各个具体的协议使用,在该协议域私有的xx_proto[]数组中增加一项。这两个数组中的存放的都是指针,指向的数据结构如下图所示:
很明显它们是用来创建不同类型的socket接口的,且是一种分层次的创建过程,可想而知,顶层socket_create()完成一些共有的操作,如分配内存等,然后调用下一层create;协议域内的create()完成一些该协议域内共有的初始化工作;最后具体协议中的create()完成协议特有的初始化。具体的下一节讲。
再来看上图右边的,也是顶层socket模块提供的4个函数,前两个一般由具体协议模块调用,由于协议栈与应用层的交互,具体的后面会讲到。后两个一般有协议域模块调用,用于底层设备与协议栈间的交互。但这也不绝对,如在PPPOE协议中,这4个函数都由具体协议模块调用,这是因为PPPOX协议域内的共有部分不多,各个协议间几乎独立。这4个函数的功能及所用到的数据结构,在后面具体用到时会详细说明。
2.socket插口创建
首先来看一下最终创建好的socket插口由哪些部分组成,该结构是相当庞大的,这里只给出框架:
基本属性有state(listen、accept等),flags标志(blocked等),type类型,这里family和protocol都没有了,因为它们再创建时使用过了,已经被融入到socket结构中。
File指针指向一个file结构,在Linux中一个socket也被抽象为一个文件,所以在应用层一般通过标准的文件操作来操作它。
Ops指向一个struct proto_ops结构,它是每种协议特有的,应用层的系统调用,最终映射到网络栈中具体协议的操作方法。
Sk指向一个struct sock结构,而该结构在分配空间时,多分配了一点以作为该协议的私有部分,这里包含了该协议的具体信息,内容相当多。首先是一个struct sock_common结构,包含了协议的基本信息;然后是一个sk_prot_create指针,指向一个struct proto结构体,该结构体就是第一节中所述的,用proto_regsiter()注册到内核中的,它包含应用层到协议栈的交互操作和信息(也可以说成是Appà transport layer的交互信息);然后还有一个sk_backlog_rcv函数指针,所指函数在协议栈处理完接收到的包之后调用,一般仅是把数据包放到该socket的接收队列中,等待APP读取;最后协议的私有部分里存放该协议的私有信息,如pppoe的sessionID、daddr,tcp的连接4元组等,这些信息很重要,利用它们来区分同一个协议中的多个socket。
附上出处链接:http://blog.csdn.net/vfatfish/article/details/9296885
⑵ 如何对linux网络协议栈进行优化,应该从哪些方面着手
shell主要是你在终端输入命令后与kernel(内核)进行沟通和交互,从而告诉掌管硬件的kernel干什么,说白了就是解释器,把你的命令解释给kernel听
⑶ Linux TCP/IP协议栈数据包处理流程及代码实现分析
好吧,我来回答吧,首先是网卡驱动程序捕获到数据包,做检验无误后,和DMA以及CPU交互,然后由DMA和驱动程序创建BD表,然后分配skbuf(LINUX下)数据结构保存获得的数据帧,内核通过协议栈处理这个skbuf,通常是层层剥离每个层的首部,然后传到上一层,细节就是一个变量做偏移量,每次做一个首部偏移读取首部数据,识别本层协议类型以及下一层协议类型,具体过程就是这个网络原理的过程,请参考《TCP/IP详解卷一》《linux设备驱动程序》《understanding linux network internals》《Unix网络编程卷一》等。
⑷ 求介绍linux内核中802.11 MAC协议栈的详细资料
有滴,看这本书《802.11权威指南》,网上容易下载
⑸ 深入浅出linux tcp /ip协议栈这书怎么样
烂。大部分“深入浅出”的书,多是作者对自己掌握的知识没有信心的表现。同时也迎合了读者,投机取巧、想走捷径的心理。想学tcp/ip,直接看计算机网络的教材就可以了。
⑹ linux socket在协议栈中是怎样的
增加对Linux socket连接 最近的一个项目的最大连接数是模拟多个套接字的客户端和服务器之间的通信。 Linux系统由于Linux的限制,/在include / linux / posix_types.h文件中有如下的宏定义: #UNDEF __FD_SETSIZE 的#define __FD_SETSIZE 1024 这个宏是当你需要超过1024个FD,如select()函数将监听错误定义的最大文件描述符1024。所以,你需要改变1024所需要的数量,但不超过65,535。但这是不够的仅仅。 第二步你需要的文件的进程打开的最大数量。具体的步骤是: 1,CD /usr/src/linux-2.4/include/linux 2,六limits.h中编辑文件: 的#define NR_OPEN 90240原1024 1024 的#define OPEN_MAX 10240原值 3值,六fs.h文件 的#define INR_OPEN 10240原值1024 的#define NR_FILE 65536 8192原始值,内存64 / 1M比例计算的值,1G内存的计算公式为:64 * 10. 4 1024 的#define NR_RESERVED_FILES 128原值,CD /usr/src/linux-2.4/include/net BR>五,六tcp.h中 的#define TCP_LHTABLE_SIZE的32 128原值易听听队列,建立大。 - 设为与内存相关的打开文件的最大数量,系统会减慢太多。 第三步是编译内核,具体步骤是: 1.使清洁 2.化妆 3. make dep的 4.做的bzImage 将导入的bzImage /启动重新启动系统! wc命令,以目前在建立套接字连接数统计| 与超过1024个客户端和服务器到服务器的终端使用netstat的连接。
⑺ 嵌入式Linux内核和网络协议栈的特点,和代表性产品有哪些
首先,嵌入Linux内核是可定制的内核:
1 Linux内核的配置系统
2 Linux内核的模块机制
3 Linux内核的源代码开放
4 经裁减的 Linux内核最小可达到 150KB以下,尤其适合嵌入式领域中资源受限的实际情况。
其次,它的性能优越:Linux 系统内核精简、高效和稳定,能够充分发挥硬件的功能,因此它比其他操作系统的运行效率更高。
再者,它有良好的网络支持:
1 支持 TCP/IP 协议栈
2 提供对包括十兆位、百兆位及千兆位的以太网,还有无线网络、Tokenring(令牌环)和光纤甚至卫星的支持
3 对现在依赖于网络的嵌入式设备来说是很好的选择。
至于网络协议的话,有很多种,就目前主流的3种网络协议是:NetBEUI、IPX/SPX及其兼容协议、TCP/IP,而其他的像Lwip、ZigBee、Sip等很多。
1 NetBEUI的前身是NetBIOS,这一协议是IBM1983年开发完成的,早期的微软OS产品中都选择该协议作为通信协议。它是一套用于实现仅仅在小型局域网上PC见相互通信的标准。该网络最大用户数不能超过30个,1985年,微软对其改进,增加了SMB(Server Message Blocks,服务器消息块)的组成部分,以降低网络的通信阻塞,形成了现在的NetBEUI通信协议。
特点:体积小、效率高、速度快、占用内存少。
2 IPX/SPX及其兼容协议:它的全称是“Internwork Packet Exchange/Sequence Packet Exchange”即网际包交换/顺序包交换。
特点:体积较大、能够连接多种网络、具有强大的路由功能,适合大型网络的使用。windows网络中无法直接使用该协议。
3 TCP/IP是国际互联网Internet采用的协议标准,早期用于ARPANet网络,后来开放用于民间。
特点:灵活性,支持任意规模的网络,可以连接所有的计算机,具有路由功能,且TCP/IP的地址是分级的,容易确定并找到网上的用户,提高了网络代换的利用率。
而其他的像Lwip协议栈的特点:
(1)支持多网络接口的IP转发
(2)支持ICMP协议
(3)包括实验性扩展的UDP
(4)包括阻塞控制,RTT估算和快速恢复和快速转发的TCP
(5)提供专门的内部回调接口用于提高应用程序性能
(6)可选择的Berkeley接口API
(7)在最新的版本中支持ppp
不知道这些是不是你想要的。
⑻ 为什么 Linux 不将网络协议栈在用户态实现
之前因项目需要在用户态实现过tcp协议栈,不难的,看懂tcp ip协议详解就可以了,如果要深入,继续看unix网络编程,深入理解linux网络技术内幕,分析linux内核协议栈,会对tcp ip协议有较大帮助
⑼ 如何学习linux 网络协议栈 书网络通信
应用编程一般不涉及网络协议栈,我指的的是tcp/udp应用开发
你要学习网络协议栈,推荐libpcap这个库(c库,但是也有其他语言的封装),通过这个库你可以把一整个以太网帧都抓下来,对于学习网络协议栈是很有用的
如果你不是一个开发者,只是想学习一下网络协议栈,可以使用tcpmp/Wireshark 这样的抓包进行抓包分析 Wireshark 提供了很有好的界面,让你在看网络包的时候不会很累
或者你可以看看 TCP/IP 协议那几卷,什么卷一卷二的,不过那几本书太厚了,我没看完过,除非你是专业的协议栈开发人员,不推荐看,太累了