原文: http://blog.chinaunix.net/uid-21768364-id-4823449.html

1 .引言
TCP/IP 协议现在已经广泛的被应用。数据在网络上应用 TCP/IP 协议进行传输的时候,需要将数据分成多个数据包。目前在网络安全领域都将用到 TCP 会话的重组问题。只有将数据包重组以后,才能还原一次完整的 TCP 会话。由于网络问题,数据包可能会经过不同的路由传输到目的地,并且到达目的地的数据包可能顺序会发生改变。在传输过程中,协 议对数据的传输进行控制,对在传输过程中丢失的数据包协议将控制系统将丢失的数据包重 新
传送。这些都是 TCP 会话在重组的时候将遇到的问题。本文经过对 TCP/IP 协议的分析, 解决了 TCP 会话还原过程的常见问题,并且给出了一个 TCP 会话重组的方法。

2 . TCP 会话
TCP 是一种面向连接的协议,客户与服务器之间的任何一次会话都必须建立连接 [1] , 退出会话时必须断开连接。连接的时候需要 3 个报文,断开的时候需要 4 个报文。

2.1 TCP 建立连接
一次 TCP 会话建立的时候需要 3 个报文交换,即需要 3 次握手(如图 1 )。其 SEQ 和ACK 的关系如下:
( 1 )客户发送一个 SYN 段, SYN=1 表示发起一个连接,生成随机 SEQ 。
( 2 )对方收到后将 SEQ+1 置于 ACK 发回给本机。表示对前者的确认,生成随机 SE Q发回本机。
( 3 )本机收到后将 SEQ+1 置于 ACK 发回给对方,将对方 ACK 置于 SEQ 。


2.2 TCP 数据传输
当双方建立 TCP 连接以后,就可以传输数据了,传输过程中发送方每发送一个数据包 ,接收方都要给予一个应答。数据包的先后关系可以由 TCP 首部的序号和确认序号确定。双方序号的及确认序号之间的关系为:设发送方发送的数据包长度为 N ,序号为 SEQ ,确认序号 ACK , 则下一个将要发送的数据包的序号为 SEQ+N ;接收方应答的数据包序号为 AC K ,确认序号为 SEQ+N ,表示对序号 SEQ 长度为 N 的数据包的确认。

2.3 TCP 断开连接
建立一个连接需要 3 次握手,而终止一个连接要经过 4 次握手(如图 2 )。这是因为一个 TCP 连接是全双工(即数据在两个方向上能同时传递),每个方向必须单独地进行关闭。4 次握手实际上就是双方单独关闭的过程。

3. TCP 会话的还原
3.1 SYN 的计算
在 TCP 建立连接的以后,会为后续 TCP 数据的传输设定一个初始的序列号。以后每 传送一个包含有效数据的 TCP 包,后续紧接着传送的一个 TCP 数据包的序列号都要做出相应的修改。序列号是为了保证 TCP 数据包的按顺序传输来设计的,可以有效的实现 TCP 数 据的完整传输,特别是在数据传送过程中出现错误的时候可以有效的进行错误修正。在 TCP会话的重新组合过程中我们需要按照数据包的序列号对接收到的数据包进行排序。
一台主机即将发出的报文中的 SEQ 值应等于它所刚收到的报文中的 ACK 值,而它所要发送报文中的 ACK 值应为它所收到报文中的 SEQ 值加上该报文中所发送的 TCP 数据的长度,即两者存在:
( 1 )本次发送的 SEQ= 上次收到的 ACK ;
( 2 )本次发送的 ACK= 上次收到的 SEQ+ 本次发送的 TCP 数据长度;
表 1 中 初始的序列号 Init_seq 可以从携带 SYN 标记的 TCP 包中获得。


