openswan中out_sa()函数报文封装思想

out_sa()函数报文封装思想讲解

1. out_sa前言

我已经在上一篇文章中将in_struct函数的基本原理进行了阐述,而out_struct()的实现基本是相同的,如果能理解in_struct()函数,那么自己再去看out_structout_rawout_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指针已经指向真实的数据末尾,也就是说载荷的长度是在这里确定出来的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叨陪鲤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值