深入理解网络协议——搞懂协议在系统中的应用

1. 不精确指明的协议软件接口

在多数实现中,TCP/IP协议软件驻留在计算机的操作系统中。因此,只要应用程序使用TCP/IP通信,它就必须与操作系统交互并请求其服务。从程序员的观点看,操作系统所提供的那些例程定义了应用程序和协议软件之间的接口,即应用程序接口API(Application ProgramInterface)TCP/IP被设计成能运行在多厂商的环境之中。为了与各种不同的机器保持兼容,TCP/IP的设计者们都尽量避免使用任何一家厂商的内部数据表示。另外,TCP/IP标准还尽量避免让接口使用那些只在某一家厂商的操作系统中可用的特征,因此,TCPIP和其应用程序之间的接口是不精确指明的(loosely specified)。换言之:

TCP/IP标准没有规定应用软件与TCP/IP协议软件如何接口的细节;这些标准只建议了所需的功能集,并允许系统设计者选择有关API的具体实现细节。

1.1 优点与缺点

对协议接口使用不精确的指明,有优点也有缺点。从好的方面说,它提供了灵活性和容错能力。它允许设计者使用各种操作系统实现TCP/IP,这里的操作系统可以是个人计算机中所提供的最简单的系统,也可以是超级计算机所使用的很复杂的系统。更重要的是,它意味着设计者既可以使用过程的接口方式,也可以使用消息传递的接口方式(最适合其所用的操作系统的方式)。

从坏的方面说,不精确的指明意味着;设计者可以使得不同操作系统中接口的实现细节有所不同。当厂商增加了与现有API不同的新接口时,应用编程就会更困难,应用程序在不同机器间的移植性更差。因此,尽管系统设计者偏爱不精确指明,但应用程序员却期望有一个受限制的规范,因为这样就可使应用不用改变即可在新机器上编译。

实际上,目前只有几种可供应用程序使用TCP/IP协议的API。加利福尼亚大学伯克利分校为Berkeley UNIX操作系统定义了一种API,后来的一些系统(包括Linux)也采用了这种API,该API业已称为套接字接口(socket interface),或者套接字。Microsoft在其操作系统中采用了套接字接口,套接字API的这种变形称为Windows Socket。AT&T为其UNIX系统V(System V)定义了一种API简写为TLI。此外还定义了几种API,但都还没有获得普遍接受。

2. 接口功能

尽管TCP/P没有定义一种应用程序接口,但标准确实对接口所需要的功能提出了建议。接口必须支持如下概念性操作:

  • 分配用于通信的本地资源
  • 指定本地和远程通信端点
  • (客户端)启动连接
  • (客户端)发送数据报
  • (服务器端)等待连接到来
  • 发送或接收数据
  • 判断数据何时到达
  • 产生紧急数据
  • 处理到来的紧急数据
  • 从容终止连接
  • 处理来自远程端点的连接终止
  • 异常终止通信
  • 处理错误条件或连接异常终止
  • 连接结束后释放本地资源

3. 概念性接口的规约

TCPIP标准并非让实现者得不到有关API的任何帮助。它们为TCP/P指明了一个概念性接口(conceplual interface),其作用是提供示例。由于多数操作系统使用过程机制把控制权从应用程序传送给系统,所以该标准把这个概念性接口定义为一组过程和函数。该标准还提出了每个过程或函数所要求的参数以及它们所执行操作的语义。例如,TCP标准讨论了SEND过程,并列出了它的参数,应用进程为在已有的TCP连接上发送数据必须提供这些参数。

概念性操作的定义很简单:

TCP/IP标准定义的概念性接口并不指明数据的表示或编程的细节;它仅仅提供了一种可能的API的例子,操作系统可将此API提供给使用TCP/IP的应用程序。

因此,这种概念性的接口并未精确说明应用进程如何与TCP/IP进行交互。由于它没有精确描述细节,操作系统的设计者就可以自由选择其他的过程名或参数,只要它们能提供相同功能就行。

4. 系统调用

图4.1说明了系统调用机制,大多数操作系统使用这种机制在应用程序和提供服务的操作系统过程之间传递控制权。对程序员来说,系统调用无论看上去还是行为上都像是函数调用。
在这里插入图片描述

