电子说
1. 为什么建立UML模型范例
作为统一建模语言,UML可以帮助我们对很多业务、技术的知识进行梳理,从多个视角描述清楚,帮助读者理解。另外因为UML的建模首先来自于软件建模的需求,所以UML的模型很容易转换为软件的设计,这对于软件开发者来说是一个天生的福利。
现在UML对于IT技术有关的建模已经比较成功,例如:
但是一个完整的应用,最重要的往往是专业性强的领域知识的建模。而这方面,可以公开看到的UML范例却不多,这也就造成了UML建模的价值还没有被充分的挖掘出来。
所以我们尝试采用UML对各个领域的专业知识建模,期望能够让大家看到逻辑建模的重要性,以及在逻辑建模方面以面向对象思想为核心的UML建模的强大表达力。进而更多的采用UML提高描述、分析和设计能力。
虽然UML对逻辑建模具有很大的表达能力,但是各个专业领域自身、以及人们自发的描述方式也是非常重要的,而且一般是各种专业知识的首要表达方式。所以UML的建模不应该成为已有描述形式的颠覆者,而更应该是对已有描述的梳理,以更简洁、更加精确、更加抽象的方式进行逻辑化描述。这样可以对知识进行多个维度、多个层次的更加充分的挖掘和展示。因为我们这里主要关注UML的建模,但是也不想损失已有的知识描述,所以在UML之前的各种已有的知识的描述和建模方式,我们这里称之为 “原生图”。
所以我们对专业知识的建模采用2种方式:
为了更加充分的描述被建模对象,这里采用4个视角进行建模:
本文采用UML模型对TCP协议进行建模。主要涉及4个视图:
TCP 协议是通信网络传输层的网络通信协议。为了充分的理解TCP按照TCP/IP的5层协议结构,我们看看各层通信协议的职责,如下图所示:
TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。
TCP/IP五层模型说明:
层 | 职责 |
---|---|
应用层 | 应用程序层是需要网络通信的应用程序所在的位置。这些应用程序的示例包括电子邮件客户端和Web浏览器。这些应用程序使用传输层发送请求以连接到远程主机。 |
传输层 | 在传输层建立在不同主机上运行的应用程序之间的连接。它使用TCP进行可靠连接,使用UDP进行快速连接。它通过为其分配port号来跟踪在其上方的应用程序中运行的进程,并使用网络层访问TCP / IP网络。 |
网络层 | 该网络层负责创建在整个网络中的数据包。它使用IP地址来识别数据包的源和目的地。 |
数据链路层 | 该数据链路层负责创建跨网络传输的帧。这些帧封装了数据包,并使用MAC地址来标识源和目的地。 |
物理层 | 所述物理层编码和解码数据链路层的一帧中的bit,它包括收发器,可以在网络上发生和接收信号。 |
通信过程中最重要的数据就是在各个通信协议层次传递的数据。如下是一个要发送的消息通过各个网络协议层的过程中被逐步添加相应协议信息的示意图:
较高的层将信息传递给较低的层。每一层都将被称为header的信息添加到传递给它的数据中。此header包含图层执行其工作所需的信息。我们将从应用程序层开始。
我们更关注各个层次数据的逐步累加过程,为了让表达累加过程中数据结构的变化,采用UML的类图,对各个层次的数据结构进行建模如下:
各个网络通信层次对消息的处理过程采用UML的活动图描述其中的数据流如下:
过程的文本描述 |
---|
应用程序层生成一条消息。在这种情况下,特定的应用程序是请求网页下载的Web浏览器。然后,此消息将发送到传输层。传输层添加了TCP 或者UDP 的header,其中包括源port和目标port地址。其他信息(如用于TCP的数据包序列号)也将添加到header中。如果使用TCP,则由传输层生成的数据称为段(segment),如果使用UDP,则称为数据报(Datagram)。然后将该段发送到网络层。网络层添加了包含源IP地址和目标IP地址的header以生成数据包(Packet)。然后将此数据包发送到数据链路层。数据链路层添加包含MAC地址信息的header以创建帧(Frame)。然后,将该帧发送到物理层以传输比特码。 |
活动图描述:
下面采用UML的4个视图建模TCP通信协议。
3.1 结构视图
主要描述TCP协议的网络通信相关的网络节点和连接,采用UML的复合结构图建模如下:
3.2 过程视图
过程视图主要描述2各层次:
TCP通信过程
建立连接
通过三次握手(3个消息)建立客户端和服务端的连接:
过程的文本描述 |
---|
段1 :客户端发送一个连接请求消息SYN报文说明:在TCP头部的SYN位字段置位的TCP/IP数据包,并指明自己想要连接的port号和它的客户端初始序列号(记为ISN,图中ISN=x)。段2:服务端响应连接请求消息服务端收到请求后,也发送自己的SYN报文段作为响应,并包含了它的初始序列号(ISN(s)=y)。此外,为了确认客户端的SYN,SYN数据加1后作为返回的ACK数值。因此,每发送一个SYN,序列号就会自动加1。、段3:客户端发送确认收到响应的消息为了确认服务器端的SYN,客户端将ISN(s)的数值加1后作为返回的ACK数值。这称为段3。 |
顺序图描述:
传输数据
如下是传输数据的图示:
关闭连接
通过四次握手(4个消息)关闭客户端和服务端的连接:
过程的文本描述 |
---|
1. 主动关闭者发送一个FIN,指明接收者希望看到的自己当前的序列号。目的是告诉被动关闭方,我要关闭连接了。2. 被动关闭方收到 FIN包后,发送一个ACK给对方,将K的数值加1作为响应的ACK值,以标识该ACK对应的FIN 。3. 被动关闭方发送一个FIN,用来告诉对方,我也可以关闭连接了。为了标识这是自己发起的,有一个表示位seq =q,为了标识该FIN对应的主动关闭方发起的FIN,会有标识符ack = p+1;4. 主动关闭方收到 FIN后,发送和一个ACK给对方,告知确认关闭,用一个标识位ack =q+1标识对应的请求。 |
顺序图描述:
如下是来自于一篇网络文章的关闭连接的过程描述:
3.3 数据视图
一个具体的TCP报文结构如下图所示:
可以用UML的类图对报文结构进行建模,图示如下:
这个类图对结构的关系描述的更加清晰,也符合开发工程师的结构化需要。当然也比较抽象,应该结合原生图进行理解才好。
3.4 状态视图
通信协议因为存在状态变迁,所以一般采用状态图建模协议的状态机。下图来自于一篇网络是常见的TCP协议状态机(来自于一篇网络文章):
TCP状态及其描述如下表。
状态 | 描述 |
---|---|
LISTEN | 等待来自远程TCP应用程序的请求 |
SYN_SENT | 发送连接请求后等待来自远程端点的确认。TCP第一次握手后客户端所处的状态 |
SYN-RECEIVED | 该端点已经接收到连接请求并发送确认。该端点正在等待最终确认。TCP第二次握手后服务端所处的状态 |
ESTABLISHED | 代表连接已经建立起来了。这是连接数据传输阶段的正常状态 |
FIN_WAIT_1 | 等待来自远程TCP的终止连接请求或终止请求的确认 |
FIN_WAIT_2 | 在此端点发送终止连接请求后,等待来自远程TCP的连接终止请求 |
CLOSE_WAIT | 该端点已经收到来自远程端点的关闭请求,此TCP正在等待本地应用程序的连接终止请求 |
CLOSING | 等待来自远程TCP的连接终止请求确认 |
LAST_ACK | 等待先前发送到远程TCP的连接终止请求的确认 |
TIME_WAIT | 等待足够的时间来确保远程TCP接收到其连接终止请求的确认 |
这个状态图涉及到了客户端、服务端、网络连接多个对象,所以看起来一头雾水,很难理解。这样的图示对于用户是不友好的,所以有必要用UML的状态图改进一下。
状态图的建模首先应该识别持有状态的对象,然后再建立它的状态图,TCP网络通信过程实际上涉及到了3个对象:
他们分别有各自的状态图,下面基于TCP的通信过程,对三个对象的状态分别进行建模。
Connection的状态如下
这样看起来和通信过程完全映射,好理解多了。
全部0条评论
快来发表一下你的评论吧 !