tcp 重组原理
原文: 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 重组原理的更多相关文章
- TCP重组问题
今天问题: vqmon 测试一pcap抓包文件18.pcap.发现实际输出的视频分片信息和抓包不符合. ===>pts : 00:00:33 Too much data in TCP recei ...
- C#版清晰易懂TCP通信原理解析(附demo)
[转] C#版清晰易懂TCP通信原理解析(附demo) (点击上方蓝字,可快速关注我们) 来源:周见智 cnblogs.com/xiaozhi_5638/p/4244797.html 对.NET中网络 ...
- tcp/ip原理/三次握手/四次挥手
@ tcp/ip原理 1.1 tcp/ip三次握手 1.1.1 建立过程说明 a) 由主机A发送建立TCP连接的请求报文, 其中报文中包含seq序列号, 是由发送端随机生成的, 并且还将报文中SY ...
- [网络编程] TCP、UDP区别以及TCP传输原理、拥塞避免、连接建立、连接释放总结
TCP.UDP都是属于运输层的协议,提供端到端的进程之间的逻辑通信,而IP协议(网络层)是提供主机间的逻辑通信,应用层规定应用进程在通信时所遵循的协议.一.UDP主要特点:传输的是用户数据报协议.1. ...
- TCP/IP原理浅析
TCP/IP概述 TCP/IP起源于1969年美国国防部(DOD:The United States Department Of Defense)高级研究项目管理局(APRA:AdvancedRese ...
- [转] TCP/IP原理、基础以及在Linux上的实现
导言:本篇作为理论基础,将向我们讲述TCP/IP的基本原理以及重要的协议细节,并在此基础上介绍了TCP/IP在LINUX上的实现. OSI参考模型及TCP/IP参考模型 OSI模型(open syst ...
- TCP协议原理与格式初探
目录 可靠数据传输原理 停等传输下的情况 1.经过完全可靠信道的可靠数据传输 2.经具有比特差错信道的可靠数据传输 3.经具有比特差错的丢包信道的可靠数据传输 流水线传输 1.回退N步(Go-Back ...
- TCP Wrappers原理及简单实验
1.TCP Wrappers(简易防火墙)简介TCP_Wrappers是一个工作在第四层(传输层)的的安全工具,对有状态连接(TCP)的特定服务进行安全检测并实现访问控制,界定方式是凡是调用libwr ...
- 白话TCP/IP原理
TCP/IP(Transmission-Control-Protocol/Internet-Protocol),中文译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议 ...
随机推荐
- 详细理解servlet实现的几种方式和生命周期
现在很多的开发都是用的框架,然后很多同学学习的时候又是直接接触的框架,对于底层的一些开发,完全没有任何的了解.虽然对于业务上面来说,没有什么问题.但是很多时候当你被面试问到,或者是想要了解框架底层原理 ...
- JavaScript在智能手机上的应用-用手势来改变图片大小
---------------------------------- <script type="text/javascript"> //初始化函 ...
- static静态初始化块
Java 中可以通过初始化块进行数据赋值.如: 在类的声明中,可以包含多个初始化块,当创建类的实例时,就会依次执行这些代码块.如果使用 static 修饰初始化块,就称为静态初始化块. 需要特别注意: ...
- Linq第一讲
在说LINQ之前必须先说说几个重要的C#语言特性 一:与LINQ有关的语言特性 1.隐式类型 (1)源起 在隐式类型出现之前,在声明一个变量的时候, 总是要为一个变量指定他的类型甚至在foreach一 ...
- insertRule()与addRule()创建规则
要向现有的样式表中添加新规则,需要使用insertRule()方法.这个方法接受两个参数:规则文本和表示在那里插入规则的索引.下面是一个例子: sheet.insertRule("body ...
- MySQL 对于千万级的大表要怎么优化
转自知乎 作者:哈哈链接:http://www.zhihu.com/question/19719997/answer/81930332来源:知乎著作权归作者所有,转载请联系作者获得授权. 很多人第一反 ...
- Eclipse的Console乱码
1.找到服务器bin目录:例:D:\WebLogic_11g\Middleware\user_projects\domains\dsrhd_domain\bin, 在该目录下找到setDomainEn ...
- sql server 的约束的作用 于 理解 [转]
SQL Server中的约束用来确保系统的完整性.一般约束可以分为:主键约束外键约束检查约束默认约束唯一约束非空约束 但是一般我们需要特别注意前三种约束:主键约束,一就是说跟你系统的实体有很大的关系, ...
- dos命令(Cacls和Icacls) -- 显示或者修改文件的访问控制表
1. dos帮助说明 cacls /? 注意: 不推荐使用 Cacls,请使用 Icacls. 显示或者修改文件的访问控制列表(ACL) CACLS filename [/T] [/M] [/L] [ ...
- cout、cerr、clog
其实大家平常常会用的主要有三个:cout.cerr.clog,首先简单介绍下三者. 这三者在C++中都是标准IO库中提供的输出工具(至于有关的重载问题在此不讨论): cout:写到标准输出的ostre ...