如图所示,当某个应用进程启动系统调用时,控制权从应用进程传递给了系统调用接口。此接口又将控制权传递给了操作系统。操作系统将此调用转给某个内部过程,该过程执行所请求的操作。内部过程一旦完成,控制权通过系统调用接口返回给应用进程,然后应用进程将继续执行。

从本质上说,只要应用程序需要从操作系统获得服务,执行这个应用程序的进程就将控制转给操作系统,执行必要的操作后就返回。由于进程要通过系统调用接口,它需要一定的特权,从而允许它读取或修改操作系统中的数据结构。然而,由于每个系统调用都会将控制转给一个由操作系统设计者所写的过程,操作系统还是要被保护的。

5. 网络通信的两种基本方法

由于操作系统的设计者们把协议软件安装在操作系统中,他们就必须选择一组过程用来访问TCP/IP协议。实现方法有两种:

  • 设计者发明一组新的系统调用,应用程序用它们来访问TCP/IP。
  • 设计者使用一般的I/O调用访问TCP/IP。

对第一种方法,设计者列举出所有的概念性的操作,为每个操作指定一个名字和参数,并分别把它们实现为一个系统调用。由于许多设计者认为,除非绝对必要,创建新的系统调用并不明智,所以这种方法很少采用。对第二种方法,设计者使用一般的IVO原语,但他们扩充了这些原语,使其既可用于网络协议,又可用于一般的I/O设备。当然,许多设计者选择了一种混合的方法,即尽可能地使用基本的IO功能,但对那些不能常规表达的操作则增加其他的函数。

6. LINIX中提供的基本I/O功能

为理解如何扩展一般的系统调用使其适用于TCP/IP,我们考虑一下Linux基本的I/O功能。Linux和其他UNIX操作系统提供了一组(六个)基本的系统函数,用来对设备或文件进行输人/输出操作。下图中的表列出了这些操作以及它们通常的含义。
在这里插入图片描述

当应用程序调用open来启动输入或输出时,系统返回一个小整数,称为文件描述符(filedescriptor),此应用程序在以后的I/O操作中会使用它。调用open带有三个参数;要打开的文件或设备的名字;一组位标志(bitflag),用来控制一些特殊的情况,例如,若文件不存在,是否要创建文件;一个访问模式,它为新创建的文件指定读/写保护。例如,代码段:

int desc
desc =open("filename",O_RDWR,0)

打开一个现有的文件flename,模式是既允许读又允许写。在获得了整数描述符desc后,应用程序在以后对这个文件的I/O操作中将使用这个标识符。例如,语句:

read(desc,buffer,128);

从文件中读取128字节的数据并写人数组buffer中。
最后,当一个应用进程结束使用一个文件时,它将调用close来撤消标识符并释放相关的资源(例如,内部缓存):

close (desc)

7. 将Linux I/O用于TCP/IP

当设计者们把TCP/IP协议加人到UNIX系统时,他们扩展了传统的UNIX I/0设施。首先,他们扩展了文件描述符集,使应用进程可以创建能被网络通信所使用的描述符。其次,他们扩展了read和write这两个系统调用,使其既可以同网络标识符一起使用,又可以同普通的文件标识符一起使用。这样,当应用进程需要通过TCP连接发送数据时,它就创建相应的标识符,并使用write传输数据。

然而,并非所有的网络通信都很容易地套用这种UNIX的open-read-write-close范例。应用进程必须指明本地的和远端的协议端口,远程IP地址,还有它将使用TCP还是UDP,以及它是否要启动传输还是要等待传人连接(这就是说,它要作为客户还是要作为服务器)。如果应用进程是服务器,它必须指明在护绝请求之前,可以接受多少传入连接请求被操作系统排队。

此外,如果应用进程选择使用UDP,它必须能传输UDP数据报,而不仅仅是字节流。套接字API的设计者提供了一些额外功能来适应这些特殊情况。在Linux中,与早期的UNIX系统一样,通过增加一些新的操作系统的系统调用来实现这些额外的功能。在下一章中我们将说明设计的细节。

8. 小结

