五、电子邮件
1.电子邮件概述
一个电子邮件系统应具有三个主要组成构件:用户代理、邮件服务器、邮件发送协议(如SMTP,simple mail transfer protocol)和邮件读取协议(POP3,post office protocol的版本3)。
用户代理UA(User Agent)——
就是用户与电子邮件系统的接口,在大多数情况下它就是运行在用户PC机中的一个程序,因此用户代理又称为电子邮件客户端软件。它向用户提供一个很友好的接口(目前主要是窗口界面)来发送和接收邮件。
包括以下四个功能:
①撰写:给用户提供编辑信息的环境。例如通信录。
②显示:能方便地在计算机屏幕上显示出来信。
③处理:包括发送邮件和接收邮件,收件人应能根据情况按不同方式对来信进行处理,如阅读后删除、存盘、打印、转发。
④通信
邮件服务器——
24小时不间断工作。功能是发送和接收邮件,同时还要向发件人报告邮件传送的结果(已交付、被拒绝、丢失等)。按照客户服务器方式工作,需要使用两种不同协议:用于用户代理向邮件服务器发送邮件或在邮件服务器之间发送邮件,如SMTP协议;用于用户代理从邮件服务器读取邮件,如邮局协议POP3。它要同时充当客户和服务器。
两种不同通信方式——①“推”,SMTP客户把邮件“推”给SMTP服务器。②“拉”,POP3客户把邮件从POP3服务器“拉”过来。
为什么邮件服务器程序不能在发送方和接收方的PC机中运行?——有些计算机可能没有足够的存储器来运行允许程序在后台运行的操作系统,或是可能没有足够的CPU能力来运行邮件服务器程序。PC机也不是24小时开着。
电子邮件由信封和内容组成。TCP/IP体系的电子邮件系统规定电子邮件地址的格式为:收件人邮箱名@邮箱所在主机的域名。
2.简单邮件传送协议SMTP
主要特点:规定了在两个相互通信的SMTP进程之间应如何交换信息。邮件内部格式、如何存储未规定。
下面介绍通信三个阶段的命令和相应信息。
Ⅰ、连接建立
发件人的邮件送到发送方邮件服务器的邮件缓存后,SMTTP客户就每隔一定时间(例如30分钟)对邮件缓存扫描一次。如发现有邮件,就使用SMTP的熟知端口号码(25)与接收方邮件服务器的SMTP服务器建立TCP连接。在连接建立后,接收方SMTP服务器要发出“220 Sever ready”(服务就绪)。然后SMTP客户向SMTP服务器发送HELO命令,附上发送方的主机名。SMTP服务器有能力接收,则回答“250 OK”,表示已准备好接收。不可用则回答“421 Sever not available”(服务不可用)。一定时间内发送不了邮件,则把这个情况通知发件人。
SMTP不使用中间的邮件服务器。不管发送方和接收方的邮件服务器相隔多远,都用发送方和接收方两个邮件服务器之间直接建立。当出现故障时,发送方服务器等一段时间后再尝试建立TCP连接,而不能先找一个中间的邮件服务器建立TCP连接。
Ⅱ、邮件传送
开始:MAIL命令mail命令后面有发件人的地址。如:MAIL FROM:。若SMTP服务器已准备好接收邮件,则回答“250 OK”。否则,返回一个代码,指出原因。如:451(处理时出错)、452(存储空间不够)、500(命令无法识别)等。
然后:RCPT命令取决于把同一个邮件发送给一个或多个收件人,其格式为RCPT TO:<收件人地址>。RCPT是recipient(收件人)缩写。每发送一个RCPT命令,都应当有相应的信息从SMTP服务器返回。如:“250 OK”,表明指明的邮箱在接收方的系统中,或“550 No such user here”(无此用户),即不存在此邮箱。作用:先弄清接收方系统是否已做好接收邮件的准备,然后才发送邮件,这样做是为了避免浪费通信资源,不致于发送很长邮件后才知道是因地址错误。
最后:DATA命令表示要开始传送邮件的内容了。SMTP服务器返回的信息是:“354 Start mail input;end with.”。不接收邮件,则返回421(服务器不可用等)。接着SMTP客户就发送邮件的内容,发送完毕后,则发送.(两个回车换行中间用一个点隔开)表示邮件内容结束。实际上在服务器端看到的可打印字符只是一个英文的句点。若邮件收到了,则SMTP服务器返回信息“250 OK”,或返回差错代码。
注意:
虽然SMTP使用TCP连接试图使邮件的传送可靠,但它不能保证不丢失邮件。接收方的邮件服务器也许会出故障,使收到的邮件全部丢失(在收件人读取信息之前),然而基于SMTP的电子邮件都通常被认为是可靠的。
Ⅲ、连接释放
邮件发送完毕后,SMTP客户发送QUIT命令。SMTP服务器返回的信息是“221(服务关闭)”,表示SMTP同意释放TCP连接。
用户看不见以上过程,全被电子邮件的用户代理屏蔽了。
3.电子邮件的信息格式
分为信封和内容。内容有首部和主体。首部有很多关键字:
To:后面接一个或多个收件人的电子邮件地址
Subject:主题,反映了邮件的主要内容,便于用户查找邮件
抄送Cc:carborn copy,意思是留下一个“复写副本”
Bcc:盲复写副本,使发件人能将邮件的副本送给某某人,但不希望此事为收件人知道,又叫“暗送”
From、Date:发件人的电子邮件地址和发信日期,由邮件系统自动填入
Reply-To:即对方回信所用的地址,这个地址可与发件人发信时所用的地址不同
4.邮件读取协议POP3和IMAP
Ⅰ、邮件读取协议POP3
工作原理:是一个非常简单、但功能有限的邮件读取协议。使用客户服务器方式,在接收邮件的用户PC机中的用户代理必须运行POP客户程序,而在收件人所连接的ISP的邮件服务器中则运行POP服务器程序。当然,这个ISP的邮件服务器还必须运行SMTP服务器程序,以便接收发送方邮件服务器的SMTP客户程序发来的邮件。POP服务器只有在用户输入鉴别信息(用户名和口令)后,才允许对邮箱进行读取。
特点:只要用户从POP服务器读取了邮件,POP服务器就把该邮件删除。这样很不方便,所以POP3进行了一些功能扩充,如让用户事先设置邮件读取后仍在POP服务器中存放的时间。
Ⅱ、网际报文存取协议IMAP
工作原理:用户的PC机运行IMAP客户程序,然后与接收方的邮件服务器上的IMAP服务器程序建立TCP连接。用户在自己的PC机上就可以操纵邮件服务器的邮箱,就像在本地操纵一样,因此IMAP是一个联机协议。当用户PC机上的IMAP客户程序打开IMAP服务器的邮箱时,用户就可看到邮件的首部。若用户需要打开某个邮件,则该邮件才传到用户的计算机上。用户未发出删除邮件的命令之前,IMAP服务器邮箱中的邮件一直保存着。
好处:①用户可在不同地方使用不同的计算机;②允许收件人只读取邮件中的某一部分。
缺点:如果用户没有将邮件复制到自己的PC机上,则邮件一直是存放在IMAP服务器上。因此,用户需要经常与IMAP服务器建立连接(因为许多用户要考虑所花费的上网费)。
Ⅲ、POP、IMAP与SMTP不同
POP和IMAP是用户代理从接收方邮件服务器上读取邮件所使用的协议
SMTP协议是用于:发件人的用户代理向发送方邮件服务器发送邮件,以及发送方邮件服务器向接收方邮件服务器发送邮件。
5.基于万维网的电子邮件
6.通用因特网邮件扩充MIME
Ⅰ、MIME概述
(1)SMTP缺点
①不能传送可执行文件或其他的二进制对象;
②限于传送7位的ASCII码,许多其他非英语国家的文字无法传送,即使在SMTP网关将EBCDIC码(即扩充的二/十进制交换码转换为ASCII码)时也会遇到一些麻烦;
③SMTP服务器会拒绝超过一定长度的邮件;
④某些SMTP的实现并没有完全按照SMTP的因特网标准,问题有如回车换行的删除和增加、后面多余空格的删除等。
(2)通用因特网邮件扩充MIME
增加了邮件主体的结构,并定义了传送非ASCII码的编码规则。
包含三部分内容:
①5个新的邮件首部字段
1.MIME-Version:标志MIME的版本,现在版本号是1.0,如无此行,则为英文版本;
2.Content-Description:可读字符串,说明邮件主体是否是图像、音频或视频;
3.Content-Id:邮件的唯一标识符
4.Content-Transfer-Encoding:在传送时邮件的主体是如何编码的
5.Content-Type:说明邮件主体的数据类型和子类型
下面对后两项介绍
②定义了很多邮件内容的格式,对多媒体电子邮件的表示方法进行了标准化
③定义了传送编码,可对任何内容格式进行转换,而不会被邮件系统改变
Ⅱ、内容传送编码
有三种。
(1)7位ASCII码
每行不超过1000个字符,MIME对这种由ASCII码构成的邮件主体不进行任何转换
(2)quoted-printable
适用:传送的数据中只有少量的非ASCII码,如汉字
要点:对于所有可打印的ASCII码,除特殊字符等号“=”外,都不改变。等号和不可打印的ASCII码以及非ASCII码的数据的编码方法是:先将每个字节的二进制代码用两个十六进制数字表示,然后在前面再加上一个等号“=”。
“=”的二进制代码为00111101,即十六进制的3D,因此等号的quoted-printable编码为“=3D”
(3)base64编码
做法:先将二进制代码划分为一个个24位长的单元,然后把每一个24位单元划分为4个6位组。每一个6位组按以下方法转换成ASCII码。6位的二进制代码共有64种不同的值,从0到63。用A表示0,用B表示1,等等。26个大写字母排列完毕后,接下去再排26个小写字母,再后面是10个数字,最后用+表示62,用/表示63。再用“==”和“=”分别表示最后一组的代码只有8位或16位。回车和换行都忽略,它们可在任何地方插入。
Ⅲ、内容类型
MIME标准规定内容类型必须含有两个标识符,即内容类型和子类型,中间用/分开。MIME允许发件人和收件人自己定义专用的内容类型,但为避免可能出现名字冲突,标准要求为专用的内容类型选择的名字要以字符串X-开始。
六、动态主机配置协议DHCP
背景:为了把协议软件做成通用的和便于移植,协议软件的编写者不会把所有细节都固定在源代码中,而是把协议软件参数化,使得在很多台计算机上有可能使用同一个经过编译的二进制代码。计算机之间的区别可通过一些不同参数来实现,在协议软件运行前,要给每一个参数赋值。
协议配置:在协议软件中给参数赋值。协议软件在使用前已正确配置,具体配置信息有哪些取决于协议栈。连接到因特网的计算机的协议软件需要配置的项目包括:IP地址、子网掩码、默认路由器的IP地址、域名服务器的IP地址。
DHCP:提供了一种机制,叫即插即用连网,允许一台计算机加入新的网络和获取IP地址而不用手工参与。
适用范围:对客户软件和服务软件都适用,当运行客户软件的计算机移至一个新的网络时,就可使用DHCP获取其配置信息而不需要手工干预;DHCP给运行服务器软件而位置固定的计算机指派一个永久地址,而当这计算机重新启动时其地址不改变。
工作原理:采用客户服务器方式,需要IP地址的主机在启动时向DHCP服务器广播发送发现报文(DHCPDISCOVER)(将目的IP地址置为全1,即255.255.255.255),这时该主机就成为DHCP客户。发送广播报文是因为还不知道DHCP服务器在什么地方,因此要发现DHCP服务器的IP地址。这个主机目前还没有自己的IP地址,因此它将IP数据报的源IP地址设为全0。这样,在本地网络上的所有主机都能收到这个广播报文,但只有DHCP服务器才对此广播报文进行回答。DHCP服务器先在其数据库中查找该计算机的配置信息。若找到,则返回找到的信息。若找不到,则从服务器的IP地址池(address pool)中取一个地址分配给该计算机,DHCP服务器的回答报文叫做提供报文(DHCPOFFER),表示“提供”了IP地址等配置信息。
DHCP中继代理:代替了DHCP服务器,配置了DHCP服务器的IP地址信息。当DHCP中继代理收到主机A以广播形式发送的发现报文后,就以单播方式向DHCP服务器转发此报文,并等待其回答。收到DHCP服务器回答的提供报文后,DHCP中继代理再把此提供报文发回给主机A。实际上,DHCP报文只是UDP用户数据报的数据,它还要加上UDP首部、IP数据报首部、以太网的MAC帧的首部和尾部后,才能在链路上传送。
DHCP服务器分配给DHCP客户的IP地址是临时的,因此DHCP客户只能在一段有限时间内使用这个分配到的IP地址。这段时间叫租用期。
DHCP适合于经常移动位置的计算机,当计算机使用windows操作系统时,若点击控制面板的网络图标就可以找到某个连接中的“网络”下面的菜单,找到TCP/IP协议后点击“属性”,选择“自动获得IP地址”和“自动获得DNS服务器地址”,就表示是使用DHCP协议。
七、简单网络管理协议SNMP
1.网络管理的基本概念
网络管理包括对硬件、软件和人力的使用、综合与协调,以便对网络资源进行监视、测试、配置、分析、评价和控制,这样就能以合理的价格满足网络的一些需求,如实时运行性能、服务质量等。简称网管。
管理站又称管理器,是整个网络管理系统的核心,所在部门叫作网络运行中心NOC,关键构件是管理程序。管理程序在运行时就称为管理进程。管理站(硬件)或管理程序(软件)都可称为管理者或管理器。
被管设备可以是主机、路由器、打印机、集线器、网桥、调制解调器等。被管设备的某个硬件、软件等叫作被管对象。在每一个被管设备中都要运行一个程序以便和管理站中的管理程序进行通信,这些运行着的程序叫作网络管理代理程序,或简称代理。代理程序在管理程序的命令和控制下在被管设备上采取本地的行动。
简单网络管理协议SNMP中的管理程序和代理程序按客户服务器方式工作,管理程序运行SNMP客户程序,代理程序运行SNMP服务器程序。
网络管理的基本原理:若要管理某个对象,就必然会对该对象添加一些软件或硬件,但这种“添加”必须对原有对象的影响尽量小些。
若网络元素使用的不是SNMP协议而是另一种网络管理协议,那么SNMP协议就无法控制该网络元素,这时可使用委托代理。委托代理能够提供如协议转换和过滤操作等功能对被管对象进行管理。
SNMP的网络管理由三个部分组成,即SNMP本身、管理信息结构SMI(structure of management information)、管理信息库MIB(management information base)。
SNMP定义了管理站和代理之间所交换的分组格式,所交换的分组包含各代理中的对象(变量)名及其状态(值)。SNMP负责读取和改变这些数值。
SMI定义了命名对象和定义对象类型(包括范围和长度)的通用规则,以及把对象和对象的值进行编码的规则。这样做可确保网络管理数据的语法和语义的无二义性。
SMI建立规则,MIB对变量进行说明,SNMP完成网管的动作。
2.管理信息结构SMI
功能有三:①被管对象怎样命名;
②用来存储被管对象的数据类型有哪些;
③在网络上传送的管理数据应如何编码。
Ⅰ、被管对象的命名
SMI规定,所有的被管对象都必须在对象命名树上。在只讨论internet中的对象时,可只画出internet以下的字符,并在internet节点旁边写上对象标识符1.3.6.1即可。
Ⅱ、被管对象的数据类型
SMI使用基本的抽象语法记法1(即ISO制定的ASN.1)来定义数据类型,但又增加了一些新的定义。因此SMI既是ASN.1的子集,又是ASN.1的超集。ASN.1记法严格,使得数据的含义不存在任何可能的二义性。
任何数据都具有两种重要属性,即值与类型。“值”是某个值集合中的一个元素,“类型”是值集合的名字。SMI把数据类型分为两大类:简单类型和结构化类型。
结构化类型有两种:sequence(简单数据类型的组合,不一定要相同类型)和sequence of(同样类型的简单数据类型的组合,或同类型的sequence数据类型的组合)。
Ⅲ、编码方法
SMI使用ASN.1制定的基本编码规则BER进行数据的编码。BER指明了每种数据的类型和值。在发送端用BER编码,可把用ASN.1所表述的报文转换成唯一的比特序列。在接收端用BER编码,就可得到该比特序列所表示的ASN.1报文。
ASN.1把所有的数据元素都表示为T-L-V三个字段组成的序列。
(1)T字段
又叫标记字段,分为类别、格式、编号。
类别共四种:通用类(00),即ASN.1定义的类型;应用类(01),即SMI定义的类型;上下文类(10),即上下文所定义的类型;专用类(11),保留为特定厂商定义的类型。
格式共两种,指出数据类型的种类:简单数据类型(0),结构化数据类型(1)。
编号用来标志不同的数据类型。编号范围一般为0~30,编号大于30时,T字段就要扩展为多个字节。
(2)L字段
又叫做长度字段(单字节或多字节)。为单字节时,最高位为0,后面的7位定义V字段的长度。为多字节时,最高位为1,后面的7位定义后续字节的字节数(用二进制整数表示)。
(3)V字段
叫作值字段,用于定义数据元素的值。
举例:INTEGER 15,根据表6-4,其T字段是02,再根据表6-3,INTEGER类型要用4字节编码。最后得出TLV编码为02 04 00 00 00 0F。
3.管理信息库MIB
“管理信息”是在因特网的网管框架中被管对象的集合,被管对象必须维持可供管理程序读写的若干控制和状态信息。这些被管对象构成了一个虚拟的信息存储器,所以才称为管理信息库MIB。管理程序就是用MIB中这些信息的值对网络进行管理(如读取或重新设定这些值)。只有在MIB中的对象才是SNMP所能够管理的。
例如调制解调器应维持发送和接收的字符数、码元传输速率和接受的呼叫等统计信息。
举例——从图6-23可看出,对象IP的标号是4,因此所有与IP有关的对象都从前缀1.3.6.1.2.1.4开始。
(1)在节点IP下面有个名为ipInRecevies的MIB变量(图6-23),表示收到的IP数据报数。这个变量的标号是3,变量的名字是:iso.org.dod.internet.mgmt.mib.ipInReceives,而相应的数值表示是:1.3.6.1.2.1.4.3。
(2)当SNMP在报文使用MIB变量时,对于简单类型的变量,后缀0指具有该名字的变量的实例。因此,当这个变量出现在发送给路由器的报文中时,ipInReceives的数值表示(即变量的一个实例)就是1.3.6.1.2.1.4.3.0。
(3)请注意,对于分配给一个MIB变量的数值或后缀是完全没有办法进行推算的,必须查找已发布的标准。
MIB变量只给出了每个数据项的逻辑定义,而一个路由器使用的内部数据结构可能与MIB的定义不同。当一个查询到达路由器时,路由器上的代理软件负责MIB变量和路由器用于存储信息的数据结构之间的映射。
4.SNMP的协议数据单元和报文
Ⅰ、探询和陷阱
SNMP的操作只有两种基本的管理功能,即“读”操作(用Get报文来检测各被管对象的状况)和“写”操作(用Set报文来改变各被管对象的状况)。
探询:实现上面的功能,即SNMP管理进程定时向被管理设备周期性地发送探询信息,上述时间间隔可通过SNMP的管理信息库MIB来建立。
探询好处是:一来可使系统相对简单,二来能限制通过网络所产生的管理信息的通信量。
探询缺点是:一来不够灵活,而且所管理的设备数目不能太多;二来开销大。
陷阱:不通过探询就能发送某些信息,能够捕捉“事件”。但陷阱的参数是受限制的。当被管对象的代理检测到有事件发生时,就检查其门限值。代理只向管理进程报告达到某些门限值的事件(叫过滤),这样好处:一来只在严重事件发生时才发送陷阱;二来陷阱信息很简单且所需字节数很少。
总之,使用探询(至少是周期性地)以维持网络资源的实时监视,同时也采用陷阱机制报告特殊事件,使得SNMP成为一种有效的网络管理协议。
Ⅱ、结构
使用无连接的UDP,因此在网络上传送SNMP报文的开销较小,但不保证可靠支付。在运行代理程序的服务器端用熟知端口161来接收Get或Set报文和发送响应报文(与熟知端口通用的客户端使用临时窗口),但运行管理程序的客户端则使用熟知端口162来接收来自各代理的trap报文。
和大多数TCP/IP协议不一样,SNMP报文没有固定的字段,想反它们使用标准ASN.1编码,因此SNMP报文用人工进行编码和理解时都比较困难。看下图结构,首部包括报文标识、最大报文长度、报文标志。报文标志占1字节,其中的每一位定义安全类型或其他信息,安全参数用来产生报文摘要(见7.4节)
PDU前面的两个加密字段在数据部分需要加密时才使用。与网络管理直接相关的是后面的SNMP PDU部分,对于表6-7给出的前四种PDU的格式都是相同的,即由PDU类型、请求ID、差错状态、差错索引以及变量绑定这几个字段组成。PDU类型以及类型编号、T字段的编码已在表6-7中给出。
(1)请求标识符
由管理进程设置的4字节整数值。代理进程在发送响应报文时也要返回此请求标识符。由于管理进程可同时向许多代理发出请求读取变量值的报文,因此设置了请求标识符可使管理进程能够识别返回的响应是对应于哪一个请求报文。
(2)差错状态
在请求报文中,这个字段是零。当代理进程响应时,就填入0-18中的一个数字,例如0表示noError,1表示tooBig等等。
(3)差错索引
在请求报文中,这个字段是零。当代理进程响应时,若出现noSuchName、badValue、readOnly的差错,代理进程就设置一个整数,指明有差错的变量在变量列表中的偏移。
(4)变量绑定
指明一个或多个变量的名和对应的值。在请求报文中,变量的值应忽略。(类型是NULL)
下图举例:
八、应用进程跨越网络的通信
还有一些特定的应用需要因特网的支持,但这些应用又不能直接使用已经标准化的因特网应用协议,就要进行下面工作。
1.系统调用和应用编程接口
大多数操作系统使用系统调用的机制在应用程序和操作系统之间传递控制权。应用进程启动时,控制权传递:应用进程→系统调用接口→操作系统,操作系统的内部过程完毕,就返回给应用功能进程。
由于应用程序在使用系统调用之前要编写一些程序,特别是需要设置系统调用中的许多参数,因此这种系统调用接口又称为应用编程接口API(application programming interface)。API从程序设计的角度定义了许多标准的系统调用函数。应用进程只要使用标准的系统调用函数就可得到操作系统的服务,因此从程序设计的角度看,也可以把API看成是应用程序和操作系统之间的接口。
现在TCP/IP协议软件已驻留在操作系统中。由于TCP/IP协议族被设计成能运行在多种操作系统的环境中,因此TCP/IP标准没有规定应用程序与TCP/IP协议软件如何接口的细节,而是允许系统设计者能够选择有关API的具体实现细节。目前,只有几种可供应用程序使用TCP/IP的应用编程接口API,著名的一种叫套接字接口(socket interface,或插口接口)。
只要应用程序使用TCP/IP协议进行通信,它就必须通过套接字与操作系统交互(这就要使用系统调用函数)并请求其服务。
应用进程(客户或服务器)需要使用网络进行通信时,必须首先发出socket系统调用,请求操作系统为创建一个套接字。这种调用的实际效果是请求操作系统把网络通信所需要的一些系统资源(如存储器空间、CPU时间、网络带宽)分配给该应用进程。操作系统为这些资源的总和用一个叫作套接字描述符的号码(小的整数)来表示,然后把这个套接字描述符返回给应用进程。此后,应用进程所进行的网络操作(建立数据、收发数据、调整网络通信参数等)都必须使用这个套接字描述符。所以,几乎所有的网络系统条用都把这个套接字描述符作为套接字的许多参数中的第一个参数。在处理系统调用的时候,通过套接字描述符,操作系统就可以识别出应该使用哪些资源来完成应用进程所请求的服务。通信完毕后,应用进程通过一个关闭套接字的close系统调用通知操作系统回收与该套接字描述符相关的所有资源。由此可见,套接字是应用进程为了获得网络通信服务而与操作系统进行交互时使用的一种机制。
由于在一个机器中可能同时出现多个套接字,因此需要有一个存放套接字描述符的表,而每一个套接字描述符有一个指针指向存放套接字的地址。
2.几种常用的系统调用
以使用TCP的服务为例介绍。
Ⅰ、连接建立阶段
服务器端把本地地址绑定到套接字:套接字被创立后,它端口号和IP地址都是空的,因此在服务器端调用bind以把熟知端口号和本地IP地址填写到已创建的套接字中。
客户端可不调用bind,是由操作系统内核自动分配一个动态端口号(通信结束后由系统收回)。
①服务器为了接受客户端发起的连接请求而进行的一些系统调用
服务器在调用bind后,还使用listen把套接字设置为被动方式,以便随时接受客户的服务请求。UDP服务器由于只提供无连接服务,不使用listen系统调用。
接着调用accept,以便把远地客户进程发来的连接请求提取出来,系统调用accept的一个变量就是要指明从哪一个套接字发起的连接。accept要完成的动作较多,这是因为一个服务器必须能够同时处理多个连接(并发方式工作的服务器),可以由多种方式实现这种并发方式。下图是一种。
主服务器进程M一调用accept,就为每一个新的连接请求创建一个新的套接字,并把这个新创建的套接字的标识符返回给发起连接的客户方。与此同时,主服务器进程还要创建一个从属服务器进程S1来处理新建立的连接。从属服务器用这个新创建的套接字和客户进程建立连接,而主服务器进程用原来的套接字重新调用accept,继续接受下一个连接请求。在已建立的连接上,从属服务器进程就用这个新创建的套接字传送和接收数据。数据通信结束后,从属服务器进程就关闭这个新创建的套接字,同时这个从属服务器也被撤销。
总之,在任一时刻,服务器中总是有一个主服务器进程和零个或多个从属服务器进程。主服务器进程用原来的套接字接收连接请求,而从属服务器进程用新创建的套接字和相应的客户建立连接并可进行双向传送数据。
②客户端的系统调用
当使用TCP协议的客户已经用调用socket创建了套接字后,客户进程就调用connect,以便和远地服务器建立连接(这就是主动打开,相当客户发出的连接请求)。在connect系统调用中,客户必须指明远地端点(即远地服务器的IP地址和端口号)。
Ⅱ、数据传送阶段
客户和服务器都在TCP连接上使用send系统调用传送数据,使用recv系统调用接收数据。
调用send需要三个变量:数据要发往的套接字的描述符、要发送的数据的地址以及数据的长度。通常send调用把数据复制到操作系统内核的缓存中。若系统调用的缓存已满,send就暂时阻塞,直到缓存有空间存放新的数据。
调用recv也要三个变量:要使用的套接字的描述符、缓存的地址以及缓存空间的长度。
Ⅲ、连接释放阶段
调用close释放连接和撤销套接字。有些系统调用在一个TCP连接中可能会循环使用。UDP服务器由于只提供无连接服务,因此不使用listen和accept系统调用。