OMNeT ++ ( C ++中的目标模块化网络)离散事件模拟器是用于离散事件建模的模块化, 面向组件的 C ++库和框架,主要用于创建网络模拟器 。 简而言之,这是一个“离散事件模拟器”,包括:用于创建模型的IDE和模拟器本身(GUI)。
INET Framework是OMNeT ++ 的网络模型的“库” 。
完整GIF(15.7 MiB)
在前面的部分中...
0. 自动网络拓扑检测和非托管交换机。 不可能完成任务吗? (+ 经典的Habrahabr UserCSS )
在这一部分:
- 创建“您的第一”协议(以LLTR Basic为例);
- 选择适当的城市模拟器来调试协议(并创建其模型);
- 我们了解了为模拟器及其IDE设置环境的精妙之处(配置,编译,链接,调优,打补丁,忽略过时的文档;以及其他大量的英语知识);
- 在陌生的网络模拟器中创建第一个协议的第一个模型时,我们将遇到您遇到的所有问题;
- 让我们一起走一路:
- 成功地(最终!)通过空网络完成第一个项目带来的快乐,
- 直到完全沉浸在具有功能协议模型的实验中;
- 教程 ,一切都被描述为教程 -我们将从错误中吸取教训-我们将使它们成为错误,并且我们将理解它们(自然),以便优雅/高效地处理它们;
- 仓库(git
),并从头到尾保存了所有步骤( “添加...” , “修复...” , “修复...” , “修改...” , “纠正...” ,...)的提交和标签。
注意 : “网状网络”中心读者的其他信息 。
{图片量:2.2+(2.1)MiB; 文字:484 KiB; 表情符号:22个。 }
注意 : [关于使用的分区结构]教程/ how-to节的结构通常与目录中的节结构不同:在目录中,节结构使您可以最少的步骤(平衡树)获得所需的信息; 在教程/的方法中,部分在逻辑上紧密相连,而单独的部分实际上是步骤序列中的步骤之一,其结构是书签(锚定)的层次结构,可让您提醒(参考)关于前面描述的片段。
非主题:关于html5 <section>标签和标头标签<h#>
最好将<section>
标记显示在HTML5中,借助它的帮助,可以直接设置该部分的嵌套级别(通过将<section>
标记彼此嵌套)。 现在可以在标签的嵌套(层次结构)中明确反映文本结构。
这也影响了标题标签<h#>
,因为 现在,节的嵌套由<section>
的嵌套确定,然后指示节的名称-仅使用一个标签<h1>
,格式为:“ <section><h1> </h1> </section>
”。
我已经使用了很长一段时间(因为<section>
),但是在创建本文时,我看到了使用<section>
另一个优点。
一个好的章节标题应该准确地反映其本质,但是,有时您需要保留(而不是披露)该实质,直到该章节的中间。 也就是说,这样的部分应该首先成为“常规”,并在中间创建“哇/ wtf-效果”。 从逻辑上讲,这是一个完整的部分,但是如果您在该部分的开头显示其名称,则该名称本身将是一个破坏者 。 想象一本书(侦探小说),其封面上是所有有关“杀手” 的信息 。
这是<section>
标签“进入场景”的地方。 它使您可以确定自己内部任何地方的部分名称,即 不一定在一开始。 示例:“ <section> <h1> </h1> </section>
“。 事实证明,我们可以同时保存文本的逻辑结构,并在适当的时间显示节的名称。 您甚至可以使部分标题在读者到达某个点之后(在html中的<h1>
)直观地显示在其开头。
在<section>
存在的短短9年中,浏览器还没有学会如何正确构建“ HTML5文档大纲”以确保可访问性 。
你为什么不学? 在结构复杂的文档中, *很难确定应该从哪个标签(节,文章,...)开始编号(h1,h2,h3,...)。 现在想象一下,文档本身被放置在像这样的页面上(还有许多与文档本身无关的附加块,但是具有标题),并且h1到处都用于标题。 如果一页上没有一个文件,而是几个文件? 但是,从视觉上看,一切看起来都不错( 示例文档 )。
*-实际上,这并不困难,所有内容均在标准中进行了描述 ,但实际上并不起作用(解释见下文)。
为什么一切看起来都不错? 在这里,由于样式的原因 ,出现了更多信息-节层次结构和标题级别(h#)之间的对应关系。 因此,也许在构建“ HTML5文档大纲”时,您应该使用CSS中的信息? 为此,您需要为title元素的CSS元素添加一个附加属性,以指示其级别,例如:
body>section>h2 { heading-level: 1; font-size: 1.8em; } body>section>section>h2 { heading-level: 2; font-size: 1.4em; } body>section>section>section>h2 { heading-level: 3; font-size: 1.17em; } body>section>section>section>section>h2 { heading-level: 4; font-size: 1em; } body>section>section>section>section>section>h2 { heading-level: 5; font-size: 0.83em; }
或更严格的选项-一节中仅允许使用一个标头。 在这种情况下,标头级别由该部分本身设置:
body>section { heading-level: 1; } body>section>section { heading-level: 2; } body>section>section>section { heading-level: 3; } body>section>section>section>section { heading-level: 4; } body>section>section>section>section>section { heading-level: 5; }
,最后使用哪个标头标记都无关紧要:h1或h5。
但是,如果早先创建一个“ 标题级别的大纲 ”就足以只具有标记(HTML),那么现在我们还需要样式(CSS)。 也许您可以限制自己使用标记(HTML)? 有了这个问题,我们就接近了标准中描述的“标题级别大纲”构造算法的问题。 因此,问题不在于算法本身,而在于这样一个事实,即只有有限(固定)的标记集可以充当“ 分段根 ”元素。 但是人们经常有“非标准的愿望”:“我希望文章标签成为文章列表页面上的'sectioning root'元素,“并且我希望任意部分成为'sectioning root'元素”。 以前,对于他们来说,在一页上使用多个h1标签就足够了(而且确实如此)。 因此,如果使用h1标记设置了标题,那么可以确保任何部分(标记:section,article,...)成为“ sectioning root”元素。
#第一步:“建模之前” /“头脑风暴”
不明飞行物 飞进去,并留在这里的 差距 ? 与上一篇文章相反的一面 。
#协议详细信息
在开始时,我们定义了需要包含在协议中的内容。 以LLTR Basic为例。
LLTR的基础是网络扫描期间多个主机上的统计信息收集的迭代。 LLTR (> 1)中有很多迭代,因此要包含在协议中的第一件事是控制每个迭代的开始和停止。 如果考虑到有很多主机(> 1) ,那么控制将包括以某种方式通知所有主机迭代的开始时间和迭代的结束时间。 即,同步所有主机。
每个迭代都有其自己的单播src主机和单播dst主机,因此要启用的下一件事是为每个迭代分配单播src和dst的方法。 也就是说,在每次迭代中,其中一台主机应“意识到”自身为单播src主机,其目的是将流量发送到单播dst主机。
还有最后一个。 完成所有迭代后,必须将所有主机收集的所有统计信息发送到一个主机进行处理。 该主机将分析收集的统计信息并构建网络拓扑。
另外,在此步骤中,您可能会考虑该协议的一些实现细节(限制)。 例如,我们希望使用LLTR的程序能够在没有root权限的情况下并且可以在用户空间中运行(即,无需在系统中安装特殊驱动程序),这意味着LLTR应该可以在TCP和UDP上运行。
其他人都做了实现,他们将在创建模型的过程中自行决定。 也就是说,当然,您可以立即考虑所有细节,但同时存在“滑入局部最优”而不注意“更好”的实施方案的风险。 最好有多个模型-如果每个实现选项都有一个模型,则可以合并模型,并逐步实现更好的实现。 记住遗传算法 ;)。 例如,在一种实现/模型中,可能存在集中管理,在另一种实现/模型中,可能是分散管理,在第三种中,则是前两种选择的最佳组合。
#选择一个网络模拟器
现在是时候决定使用网络模拟器了,我们将在其中创建模型并建立实验。
基本上,从网络模拟器中,我们需要能够实现“我们的”协议。 并非所有的模拟器都使它变得容易。
但是相反,“世界品牌” 的真实网络设备的OS仿真器的存在不是必需的。 仿真器很可能会产生许多限制,这些限制只会干扰实验。
选择模拟器后, 评估网络模拟工具 (我在许多方面对模拟器的要求)和OMNeT ++常规“网络”模拟一文帮助了我。
#安装OMNeT ++和INET
下载OMNeT ++ 5.0 。
而且由于OMNeT ++只是一个“离散事件模拟器”,因此您还需要INET (网络模型库(协议和设备))。 下载INET 3.4.0 。 实际上,可以从IDE进行安装 ,但是我建议手动安装 (稍后会清楚为什么)。
在* nix和Windows上的安装没有太大区别。 我将继续以Windows为例。
用%ProgramData%(C:\ ProgramData \)解压缩OMNeT ++ ,然后打开文件INSTALL.txt(C:\ ProgramData \ omnetpp-5.0 \ INSTALL.txt)。 它说详细的说明在“ doc / InstallGuide.pdf”中,进一步写道,如果您不想阅读它,只需执行以下操作:
$。 设定
$ ./配置
$使
但是不要急着去做!
首先,请注意第一个命令. setenv
” . setenv
。“ 在“ omnetpp-5.0”目录中没有“ setenv
”文件(该文件的版本为5.0b1)。 它不是必需的(对于Windows),因此只需运行“ mingwenv.bat”(我建议您在启动之前先查看它的功能, 以避免 rm
)。 最后,终端将断开(关闭)。
其次,我建议您稍微校正一下“ configure.user”文件(如果所提到的参数在文件中已被注释掉,那么您需要取消注释):
- 如果要使用Clang(默认情况下),请离开
PREFER_CLANG=yes
并配置:- CFLAGS_RELEASE(编译器选项):
CFLAGS_RELEASE='-O2 -march=native -DNDEBUG=1'
- 如果您要使用GCC而不是Clang(并且您最有可能在看到“ configure.in”文件的第398行中写的内容后使用GCC),则请安装
PREFER_CLANG=no
并配置:- CFLAGS_RELEASE(编译器选项)。 可以选择或
CFLAGS_RELEASE='-O2 -mfpmath=sse,387 -ffast-math -fpredictive-commoning -ftree-vectorize -march=native -freorder-blocks-and-partition -pipe -DNDEBUG=1'
或
CFLAGS_RELEASE='-O2 -fpredictive-commoning -march=native -freorder-blocks-and-partition -pipe -DNDEBUG=1'
或
CFLAGS_RELEASE='-O2 -march=native -freorder-blocks-and-partition -pipe -DNDEBUG=1'
(以出现故障的降序排列)。 - 也值得将CXXFLAGS添加为'
-std=c++11
'+ CFLAGS_RELEASE。 例如:
CXXFLAGS='-std=c++11 -O2 -fpredictive-commoning -march=native -freorder-blocks-and-partition -pipe -DNDEBUG=1'
- JAVA_CFLAGS(只是取消注释):
JAVA_CFLAGS=-fno-strict-aliasing
PREFER_QTENV=yes
- 关闭3D可视化:
WITH_OSG=no
她当然很漂亮 ,但是我们不需要它。 - 不幸的是,并行(在一组CPU上)模拟(WITH_PARSIM)执行也应该被关闭,但是如果没有它,链接器将失败,因此我们将其保持打开状态:
WITH_PARSIM=yes
为什么要关闭它?
如果未明确使用它,则不需要(理论上)。 有关更多详细信息,请参见“ doc / InstallGuide.pdf”中的16.1、16.3和16.3.2节“并行仿真示例”,或此处 。
现在在终端(mintty)中,您可以执行以下操作:
./configure && make clean MODE=release make MODE=release –j17
注意 : “ 17
”应替换为CPU + 1核或1.5×核。
注意好奇(构建64位)
“ tools / win32”目录包含MSYS2,其编译器软件包可以更新:
OMNeT ++可以在64位下构建。
但是 OMNeT ++可能根本无法使用较新版本的GCC进行编译 (这是OMNeT ++第五个版本的第一个beta版的情况 -无需编辑源代码,通常仅使用GCC 4.x构建)。 过渡到64位将需要更多的努力。 首先,您需要检查编译选项( fPIC , 不需要吗? )。 然后,如果滚动浏览OMNeT ++源代码 ,您将发现在那里经常使用long类型,而不是int32_t, size_t和ptrdiff_t(以及uintptr_t和intptr_t) 。 这有什么威胁? 在64位(LP64)程序集中的* nix中,长尺寸为64位,而在Windows(LLP64)中为32位(请参见数据模型 )。 我们必须将long替换为size_t和ptrdiff_t,但是在这里您会发现一些陷阱。 例如,您可以打开“ src / utils / opp_lcg32_seedtool.cc”并查看第231行- index
或者可以保留32位(用int32_t替换),或保留64位并修改所有位掩码+描述+(可能)有点逻辑。 因此,长变量的一部分将需要保留32位,而另一部分将是64位。 通常,为了正确操作,您需要执行以下所有操作:
对于OMNeT ++的众多库,例如,与INET,也需要完成同样的事情。
通常,我警告您不要尝试构建64位OMNeT ++程序集。
在* nix下,我还建议使用32位版本(至少在5.0版及更低版本中)。
也许有一天Andrey2008将负责检查OMNeT ++和INET代码...同时,我建议只查找并查看;)代码中的所有“ FIXME
” /“ Fix
”。
PS提到缺少静态代码分析器检查的OMNeT ++代码 ,但是在“ ChangeLog” INET 3.4.0文件中,您可以找到70条有关在Coverity中进行扫描后修复缺陷的提及。
OMNeT ++使用Eclipse作为IDE。 为了方便起见,您可以在IDE上创建一个快捷方式“%ProgramData%\ omnetpp-5.0 \ ide \ omnetpp.exe”,并将其放置在易于访问的位置。 目录“ ide / jre /”包含JRE v1.8.0_66-b18。 如果系统中已经安装了兼容的JRE / JDK,则可以通过将ide / jre /目录替换为指向系统JRE位置的符号链接来安全地删除ide / jre /目录。
Eclipse首先建议将工作空间放置在“ samples”目录中,但是最好将其放置在“%ProgramData%”之外对您方便的任何其他目录中。 最主要的是,新目录的路径中仅使用拉丁字母(+字符),并且没有空格。
关闭“欢迎使用”后,IDE将提供安装INET(如上所述)并导入示例的功能-放弃这两点。
Eclipse设置,JVM选项,其他插件和主题
JVM选项 。 在文件中添加“ ide / omnetpp.ini”(任何能够理解LF换行的编辑器都适用于编辑;记事本将不起作用),并保存最后一个空行:
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+AggressiveOpts -XX:+TieredCompilation -XX:CompileThreshold=100
为了使Eclipse像图片中的那个一样,请查看图片内部。
现在该安装INET。 必须将先前下载的档案(inet-3.4.0-src.tgz)中的“ inet”目录转移到工作区中。 目录中有一个“ INSTALL”文件,其中包含安装的分步说明。 您可以使用它(“如果您正在使用IDE”一节),但不要构建(构建)项目!
导入INET:
- 在Eclipse中,打开: 文件>导入。
- 选择:工作区的常规/现有项目。
- 作为“根目录”,选择工作空间的位置。
- 确保“将项目复制到工作区”选项处于关闭状态。
- 单击“完成”按钮后,等待直到项目的索引编制完成(完成百分比,请参见下面的状态栏中的“ C / C ++索引器”)。
设置项目:
- A.禁用LLTR不必要的组件;
- B.开关组件释放;
- C.摆脱OMNeT ++ Make Builder故障(opp_makemake)-较早时,选择它时,即使不需要,Makefile也经常被重新生成;
- D. 启用并行编译 ;
- E.打开优化;
- F.在几个地方打开c ++ 11的语法突出显示;
- G.修复与“
#include
”有关的错误(如果多次更改“当前构建器”,则会发生;在其他情况下可能会发生)。
在设置{A}之前,您需要修复一个项目文件。 在“ inet / .oppfeatures”文件中,有一行“ inet.examples.visualization
”,您需要在inet.examples.visualization
添加一个空行以写入“ inet.tutorials.visualization
”,最好保持缩进在左边(与文件中其他参数“ nedPackages
”类似) ) 如果不这样做,那么就不会有什么不好的事情,在“问题”(Alt + Shift + Q,X)中设置之后,总会有与“ inet.tutorials.visualization
”相关的错误。 您可以先创建{A} ,然后查看错误,然后修复“ inet / .oppfeatures”文件-同时,Eclipse将警告您违反设置的完整性并提出对其进行修复(我们对此表示同意)。
让我们开始吧( “ Project Explorer”面板> “ inet” project> 上下文菜单> Properties ):
- OMNeT ++部分>项目功能子部分
- {A}删除所有内容,但以下各项除外:
- TCP通用
- TCP(INET)
- IPv4协议
- UDP协议
- 乙太网路
- “应用”按钮。
- “ C / C ++构建”部分:
- “管理配置...”按钮>启用“ gcc-release” {B} ;
- 选择配置“ gcc-release [活动]” {B} 。
- 小节“工具链编辑器”:
- 作为“当前构建器”,为两个配置都选择“ GNU Make Builder”:“ gcc-debug”和“ gcc-release” {C} , 注意 :如果将来更改“当前构建器”,则必须重新配置所有内容!
- “应用”按钮。
- “行为”选项卡(返回“ C / C ++构建”部分的根):
- 将“使用并行作业”设置为N(N是CPU内核数+ 1或1.5×内核)-这将允许所有CPU内核用于编译 {D} (配置“ gcc-debug”和“ gcc-释放”)。
- 构建设置选项卡:
- 禁用“使用默认构建命令”;
- 将“ Build command”行替换为“
make MODE=release CONFIGNAME=${ConfigName} -j17
”(用该行中的前一个值替换“ 17
”,即选中的N) {E} ,您可以执行相同的操作对于“ gcc-debug”配置,请在该行中将“ MODE=release
”替换为“ MODE=debug
”,然后不要忘记切换回“ gcc-release [Active]”。
- “应用”按钮。
- “ C / C ++常规”部分:
- 小节“路径和符号”:
- 标签“包含”:
- 添加按钮:将目录“
../src
”与所选的“添加到所有配置”和“添加到所有语言” {G}一起添加 -最初的“ ../src
”使用语言“ GNU C ++ ”,但不确定,可以将其从列表中删除; - 单击“应用”按钮,并检查“
../src
”是否以所有语言和配置显示。
- 符号选项卡:
- 添加按钮:添加符号“
__cplusplus
”,其值为“ 201103L
”,并选择“添加到所有配置”和“添加到所有语言”- {F} 更多 ; - 单击“应用”按钮,并检查在“ gcc-debug”配置中,“
__cplusplus
”的值为“ 201103L
”。
- 源位置选项卡:
- 检查列表中是否有一项是否指向“
/inet/src
” {G} ,如果还有其他内容(例如,仅“ /inet
”),则删除内容并添加(“添加文件夹” ...”)“ /inet/src
”。 然后单击“应用”按钮,并返回到{A} ,因为 删除期间删除了所有过滤器。 顺便说一句,实际上可以保留“ /inet
”-一切都很好,但是最好将其缩小到原始的“ /inet/src
”。
- 小节“预处理器包含路径,Marcos等” > “提供商”标签:
- 选择“ CDT GCC内置编译器设置”:
- 在“语言设置提供程序选项”组中,单击“工作区设置”链接:
- “发现”选项卡:再次选择“ CDT GCC内置编译器设置”,并在“获取编译器规格的命令”的“
${FLAGS}
”之前添加“ -std=c++11
”,其外观应类似于` ${COMMAND} -std=c++11 ${FLAGS} -E -P -v -dD "${INPUTS}"
` {F} , 此处和此处有更多详细信息; - 按钮“应用”,“确定”(关闭窗口)。
- 将“ CDT GCC内置编译器设置”移至“ CDT托管构建系统条目”上方(两种配置:“ gcc-release”和“ gcc-debug”) {F} , 更多详细信息 -之后,我们将失去重新定义字符“ CDT”的能力通过“ CDT托管构建系统条目”( “ C / C ++常规”> “路径和符号”> “符号”)进行的GCC内置编译器设置,您只能通过向“ CDT用户设置条目”中添加值来覆盖它 “Entries” (: , .. “CDT Managed Build System Entries” “
__cplusplus
”; , “ __cplusplus
__cplusplus
” “CDT Managed Build System Entries”, , ); - “Apply”, , “Entries” “GNU C++ ” “CDT GCC Build-in Compiler Settings” ( [ ] “Show build-in values” ) “
__cplusplus=201103L
” ( ).
- “Indexer”:
- “Build configuration for indexer” “gcc-release” {B} ;
- “Apply”.
{E} . 我会解释。 , Eclipse , “configure.user” OMNeT++ (./configure). Eclipse g++ make. , , , . , “Build command” {E} “ --just-print
” “ --trace
”, , ( “Project Explorer” > “inet” > > “Clean Project” “Build Project”), “Console” (Alt+Shift+Q,C), ‑ “ g++ -c -std=c++11 -O2 -fpredictive-commoning -march=native -freorder-blocks-and-partition -pipe -DNDEBUG=1 …
”. , .
再次,打开项目设置(“项目资源管理器” 面板> “ inet”项目> 上下文菜单> 属性):
- “ C / C ++构建”部分:
- “构建变量”小节(检查当前配置是否为“ gcc-release [Active]”):
- “Add…”, “
CFLAGS
”, “String”, “ -O2 -fpredictive-commoning -march=native -freorder-blocks-and-partition -pipe
”; - “Add…”, “
CXXFLAGS
”, “String”, “ -std=c++11 -O2 -fpredictive-commoning -march=native -freorder-blocks-and-partition -pipe
”; - “Apply”.
- “Environment”:
- “Add…”, “
CFLAGS
”, “ ${CFLAGS}
”; - “Add…”, “
CXXFLAGS
”, “ ${CXXFLAGS}
”; - “Apply”.
, , g++ , “ --just-print
” “ --trace
”, Process Explorer . Process Explorer , “ -march=native
” “cc1plus.exe”.
, , INET! , “gcc-release” {B} , “ --just-print
” “ --trace
” {E} , . ( “Project Explorer” > “inet” > > “Clean Project” “Build Project”), “Console” (Alt+Shift+Q,C).
, Eclipse, “.cproject” “.settings” {BG} , : “.oppfeatures”, “.oppfeaturestate”, “.nedexclusions” – {A} .
, , .
Note : , – “doc” OMNeT++ INET. Simulation Manual User Guide, Stack Overflow ( stackoverflow.com, ). , , , , “” .
Note : , OMNeT++ INET, , INET GitHub. 3.4.0 ( , INET ).
INET, , . , ?
INET “Project Explorer”, “inet/src/inet/applications”, “ udpapp ” (UDP Application). UDP broadcast . , , , , “ UDPEchoApp ”. “UDPBasicApp”, “Basic”. “.cc”, “.h” “.ned” . , “.ned” , ( “parameters:
” ) .
. , ( inet/examples ) INET. , “broadcast” ( inet/examples/inet/broadcast )! “.cc”, “.h” “.ned”, “.ini” “.xml” . , :
, (“broadcast”) , .. . , , .
Note : Simulation Manual . , , ( RAM) . JS ‑ bookmark let . , Simulation Manual, ( ), ( target
Simulation Manual). Bookmarklet . , , Simulation Manual , bookmarklet .
bookmarklet , ?
bookmarklet . . 5- . bookmarklet , .
⇒ bookmarklet – ; bookmarklet , ( 5- ) – .
“LLTR”, “src” “simulations”, “gcc-release” (File → New → OMNeT++ Project…):
“inet”, . , “gcc-debug” (.. “LLTR”), “inet”. : {A,B,G} “Project References”, “inet”.
, Wizard, , “package.ned” : “src”, “simulations”. – “ package lltr;
” “ package lltr.simulations;
” . .
INET, “inet/src” – “LLTR/src”, “inet/examples” – “LLTR/simulations”. “LLTR/simulations” “.ned” c Network , “LLTR/src” – ().
– INET , INET, , INET. , – INET.
, “.ned” “LLTR/src” ( “inet/src”), “ package lltr.simulations;
” “LLTR/simulations”. “package.ned” “LLTR/src” “LLTR/simulations”.
LLTR. “LLTR/simulations/omnetpp.ini”, ( Run > Run As > 1 OMNeT++ Simulation):
Eclipse “simulations” . , : “LLTR/src/LLTR.exe” . , “LLTR.exe” , ( Project → Build Project), ( ).
“No network specified in the configuration.”, , “ network = lltr. Network
” “ [General]
” “omnetpp .ini ”, “ network Network {}
” “package .ned ”. ( “.ned” ), ( “.ini” ) ( Network – ) .
( Run > Run As > 1 OMNeT++ Simulation), () Network .
Note : ( Run > Run As > 1 OMNeT++ Simulation), ( Run > 1 simulations): , .. , , Eclipse .
Note : ( – a1_v0.1.0 (“a” – article) “ git checkout -b ‹my_branch› tags/a1_v0.1.0
”) 
, :
- tutorial git;
- tutorial – ;
- () , (article) – ( : “article_#”), / ;
- , “” tutorial.
Note : “article_#” , , , ( ), /.
“ ”? , GitHub , :
, , “ git checkout -b ‹ my_branch › tags/‹tag_name›
”.
, .. ? Pull Request, >:-), , , , ):
, , Pull Request .
Note : , : , ( “ ” () , ). “ -u ” , . , “a1_v0.1. 0 ”, “a1_v0.2. 0 ”, … – “a1_v0.1. 1 ”, “a1_v0.2. 1 ”, … , : “a1_v0.1. 2 ”, “a1_v0.2. 2 ”, …
Note : tutorial , “”, git
, git tag.
Note : git diff , , ( , / ) ( AST ), Java .
# (Link Layer Topology Reveal)
# −1:
“package.ned” ( “Design” ), :
, broadcast :
- – StandardHost;
- – EtherSwitch.
“” ( ) Eth100M (: 100 Mbps; : 10 ). , 10 , , ? ( )
( “Source” ), (git tag a1_v0.2.0)
。 :
package ‹<a href="https://omnetpp.org/doc/omnetpp/manual/#sec:ned-ref:packages"> </a>›;
Warning : <a>...</a>
– “” . , , , ( <strong>...</strong>
, <em>...</em>
).
“ ” (Gates) :
- Gates , , gate “
‹ ›.‹gate›[‹›]
”, – “ ‹ ›.‹gate› ++
”. - (: “
… <--> { delay = 100ms; } <--> …
”), / , ( broadcast : “ … <--> C <--> …
”), (: “ … <--> FastEthernet {per = 1e-6;} <--> …
”), … - Gates ( :
output
/ input
; : -->
/ <--
), ( : inout
; : <-->
). , , “ $i
” “ $o
” .
Warning : 1 ⁄ 3 20 ( 504 “Gateway Time-out”). 1 ⁄ 3 . ( ):
<a href="#set">: “<code>set: p=1.87548</code>”</a> .
:
<a href="#set"><code>: “set: p=1.87548</code>”</a> .
, 3‑ . :
, <a href="https://omnetpp.org/doc/omnetpp/manual/#sec:ned-ref:inout-gates"> “<strong><code>$i</code></strong>” “<strong><code>$o</code></strong>”</a>.
, . , , GitHub Pages:

Note : target
Simulation Manual – bookmarklet ', . « →» , .
Note : , CSS JS – , 3 , GitHub Pages 2‑ ( HTML, , , , ‑). 3‑ – .
# / To be continued…
- 2.
- 3. OMNeT++
- 4.
- 5. OMNeT++ 2
- 6.
- 7. (‑: “ ”)

. . – . – .