本文是对
http://www.omnetpp.org/doc/INET/tcp-tutorial/index.html
的翻译。
注意:此教程中的
OMNeT++
版本为
3.4
,和现在的
4.0
版本有不少区别,特别是绘图部分。
INET
框架包含了一个详细的可靠的
TCP
模型。这个教程解释了在
TCP
仿真中可以跟踪什么信息、怎样在你的模型中使用
TCP
,最后,我们将看看如何扩展
TCP
。
对使用
TCP
的模型跟踪和分析
开始
启动任何含有
TCP
应用的网络模型。两个比较好的模型是INET/NClients
和INET/REDTest仿真模型例子。如果你使用NClients 网络模型的话,我们建议你将客户端主机的数目设置为
1
或者
2
——这样有利于跟踪事件。(在
omnetpp.ini
中查找并修改“
*.n=4
”)
开始的时候,启动仿真动画并将速度设慢一点(可以通过调节滑动块来设置这点)。你应该可以看到熟悉的
SYN
、
SYN+ACK
报文,
TCP
三次握手连接的建立,接着你将看到数据报文和
ACK
确认。如果你观察到了连接的断开,你应该可以看到双向的
FIN
和
ACK
报文分组(如果你观察到了此事件发生的时间,在下次运行的时候可以使用“Run
until..”对话框来直接跳到这里)。如果上面的字句你没有感觉的话,则建议你在进行仿真之前对
TCP
协议进一步的熟悉。
看看
TCP
报文内部
重启仿真,通过重复的按
F4
来单步执行仿真。可以通过双击红色的图标打开一个报文的检查器。
即使是这样,有些时候也不容易:在你点击那些运动的报文之前,可能就已经消失了。有两种方法来解决这个问题:一种使降低动画的速度,使得你有时间点击报文头标(当然速度也还是要快的);另一种方法是在路由器和主机中找到此报文:双击图标打开内部构成,并检查ppp[0],
ppp[1]内部,你可以看到类似下面的图:
当找到此报文后,可以双击此图标来打开检查器窗口。
你将可以看到表示
PPP
帧的报文。为了可以看到
IP
数据报文头标,点击“Encapsulated message”来打开
IPDatagram
的检查器窗口。为了获得
TCP
头标,你可以点击数据报文检查器的“Encapsulated
message”按钮,并选择“
Fields
”标签。
跟踪应用的
listen()
和
connect()
调用
应用层可以通过发送消息到
TCP
上来打开一个连接。此消息被称为
ActiveOPEN
或者
PassiveOPEN
(至少如果你在应用中使用
TCPSocket
工具类的时候是如此),你可以在应用开始之前通过打开主机模块(双击)来获取此消息。然后单步的执行仿真(单步,
F4
)。你应该可以看到下面的图像:
ActiveOEN
消息和
connect()
调用是关联的,而
PassiveOPEN
和
listen()
调用是关联的。
Open
消息本身并不包含数据:所有的连接参数都是在“
Control Info
”结构中。你可以通过打开检查器(双击报文对象)并选择“
Control Info
”标签来查看。
connId
域从应用层的角度标志了此连接,仅仅用于应用层和
TCP
层之间,而在此范围之外无效,举个例子,在任何的
TCP
报文中都不会包含此信息。
connId
必须在每个应用层发送给
TCP
层的消息中存在(作为
Control Info
对象的一部分)(数据和控制信息),使得
TCP
可以知道是在和什么应用通信。同样的,
TCP
在每个发送给应用层的消息中的
Control Info
中包含
connId
域。
其他的域则是
OPEN
调用的参数。
Remote address
,
remote port
,
local address
和
local port
不需要在这里进行解释。
Fork
只有在被动
OPEN
(
listen()
)的时候才使用:如果设置为
true
,一个连接请求(
SYN
报文)将总是引起连接进行
Fork
,从而保证总是有一个侦听用来处理新请求;当设置为
false
的时候,不会
Fork
一个新连接,
TCP
在处理完此连接之前将会拒绝其他的连接请求。剩下的参数则和
TCP
模型有关,将在后面进行讨论。
自身的命令类型(主动打开、被动打开、发送、关闭等)是包含在数字的
message field
域中,将显示在检查器的第一个标签页中。同样的,当
TCP
发送消息到上层应用的时候,将设置
message
field
域用来指示操作类型:连接建立的通知,被远程
TCP
关闭连接的通知,重置,超时等等;数据到达了
TCP
建立的连接上,并在
Control Info
和
message kind
来指示此报文是数据还是紧要数据。
C++ API
中定义了
message
field
域的符号常数:位于
TcpCommandCode
中的
TCP_C_OPEN_ACTIVE
等和
TcpStatusInd
中的TCP_I_ESTABLISHED等。
怎样看到自己的
TCP
连接
TCP
连接列表保存在
TCP
中的tcpConnMap
和tcpAppConnMap数据结构中。这两个数据结构包含了相同的连接,只是有着不同的索引方式:tcpConnMap可以为进入的
TCP
报文快速的查找连接进行了优化,而tcpAppConnMap则从应用层方面来通过
connID
来标志连接。
为了查看此数据结构,双击
TCP
,选择“
Contents
”的标签页,并双击tcpConnMap或者tcpAppConnMap项。如tcpConnMap:
现在,关于每个连接的信息在非常长的一行中打印出来。以后的发行版中将此连接信息展示为更结构化的形式。
在哪里查找开放式
socket
的信息呢?
在
INET
的
TCP
中并没有类似于
socket
的数据结构——
TCPSocket
类仅仅只是保存了
connID
,并提供了连接、发送、关闭等操作的少量工具函数。
绘制序列图
记录数据到输出矢量中
可视化观察
TCP
行为的一种方法是绘制序列图。
TCP
模块将记录序列号和其他的信息到
OMNeT++
的输出矢量中。
OMNeT++
的输出矢量是一种基本的时间序列数据:每个输出矢量包含有排序好的(
time
,
value
)对,其中
time
为
value
记录时的仿真时间。一个仿真的所有输出矢量将会输出到一个单一的矢量文件,经常被称为
omnetpp.vec
或者是
something.vec
。输出矢量文件的内容可以通过
OMNeT++
自带的
Plove
文件来查看,由于内容是文本的,所以也可以通过其他你喜欢的工具来处理,如awk,
perl, octave, matlab, gnuplot, xmgrace, R, spreadsheet programs, 等。
记录发送和接收
TCP
保温的输出矢量包含下面的内容:
-
"send seq":
发送报文中的序列号
-
"sent
ack": 发送报文中的
ACK
序列号
-
"rcvd seq":
接收报文中的序列号
-
"rcvd
ack": 接收报文中的
ACK
序列号
大部分的模拟器都是用
segment
来计数,而在
OMNeT++
中的
TCP
中,为了能够更忠于
RFC
,使用字节数来计数。
更多的,下面的信息也将会记录:
-
"advertised window":
接收报文中的窗口值
-
"congestion
window":竞争窗口值 commonly referred to as "cwnd"
-
"measured
RTT": 测量的
RTT
值(发送报文和接收
ACK
之间的时间差,只有在无报文传送的时候测量)
-
"smoothed
RTT": 对测量的
RTT
时间值的指数加权平均值(基于
Jacobson
算法)
有些时候少就是多,所以你需要对写入矢量文件的项进行限制,同时限制记录区间。为了你需要在
omnetpp.ini
中加入一些选项。通过查看
OMNeT++ manual
看看如何设置输出矢量。
一个例子:
RTT
绘图
让我们来看一个例子。运行一段时间的
REDTest
仿真,然后停止并退出。结果在当前目录中将会有一个
omnetpp.vec
文件。你可以通过
Plove
来打开:
$
plove omnetpp.vec
Plove
窗口将会出现,在左边窗口中将会显示已有的输出矢量。假设你需要知道
RTT
时间。我们可以在右边栏中绘制输出矢量图。可以通过双击左边栏中的矢量放置到右边栏中。
然后可以通过工具栏按钮创建一个图片。经过缩放和自定义(在图表上右键点击可以看到对线条样式、轴标签等的设置),可以看到下面的内容:
可以讲此图保存为
postscript
或者
GIF
,或者是拷贝到剪贴板中用于报告中。
通过序列图来看看
TCP
操作
下面我们将看看相同仿真中的序列图:
这张图可以看到
TCP
的所有内容。横轴表示时间,纵轴表示
TCP
的序列号。这里显示了
s1
发送
TCP
数据到
s2
中。刚开始的时候,发送的报文(蓝色)中序列号稳定的增长。这些报文将在一定的延时后到达
s2
(在蓝色点后大概
0.1s=100ms
的红色点)。这些报文在
s2
上得到确认(绿色的三角形——大概在红色点的
MSS=1024
字节之上,因为红色点表示到达的全
1024
字节的第一个字节,同时
ACK
中包含了下一个期望的序列号)。这些
ACK
报文将在
30ms
之后到达
s1
(黄色的十字)。不对称的延时(
100ms vs 30ms
)是因为
ACK
报文要小一些,从而在瓶颈链路上需要更小的排队时延。
一个报文丢失了:大概在
t=44.81s
出的一个红色点丢失了,这也意味着一个报文在
s2
处没有被收到——有可能是在路由器被丢弃。发送者
s1
并不知道这点,从而保持发送状态直到窗口溢出。但是
s2
还是持续的发送相同的
ACK
数字(绿色的三角形变得水平),指示接收者需要丢失的报文。当这些
ACK
到达
s1
后,在第四个
ACK
(前三个都是重复的)的地方意识到发生了错误,并重传了丢失的报文(单独的蓝色点)。最终,在
100ms
的延时后此报文到达了
s2
节点(单独的红色点),在
s2
节点上其他报文的
ACK
确认都缓存在队列中。
当丢失的报文到达
s2
后,
s2
发送的
ACK
报文跳跃了(
t=44.93s
,单独的绿色三角形),表示丢失的报文已经收到(这也表示在
gap
上收到的报文没有被
s2
丢弃,而是为以后的处理保存了起来)。
当
ACK
报文到达
s1
后(
t=44.95s
,黄色的十字),
s1
知道所有的报文已经收到,并且同一时间发送了好几个报文(垂直线的蓝色点)。这是因为这些重复的
ACK
报文影响了竞争窗口(表示以前的序列号已经被
s2
节点正确接收)——这是快速恢复算法。当然,这些报文在
s2
上是一个接一个的(
t=44.98s
的红色点序列是倾斜的),因为都是单独的排队和传输。
s1
上的
TCP
在收到
ACK
后将发送更多的报文(
t=45s
后的黄色十字)。
这就是
TCP
运行的所有过程内容。
画图的其他提示
当使用
Plove
来绘制序列图的时候,有用的过滤器是“
divide
”过滤器(可以将字节数转换为报文数)和“
modulo
”过滤器(可以将报文数据按照同样的区间排列,从而方便显示)。为了应用过滤器,在边栏上右键点击矢量,并在上下文菜单中选择“Pre-plot
filtering...”。
- 大小: 29.2 KB
- 大小: 15.8 KB
- 大小: 16.5 KB
- 大小: 32.9 KB
- 大小: 33.9 KB
- 大小: 16.4 KB
- 大小: 25.8 KB
- 大小: 24.8 KB
- 大小: 37.2 KB
- 大小: 27 KB
- 大小: 20.9 KB
分享到:
相关推荐
**inet4.0传感网仿真框架** `inet4.0`是`OMNeT++`的一个重要组件,专为网络仿真设计,特别是针对物联网(IoT)和无线传感器网络(WSN)。`OMNeT++`是开源的、事件驱动的网络模拟器,广泛应用于通信系统、计算机网络...
标题中的“来自ProjectGrADyS在OMNET++和INET框架上的模拟_C++_Makef.zip”表明这是一个关于使用C++编程语言,在OMNET++和INET框架下进行网络模拟的项目。这个压缩包可能包含了源代码、配置文件以及构建脚本,特别是...
《TCP协议在OMNET++ INET框架中的实现详解》 在计算机网络领域,TCP(Transmission Control Protocol)协议是传输层的重要组成部分,它为应用程序提供了可靠的数据传输服务。OMNET++是一个广泛使用的离散事件模拟器...
在本文中,我们将深入探讨INET框架以及如何将其与Omnet++结合使用。 1. INET框架介绍 INET是Omnet++中一个核心的网络模拟框架,由多个模块组成,包括网络接口、路由协议、传输层协议(如TCP和UDP)、应用层协议(如...
inet框架可能包含了以下关键组件和功能: 1. **事件驱动模型**:inet可能采用了事件驱动的编程模型,如select、poll、epoll等,以实现高效的I/O多路复用。这种模型允许服务器在一个线程中处理多个连接,减少了线程...
**INET框架介绍** INET是一个强大的开源仿真框架,主要用于模拟和建模互联网协议和技术。它是由OMNeT++仿真环境支持的,一个广泛用于分布式系统、网络和通信领域建模的C++库。INET的主要目标是提供一个灵活且可扩展...
而“inet框架”则特指 INET,它是OMNeT++的一个重要组成部分,专为网络模拟设计。 INET 框架提供了丰富的网络协议模型,包括TCP/IP协议栈、路由协议(如 OSPF、BGP)、无线通信协议(如 IEEE 802.11)、网络设备...
标题中的"inet-3.6.3.zip"表明这是一个包含INET框架3.6.3版本的压缩包文件,用户可以从这个压缩包中解压并安装使用。 **OMNET++基础** 在深入讨论INET之前,我们需要理解OMNET++。OMNET++是一个开源的C++模拟库,...
INET框架是OMNET++的一个核心组成部分,专门用于网络仿真。它包含了多种网络协议的实现,如TCP/IP、OSI模型、无线通信协议、路由协议等。INET4.3版本不仅包含了这些基本协议,还涵盖了物联网(IoT)、移动自组织网络...
在实际使用中,INET框架通常与OMNET++的另一组件——SimulaQt一起工作,后者提供了一个交互式的模拟运行时环境。SimulaQt允许用户在模拟运行过程中暂停、快进、回放,以及查看详细的统计信息,这对于理解和优化网络...
INET框架的核心功能包括网络协议的实现,如TCP/IP协议栈,以及各种网络设备和节点的模型。在"inet-3.6.0"这个版本中,我们可以期待一些特定的改进和新特性: 1. **协议实现**:INET框架提供了多种网络协议的实现,...
OMNET++ INET框架安装指南 OMNET++和INET是两个在计算机网络模拟领域广泛应用的开源工具。OMNET++是一个C++模拟库,提供了一个强大的可视化编辑器和事件驱动的模拟环境。而INET则是在OMNET++基础上的一个框架,专门...
而INET框架是OMNet++的一个重要组件,它是专门为网络模拟而开发的,包含了各种网络协议、设备和模型的实现。"OMNET开源库inet3.0"指的是INET框架的第三个主要版本,它在前两个版本的基础上进行了优化和扩展,提供了...
5. **导入与使用**:在OMNeT++环境中,将解压后的inet3导入意味着将它添加到工程的源代码路径中,以便OMNeT++能够识别并使用INET框架中的组件和模块。用户可以根据自己的需求配置模拟场景,通过OMNeT++的图形化界面...
使用INET框架时,你需要在OMNET++环境中导入该项目,然后根据自己的需求配置ini文件,选择合适的网络拓扑、协议栈以及参数。通过OMNET++的图形界面,你可以观察模拟过程,查看统计结果,并对结果进行分析。 总之,...
在这个“python简单TCP源码(服务器+客户端)”中,我们将探讨如何使用Python 2.7实现一个基本的TCP服务器和客户端。 首先,TCP服务器是网络服务的提供者,它监听特定的端口,等待客户端的连接请求。在Python中,...
标题 "inet-3.4.0-src.tgz" 指的是 INET 框架的一个源代码版本,版本号为 3.4.0,它被打包成一个名为 "inet-3.4.0-src.tgz" 的压缩文件。这个文件可能是为了方便在无法直接从 Github 下载时获取 INET 源码而提供的。...
下面将详细介绍INET框架及其在不同领域的应用。 INET框架是Omnet++生态系统中的核心组件之一,它提供了一组全面的网络协议模型,涵盖了从物理层到应用层的多个层次。在INET 4.4.1中,开发者和用户可以找到对现代...
INET框架广泛应用于学术研究和工业界,特别在无线通信、互联网架构以及物联网(IoT)领域。 首先,让我们深入了解一下OMNeT++。它是一个开源的事件驱动的模拟器,主要面向分布式系统,如计算机网络和实时系统。OMNeT+...
1. **Socket创建**:首先,通过调用`socket()`函数创建一个套接字,指定协议类型(这里是TCP,对应的值为`SOCK_STREAM`)和协议族(通常是`AF_INET`,代表IPv4)。 2. **地址结构体**:使用`struct sockaddr_in`...