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

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媒体网胡老师。 重庆地区媒体宣传邀约资源整理 一、主流媒体资源 电视台:重庆电视台:作为重庆地区最具影响力的电视媒体之一,拥有多个频道,涵盖新闻、综艺…

python-日历库calendar

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

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

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

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

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

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

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

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

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

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

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

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 模型由编码器和解码器两个部分构成,而…

中国各区域人口密度可视化图

原文链接https://mp.weixin.qq.com/s?__bizMzUyNzczMTI4Mg&mid2247674303&idx1&sn830304f80a0429406c4a5e38dc7750ec&chksmfa777682cd00ff9434e4660bb52ab2bf19913b6732083de061664401a9ac0fa46581cd9e5e86&token1445576002&langzh_CN&scene21#we…

为什么网络安全缺口很大,而招聘却很少?

2020年我国网络空间安全人才数量缺口超过了140万,就业人数却只有10多万,缺口高达了93%。这里就有人会问了: 1、网络安全行业为什么这么缺人? 2、明明人才那么稀缺,为什么招聘时招安全的人员却没有那么多呢&#xff1…

嵌入式学习记录6.17(qss练习)

一思维导图 二.练习 widget.h #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);this->setWindowFlag(Qt::FramelessWindowHint);this->setAttribute(Qt:…

五种HTTP数据传输方式

在前端开发过程中,后端主要提供 http 接口来传输数据,而这种数据传输方式主要有五种: url paramqueryform-urlencodedform-datajson 下面就让我们一起来了解一下在Nest.js中如何使用这五种HTTP数据传输方式: 一,创建项目 使用nest new 创建一个nest的项目 nest new 项目名称 …

Three.js框架的技术难点

Three.js作为一款功能强大的3D JavaScript框架,在为开发者提供丰富的功能和灵活性的同时,也带来了一些技术难点,需要开发者具备一定的知识和经验才能克服。以下是一些Three.js框架的技术难点。北京木奇移动技术有限公司,专业的软件…

【解决】法启动此程序,因为计算机中丢失vcruntime140_1.dll,尝试重新安装此程序以解决此问题【包括安装mysql在内的】

缺少vcruntime140_1.dll解决此问题的第一步找到该文件,有些dll修复工具是收费的,因此下面介绍几种比较简单有效而且免费的解决办法 方法1:重新安装Visual C Redistributable Packages 上面的安装包解决win7,8,10,11的…

STM32HAL库--NVIC和EXTI

1. 外部中断实验 1.1 NVIC和EXTI简介 1.1.1 NVIC简介 NVIC 即嵌套向量中断控制器,全称 Nested vectored interrupt controller。是ARM Cortex-M处理器中用于管理中断的重要组件。负责处理中断请求,分配优先级,并协调中断的触发和响应。 它是…

【日记】被客户一顿输出该怎么办(431 字)

正文 上午有个客户在电话里对着我一顿输出,说他们没有发票财务账务没法处理怎么怎么的。话里话外满满一股 “全是你们的错” 的味道。 当时我很想笑,大姐,你对我输出有啥用啊。票是上级行开的,我们又没有开票权限,对…

让AI代替我写代码???——Codeium安装及使用

序 不知不觉又到了期末大作业的时间了,面对老师布置的超繁琐代码项目,竟一时有些发怵,不知道从何下手才好…… 但是,懒惰如张同学的我怎么能拘泥于老老实实完成这些毫无技术可言的作业呢? 于是乎,我便寻…

【SQL server速成之路】函数

(3)LEFT函数 LEFT ( character_expression , integer_expression ) 功能:返回从字符串character_expression左边开始,由integer_expression指定个数的字符。参数character_expression:为字符型表达式,integ…

c#音乐播放器续(联网下载)

0.前言 书接上文,我们已经实现了一个能够播放本地音乐的音乐播放器,能够播放众多音乐格式,包括.ogg,接下来,我们将为我们的音乐播放器添加一个令人激动的新功能——联网音乐下载和播放!这个功能将使我们能…