OSI七层模型是不同计算机或通信系统间互联的标准体系和框架,在OSI中包括一系列标准和协议,如:TCP/IP
、UDP
、HTTP
等,在Node.js中提供了对这些协议的实现和支持,如:net
模块提供了对TCP
、Socket
的封装和支持,dgram
模块提供了对UDP
的封装和支持、http
模块进一步封装了TCP
协议提供了对HTTP
的支持。本文对网络中相关协议、概念及Node.js中对相关协议的实现模块做简单介绍,后续会有对具体介绍模块及其功能文章。
1. OSI
七层模型
1.1 概念介绍
OSI(Open System Interconnection)开放系统互连参考模型,是ISO制定的一个用于计算机或通信系统间互联的标准体系,它是一个七层抽象模型,从低到高分别是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。目的是为不同计算机互连提供一个共同的基础和标准框架,OSI中包括一系列抽象的术语、概念,也包括具体的协议,遵循OSI参考模型和相关协议能够实现计算机或通信系统间互联互通。
1.2 OSI
七层模型简单介绍
- 应用层(Application Layer):应用层是网络服务与最终用户的一个接口,其功能是实现应用进程(如用户程序、终端操作员等)之间的信息交换。应用层协议有:
HTTP
、FTP
、TFTP
、SMTP
、SNMP
、DNS
- 表示层(Presentation Layer):表示层用于数据表示形式的控制,其主要功能是把应用层提供的信息变换为能够共同理解的形式,提供字符代码、数据格式、控制信息格式、加密等的统一表示。
- 会话层(Session Layer):会话层是会话单位的控制层,用于建立、管理、终止会话,其主要功能是按照在应用进程之间约定的原则,按照正确的顺序收、发数据,进行各种形态的对话。会话层规定了会话服务用户间会话连接的建立和拆除规程以及数据传送规则。
- 传输层(Transport Layer):传输层定义传输数据的协议端口号,以及流控和差错效验。用于系统之间的数据传送控制层,主要功能是开放系统之间数据的收发确认。同时,还用于弥补各种通信网路的质量差异,对经过下三层之后仍然存在的传输差错进行恢复,进一步提高可靠性。会话层协议有:
TCP
、UDP
- 网络层(Network Layer):进行逻辑地址寻址,实现不同网络之间的路径选择,为报文或分组通过通信子网选择最适当的路径。控制数据链路层与传输层之间的信息转发,建立、维持和终止网络的连接。网络层协议有:
ICMP
、IGMP
、IP
、ARP
、RARP
- 数据链路层(Data Link Layer):数据链路可以粗略地理解为数据通道,该层的主要功能是:通过各种控制协议,将有差错的物理信道变为无差错的、能可靠传输数据帧的数据链路。其功能包括:建立逻辑连接、进行硬件地址寻址、差错效验等。
- 物理层(Physical Layer):物理层并不是物理媒介本身,它只是开放系统中利用物理媒体实现物理连接的功能描述和执行连接的规程。物理层提供用于建立、保持和断开物理连接的机械的、电气的、功能的和过程的条件,如:建立、维护、断开物理连接。物理层协议有:
RS 232C
、RS 449/422/423
等。
2. Node.js
对网络协议的实现与支持
2.1 net
模块与TCP
、Socket
TCP
与Socket
TCP
(Transmission Control Protocol)传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议,它位于IP
协议之上,TCP
是因特网中的传输层协议,使用三次握手协议建立连接,而终止一个连接要经过四次握手。TCP
为应用层提供了一种传输机制,例如:HTTP
就工作在TCP
之上,其它很多面向连接的应用(如:iRC、SMTP、IMAP)也工作在TCP
之上。
Socket
是在应用层和传输层之间的一个抽象层,它把TCP/IP
层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信,Socket
本身并不是协议,是对TCP/IP
协议的封装,是一个调用接口。
Node.js的net
模块
Node.js中提供了net
模块,该模块提供了对TCP、Socket的封装与支持,它包含了创建TCP
服务器/客户端的方法。net
模块继承自events
和stream
模块,所以该模块创建的服务器/客户端也是一个事件发射器,而其创建的客户端socket
套接字对象又是一个可读写的Stream
。net
模块网络操作的基础模块,Node.js中其它网络操作相关模块,如:Http
模块等,都是基于net
模块的进一步封装。
net
模型的详细介绍请参考:Node.js对TCP/Socket的实现之net模块的使用。
2.2 dgram
模块与UDP
UDP
用户数据报
UDP
(User Datagram Protocol)用户数据报协议,是一种无连接的传输层协议。它与TCP
协议一样在IP
协议之上,同样位于传输层,用于处理数据包。但TCP
协议是面向链接,在网络节点之间提供可靠有序的数据传输。而UDP
协议是一种无连接的协议,不具备TCP
协议的可靠性。UDP
无状态特性在有些情况下特别有用,例:消息的广播和多播等。使用UDP
的应用程序包括:DNS、流媒体应用、IPTV、网络语音等。
Node.js的dgram
模块
Node.js使用dgram
模块来支持UDP
用户数据报协议,由于不用像TCP
那样面向连接,所以UDP
要相对轻量。想要发送或接收UDP
消息,就可以使用dgram
模块创建套接字对象,通过该套接字可以将消息发送给其它UDP
终端。将套接字对象绑定到UDP
端口后,可以监听传入消息。UDP
模块也实现了events
模块,但与TCP
的套接字对象不同,该模块没有继承stream
模块。
dgram
模型的详细介绍请参考:Node.js用户数据报dgram模块。
2.3 http
模块与HTTP
HTTP
协议
HTTP
(Hypertext Transfer Protocol)超文本传输协议,是一个用于内容传输的应用层协议,是互联网上应用最为广泛的一种网络协议,它工作在TCP
之上,是万维网进行数据通信的基础。HTTP
连接最显著的特点是每次客户端发送的请求都需要服务器响应,请求结束后,连接会自动释放。
Node.js的http
模块
在Node.js中可以使用http
模块轻松创建HTTP服务器或HTTP客户端,https
模块是其安全版本。http
模块在net
模块之上构建,所以net
模块中的大部分功能都可以在http
模块中使用。与net
模块一样,http
模块也实现了events
和stream
模块,所http
模块创建的对象也分别是事件发射器或可读写的Stream
,或既是事件发射器又是Stream
。
http
模型的详细介绍请参考:详解Node.js的http模块之http模块概述。https
模型的详细介绍请参考:使用Node.js HTTPS模块创建HTTPS服务器。