背景技术
IPv6协议是取代IPv4的下一代互联网络协议,但是IPv6与IPv4协议不
完全兼容,例如地址长度、包头格式不同等等。协议上的差异导致采用两
种协议的网络互通时必须经过转换网关。目前有各种各样的IPv4/IPv6互
通和转换机制,比较典型的有NATPT和TRT两种转换技术。但是不管是何种
转换机制面对不兼容的应用层协议的时候都必须在转换网关中增加应用
层转换模块。对于采用TCP协议的FTP包,在采用IPv4和IPv6两种网络协议
的网络间通信的时候将涉及到包序号的控制问题。
TCP协议是一种端到端、面向连接的协议。该协议弥补了IP协议的某些
不足,其中比较突出的是TCP协议能够保证IP数据包丢失时进行重发,能
够删去重复收到的IP数据包,还能保证准确地按原发送端的发送顺序重新
组装数据。TCP将所要传送的整个报文看成是一个个字节组成的数据流,
然后对每一个字节编一个序号。在连接建立时,双方要商定初始序号。TCP
就将每次所传送的报文段中的第一个数据字节的序号,放在TCP首部的序
号字段中。TCP的确认是对接收到的数据的最高序号表示确认。但返回的
确认序号是已经收到的数据的最高序号加1。也就是说,确认序号表示期
望下次收到的第一个数据字节的序号。因此在采用TCP协议传输的数据包
的TCP报头中包括了32位序号和32位确认序号,图1表示的就是一个TCP数
据包的包头格式。
在IPv6协议成为标准前FTP仅仅提供了建立在IPv4上进行数据通信的
能力,它基于网络地址是32位这一假设。但是,当IPv6出现以后,地址就
比32位长许多了。原来对FTP进行的扩展在多协议环境中有时会失败。因
此在RFC 2428根据IPv6对FTP再次进行扩展。下面将主要说明一种在非
IPv4上传送信息的方法,我们熟悉的两个FTP命令PORT和PASV通过扩展后,
我们称它们为EPRT和EPSV。
例如:EPRT|2|3ffe:8330:5∷12|1909|
该命令表示在TCP端口1909上用IPv6打开主机″3ffe:8330:5∷12″。当
这样的FTP命令包在送到IPv4网络的时候需要转换成如下的格式:
PORT 192,168,6,41,7,117
这种转换将导致TCP数据包的长度变短,减少了4个字节。下一个数据
包从IPv6到IPv4发出,如果不调整它的序号,还是按照发送的IPv6端的需
要发送,那么IPv4接收端总会认为对方发来的包丢掉了4个字节。因此FTP
应用转换网关将需要适时地调整数据包的序号和确认序号。
EPSV请求服务器在一个数据端口上侦听等待连接。对它的响应的格式
与EPRT参数的很象。其格式如下:
Entering Extended Passive Mode(|||24314|)
而对于仅支持IPv4的ftp应用发出的PASV响应包,其格式如下:
Entering Extended Passive Mode(192,168,6,41,94,250)
以上关于FTP命令包在IPv4和IPv6协议上的差异看出,对于像FTP这样
的应用其数据包经过转换网关翻译导致包载荷长度因为两种协议的差异
而发生变化。而且这类应用在传输层通常采用TCP协议,因此转换网关在
进行包转换的时候需要适时地调整数据包的序号和确认序号。而且这种方
法还可以用在任何一种采用TCP协议的转换网关上。
发明内容
本发明的目的在于提供一种应用层协议转换网关的包序号控制方法,
包括关键数据结构的定义和序号调整的流程。
本发明设计了一套Seq_Number_Offset表结构来记录tcp数据包在进行
转换时候序号发生的变化,并且在应用层转换网关(Application Level
Gateway,ALG)处理程序中加入Seq_Number_Offset_Table表的维护,偏
移量值的读取和修正的方法,来保证转换中的数据包序号和确认号的正确
性。该发明同时还解决了重传包的序号控制问题。
本发明中定义的关键数据结构即Seq_Number_Offset表,该数据结构不
仅能够记录数据包的源地址、目的地址、源端口、目的端口,包的来源,
sequence number offset,并且还增加了包的sequence number,payload
length,ack number。后面的数据项主要是用来检查下一个地址和端口都
相同的数据包与当前这个数据包是否是重复数据包。如果是重复数据包,
即使该数据包的负载长度发生了变化,ALG处理程序也不会把该包的
sequence number offset值叠加到Seq_Number_Offset表中对应的条目上。
本发明中定义的关键功能模块包括:sequence number offset值的读
取和维护。维护模块根据当前数据包的地址和端口信息检查在
Seq_Number_Offset表中是否有对应的条目,如果有,就修改该条目中的
offset项,否则在Seq_Number_Offset表中增加一个新的条目,并记录
offset值。读取模块则是根据数据包的地址和端口信息检查在
Seq_Number_Offset表中是否有相同的地址和端口的条目,如果有就读取
否则置0。
发明技术方案
一种应用层协议转换网关针对传输层采用TCP协议的包序号控制方
法,具体步骤如下:
步骤1:定义Seq_Number_Offset表结构来记录TCP数据包在进行转
换时候序号发生的变化;
步骤2:维护进程定期刷新Seq_Number_Offset表;
步骤3:如果当前数据包转换导致数据包长度发生变化,将修改
Seq_Number_Offset表中对应条目的偏移量值;
步骤4:根据当前数据包的源地址、源端口、目的地址、目的端口在
Seq_Number_Offset表中查找对应的条目,读取偏移量值,并调整当前数
据包的序号和确认号;
步骤5:根据当前数据包的序号(seq number),载荷长度(payload
length),确认序号(acknumber),检查当前包是否是重传包。
具体实施方式
图1的一个tcp协议数据包的格式图。该图中32位序号和32位确认
序号就是本发明中由于转换而导致发生变化的关键字段。源端口号和目的
端口号通常会用来鉴别不同的TCP连接条目。当TCP头发生变化,需要适
时地调整该结构图中的16位检验和。
图1中,该图说明TCP数据包的包头包括了32位的序号和32位的确
认序号。由于通常采用TCP协议的应用都会对序号和确认序号进行检查。
如果由于转换导致了数据包的长度发生变化,那么其对应的序号也必须进
行调整,否则接收方和发送方将无法协同工作。
图2中,Sequence number控制表。通过这个控制表结构生成的序号
偏移量表可以唯一地标识每一个经过转换网关的TCP连接和连接的方向。
为了鉴别重传包,我们还在这个表结构中增加了条目。每次进行Sequence
number偏移量修正的时候,首先判断是否是重传包,如果是就不修订,
而直接获取现在表中的偏移量值。
该数据结构中Source_address、Source_port、Destination_address、
Destination_port表示源地址、源端口号、目的地址和目的端口号。
Offset_from_v4、Offset_from_v6记录v4到v6或从v6到v4方向的偏
移量。accesses_before_terminate是用来判断该表项是否将被删除,该
项是Seq_Number_Offset表维护进程用。pre_seqnumber_v4、
pre_payloadlen_v4、pre_acknumber_v4、pre_seqnumber_v6、
pre_payloadlen_v6、pre_acknumber_v6这六个数据项分别记录了上一个
数据包的属性。
首先本发明定义了图2所示的关键数据结构。该数据结构中
Source_address、Source_port、Destination_address、Destination_port
表示源地址、源端口号、目的地址和目的端口号。Offset_from_v4、
Offset_from_v6记录v4到v6或从v6到v4方向的偏移量。
accesses_before_terminate是用来判断该表项是否将被删除,该项是
Seq_Number_Offset表维护进程用。pre_seqnumber_v4、
pre_payloadlen_v4、pre_acknumber_v4、pre_seqnumber_v6、
pre_payloadlen_v6、pre_acknumber_v6这六个数据项分别记录了上一个
数据包的属性。如果上一个数据包是v4包,那么它的包序号、包载荷的
长度、确认序号就被保存在前三个数据项中。如果是v6包,那么它的包
序号、包载荷的长度、确认序号就被保存在后面三个数据项中。这些数据
项是用来判断当前正在处理的数据包是否是一个重传数据包。
为实现包序号控制技术,我们设计的功能模块包括:sequence number
offset值的修正和读取。
(1)、修正模块根据当前数据包的地址和端口信息检查在
Seq_Number_Offset表中是否有对应的条目。如果有,就修改该条目中的
offset项,否则在Seq_Number_Offset表中增加一个新的条目,并记录
offset值。
(2)、读取模块则是根据数据包的地址和端口信息检查在
Seq_Number_Offset表中是否有相同的地址和端口的条目,如果有就读取
否则置0。
下面看一下数据包的处理流程,见图3:
一个FTP数据包负载转换流程,步骤S1,接收一个FTP数据包,步骤
S2,首先对其负载内容进行关键字比较,例如:PORT,EPRT,PASV,EPSV等
等。步骤S3查找到匹配的关键字,判断关键字是否匹配,如果匹配,步
骤S4,则进行关键字的转换。步骤S5修订sequence number表中对应的
条目的偏移量。步骤S6,修改当前包的sequence number号,然后步骤
S9通过读取反向的序号偏移量,修订当前包的确认序号。步骤s10重新
计算伪头校验和。如果进行关键字匹配时,没有发现对应的关键字,步骤
S7则执行,读取当前数据包序号的偏移量值,步骤S8修改当前数据包的
序号。然后通过读取反向的序号偏移量,步骤S9修订当前包的确认序号,
步骤S10重新计算伪头校验和。
(1)、对于一个FTP数据包,首先对其负载内容进行关键字匹配,例如:
PORT,EPRT,PASV,EPSV等等。如果找到匹配的关键字,则进执行(2)中
的步骤。否则将两次调用sequence number offset值的读取模块。该函
数的作用就是返回在Seq_Number_Offset表中源地址、源端口、目的地址、
目的端口与该函数传递的值相同的条目中记录的seq_offset.调用下列函
数处理:
ALG_Retrieve_Sequence_Number_Offset(Source_Address_String,
htons(ptcp_header_in->th_sport),
Dest_Address_String,
pIP_header_in->Dest_port,
network_source,
&new_payload_offset);
该函数包括的参数:源地址、源端口、目的地址、目的端口。
Network_source表示转换前数据包的协议即是Ipv4或。该函数的返回值
是new_payload_offset。该值用来修正当前数据包的sequence_number+=
new_payload_offset。
ALG_Retrieve_Sequence_Number_Offset(Source_Address_String,
htons(ptcp_header_in->th_sport),
Dest_Address_String,
pIP_header_in->Dest_port,
network_source,
&new_acknowledge_offset);
该函数中的network_source记录的是与当前数据包相反的方向。例如
当前处理的是一个v4数据包,那么这里的network_source=IPv6;而修改
sequence number表调用概述的时候,network_source=IPv4,即等于这
个数据把在转换前所采用的网络协议。
该函数的返回值是new_acknowledge_offset。该值用来修正当前数据
包的
ack_number=ack_number-new_acknowledge_offset
(2)数据包从一种网络协议转换到另外一种网络协议的时候本发明做如
下的处理,首先,本发明会调用如下的函数:
ALG_Amend_Sequence_Number_Offset(Source_Address_String,
htons(ptcp_header_in->th_sport),
Dest_Address_String,
pIP_header_in->Dest_port,
total_payload_offset,
IPV6,
htonl(ul_th_seq),
pIP_header_in->Payload_length,
htonl(ul_th_ack),
&new_payload_offset);
该函数的参数除了包的源地址等信息,还增加了seqnumber、
payload_length、ack_number,返回的值存放在new_payload_offset。
sequence_number=sequence_number+(new_payload_offset-
total_payload_offset);
该函数的功能:
然后:调用ALG Retrieve_Sequence_Number_Offset函数,读取对应的偏
移量值。
ALG_Retrieve_Sequence_Number_Offset(Source_Address_String,
htons(ptcp_header_in->th_sport),
Dest_Address_String,
pIP_header_in->Dest_port,
IPv4,
&new_acknowledge_offset);
注意该函数中的network_source与实际的数据包的方向是相反的。因
为ack_number记录的是另外一个方向的偏移量。
(3)重传包的控制技术
本发明在Seq_Number_Offset表中增加了三个表项。当要在该表中增
加一个新的条目或者要对seq number offset表中的offset值修改的时
候,本发明会把当前数据包的sequnumber,payload length,acknumber保
存到seq number offset表中。如果数据包来源于v4协议,则这些数据
项会保存到
pre_seqnumber_v4;
pre_payloadlen_v4;
pre_acknumber_v4;
否则,以上三项内容会保存到下面的三个表项中:
pre_seqnumber_v6;
pre_payloadlen_v6;
pre_acknumber_v6;
对于每一个需要对SEQ number和ACK number进行修改的包,程序都会
首先比较当前数据包的SEQ number、Payloadlen、和ACK number。如果
当前数据包的这些项与表中记录的完全相同,那么可以判定该数据包是一
个重复数据包。系统程序就不再将当前数据包的偏移量叠加到SEQ表对应
的表项。
(4)维护进程
维护进程负责定期对Seq_Number_Offset表进行刷新。每次刷新的时候
系统都会将accesses_before_terminate值-1。如果该值已经为0,维
护进程将删除该条目。对于读取该表和修正该表的进程,每次读取其中一
个表项时,都会将accesses_before_terminate置为最大值。