openswan中out_sa()函数报文封装思想
out_sa()函数报文封装思想讲解
1. out_sa前言
我已经在上一篇文章中将in_struct函数的基本原理进行了阐述,而out_struct()的实现基本是相同的,如果能理解in_struct()函数,那么自己再去看out_struct、out_raw、out_generic等几个函数接口,就不应该是什么问题了。in_struct是将网络字节序结构体转换为主机字节序结构体;out_struct为将主机字节序结构体转换为网络字节序结构体。
这里附上上一篇in_struct的讲解文章:openswan中的in_struct和out_struct函数
我们在看ISAKMP报文封装时,又看到另外一个函数:out_sa()。顾名思义,它是将主机字节序的SA结构转换为网络字节序的SA结构:从抓到的ISAKMP第一个报文可看出**out_sa()就是封装了SA载荷**。这里主要介绍下out_sa()的封装原理和思想,并不是专门来介绍out_sa()功能的。

2. out_sa原理
可能大家都注意到了,openswan中报文封装的格式不同于常见的网络协议栈的封装:
- 网络协议栈:倒序封装,顺序解封装
这种方式主要的原因还是在于网络分层的缘故。

- openswan封装/解封装方式:顺序序封装,顺序解封装
它采取这样的处理方式是因为这部分就是应用层的数据,没有必要采用类似网络协议栈的处理方式。但是需要注意的是报文中有长度字段,在没有确定数据部分长度的情况下无法得知长度字段的数据,因此长度字段是延迟到数据部分填充完毕后最后填充的。这是正规的做法,只有完全确定了数据部分长度,才能填充长度字段。我们之所以把ISAKMP的封装和TCPIP协议栈的封装联系在一起,就是因为他们有相同的格式:头部1+头部2+头部3+数据,但是他们封装却大相径庭。就是因为TCPIP协议栈是分层的,而ISAKMP是个应用层数据,没有必要采取那种方式。
刚才说明了ISAKMP中长度字段是最后填充的(这也是比较合理的),这个在out_sa()中体现的更加明显:

实际上out_sa()就是连续多次使用out_struct相关函数实现的;除此之外,还需要填充各个头部的相关字段(SA头部、建议载荷头部、变换载荷头部、变换载荷等),当某一个载荷填充完毕后,调用close_output_pbs()来填充当前载荷的长度字段。
按上图所示,进行简单的介绍:
下面只是填充载荷头部中的长度字段,其他字段的填充是顺序填充的;最后倒序填充长度字段。
2.1 填充变换载荷长度
在填充完毕变换载荷tans_pbs的其他字段(除了长度字段)以及载荷数据部分后,调用close_out_pbs来填充trans_pbs中的长度字段。

2.2 填充建议载荷长度
此时已经填充完毕变换载荷trans_pbs,也就是说建议载荷proposal_pbs的数据部分已经填充完毕,数据长度已经确定下来。因此调用close_output_pbs来填充建议载荷proposal_pbs的长度字段。

2.3 填充SA载荷长度
在所有的建议载荷填充完毕后,需要填充SA载荷sa_pbs中的长度字段,此时调用close_output_pbs()来填充。

2.4 填充ISAKMP载荷长度
这个部分功能已经不再out_sa()函数中实现了,而是在调用out_sa()的函数中实现。不过这没有关系,原理是完全一样的。依然是等确定完毕数据部分长度后最后填充长度字段。由于ISAKMP还需要填充除SA之外的其他载荷部分,例如VID载荷等,因此等这部分填充完毕后再调用close_output_pbs()来填充长度字段。