3.2 报文的还原
以上我们讨论的内容都是针对一次 TCP 会话的情况,但是实际应用网络同时传输的数据同时来自很多机器,对应很多个不同的 TCP 会话。每个 TCP 传输的报文过程都有一个源、目的 MAC 地址、 IP 地址和端口(如图 3 ),根据这个六元组的可以确定唯一的一次 TCP 会话,因此我们建立了一个链表TCPSESSIONList ,每一个节点指向一次 TCP 会话组装链表 TCPList ,链表的表头即为六 元组。用于区分不同的 TCP 会话。其中 mac_src 表示源 MAC 地址, mac_dst 表示目的 MAC地址, ip_src 表示源 IP 地址, ip_dst 表示目的 IP 地址, th_sport 表示源端口, th_dport 表示目的端口, next 表示一个指向下个 TCP 会话接点的指针, tcplisthead 表示一个指向 TCPLi头节点的指针。一个报文节点是一个 7 元组(如图 4 ),包括: IP 首部标志位 syn 和 fin 分别用来表示会话的开始和结束; seq 表示数据包序列号; len 表示数据包的长度; prev 指向上一个 TCPLi节点的指针,首节点时为空, next 指向下一个 TCPList 节点的指针,尾节点时为空, data 为传输的 TCP 数据。显然对于一个完整的报文,重装链表的第一个包的 syn 为 1 ,最后一个 包
的 fin 为 1 ,且所有节点的 seq 应该是连续的,计算方法可以按照 3.1 节中所给的方法进行计算。



数据结构如下:
typedef struct TCPSESSION{
unsigned char mac_src[6]?
unsigned char mac_dst[6]?
long ip_src?
long ip_dst?
unsigned short th_sport?
unsigned short th_dport?
struct TCPSESSION* next?
TCPNODE tcplisthead?
}
typedef struct TCPNODE{
int syn?
int fin?
unsigned long seq?
int len?
struct TCPNODE *prev?
struct TCPNODE *next?
unsigned char data[MAXETHERLEN]?
}
数据在传输的过程中,可能由于路由,数据校验错误等网络原因,会导致数据包的乱序或重传。因此我们建立一个二维链表用来对众多的 TCP 进行管理(如图 5 )。TCP 会话的重组过程实际上就是对链表的插入和删除的过程。针对每一次 TCP 会话建立一个 TCPSESSION ,以后每当捕获一个数据包以后首先检查此数据包所属的 TCP 会话是否已经在链表中存在,如果存在找到相应的 TCP 会话过程,根据序列号将其插入到适当的位置。如果所属的 TCP 会话不在链表中,则新建立一个 TCPSESSION 节点插入到链表的尾部。在此过程中,如果一个数据包与链表中某一个数据包的序列号和数据长度相同的话, 则说明是重发包,做丢弃处理。最后链表的每一个数据包序列号连续,且第一个数据包为 SYN包,最后一个数据包为 FIN 包(或是连接复位包 RST ),此时认为报文是完整的。程序流程图如图 6 。



4. 结束语
网络传输数据时,传输到目的主机的数据包是通过 TCP/IP 协议实现报文的还原,我们利用这一原理实现了网络数据传输中的 TCP 会话的还原问题。经过测试我们发现,利用二维链表可以快速有效的处理还原多个 TCP 会话,利用序列号能够准确的确定 TCP 数据包的位置,并且可以有效的解决 IP 数据包乱序和 TCP 数据包的重传问题。

