假设运行在一台主机(客户)上的一个进程想与另一台主机(服务器)上的一个进程建立一条连接,客户应用进程首先通知客户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。