接口层包含在本地网上发送和接收分组的硬件与软件。

我们用设备驱动程序来表示与硬件及网络接口通信的软件,网络接口是指在一个特定网络上硬件与设备驱动器之间的接口。

Net/3接口层试图在网络协议和连接到一个系统的网络设备的驱动器间提供一个与硬件无关的编程接口。这个接口层为全部的

设备提供下面支持。

1.一套精心定义的接口函数。

2.一套标准的统计与控制标志。

3.一个与设备无关的存储协议地址的方法。

4.一个标准的输出分组的排队方法。

这个不要求接口层提供可靠地分组传输,仅须要提供最大努力的服务。

更高协议层必须弥补这样的可靠性缺陷。

ifnet结构

结构ifnet结构中包括全部接口的通用信息。在系统初始化期间。分配为每一个网络设备分配一个独立的ifnet结构,每一个ifnet结构

有一个列表。它包括这个设备一个或多个协议地址。下图说明了一个接口和它地址之前的关系。

上图的接口显示了3个存放在ifaddr结构中的协议地址。

尽管一些网络接口,比如slip,仅支持一个协议,而其它接口。如

以太网,支持多个协议并须要多个地址。

比如。一个系统可能使用一个以太网接口同一时候同于Internet和OSI两个协议。一个

类型字段标识每一个以太网帧的内容,而且由于Internet和OSI协议使用不同的编址方式。以太网接口必须有一个Internet地址

和一个OSI地址。

下图是包括在结构ifnet中的实现信息。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVE9ERDkxMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

ifnet结构中的下一部分显示在下图,它用来描写叙述接口的硬件特征。

接口统计信息由下图中下一组ifnet接口成员来收集。它们被增加来支持接口的标准SNMP MIB-II变量

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVE9ERDkxMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

结构ifnet的下一部分,显示在下图,它包括指向标准接口层函数的指针,他们把设备专用的细节从网络层分离出来。每一个接口

实现这些适用于特定设备的函数。

以后会分析以太网、环回接口的设备专用函数,内核通过ifnet接口中的这些指针直接调用它们,比如,ifp指向一个ifnet结构。

(*if->if_start)(ifp)

调用这个接口的设备驱动程序的if_start函数。

结构ifnet的最后一个成员是接口的输出队列。

队列作为一个mbuf链的链表来实现。

ifaddr结构

每一个接口维护一个ifaddr结构的链表,由于一些数据链路。如以太网,支持多于一个的协议。一个单独的ifaddr结构描写叙述每一个

分配给接口的地址,通常每一个协议一个地址。支持多地址的还有一个原因是非常多协议。包含TCP/IP,支持为每一个物理接口指派

多个地址。

ifnet和ifaddr的关系例如以下:

sockaddr结构

一个接口的编址信息不只包括一个主机地址,在通用的sockeaddr结构中维护主机地址、广播地址和网络掩码。

通过使用

一个通用的结构,将硬件与协议专用的地址细节相对于接口层隐藏起来。下图说明了这些结构的组织。

sa_len指示地址的长度。sa_family指示地址的类型。sa_data。包括一个协议相关格式的地址。

ifnet和ifaddr的专用化

结构ifnet和ifaddr包括适用于全部网络接口和协议地址的通用信息。为了容纳其它设备和协议专用信息,每一个设备定义了而且

每一个协议分配了一个专用化版本号的ifnet和ifaddr结构。这些专用化的结构总是包括一个ifnet或ifaddr结构作为它们的第一个成员,

这样无需考虑其它专用信息就能訪问这些公共信息。

下图是专用化ifnet结构的组织。

每一个设备的结构以一个ifnet開始,接下来诠释设备相关的数据。环回接口仅仅声明了一个ifnet,由于它不要求不论什么设备相关的

数据。

每一个协议把每一个接口的地址信息存储在一个专用化的ifaddr结构列表中。以太网协议使用一个in_ifaddr结构。而OSI协议使用

一个iso_ifaddr结构。另外,当接口被初始化时,内核为每一个接口分配一个链路层地址。它在内核中标识这个接口。

