Net/3组把协议关联到一个域,而且用一个协议族常量来标识每一个域。Net/3还通过全部的编址方法将协议分组。

在一个域中

的每一个协议使用同类地址。而且每种地址仅仅被一个域使用。作为结果,一个域能通过它的协议族或地址族常量唯一标识。

下图是是我们讨论的协议和常量。

1.domain结构

一个协议有一个下图所看到的的domain结构来表示。

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

下图显示了一个domains列表的样例。


2.protosw结构

在编译期间。Net/3为内核中每一个协议分配一个protosw结构并初始化。同一时候将在一个域中的全部协议的这个结构组织到一个
数组中,每一个domain结构引用对应的protosw结构数组。一个内核能够通过提供多个protosw项为同一协议提供多个接口。
protosw结构的定义例如以下:

pr_type可能的值和相应的Internet协议例如以下图所看到的。


pr_flags的值例如以下图所看到的。

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


pr_input,pr_output,pr_ctlinput。pr_ctloutput和pr_usrreq这几个函数的关系例如以下下图所看到的:


3.IP的domain和protosw结构

申明全部协议的结构domain和protosw,并进行静态初始化。对于Internet协议。inetsw数组包括protosw结构。下图总结了
在数组inetsw中协议信息。

下图为Internet协议的数组定义和domain结构的定义。

domaininit函数:
在系统初始化期间,在main函数中。内核调用domaininit来链接结构domain和protosw。
下图显示了链接的结构domain和protosw。它们
配置在内核中来支持Internnet、Unix和OSI协议族。


4.pfctlinput函数

函数pfctlinput给每一个域中的每一个协议发送一个控制请求,当可能影响每一个协议的事件发生时。使用这个函数。比如一个接口
被关闭。或路由表发生变化。当一个ICMP重定向报文到达时,ICMP调用pfctlinput,由于重定向会影响全部Internet协议。

函数通过遍历每一个域,然后遍历每一个域以下的protosw。终于调用protosw中的pr_ctlinput函数。

5.IP初始化

Internet域没有一个初始化函数可是单个Internet协议有。如今,我们仅查看IP初始化函数ip_init。在该函数中,一个功能就是
初始化数组ip_protox.
一个网络层协议像IP必须奋勇输入数据报,并将它们传递到对应的运输层协议。为了完毕这些,对应的protosw结构必须通过
一个在数据报中出现的协议编号得到。

对于Internet协议。这由数组ip_protox来完毕,例如以下图所看到的:


数组ip_protox的下标是来自IP的协议值。被选项是inetsw数组中处理此数据报的协议的下标。

6.sysctl系统调用

系统调用sysctl訪问并改动Net/3系统范围參数。

系统管理员通过程序sysctl改动这些參数。每一个參数有一个分层的整数列表

来标识。并由一个对应的类型,此系统调用的原型为:
int sysctl(int *name, u_int namelen, void *old, size_t * oldlenp, void *new, size_t newlen) ;

*name指向一个包括namelen个整数的数组。*old指向在此范围内返回的旧值。*new指向在此范围内传递的新值。

下图总结了关于联网名称的组织。
在上图中,IP转发标志的全名为:
CTL_NET、PF_INET、0、IPCTL_FORWARDING
用4个整数存储在一个数组中。


net_sysctl函数:
每层的sysctl命名方案通过不同函数处理。下图显示了处理这些Internet參数的函数。

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

顶层名称由sysctl处理。

网络层名称由net_sysctl处理,它依据族和协议将控制转给此协议的protosw项指定的pr_sysctl函数。


《TCP/IP具体解释卷2:实现》笔记--域和协议的更多相关文章

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

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

  2. 《TCP/IP具体解释卷2:实现》笔记--接口层

    接口层包含在本地网上发送和接收分组的硬件与软件. 我们用设备驱动程序来表示与硬件及网络接口通信的软件,网络接口是指在一个特定网络上硬件与设备驱动器之间的接口. Net/3接口层试图在网络协议和连接到一 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. socket 笔记(一)

    #include "stdafx.h" #include "WINSOCK2.H" #pragma comment(lib,"WS2_32.lib&q ...

  2. Java经典23种设计模式之行为型模式(二)

    本文接着介绍行为型模式里的解释器模式.迭代器模式.中介者模式. 一.解释器模式Interpret 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言的中的句子. 1 ...

  3. Android开发工具之adt-bundle-windows

    adt-bundle-windows是非常久之前的android开发工具.是集成了ADT版本号的eclipse,可是里面并没有下载SDK.这个须要自己单独下载,这个工具适合刚開始学习的人使用. 由于刚 ...

  4. progerssbar-style 属性分析

    先看如下代码 <ProgressBar android:id="@+id/stateProgressBar" android:orientation="horizo ...

  5. ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第五篇:MVC整合Ajax

    摘要      本文将从完成“输入数据验证”这个功能出发,逐渐展开ASP.NET MVC与Ajax结合的方法.首先,本文将使用ASP.NET MVC提供的同步方式完成数据验证.而后,将分别结合ASP. ...

  6. 逆波兰法(计算器)程序<无括号版>

    涉及队列.栈的运用. Java中队列可以用: Queue<String> q = new LinkedList(); 来声明,其主要的方法有: poll(),peak(),offer(), ...

  7. 并发知识与concurrent包

    要想进入一线互联网公司,这部分内容必须要会,否则的话,你始终都只能停留在比较low的段位. 关于并发知识,最重要的两个概念一定要搞清楚,那就是可见性和原子性.其中可见性与前面提到的volatile关键 ...

  8. POJ 1274 The Perfect Stall || POJ 1469 COURSES(zoj 1140)二分图匹配

    两题二分图匹配的题: 1.一个农民有n头牛和m个畜栏,对于每个畜栏,每头牛有不同喜好,有的想去,有的不想,对于给定的喜好表,你需要求出最大可以满足多少头牛的需求. 2.给你学生数和课程数,以及学生上的 ...

  9. 【Codeforces Round #301 (Div. 2) E】Infinite Inversions

    [链接] 我是链接,点我呀:) [题意] 给你一个无限长的序列1,2,3,4... 然后给你n个操作. 每个操作ai,bi; 表示调换位置为ai和位置为bi的数的位置. (ai,bi<=10^9 ...

  10. Scala入门到精通——第十九节 隐式转换与隐式參数(二)

    作者:摇摆少年梦 配套视频地址:http://www.xuetuwuyou.com/course/12 本节主要内容 隐式參数中的隐式转换 函数中隐式參数使用概要 隐式转换问题梳理 1. 隐式參数中的 ...