TCP/IP协议的三次握手及实现原理


TCP/IP是很多的不同的协议组成,实际上是一个协议组,TCP用户数据报表协议(也称作TCP传输控制协议,Transport Control Protocol 。可靠的主机到主机层协议 。这里要先强调一下,传输控制协议是OSI网络的第四层的叫法,TCP传输控制协议是TCP/IP传输的6个基本协议的一种 。两个TCP意思非相同 。) 。TCP是一种可靠的面向连接的传送服务 。它在传送数据时是分段进行的,主机交换数据必须建立一个会话 。它用比特流通信,即数据被作为无结构的字节流 。通过每个TCP传输的字段指定顺序号,以获得可靠性 。是在OSI参考模型中的第四层,TCP是使用IP的网间互联功能而提供可靠的数据传输,IP不停的把报文放到 网络上,而TCP是负责确信报文到达 。在协同IP的操作中TCP负责:握手过程、报文治理、流量控制、错误检测和处理(控制),可以根据一定的编号顺序对非正常顺序的报文给予从新排列顺序 。关于TCP的RFC文档有RFC793、RFC791、RFC1700 。
在TCP会话初期,有所谓的“三握手”:对每次发送的数据量是怎样跟踪进行协商使数据段的发送和接收同步,根据所接收到的数据量而确定的数据确认数及数据发送、接收完毕后何时撤消联系,并建立虚连接 。为了提供可靠的传送,TCP在发送新的数据之前,以特定的顺序将数据包的序号,并需要这些包传送给目标机之后的确认消息 。TCP总是用来发送大批量的数据 。当应用程序在收到数据后要做出确认时也要用到TCP 。由于TCP需要时刻跟踪,这需要额外开销,使得TCP的格式有些显得复杂 。下面就让我们看一个TCP的经典案例,这是后来被称为MITNICK攻击中KEVIN开创了两种攻击技术:
TCP会话劫持
SYN FLOOD(同步洪流)
在这里我们讨论的时TCP会话劫持的问题 。
先让我们明白TCP建立连接的基本简单的过程 。为了建设一个小型的模拟环境我们假设有3台接入互联网的机器 。A为攻击者操纵的攻击机 。B为中介跳板机器(受信任的服务器) 。C为受害者使用的机器(多是服务器),这里把C机器锁定为目标机器 。A机器向B机器发送SYN包,请求建立连接,这时已经响应请求的B机器会向A机器回应SYN/ACK表明同意建立连接,当A机器接受到B机器发送的SYN/ACK回应时,发送应答ACK建立A机器与B机器的网络连接 。这样一个两台机器之间的TCP通话信道就建立成功了 。
B终端受信任的服务器向C机器发起TCP连接,A机器对服务器发起SYN信息,使C机器不能响应B机器 。在同时A机器也向B机器发送虚假的C机器回应的SYN数据包,接收到SYN数据包的B机器(被C机器信任)开始发送应答连接建立的SYN/ACK数据包,这时C机器正在忙于响应以前发送的SYN数据而无暇回应B机器,而A机器的攻击者猜测出B机器包的序列号(现在的TCP序列号猜测难度有所加大)假冒C机器向B机器发送应答ACK这时攻击者骗取B机器的信任,假冒C机器与B机器建立起TCP协议的对话连接 。这个时候的C机器还是在响应攻击者A机器发送的SYN数据 。
TCP协议栈的弱点:TCP连接的资源消耗,其中包括:数据包信息、条件状态、序列号等 。通过故意不完成建立连接所需要的三次握手过程,造成连接一方的资源耗尽 。
通过攻击者有意的不完成建立连接所需要的三次握手的全过程,从而造成了C机器的资源耗尽 。序列号的可猜测性,目标主机应答连接请求时返回的SYN/ACK的序列号时可猜测的 。(早期TCP协议栈,具体的可以参见1981年出的关于TCP雏形的RFC793文档)
TCP头结构
TCP协议头最少20个字节,包括以下的区域(由于翻译不禁相同,文章中给出相应的英文单词):
TCP源端口(Source Port):16位的源端口其中包含初始化通信的端口 。源端口和源IP地址的作用是标示报问的返回地址 。

推荐阅读