TCP连接的建立与终止
这里详细介绍了tcp连接和关闭的过程,尤其要掌握三次握手的过程,这是SYN攻击的原理。
三次握手:
下列步骤建立一个TCP连接:
服务器必须准备好接受外来的连接。这通过调用socket,bind,listen函数来完成,即被动打开(Passive open)。
客户通过conmect进行主动打开(active open)。这引起客户TCP发送一个SYN分节(表示同步),他告诉服务器客户将在待建立的连接中发送的数据的初始序列号。一般情况下syn分节不携带数据。他只包含一个IP头,一个TCP头,及可能携带的TCP选项。
服务器必须确认客户的Syn,同时自己也得发送一个SYN分节,他含有服务器将在同一连接中发送的数据的初始序列号。服务器以单个分节向客户发送SYN和对客户SYN的ACK。
客户必须确认服务器的SYN。
连接至少需要三个分组,因此称做三次握手(three-way handshake)。
如果客户的初始序列号为J,服务器的初始序列号为K。在ACK里的确认号为发送这个ACK的一方所期待的对方的下一个序列号。因为SYN只占一个字节的序列号空间,所以每一个SYN的ACK中的确认号都是相应的初始序列号加一。类似的,每一个FIN的ACK中的确认号为FIN的序列号加一。
TCP选项
每一个SYN可以含有若干个TCP选项。通常使用的选项有:
MSS选项(MAX segment size )。
窗口规模选项。
时间戳选项。
TCP连接终止
TCP的连接需要用三个分节建立一个连接,终止一个连接则需要四个分节!
某个应用进程首先调用close,我们称为主动关闭(active close)。这一端的Tcp于是发送一个FIN分节,表示数据发送完毕。
接受到FIN的另一端执行passive close。这个FIN由TCP确认。他的接受也作为文件结束符传送给接受方应用进程,因为FIN意味着应用进程在此连接上再也接受不到额外数据。
一段时间后,接受到文件结束符的应用进程将调用close,关闭他的套接口。这导致他的TCP也发送一个FIN。
接收到这个FIN的原发送方TCP对他进行确认。
因为每个方向都需要有一个FIN和ACK,所以一般需要四个分节。
有时候,步骤1的FIN随数据一起发送。
执行被动关闭的方在步骤2,3时的FIN和ACK也可以合并为一个分节。
当进程终止时,所有打开的描述字都将关闭,此时仍然打开的TCP连接上也会发出一个FIN。
通常是由客户执行主动关闭,但HTTP是服务器执行主动关闭。