(1)客户机TCP首先向服务器的TCP发送一个连接请求报文段。这个特殊的报文段中不含应用层数据,其首部中的SYN标志位被置为1.另外,客户机会随机选择一个起始序号seq=x(随机,连接请求报文不携带数据,但要消耗一个序号)。
(2)服务器的TCP收到连接请求报文段之后,如果同意建立连接,就向客户机发回确认,并为该TCP连接分配TCP缓存和变量。在确认报文段中,SYN和ACK位都被置为1,确认号字段的值为x+1,并且服务器随机产生起始序号seq=y(随机),确认报文段同样不包含应用层数据。
(3)当客户机收到确认报文段之后,还要向服务器给出确认,并且也要给连接分配缓存和变量。这个报文段的ACK标志位被置为1,序号字段为x+1,确认号字段ack=y+1,该报文段可以携带数据,若不懈怠数据则不消耗序号。
成功进行以上三步后,就建立了TCP连接,接下来就可以传送应用层数据。TCP提供的是全双工通信,因此通信双方的应用进程在任何时候都能发送数据。
注:服务器资源是在完成第二次握手时分配的,而客户端是在完成第三次握手时分配的,因此,这使得服务器易于受到SYN洪泛攻击,解决方案可以使用 SYN COOKIES 来处理
连接示意图如下: