1. NS2中数据包packet类结构图:


packet类中的access函数如下:
inline unsigned char* access(int off) const {
     if (off < 0)
       abort();
       return (&bits_[off]);
}
struct hdr_cmn(即共用common头)中的access函数如下:
inline static hdr_cmn* access(const Packet* p) {
     return (hdr_cmn*) p->access(offset_);
}

从以上的函数可以看出只要给出特定的报头在packet中的偏移量offset_,立刻就能够取得指向该报头的指针(通过强类型转换,原理有点类似把一个子类强类型转换为其父类),从而访问或设置该报头内容。

常见TCL脚本中有如下语句:
remove-all-packet-headers
add-packet-header AODV ARP
... 
set ns [new Simulator]
其中涉及到的函数如下:
proc add-packet-header args {
     foreach cl $args {
          PacketHeaderManager set tab_(PacketHeader/$cl) 1
     }
}#add-packet-header函数把要激活的报头对应的tab_数组元素置1

脚本中new Simulator的工作之一就是创建包结构:
Simulator instproc create_packetformat { } {
       PacketHeaderManager instvar tab_
       set pm [new PacketHeaderManager]
       foreach cl [PacketHeader info subclass] {
             if [info exists tab_($cl)] {
                   set off [$pm allochdr $cl]   #取得当前子报头在整个packet中的偏移
                   $cl offset $off      #把这个赋给当前的子报头中的offset变量
             }
       }
       $self set packetManager_ $pm
}

#下面的函数取得当前子报头在整个packet中的偏移

PacketHeaderManager instproc allochdr cl {
       set size [$cl set hdrlen_]    #取得子报头$cl的长度hdrlen_
       $self instvar hdrlen_       #注意此处hdrlen_变量是PacketHeaderManager的
       set NS_ALIGN 8
       set incr [expr ($size + ($NS_ALIGN-1)) & ~($NS_ALIGN-1)]  
       #计算偏移,使用了向上进位保证了,incr的长度是一个字节(8 bit)的倍数。
       set base $hdrlen_   
       incr hdrlen_ $incr   # hdrlen_加上偏移
       return $base       #返回当前偏移
}
对于计算偏移NS手册上有如下表述:The procedure keeps a running variable hdrlen_ with the current length of BOB as new packet headers are enabled. It also arranges for 8-byte alignment for any newly-enabled packet header. This is needed to ensure that when double-world length quantities are used in packet headers on machines where double-word alignment is required, access faults are not produced.

综上取得包中子报头的基本思路:首先设置包结构(packet)的报头中含有多少个子报头,然后初始化包结构,把各个子报头的offsize字段设置成正确的偏移量。然后用access函数就可以很方便地访问各个子报头了。
2.移动节点的通信过程:

两个对等无线节点的结构图

                                   两个移动节点之间的通信过程图
3.每个层对packet的设置:

总结:NS2中,packet结构在一次模拟中保持不变,packet在网络各个层次流动时,唯一的变化就是各个子报头中的内容改变了。即传输层把IP报头设置了,TCP协议把TCP报头设置了,网络层路由协议把相应的路由协议报头设置了,LL层根据IP地址把Mac包头的Mac地址等正确设置了;并没有加报头拆报头的过程。

附录:实际中的数据包结构(以下部分资料来源网上)
1. IP报头格式:
 
1)版本字段标志:该分组采用的IP数据包结构的版本号, 对于常用的IPv4来说,该字段 的内容为4; 对于IPv6来说,该字段的内容为6。
2)IHL字段:报头的长度, 以4Bit为单位,最小为5,最大值为l5, 即报头的最大长度为60Bit。
3)服务类型字段: 主机能告诉子网它需要的服务。
4)总长: 该数据包(包括报头和报文)的长度,最大是65 535Bit。
5)标志字段: 主机判断新来的分段属于哪个分组,所有属于同一个分组的分段应具有同样的标志值。
6)DF MF和分段偏移字段: 指示该分组是否需要分段, 是否全部到达, 该分段处于分组的位置。
7)生命期字段: 用来限制分组生命周期的计数器,最长生命周期为255 s。该字段将在每个节点中被递减处理, 当它被减到0时, 该分组将被丢弃。
8)协议:该数据包采用的是哪一种TCP/IP应用协议,对于TCP协议,该字段为6;对于 UDP协议,该字段为ll。
9)头校验:校验头部,主要用于检测以路由器中的内存坏字带来的错误。
10)源地址和目的地址: 该数据包的来源和去向。

