1.三次握手
假设运行在一台主机(客户)上的一个进程想与另一台主机(服务器)上的一个进程建立一条连接,客户应用进程首先通知客户TCP,它想建立一个与服务器上某个进程之间的连接,客户中TCP会用以下方式(三次握手)与服务器中的TCP建立一条TCP连接:
第一次握手:
(1) 客户端的TCP首先向服务器端的TCP发送一个特殊的TCP报文,该报文中不包含应用层数据。但是在报文的首部中的一个标志位(SYN比特)被置为1,因此,这个特殊报文被 称为 SYN报文。
(2)客户端会随机选择一个初始序号(client_isn),并将此编号放置于该起始的TCP SYN报文段的序号字段中。
(3)该报文段会被封装在一个IP数据报中,并发送给客户端服务器。
第二次握手:
(1)当服务器收到包含TCP SYN 报文段的IP数据包时,服务器会从该数据报中提取出TCP SYN报文段,为该TCP连接分配TCP缓存和变量,并向客户端TCP发送允许连接的报文段。
(2)这个允许连接的报文段也不包含应用层数据,但是在报文段的首部包含了3个重要信息,首先SYN比特为置为1,其次该TCP报文段首部的信号(client_isn)被置为(client_isn+1),最后服务器选择自己的初始序号(server_isn),并将其放到TCP报文段首部的序号字段中。允许连接的报文段有时被称为SYNACK。
第三次握手:
(1)在收到SYNACK后,客户端也要该连接分配缓存和变量,客户主机向服务器发送另外一段报文,对服务器的允许连接的报文段进行确认。
(2)客户端在发送报文时将(server_isn+1)放置到TCP报文段首部的确认字段中完成此项工作,因为已经建立了连接,此时SYN被置为0。
注:在完成三次握手的第三次之前分配这些缓存和变量,使得TCP易于收到SYN洪泛的拒绝服务器攻击,详情见:http://www.cnblogs.com/xyzyj/p/7345701.html。
2.四次挥手
参与一条TCP连接的两个进程中的任何一个都能终止该连接,当连接结束后,主机中的 “资源”(缓存和变量)将被释放,假如客户端将要终止连接,会通过下面的过程(四次挥手):
第一次挥手:客户应用进程发出一个关闭连接的命令,这会引起客户TCP向服务器进程发送一个特殊的TCP报文段,这个报文段让其首部中的一个标志位即FIN比特被置为1。
第二次挥手:服务器收到该报文段后,就向发送一个确认报文段。
第三次挥手:服务器发送自己终止的报文段,其FIN被置为1。
第四次挥手:客户端对服务器终止报文段进行确认。此时在两台主机上用于该连接的资源都被释放了。
客户TCP状态
在一个TCP连接的声明周期内,运行在每台主机中的TCP协议在各种TCP状态之间迁移,如下图:
服务器端TCP状态