下图是一个

包括链路层地址、internet地址和OSI地址的接口地址列表。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVE9ERDkxMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

内核通过分配一个iifaddr结构和两个sockaddr_dl结构(一个是链路层地址本身,一个是地址掩码)来构造一个链路层地址。

结构sockaddr_dl可被OSI、ARP和路由算法訪问。

下图是一个初始化后的以太网sockaddr_dl.

第一个sockaddr_dl初始化各中值。

第二个是一个比特掩码,用来选择出如今第一个结构中的文本内容。上图为le0.

网络初始化概述

全部我们说明的结构在内核初始化时分配和互相链接起来的。

有些设备,比如slip和环回接口,全然用软件来实现。这些伪设

备用存储在全局pdevinit数组中的一个pdevinit结构来表示,在内核配置期间构造了这个数组。

以下概要地说明下以太网的初始化过程:

作为cpu_startup的一部分,内核查找不论什么连接的网络设备。

这个过程的细节超出了本书的范围,一旦一个设备被识别。一个

设备专用的初始化函数就被调用(LANCE以太网设备为leattach函数)。以下的操作被运行:

1.创建le_softc结构

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVE9ERDkxMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

2.从设备复制硬件地址到结构中。

3.初始化ifnet结构。设置ifnet的例如以下成员:if_unit,if_name,if_mtu。if_init,if_reset,if_ioctl,if_output。if_start,if_flags。

if_attach函数

对接口进行初始化后,都须要调用if_attach函数来完毕接口ifnet结构的初始化。并把这个结构插入到先前配置的接口列表
中。在if_attach中,内核也为每一个接口初始化并分配一个链路层地址。下图说明了由if_attach构造的数据结构。

在上图中。if_attach被调用了三次。每次调用时,它向ifnet列表中加入一个新的ifnet结构。

为这个接口创建一个链路层ifaddr

结构,而且初始化ifnet_addrs数组中的一项。
if_attach更新两个全局变量,第一个是if_index,它存放系统中最后一个接口的索引。

第二个是ifnet_addrs。它指向一个

ifaddr指针的数组。这个数组的每项都指向一个接口的链路层地址。这个数组提供对系统中每一个接口的链路层地址的高速
訪问。



《TCP/IP具体解释卷2:实现》笔记--接口层的更多相关文章

  1. 《TCP/IP具体解释卷2:实现》笔记--IP多播

    D类IP地址(224.0.0.0到239.255.255.255)不识别互联网内的单个接口,但识别接口组,被称为多播组. 单个网络上的组成员利用IGMP协议在系统之间通信. 多播路由器用多播选录协议. ...

  2. 《TCP/IP具体解释卷2:实现》笔记--选路请求和选路消息

    内核的各种协议并不直接使用前面提供的函数来訪问选路树,而是调用几个函数:rtalloc和rtallocl是完毕路由表查询的两个 函数:rtrequest函数用于加入和删除路由表项:另外大多数接口在接口 ...

  3. 《TCP/IP具体解释卷2:实现》笔记--UDP:用户数据报协议

    用户数据报协议.即UDP,是一个面向数据报的简单运输层协议:进程的每次输出操作仅仅产生一个UDP数据报,从而发送 一个IP数据报. 进程通过创建一个Internet域内的SOCK_DGRAM类型的插口 ...

  4. 《TCP/IP具体解释卷2:实现》笔记--协议控制块

    协议层使用协议控制块(PCB)存放各UDP和TCP插口所要求的多个信息片.Internet协议维护Internet协议控制块 (internet protocol control block)和TCP ...

  5. 《TCP/IP具体解释卷2:实现》笔记--ICMP:Internet控制报文协议

    ICMP在IP系统间传递差错和管理报文,是不论什么IP实现必须和要求的组成部分.能够把ICMP分成两类:差错和查询.查询报文 是用一对请求和回答定义的.差错报文通常包括了引起错误的IP包的第一个分片的 ...

  6. 《TCP/IP具体解释卷2:实现》笔记--IP:网际协议

    本章介绍IP分组的结构和主要的IP处理过程,包含输入,转发和输出. 下图显示了IP层常见的组织形式. 在之前的文章中.我们看到了网络接口怎样把到达的IP分组放到IP输入队列ipintrq中去,并怎样调 ...

  7. 《TCP/IP具体解释卷2:实现》笔记--IP的分片和重装

    IP首部内有三个字段实现分片和重装:标识字段(ip_id).标志字段(ip_off的3个高位比特)和偏移字段(ip_off的13个低位 比特).标志字段由3个1bit标志组成.比特0是保留的必须为0, ...

  8. 《TCP/IP具体解释卷2:实现》笔记--域和协议

    Net/3组把协议关联到一个域,而且用一个协议族常量来标识每一个域.Net/3还通过全部的编址方法将协议分组. 在一个域中 的每一个协议使用同类地址.而且每种地址仅仅被一个域使用.作为结果,一个域能通 ...

  9. 《TCP/IP具体解释卷2:实现》笔记--4种不同类型的mbuf

    mbuf的主要用途是保存子进程和网络接口间互相传递的用户数据.但mbuf也用于保存其它各种数据:源于目的地址.插口 选项等等. 以下介绍我们要遇到的四种类型的mbuf,它们根据在成员m_flag中填写 ...

