网络/消息序列图

网络/消息序列图

我正在寻找生成与该图表类似(但更复杂)的东西: 在此处输入图片描述

这描述了通信双方之间的网络数据包。我不知道它是否有特定的名称(编辑:消息序列图)。它看起来类似于来自 pgf-umlsd 的序列图,但也存在一些根本区别:

  • 箭头呈一定角度,表示数据包从发送方传输到接收方的时间
  • 没有序列图中的控制传递

您知道这种图表的名称吗?是否有任何宏可以轻松完成此操作,或者是否可以快速创建?

基本上,我需要的是倾斜的箭头、箭头本身的标签以及箭头的锚点,其他的什么都不需要。

答案1

我的电脑里有一些旧代码。这不是你想要的,但我认为它可以作为一个起点。

首先是最终结果:

在此处输入图片描述

我还必须绘制一些链路控制协议示例,并决定创建一些命令来绘制框架(从上图中的 A 到 B)

\newcommand{\tramaok}[2]{%
    \draw[trama,->]  #2 --++(1.5,-2) node[above right,near start] {#1};
}

丢失帧

\newcommand{\tramaperduda}[2]{%
    \path #2 coordinate (a)--++(1.5,-2) coordinate (b) coordinate[midway] (c); 
    \draw[trama,-]  (a) --(c) node[below] {#1};
    \draw[trama,->]  (c) -- ++(30:.5);
}

及致谢(从下至上)

\newcommand{\ackok}[2]{%
    \draw[ack,->] {#2}--++(1.5,2) node[below right,near start] {#1};
}

\newcommand{\ackperdut}[2]{%
    \path #2 coordinate (a)--++(1.5,2) coordinate (b) coordinate[midway] (c); 
    \draw[ack,-]  (a) --(c) node[above] {#1};
    \draw[ack,->]  (c) -- ++(-30:.5);
}

所有这些命令都有两个参数,一个是标签(如果需要),另一个是起点。斜率和距离是固定的。使用这些命令很容易绘制上图:

\tramaok{Tr0}{(0,2)}
\tramaok{Tr0}{(2.5,2)}
\tramaperduda{Tr1}{(5,2)}
\tramaok{Tr0}{(7.5,2)}
\ackok{Ack}{(1.5,0)}
\ackok{Ack}{(4,0)}
\ackok{Ack}{(9,0)}
\timeout{(0,2)}{(2.5,2)}

完整代码如下:

\documentclass[tikz,border=2mm]{standalone}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}

\usetikzlibrary{calc,arrows,positioning}
\begin{document}

\tikzset{
    host/.style={rectangle,rounded corners,             
                  thick,draw=#1!60,fill=#1!15},
    host/.default=blue,
    trama/.style={thick,draw=#1!60,fill=#1!60},
    trama/.default=purple,
    ack/.style={trama=teal},
}

\newcommand{\tramaok}[2]{%
    \draw[trama,->]  #2 --++(1.5,-2) node[above right,near start] {#1};
}
\newcommand{\tramaperduda}[2]{%
    \path #2 coordinate (a)--++(1.5,-2) coordinate (b) coordinate[midway] (c); 
    \draw[trama,-]  (a) --(c) node[below] {#1};
    \draw[trama,->]  (c) -- ++(30:.5);
}

\newcommand{\ackok}[2]{%
    \draw[ack,->] {#2}--++(1.5,2) node[below right,near start] {#1};
}

\newcommand{\ackperdut}[2]{%
    \path #2 coordinate (a)--++(1.5,2) coordinate (b) coordinate[midway] (c); 
    \draw[ack,-]  (a) --(c) node[above] {#1};
    \draw[ack,->]  (c) -- ++(-30:.5);
}

\newcommand{\timeout}[2]{%
    \draw #1 --++(0,5mm);
    \draw #2 --++(0,5mm);
    \begin{scope}[yshift=2.5mm]
    \draw[<->] #1 -- #2 node[above,midway]{\emph{Time-out}};
    \end{scope}
}

\begin{tikzpicture}[>=stealth',
    font=\small\sffamily]

% S&W amb etiquetes a trames 
% Tout curt. Repetició trames.
% No detecta pèrdues de trames
\draw[help lines,->] (-0.2,0) node[host,left] {B}--(11.5,0);
\draw[help lines,->] (-0.2,2) node[host,left] {A}--(11.5,2);

\tramaok{Tr0}{(0,2)}
\tramaok{Tr0}{(2.5,2)}
\tramaperduda{Tr1}{(5,2)}
\tramaok{Tr0}{(7.5,2)}
\ackok{Ack}{(1.5,0)}
\ackok{Ack}{(4,0)}
\ackok{Ack}{(9,0)}
\timeout{(0,2)}{(2.5,2)}

\end{tikzpicture}

\end{document} 

答案2

我喜欢 Ignasi 的解决方案,但我决定采纳 Claudio 的评论并使用硕士- 它附带了很好的文档、一些不错的功能,并且运行良好。唯一的问题是你不能直接将其编译为 .pdf,因为它使用普斯特里克绘制图表。

为了保持这些pdflatex优势,我想出了一个基于 GNU make 的简单工作流程。以下是 Makefile:

all: protokol.pdf

protokol.pdf: ack1.pdf ack2.pdf ack3.pdf ack4.pdf ack5.pdf protokol.tex json/*
    pdflatex protokol.tex

%.pdf: %.tex
    ./processDvi.sh $* 

这是processDvi.sh:

#!/bin/sh

latex $1.tex
dvips $1.dvi
ps2eps -l --nohires -f $1.ps
ps2pdf -dEPSCrop -dAutoRotatePages=/None -dUseFlateCompression=true $1.eps

基本上,我所做的就是创建仅包含图表的小型 .tex 文档,并将它们包含在主文档中。Makefile 可能需要一些重构,这样我就不必添加我想要创建的每个新图表,但目前对我来说,这种方法已经足够了。

相关内容