P3:写入从SYN3-File_Init_Write_Pointer,即,SYN1 + LEN1 + LEN2 - File_Init_Write_Pointer到SYN1 + LEN1 + LEN2 - File_Init_Write_Pointer + LEN3。
在数据包不能按序到达的情况下,设IP数据包到达的顺序为P1,P3,P2,可以发现重组数据的写入位置还是相同的,只是写入的先后不同,成了P1,P3,P2。因此,按照此种算法仍能将有效的TCP数据写入到重组数据文件的正确位置。
▲处理TCP数据包重传问题
假设TCP数据传送方先传了四个TCP包TCP1、TCP2、TCP3、TCP4,Sequence Number分别为:SYN1、SYN2、SYN3、SYN4,长度分别为LEN1、LEN2、LEN3、LEN4。但是,TCP数据接收方要求从第二个TCP包开始重新传送,同时由于网络原因重传的数据包大小发生了变化,分别为:LEN2’,LEN3’,LEN4’,并有LEN2 + LEN3 + LEN4 = LEN2’ + LEN3’+ LEN4’,三个新TCP包的Sequence Number分别为:SYN1 + LEN1,SYN1 + LEN1 + LEN2’, SYN1 + LEN1 + LEN2’ + LEN3’。
根据SYN计算法可得,第一次传输的四个数据包写入TCP重组文件的位置分别为:
TCP1:写入位置为SYN1-File_Init_Write_Pointer到SYN1-File_Init_Write_Pointer + LEN1。
TCP2:写入位置为SYN2-File_Init_Write_Pointer,即,SYN1 + LEN1 + - File_Init_Write_Pointer到SYN1 + LEN1 - File_Init_Write_Pointer + LEN2。
TCP3:写入位置为SYN3-File_Init_Write_Pointer,即,SYN1 + LEN1 + LEN2 - File_Init_Write_Pointer到SYN1 + LEN1 + LEN2 - File_Init_Write_Pointer + LEN3。
TCP4:写入位置为SYN4-File_Init_Write_Pointer,即,SYN1 + LEN1 + LEN2 + LEN3 - File_Init_Write_Pointer到SYN1 + LEN1 + LEN2 + LEN3 - File_Init_Write_Pointer + LEN4。
当发生TCP包重传时,程序将从第二个TCP包开始重新写重组数据文件。此时的情况为:
TCP2’:写入位置为SYN1 + LEN1 - File_Init_Write_Pointer到SYN1 + LEN1 - File_Init_Write_Pointer + LEN2’。
TCP3’:写入位置为SYN1 + LEN1 + LEN2’ - File_Init_Write_Pointer到SYN1 + LEN1 + LEN2’ - File_Init_Write_Pointer + LEN3’。
TCP4’:写入位置为SYN1 + LEN1 + LEN2’ + LEN3’ - File_Init_Write_Pointer到SYN1 + LEN1 + LEN2’ + LEN3’ - File_Init_Write_Pointer + LEN4’。
由于LEN2 + LEN3 + LEN4 = LEN2’ + LEN3’ + LEN4’,因此各数据包在TCP重组数据文件中写入的最终位置两次是相同的,即实现了正确覆盖。
三、 结束语
经反复测试我们发现:利用HASH表可以快速实现对多个会话的处理;利用SYN算法可以成功实现TCP会话的恢复,并可以有效地解决IP数据包的乱序到达和TCP数据包的重传问题,误差率非常小且重组效率很高。
(责任编辑:adminadmin2008)