本文将会介绍如何建立和拆除一条TCP连接,TCP的连接会显著的增加人们感受到的时延(尤其是在Web冲浪时)。同时一些常见的网络攻击
SYN洪范攻击
利用了TCP连接管理的弱点。
假定运行一台主机(客户)上的一个进程想和另一台主机(服务器上)的一个进程建立一条连接;客户端进程会首先通知客户端TCP,建立一个与服务器上层某个进程之间的连接。具体步骤如下:
TCP连接管理
- 第一步:客户端发送SYN
- 第二步:服务端接收TCP SYN
- 第三步:客户端接收SYNACK,并且分配缓存和变量
第一步:客户端发送SYN
首先,客户端TCP会首先向服务端的TCP发送一个特殊的TCP报文段
,该报文段中不包含应用层的数据
。在保温段的首部中的一个标志位
(也就是SYN比特
)会被置1。因此,该特殊报文段被称之为SYN报文段
。
另外,客户会随机选一个初始序号(client_isn)
,并且把该编号放置于起始的TCP SYN
报文段的序号字段中。该报文段会被封装在一个IP数据报
中,并且发送给服务器。
第二步:服务端接收TCP SYN
一旦包含TCP SYN
的报文段IP数据报到达服务器主机(假设确定到达了),服务器会从这个数据报中提取TCP SYN
报文段,并且给该TCP连接分配TCP缓存和变量
,并且向客户端发送允许连接的报文段。
在完成三次握手的第三步之前分配这些缓存和变量,会让TCP容易受到称之为
SYN
的洪泛的拒绝服务攻击。
这些允许连接的报文段不应该包含应用层的数据,不过,在报文段的首部却包含了三个重要的信息:
- 首先,
SYN比特
会被置1。 - 其次,该TCP报文段的首部的确认号字段被重置为
client_isn + 1
。 - 最后,服务器选择自己的初始序号
server_isn
,并且将其放置到TCP报文段首部的序号字段中。
这个允许连接的报文段实际上表明了:我接受了你发起建立的SYN分组,该分组带有初始序号的client_isn,服务器同意建立该连接,服务器初始序号server_isn
,该允许连接的报文段称之为SYNACK报文段
(SYNACK segment)。
第三步:客户端接收SYNACK,并且分配缓存和变量
在接受了SYNACK
报文段之后,客户也要给该连接分配缓存和变量。客户主机则向服务器发送了另一个报文段,最后一个报文段对服务器的允许连接的报文段进行了确认(该客户端通过把server_isn + 1
放置到TCP报文段首部的确认字段中完成)。
由于连接已经建立,所以该SYN比特重置0
,该三次握手的第三个阶段可以在报文段负载中携带客户到服务器的数据。
假设客户端要关闭连接,则会引起客户TCP向服务器进程发送一个特殊的TCP报文段。该特殊的报文段让其首部的一个标志位也就是FIN比特被设置1
。
当服务器接收到该报文段之后,就像发送方回送一个确认报文段
,其FIN被设置1
,最后,该客户对这个服务器的终止保温段进行了确认。此时,两台主机上用于连接的所有的资源均被释放。
在一个TCP连接的生命周期中,运行在每一台主机的TCP协议在各种TCP状态
,如下图表明客户端TCP会经历一系列的典型TCP状态。
客户的TCP开始处于closed关闭态
。客户的应用程序发起了一个新的TCP连接。引起了客户端的TCP向服务器的发送了一个SYN报文段
。在发送过SYN
报文段之后,客户端的TCP就进入了SYN-SENT
状态;其将会等待服务的TCP对客户端的发送报文段进行确认并且SYN比特置1
的一个报文段。
在收到这样的一个报文段之后,客户TCP进入established已建立状态
,当处于该状态时,TCP客户端就能够发送和接收包含有效载荷(也就是应用层产生的数据)的TCP报文段了。