随机推荐

  1. luoguP3507 [POI2010]GRA 性质 + 动态规划

    题目大意: 给定\(n\)个正整数,\(a, b\)两个人轮流取,\(a\)先手 每次可以取任意多的数,直到取完,每次的得分为取的数中的最小值 \(a, b\)都会使自己的得分减去对手的得分更大,询问 ...

  2. Linux怎么开启ssh

    一.查看ssh开启状态 service ssh status 这是已经开启了的状态 二.如果没有开启  键入以下命令开启 service ssh start 三.开启后如果不能利用xshell远程访问 ...

  3. CI Weekly #15 | 据说新版 flow.ci Dashboard 界面很酷

    好久不见 :) 最近工程师们卯足了劲,全新的 flow.ci dashboard 页面 已经与所有用户见面了.更快捷地创建项目,构建列表页面新增分支,Pull Request 界面:侧边栏新增构建任务 ...

  4. 模板 快速询问GCD

    快速询问两个数的GCD 我觉得只有智障会卡这个玩意儿-- const int maxn = 1e6; const int Sqrt_N = 1e3; int pre[maxn + 1] , decom ...

  5. wamp经典安装

    1,根据综述 本机 注意,现在apache2.2不能和5.5php, 2.4apache和5.5php就可以   window10    64位  vc14 apache  2.4.23  注意,虚拟 ...

  6. 分频器VHDL描述

    在数字电路中,常需要对较高频率的时钟进行分频操作,得到较低频率的时钟信号.我们知道,在硬件电路设计中时钟信号时非常重要的.    下面我们介绍分频器的VHDL描述,在源代码中完成对时钟信号CLK的2分 ...

  7. Chrome在win8显示“没有注册类”的解决办法

    问题1:从任务栏和桌面快捷方式无法打开Chrome,显示错误为没有注册类问题2:无法从word等中点击打开url,无法打开html,htm方式的文件,同样显示错误为没有注册类出了这两个错误后,用起来相 ...

  8. debian安装ibus中文输入法

    转载自:http://www.shunix.com/debian-ibus-chinese-470/ 以前在debian一直用scim,但是那个真的很不好用,现在用的是debian squeeze还是 ...

  9. VS增强插件 Supercharger破解教程

    Supercharger 破解教程:步骤:1.打开Supercharger的options; 2.点击Pricing & Registration 3.复制 license tt4e2HN4X ...

  10. 彻底理解jdbc为什么用反射创建驱动程序对象

    1.class.forName(mysql),这样更换数据库时,不需要更改程序代码,程序不需要重新编译就能运行. 因为反射是动态编译的,程序运行期间生成指定类的对象, 这样就可以程序运行期间生成不同的 ...