OSI七层网络协议

OSI模型成为计算机之间,以及网络间进行通信的主要的结构模型。

从上到下,各层名称及其描述依次为:

第七层:应用层(Application Layer)

定义了用于在网络中进行通信和数据传输的接口 - 用户程式;
提供标准服务,比如虚拟终端、文件以及任务的传输和处理;

第六层:表示层(Presentation Layer)

掩盖不同系统间的数据格式的不同性;
指定独立结构的数据传输格式;
数据的编码和解码;加密和解密;压缩和解压缩

第五层:会话层(Session Layer)

管理用户会话和对话;
控制用户间逻辑连接的建立和挂断;
报告上一层发生的错误

第四层:传输层(Transport Layer)

管理网络中端到端的信息传送;
通过错误纠正和流控制机制提供可靠且有序的数据包传送;
提供面向无连接的数据包的传送;

第三层:网络层(Network Layer)

定义网络设备间如何传输数据;
根据唯一的网络设备地址路由数据包;
提供流和拥塞控制以防止网络资源的损耗
第二层:数据链路层(Data Link Layer)

定义操作通信连接的程序;
封装数据包为数据帧;
监测和纠正数据包传输错误

第一层:物理层(Physical Layer)

定义通过网络设备发送数据的物理方式;
作为网络媒介和设备间的接口;
定义光学、电气以及机械特性。
网络通信过程概述

通过OSI模型,信息可以从一台计算机的软件应用程序传输到另一台的应用程序上。

比如,我们要实现计算机A与计算机B之间通信。

实际上,通信过程是计算机 A 上的应用程序要将信息发送到计算机 B 的应用程序。

中间过程如下:

计算机 A 中的应用程序需要将信息先发送到其应用层(第七层),然后此层将信息发送到表示层(第六层),表示层将数据转送到会话层(第五层),如此继续,直至物理层(第一层)。在物理层,数据被放置在物理网络媒介中并被发送至计算机 B 。计算机 B 的物理层接收来自物理媒介的数据,然后将信息向上发送至数据链路层(第二层),数据链路层再转送给网络层,依次继续直到信息到达计算机 B 的应用层。最后,计算机 B 的应用层再将信息传送给应用程序接收端,从而完成通信过程。

网络通信过程中的数据封装结构

OSI的七层运用各种各样的控制信息来和其他计算机系统的对应层进行通信。这些控制信息包含特殊的请求和说明,它们在对应的 OSI 层间进行交换。每一层数据的头和尾是两个携带控制信息的基本形式。

对于从上一层传送下来的数据,附加在前面的控制信息称为头,附加在后面的控制信息称为尾。然而,在对来自上一层数据增加协议头和协议尾,对一个 OSI 层来说并不是必需的。

当数据在各层间传送时,每一层都可以在数据上增加头和尾,而这些数据已经包含了上一层增加的头和尾。协议头包含了有关层与层间的通信信息。头、尾以及数据是相关联的概念,它们取决于分析信息单元的协议层。

例如,传输层头包含了只有传输层可以看到的信息,传输层下面的其他层只将此头作为数据的一部分传递。对于网络层,一个信息单元由第三层的头和数据组成。对于数据链路层,经网络层向下传递的所有信息即第三层头和数据都被看作是数据。换句话说,在给定的某一OSI 层,信息单元的数据部分包含来自于所有上层的头和尾以及数据,这称之为封装。


例如,想要实现计算机A与计算机B之间通信,通信过程如下:

如果计算机 A 要将应用程序中的某数据发送至计算机 B ,数据首先传送至应用层。计算机 A 的应用层通过在数据上添加协议头来和计算机 B 的应用层通信。所形成的信息单元包含协议头、数据、可能还有协议尾,被发送至表示层,表示层再添加为计算机 B 的表示层所理解的控制信息的协议头。信息单元的大小随着每一层协议头和协议尾的添加而增加,这些协议头和协议尾包含了计算机 B 的对应层要使用的控制信息。在物理层,整个信息单元通过网络介质传输。

计算机 B 中的物理层收到信息单元并将其传送至数据链路层;然后 B 中的数据链路层读取计算机 A 的数据链路层添加的协议头中的控制信息;然后去除协议头和协议尾,剩余部分被传送至网络层。每一层执行相同的动作:从对应层读取协议头和协议尾,并去除,再将剩余信息发送至上一层。应用层执行完这些动作后,数据就被传送至计算机 B 中的应用程序,这些数据和计算机 A 的应用程序所发送的完全相同。

套接字(Socket)所处位置

套接字大致位于OSI模型的会话层。

会话层夹在其上面向应用的层和其下的实时数据通信层之间。会话层为两台计算机之间的数据流提供管理和控制服务。

作为该层的一部分,套接字提供一个隐藏从导线上获取比特和字节的复杂性的抽象。换句话说,套接字允许我们让应用程序表明它想发送一些字节即可传输数据。套接字隐藏了完成该项工作的具体细节。

如图(来源于IBM DW)所示:


向上,使用套接字的代码工作于表示层。

编写的套接字处理代码只存在于表示层中,应用层无须知道套接字如何工作的任何事情。

如图所示:


套接字的类型

Java中套接字一般有两种类型:TCP套接字和UDP套接字。

TCP 和 UDP 扮演相同角色,但做法不同。

两者都接收传输协议数据包并将其内容向前传送到表示层。

TCP 把消息分解成数据包(数据报,datagrams)并在接收端以正确的顺序把它们重新装配起来。TCP 还处理对遗失数据包的重传请求。有了 TCP,位于上层的层要担心的事情就少多了。

UDP 不提供装配和重传请求这些功能。它只是向前传送信息包。位于上层的层必须确保消息是完整的并且是以正确的顺序装配的。

一般而言,UDP 强加给您的应用程序的性能开销更小,但只在应用程序不会突然交换大量数据并且不必装配大量数据报以完成一条消息的时候。否则,TCP 才是最简单或许也是最高效的选择。


引用
http://hi.baidu.com/shirdrn/blog/item/4bc930fb85bcb6274f4aea87.html

猜你喜欢

转载自flynndang.iteye.com/blog/798873