设为首页  
联系我们  
加入收藏  
网页制作 冲浪宝典 图形图像 操作系统 软件教学 编程开发 认证考试 安全技术 站长专区 文学驿站 娱乐天地 游戏天地 办公软件
文章搜索
您的位置: 首页 >> 文章首页 >> 操作系统 >> Linux >> Linux 核心--11.网络
精品推荐
Linux点击TOP10
·Linux下安装LumaQQ
·口袋里的Linux:在您的U盘上运行SLAX
·Linux命令Man解释:PPPD(8) :点对点daemon协议
·虚拟网络计算工具VNC使用指南
·Linux系统中如何正确安装摄像头驱动
·Linux 核心--4.内存管理
·Linux 内核文件系统与设备操作流程分析
·Ethernet HOWTO Linux以太网-HOWTO (4)型号的信息
·Linux精彩桌面 GNOME桌面主题安装实例
·Linux下Flash/Shockwave播放器安装
操作系统点击TOP10
·Windows Vista完全硬盘安装法
·Windows Vista 激活不求人
·Windows Vista局域网网络连接设置
·Windows Vista系统动态桌面截图欣赏
·Windows XP中磁盘的分区应用
·Windows NT/2000/XP 出现蓝屏并显示“STOP 0x0000007f”错误
·让Windows XP变身Vista
·一招搞定Vista系统软件不兼容问题
·教你如何正确配置和优化Windows Vista
·只转两圈 加快Windows XP启动速度
精选专题

Linux 核心--11.网络

作者: 来源:http://www.xgdown.com/ 时间:2005-11-18 17:38:10

Linux 核心--11.网络(6)
10.4.5  接收连接请求
    UDP不支持连接的概念,接收INET socket连接请求只适用于TCP协议,一个监听socket接收操作从原始的监听socket中复制新的socket结构。接收操作透过支持的协议层,本例是INET,来接收任何连入连接请求。如果下层协议,如UDP,不支持连接,INET协议层接收操作将失败。否则接收操作透过真实协议层,本例是TCP。接收操作可以是阻塞或非阻塞。在非阻塞情况下,如果没有连入连接可接收,则接收操作失败,新建的socket 结构被废弃。在阻塞情况下,网络应用程序执行接收操作将加上一个等待队列并将之挂起,直到接收到TCP连接请求。当接收一个连接请求后,包含请求的 sk_buff 被废弃,并且 sock 数据结构返回到INET socket层,在那与一个新的更早建立的socket结构连接。新socket文件描述符(fd)号返回给网络应用程序,然后,应用程序就能在socket操作中将这一文件描述符用于新建立的INET BSD socket。 

10.5  IP层
10.5.1  Socket 缓存
    每一层协议用另外层提供的服务,这样使用多层网络协议会有一个问题:每个协议都要在传送数据时都要 加上协议头和协议尾,而数据到达时又要将之去掉。这样,在不同的协议间要有数据缓存,每一层需要知道特 定协议的头和尾放在哪个位置。一个解决办法就是在每一层中都拷贝缓存,但这样做效率就很低。Linux用 socket缓存或者说 sk_buffs 来在协议层与网络设备驱动之间交换数据。 sk_buffs 包括指针和字段长度,这样每 个协议层就可以通过标准的函数或“方法”来操作应用程序数据。 





图 10.4: Socket 缓存 (sk_buff) 

    图  10.4 显示了 sk_buff 数据结构;每个 sk_buff 有一个数据块与之相连。 sk_buff 有四个指针,这些指针 用来操作和管理socket缓存的数据: 

head 
指向内存中数据区的开头。这一指针在 sk_buff 和其相关的数据块分配时就固定了。 
data 
指向当前协议数据的开头。这一指针是随当前拥有 sk_buff 的是哪个协议层而变化的。 
tail 
指向当前协议数据的结尾。同样,这一指针也是随当前拥有 sk_buff 的是哪个协议层而变化的。 
end 
指向内存中数据区的结尾。这一指针在 sk_buff 和其相关的数据块分配时固定。 
     len 和 truesize 这两个字段分别用来描述当前协议包长度和数据缓存总体长度。 sk_buff 处理代码提供标准的操作来向应用程序增加和移除协议头和协议尾。这就可以安全地操作 sk_buff 中的 data , tail 和 len 字段。 

push 
它把 data 指针指向数据区的开始并增加 len 。用于在要传输的数据开始处增加协议头。 

pull 
它把 data 指针从数据区的开始处移到数据区的结尾处,并减小 len 。用于在已接收的数据开始处移除协议头。 

put 
它把 tail 指针指向数据区的结尾处,并增加 len 。用于在要传输的数据结尾处增加数据或协议信息。 

trim 
它把 tail 指针指向数据区的开始处,并减小 len 。用于在已接收的数据尾移除数据或协议信息。 

    sk_buff 结构还包含了用于一些指针,用于在处理过程中存入 sk_buff 的双连接环路列表。通用sk_buff例 程可以将 sk_buff 加入到这些列表的前面或后面,也可以删除它们。 

10.5.2  接收IP包
    第  dd-chapter 章描述了Linux的网络设备是如何置入内核并初始化的。一系列 device 数据结构在 dev_base 表中相互连接起来。每个 device 结构描述了它的设备并提供回调例程,当需要网络驱动来执行工作时,网络协议层调用这些例程。这些函数与传输的数据及网络设备地址紧密相关。当一个网络设备从网上接收包时,它必须将接收的数据转换成 sk_buff 结构。这些 sk_buff 则被网络驱动加入到了 backlog 队列中。

    如果 backlog 队列太长,则丢弃接收的 sk_buff。准备好要运行时,网络底层将被设置标志。

    当网络底层按计划开始运行后,处理 backlog 队列之前,任何等待着被传输的网络包都由它来处理。 sk_buff 决定哪些层处理被接收的包。 

共9页 9 7 [1] [2] [3] [4] [5] [6] [7] [8] [98 :>

Linux 核心--11.网络 相关文章:
Linux 核心--11.网络 相关软件:
特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
转载请注明来源:http://www.xgdown.com