3. out_sa另一个功能
如果一个pb_stream变量已经调用过一次out_sa, 那么在调用close_output_pbs函数之前不能再次通过out_sa类函数填充载荷。因此out_sa中将该变量的cur指针指向roof,因此无法再次填充数据。当然调用close_output_pbs后就可以再次使用了,此时cur指针已经指向真实的数据末尾,也就是说载荷的长度是在这里确定出来的。
openswan中out_sa()函数报文封装思想的更多相关文章
- jquery中ajax中post方法(多学习:洞悉原理,触类旁通)(函数封装思想)
jquery中ajax中post方法(多学习:洞悉原理,触类旁通)(函数封装思想) 一.总结 1.多看学习视频:洞悉原理,触类旁通, 2.函数封装:$.post(URL,data,callback); ...
- java基础课程笔记 static 主函数 静态工具类 classpath java文档注释 静态代码块 对象初始化过程 设计模式 继承 子父类中的函数 继承中的构造函数 对象转型 多态 封装 抽象类 final 接口 包 jar包
Static那些事儿 Static关键字 被static修饰的变量成为静态变量(类变量) 作用:是一个修饰符,用于修饰成员(成员变量,成员方法) 1.被static修饰后的成员变量只有一份 2.当成员 ...
- openswan中的in_struct和out_struct函数
openswan中的in_struct和out_struct函数 文章目录 openswan中的in_struct和out_struct函数 1. 花絮 2. in_struct代码实现分析 3. 它 ...
- JS —— 轮播图中的缓动函数的封装
轮播图的根本其实就是缓动函数的封装,如果说轮播图是一辆跑动的汽车,那么缓动函数就是它的发动机,今天本文章就带大家由简入繁,封装属于自己的缓动函数~~ 我们从需求的角度开始,首先给出一个简单需求: 1. ...
- rxjs入门3之项目中ajax函数封装
项目中ajax函数封装 ⽹页应⽤主要数据源有两个:⼀个是⽹页中的DOM事件,另⼀个就是通过AJAX获得的服务器资源.我们已经知道fromEvent这个操作符可以根据DOM事件产⽣Observable对 ...
- openswan中ISAKMP交互过程关键函数接口
1. ISAKMP交互过程中关键函数接口 下面分别说明不同的阶段和模式下的函数接口以及对应的报文. 2. 第一阶段(Phase I)主模式函数接口 发送端 响应端 main_outI1 主模式第一包 ...
- C++中回调函数(CallBack)的使用
如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过. 其错误是普通的C++成员函数都隐含了一个传递函数作为参数,亦即“this”指针,C++通过传递this指针给其成员函数从而 ...
- c语言里用结构体和指针函数实现面向对象思想
一.基础研究 观察如下两个程序a.c和b.c: A.c: B.c: 这两个程序都是要实现在屏幕上第10行40列打印一个绿色的字符c: 这两个程序的数据组织方式是一样的,都是使用结构体,而且对共性和个性 ...
- 第四节:详细讲解Java中的类和面向对象思想
前言 大家好,给大家带来详细讲解Java中的类和面向对象思想的概述,希望你们喜欢 类和面向对象 在Java中怎样理解对象,创建对象和引用:什么是引用,对于基础学习的同学,要深入了解引用.示例:Stri ...
随机推荐
- 一文带你认识LPWA通信技术
摘要:为了满足越来越多的远距离物联网设备的连接需求,LPWA应用而生. 本文分享自华为云社区<常见物联网通信技术之LPWA通信技术>,作者:爱吃面包的猫. 如果你比较关注物联网圈的话,想必 ...
- [GXYCTF2019]Ping Ping Ping(ping命令执行绕过Waf)
记一道ping注入的题.过滤了很多字符. 分析 简单的测了一下,很容易就拿到了flag.php和index.php. 但是存在waf无法直接查看.直接?ip=127.0.0.1|cat flag.ph ...
- BUUCTF-[SUCTF 2019]CheckIn(.user.ini利用+exif_imagetype绕过)
目录 分析 .user.ini使用条件 解题 参考链接 记一道.user.ini利用+exif_imagetype绕过的文件上传的题. 分析 先正经上传一张图片.回显了存储路径,同时发现还包含了一个i ...
- 工资8000以下的Android程序员注意了!接下来要准备面对残酷现实了……
最近在知乎看到一个测试,特扎心: 以下三种情况,哪个最让你绝望? ❶ 每月工资去掉开销还存不到3千: ❷ 家人突然急病住院,医药费10万: ❸ 同班的家长都在争先恐后给孩子报名各种辅导班.兴趣班,但一 ...
- java数据类型和类型得转换
java数据类型 强类型语言 Java是一种强类型得语言,严格要求变量要符合规定,所有变量都必须先定义再使用 java得数据类型分为两大类 值得注意得是String并不是一个数据类型,它是一个类 ...
- markdown的摘要测试
123456789 1 123456789 2 123456789 3 123456789 4 123456789 5 123456789 6 粗体 123456 划线 123456 斜体 12345 ...
- .net core 响应的json数据驼峰显示问题。
在.net core webapi中,默认响应的json数据是以驼峰显示的,即首字母小写的方式.如果让其正常显示,只需要在全局配置即可.代码如下图: 配置之后,响应数据就不会再以驼峰的形式展示了.而是 ...
- 如何在 Matlab 中绘制带箭头的坐标系
如何在 Matlab 中绘制带箭头的坐标系 如何在 Matlab 中绘制带箭头的坐标系 实现原理 演示效果 完整代码 实现原理 使用 matlab 的绘制函数时,默认设置为一个方框形的坐标系, 图1 ...
- 去掉文件中的^M
一般情况下用:set ff=unix就可以解决问题,如果无效,用下面的方法手工完成: :%s/[ctrl+v] [ctrl+m]//g ctrl+v表示按住Ctrl键再按下v键.
- awk-08-综合例子
分析nginx日志 1.统计访问IP次数 2.统计访问IP大于10次的 3.统计访问IP次数,并取出前几的访问数 4.统计时间段访问最多的IP 5.统计访问最多的10个页面 6.统计每个 URL 数量 ...