对于TCP/IP数据包而言, 仅仅掌握IP数据包的格式, 还不能将数据正文从数据包中完全分离出来,还不能完全理解这个数据包的真正含义。在网络层之上的传输层,TCP/IP定义了2种数据传输协议:TCP和UDP,这2种协议也相应定义不同的数据结构。

2.TCP报头结构:

1)源端口和目的端口字段:标志出本地和远端的连接端口。
2)顺序号和确认号字段:TCP流特有的,TCP对每个数据字节进行编号。顺序号标志本分组的编号,确认号指示希望接收的下一个分组编号。
3)TCP头长表明在TCP头的长度,以4Bit为单位。这条信息对于定位确切的数据信息十分重要,因为选项字段的长度是不固定的, 只有通过TCP头长的内容才能确认选项字段的长度。
4)URG、ACK、PSH RST、SYN、FIN等字段标志了该分组的控制功能。
5)窗口大小字段:指示的是TCP滑动窗控制内容。
6)校验和: 为了确保高可靠性而设置的,只校验该头部信息的数据。

3. UDP数据包的报头十分简单:
固定为8Bit,内容是分别为2Bit的源端口、目的端口、UDP长度和UDP校验和。 其中UDP长度标志的是包括8Bit的报头及后面的报文在内的数据包长度;UDP校验和校验的是全部UDP数据包的内容。

4. 802.3 MAC帧的结构:


1)前导码:7个字节(10101010),用于收发双方的时钟同步。
2)帧起始定界符:1个字节(10101011),标志帧的开始。
3)目的地址和源地址:可为2或6个字节,但10Mbps的基带系统只用6字节地址。目的地址可分为:单地址:最高比特位为“0”,用于单播(unicast)。组地址:最高比特位为“1”,用于组播(multicast)。广播地址:全“1”,用于广播(broadcast)。通过次高位的不同来区分全局地址和局部地址:局部地址:次高位为“1”,由网络管理员指定,只用于本网中。全局地址:次高位为“0”,由IEEE统一分配,保证在世界上的唯一性。共有248-2≈7?1013个。
4)长度字段:2个字节(0~1500),用于指明数据域的字节数。
5)数据域:0~1500个字节,用于存放被传输的数据(LLC PDU)。
6)填充域:0~46个字节,802.3规定有效帧从目的地址到校验和字段的最短长度为64字节(固定部分为18字节),当数据域长度小于46个字节时,就使用本字段的填充来满足最短帧的要求。
7)校验和:4个字节,使用32位CRC校验,G(x)=x32+x26+x23+x22+x16+x12+x11+x10+x8+x5+x4+x2+x+1
5. 802.11MAC帧格式

原文地址: http://happywh583.blog.sohu.com/68718667.html