由于TCP/P是为多厂商环境而设计的,协议标准没有精确指明应用程序使用的接口,并允许操作系统的设计者自由选择如何来实现这个接口。标准确实也讨论了概念性的接口,但它仅仅是作为一种说明性的示例。尽管这些标准把这种概念性接口定义为一组过程,但设计者可以自由选择不同的过程,或者干脆使用一种完全不同的交互风格(例如,消息传递)。

操作系统往往通过一种叫做系统调用接口的机制提供服务。当在系统中增加对TCP/IP的支持时,设计者们试图通过尽可能地扩展已有系统调用的功能,减少新增加的系统调用的数量。然而,由于网络通信所要求的一些操作不容易套用通常的I/O过程,大多数TCPIP的接口还是需要几个新的系统调用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/29952.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

重庆地区媒体宣传邀约资源整理

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 重庆地区媒体宣传邀约资源整理 一、主流媒体资源 电视台:重庆电视台:作为重庆地区最具影响力的电视媒体之一,拥有多个频道,涵盖新闻、综艺…

C#面:C#中有没有静态构造函数,如果有是做什么用的?

在C#中是存在静态构造函数的,它被称为静态构造器(static constructor)。静态构造函数是一种特殊的构造函数,用于初始化静态成员变量或执行一些静态初始化操作。它与普通的实例构造函数不同,静态构造函数没有参数&#…

数据提取的艺术:如何通过数据治理提高效率

数据提取的艺术:如何通过数据治理提高效率 在当今数字化浪潮下,数据已成为企业最重要的资产之一。然而,如何从海量的数据中提取有价值的信息,并将其转化为实际的业务效益,却是一个挑战。数据治理,作为确保…

在 Qt Quick 中的布局:Grid,Row