tcp 重组原理的更多相关文章

  1. TCP重组问题

    今天问题: vqmon 测试一pcap抓包文件18.pcap.发现实际输出的视频分片信息和抓包不符合. ===>pts : 00:00:33 Too much data in TCP recei ...

  2. C#版清晰易懂TCP通信原理解析(附demo)

    [转] C#版清晰易懂TCP通信原理解析(附demo) (点击上方蓝字,可快速关注我们) 来源:周见智 cnblogs.com/xiaozhi_5638/p/4244797.html 对.NET中网络 ...

  3. tcp/ip原理/三次握手/四次挥手

    @ tcp/ip原理 1.1 tcp/ip三次握手 1.1.1 建立过程说明 a)   由主机A发送建立TCP连接的请求报文, 其中报文中包含seq序列号, 是由发送端随机生成的, 并且还将报文中SY ...

  4. [网络编程] TCP、UDP区别以及TCP传输原理、拥塞避免、连接建立、连接释放总结

    TCP.UDP都是属于运输层的协议,提供端到端的进程之间的逻辑通信,而IP协议(网络层)是提供主机间的逻辑通信,应用层规定应用进程在通信时所遵循的协议.一.UDP主要特点:传输的是用户数据报协议.1. ...

  5. TCP/IP原理浅析

    TCP/IP概述 TCP/IP起源于1969年美国国防部(DOD:The United States Department Of Defense)高级研究项目管理局(APRA:AdvancedRese ...

  6. [转] TCP/IP原理、基础以及在Linux上的实现

    导言:本篇作为理论基础,将向我们讲述TCP/IP的基本原理以及重要的协议细节,并在此基础上介绍了TCP/IP在LINUX上的实现. OSI参考模型及TCP/IP参考模型 OSI模型(open syst ...

  7. TCP协议原理与格式初探

    目录 可靠数据传输原理 停等传输下的情况 1.经过完全可靠信道的可靠数据传输 2.经具有比特差错信道的可靠数据传输 3.经具有比特差错的丢包信道的可靠数据传输 流水线传输 1.回退N步(Go-Back ...

  8. TCP Wrappers原理及简单实验

    1.TCP Wrappers(简易防火墙)简介TCP_Wrappers是一个工作在第四层(传输层)的的安全工具,对有状态连接(TCP)的特定服务进行安全检测并实现访问控制,界定方式是凡是调用libwr ...

  9. 白话TCP/IP原理

    TCP/IP(Transmission-Control-Protocol/Internet-Protocol),中文译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议 ...

随机推荐

  1. jquery_核心_(1)

    1.data([key],[value]) 概述 在元素上存放或读取数据,返回jQuery对象. 当参数只有一个key的时候,为读取该jQuery对象对应DOM中存储的key对应的值,值得注意的是,如 ...

  2. android 进程(复习)

        前台进程 前台进程是用户当前正在使用的进程.只有一些前台进程可以在任何时候都存在.他们是最后一个被结束的,当内存低到根本连他们都不能运行的时候.一般来说, 在这种情况下,设备会进行内存调度,中 ...

  3. HDU 5775 Bubble Sort

    对于一个数,可以记录3个位置:初始位置,终点位置,最右边的位置. 初始位置和终点位置容易计算.最多边的位置即为初始状态下该数的位置+该数之后还有多少数比该数小. 三个位置中的min即为leftpos, ...

  4. C++编写一个简单的DLL

    什么是DLL: 自从微软推出16位的Windows操作系统起,此后每种版本的Windows操作系统都非常依赖于动态链接库(DLL)中的函数和数据,实际上 Windows操作系统中几乎所有的内容都由DL ...

  5. 50个很棒的Python模块

    50个很棒的Python模块 我很喜欢Python,Python具有强大的扩展能力,我列出了50个很棒的Python模块,包含几乎所有的需要:比如Databases,GUIs,Images, Soun ...

  6. Java中的Builder模式

    package com.mc.bsfram.others.entity; public class Person { private String name; private String addre ...

  7. LeetCode OJ 107. Binary Tree Level Order Traversal II

    Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...

  8. TCP/IP,http,socket,长连接,短连接——小结。

    来源:http://blog.chinaunix.net/uid-9622484-id-3392992.html TCP/IP是什么? TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层. ...

  9. iOS 的 APP 如何适应 iPhone 5s/6/6Plus 三种屏幕的尺寸?

    初代iPhone 2007年,初代iPhone发布,屏幕的宽高是 320 x 480 像素.下文也是按照宽度,高度的顺序排列.这个分辨率一直到iPhone 3GS也保持不变. 那时编写iOS的App( ...

  10. 克隆虚拟机系统整个文件快照,然后另起建立该系统,产生的IP地址冲突解决办法

    进入克隆后的文件系统 cd /etc/sysconfig/network-scripts/ cp ifcfg-eth0  ifcfg-eth1 vim ifcfg-eth1   #修改其中的文件内容 ...