NS2中数据包Packet的分析 (转帖)相关推荐

  1. Kubernetes 中数据包的生命周期 -- 第 3 部分

    本文翻译自:Life of a Packet in Kubernetes - Part 3 [1] 作者:Dinesh Kumar Ramasamy 本文在原文的基础上做了适当的修改,如有疑问请查阅原 ...

  2. NS3中数据包添加有效负载

    目的:将自己想发送的内容放到packet中,使其发送到客户端显示. 说白点就是让数据包夹带私货,可以输出时延.丢包率等信息.你要是问为什么不使用日志系统,呃,问就是不会- 发送端: 在生成数据包函数中 ...

  3. 常用网络数据包丢失的分析与处理

    网络管理维护过程中,经常会遇到数据包丢失的情况.用Ping命令进行连接测试,会发现Ping包的延迟远远超过正常值,甚至无法到达,同时伴随着网络服务应用的障碍,比如打开网站的速度太慢,严重时甚至无法打开 ...

  4. 5G网络学习(四)——5G网络中数据包转发模型(未完待续)

    3GPP TS 29.244介绍了控制层面和用户层面节点之间的接口 主要介绍了数据包转发模型及其内部一系列操作. 目录 1.定义缩写 2数据包转发模型 2.1数据包检测规则(PDR) 2.2使用报告的 ...

  5. 一文搞懂 Kubernetes 中数据包的生命周期

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 即使是对于具备一定虚拟网络和路由知识的人来说,Kubernetes 集群的网络也是个颇为麻烦的事情.本文尝试帮助读 ...

  6. 1、Linux下C语言 编写简单的网络嗅探器: 基本的数据包抓取分析

    首先贴上源代码 #include <stdio.h> #include <errno.h> #include <unistd.h> #include <sys ...

  7. DNS数据包模拟与分析

    目录 一. 域名的命名规则 二. 域名请求数据包分析 1.通过网络调试助手发送构建的DNS数据包到DNS服务器 2.wireshark抓包分析 可以参考如下分析:https://blog.csdn.n ...

  8. 【待补】Wireshark+BLE dongle: BLE数据包捕获以及分析

    文章目录 前言 1. 捕获BLE数据包 2. 分析BLE数据包 2.1 过滤掉不感兴趣的BLE数据包 2.2 利用Wireshark内嵌工具生成图表 前言 硬件:Nordic 52840 dongle ...

  9. NGFW中数据包转发流程

    状态检测防火墙报文处理流程 查询会话前的处理过程:基础处理 查询会话中的处理过程:转发处理,关键是会话建立 查询会话后的处理过程:安全业务处理及报文发送 了解转发流程之前,先给报文分个类 协议报文:使 ...

最新文章

  1. C语言----求解N以内的素数的两种典型方法以及其优化
  2. 嵌套向量中断控制器NVIC和系统控制块SCB特性
  3. MySQL连接相关问题(查看及设置连接数)
  4. 设置 Xcode 自动生成代码片段
  5. resample函数_使用Pandas的resample函数处理时间序列数据的技巧
  6. R+python︱XGBoost极端梯度上升以及forecastxgb(预测)+xgboost(回归)双案例解读
  7. 一个很好的String组合连接的方法(StringBuffer)
  8. 2018java面试集合
  9. 制作VOC格式的数据集
  10. 多线程相关知识点详解
  11. Informatic学习总结_day03
  12. wsus服务器搭建自动更新
  13. lwj_C#_集合的使用、接口方法的实现;
  14. Ubuntu虚拟机实现与主机之间复制粘贴
  15. PPT怎么修改母版背景
  16. Mysql知识梳理,学习笔记
  17. 微信t服务器地址,微信地址怎么改?教你如何修改微信地址
  18. vue实现微信公众号微信登录
  19. 军队文职(数学2+物理)——线性代数 3、矩阵的行列式值(一)
  20. 【ACM 2020 - Text Recognition in the Wild:A Survey】OCR识别综述

热门文章

  1. python改变列的数据类型_PySpark SQL: 改变列的数据类型
  2. 用html5开发本地桌面应用,十个使用HTML5开发的精彩应用
  3. python散点图解_python 画三维图像 曲面图和散点图的示例
  4. Spring Security UserDetail
  5. setuptools Command Reference
  6. Hadoop HIVE JavaAPI
  7. hadoop hdfs 集群配置
  8. 1.11 神经网络的权重初始化
  9. linux systemctl
  10. android教程1009无标题,Android ActionBarActivity设置全屏无标题实现方法总结_Android_脚本之家...