Grid 在 Qt Quick 中,网格布局可以使用 Grid 元素来实现。Grid 元素允许您以网格形式对子元素进行布局,类似于 HTML 中的表格布局。以下是一个简单的示例,展示如何在 QML 中使用网格布局: import QtQuick 2.0Grid {columns: 3 /…

python-日历库calendar

目录 打印日历 基本日历类Calendar TextCalendar类 HTMLCalendar类 打印日历 设置日历每周开始日期(周几) import calendarcalendar.setfirstweekday(calendar.SUNDAY) # 设置日历中每周以周几为第一天显示 打印某年日历 print(calendar.calendar(2024, w2, l1, c6, m…

flutter实现UDP发送魔法包唤醒主机

魔法包 魔法包是用16进制表示的数据包,它是由固定的前缀数据(FFFFFFFFFFFF)以及固定重复次数(16次)的目标主机MAC地址组成。 假设目标主机的MAC地址是:"50:eb:f6:27:ae:a8" 那么魔法包就是[FFFFFFFFFFFF50EBF627AEA850EBF627AEA850EBF627AEA8…

数据结构与算法笔记:基础篇 - 分治算法:谈一谈大规模计算框架MapReduce中的分治思想

概述 MapReduce 是 Google 大数据处理的三姐马车之一,另外两个事 GFS 和 Bigtable。它在倒排索引、PageRank 计算、网页分析等搜索引擎相关的技术中都有大量的应用。 尽管开发一个 MapReduce 看起来很高深。实际上,万变不离其宗,它的本质就…

重磅!首个跨平台的通用Linux端间互联组件Klink在openKylin开源

随着智能终端设备的普及,多个智能终端设备之间的互联互通应用场景日益丰富,多设备互联互通应用场景需要开发者单独实现通讯协议。因此,为解决跨平台互联互通问题,由openKylin社区理事单位麒麟软件旗下星光麒麟团队成立的Connectiv…

<provider>标签的android:authorities属性,和androidx.appcompat.androidx-startup库有什么关系?

<provider> 标签的 android:authorities 属性在 Android 中是用于唯一标识一个 ContentProvider 的。这与库或特定的组件&#xff08;如 androidx.appcompat&#xff09;本身并没有直接的关系&#xff0c;除非该库或组件内部定义了一个 ContentProvider 并指定了它的 aut…

2024下《网络工程师》50个高频考点汇总,背就有效!

宝子们&#xff01;上半年软考已经结束一段时间了&#xff0c;准备考下半年软考中级-网络工程师的小伙伴们可以开始准备了&#xff0c;这里给大家整理了50个高频考点&#xff0c;涵盖全书90%以上重点&#xff0c;先把这个存下&#xff01;再慢慢看书&#xff0c;边看书边背这个…

数据治理创新路:建设数据集市,强化数据报送一致性新实践

随着信息化和数字化的飞速发展&#xff0c;数据已经成为企业运营和决策的核心要素。然而&#xff0c;数据治理的复杂性和多样性给企业带来了不小的挑战。为了更好地应对这些挑战&#xff0c;许多企业开始探索数据治理的创新路径&#xff0c;其中建设数据集市和强化数据报送一致…

各类存储器类型(RAM、ROM、FLASH、DRAM、SRAM)

1 计算机存储类型构成 在计算机中&#xff0c;各类存储器构成了计算机能高速高效运转程序的基石。 计算机的存储体系中&#xff0c;从速度慢到速度快对应着容量大到小&#xff0c;也就是说&#xff0c;速度越快容量越小&#xff1b;容量越大的&#xff0c;速度越慢。两者互相…

C# OpenCvSharp 矩阵计算-compare、repeat、PSNR、cross、dot

🌟详细解释OpenCV函数🌟 在这篇文章中,我将详细解释并给出每个函数的示例,包括运算过程和运算结果。💻✨ 🔍函数:compare 定义: void compare(InputArray src1, InputArray src2, OutputArray dst, int cmpop); 参数: src1:输入图像或矩阵 src2:输入图像或矩阵…

mtk android开机及重启速度优化

zygote&#xff1a;预加载类和资源。加载过多会影响开机时间。 查看 /sdcard/mtklog/bootprof 文件。减少预加载的类和资源&#xff0c;确保没有冗余的资源图片。开机动画进程&#xff1a;bootanimation 或 mtkbootanimation&#xff0c;走 android 流程比 movie 流程占用内存资…

java 判断字符串是否以两个中文字符开头

在Java中&#xff0c;可以使用正则表达式来判断一个字符串是否以两个中文字符开头。 以下是一个简单的Java代码示例&#xff1a; public class Main {public static void main(String[] args) {String testString "中文字符开头的文本";boolean isChineseCharacte…

JavaScript算法题

排序算法 1.冒泡排序 从开始位置两两比较&#xff0c;持续n轮 // 冒泡排序let bubbleSort (arr) > {const len arr.lengthfor (let i 0; i < len - 1; i) {// 外层循环控制轮数for (let j 0; j < len - i - 1; j) {// 内层循环控制比较次数if (arr[j] > arr[…

Unity3D 打造3D路径编辑系统详解

在Unity3D中打造3D路径编辑系统&#xff0c;对于游戏开发者来说是一项重要且实用的任务。无论是实现敌人的AI巡逻、角色的自定义移动路线&#xff0c;还是物体的动态轨迹&#xff0c;一个强大的路径编辑系统都能大大提高开发效率。本文将详细介绍如何使用Unity3D打造一个3D路径…

echarts 折线图 实现某两个点之间不要连线

通过插入null或NaN的数据点来实现"断开"的效果 const data [[a, 1], [b, 2], [c, 3], [d, 4], [e, 5]] data.splice(2, 0, NaN) option {xAxis: {type: "category",data: [a, b, c, d, e]},yAxis: {},series: [{data,type: "line"}] }

大语言模型架构---Transformer 模型

文章目录 输入编码多头自注意力机制前馈网络层编码器解码器当前主流的大语言模型都基于 Transformer 模型进行设计的。Transformer 是由多层的多头自注意力(Multi-head Self-attention)模块堆叠而成的神经网络模型。原始的 Transformer 模型由编码器和解码器两个部分构成,而…

多目标跟踪中检测器和跟踪器如何协同工作的

多目标跟踪中检测器和跟踪器如何协同工作的 flyfish 主要是两者 接口间的交互 假设 原始图像尺寸&#xff1a;1920&#xff08;宽&#xff09;x 1080&#xff08;高&#xff09; 模型输入尺寸&#xff1a;640&#xff08;宽&#xff09;x 640&#xff08;高&#xff09; 检…