三次握手针对于TCP的连接(因TCP连接是可靠的连接)而采用的。
名词解释:
针对本文中的用到的一些名词,作如下解释:
SYN包:同步序列号,他是TCP连接的第一个数据包,非常小,此包表明发送方已做好会话准备,只有发送服务请求方才发送SYN包
ACK包:应答字段
具体描述:
下面是对TCP三个握手建立一个连接的具体描述:
第一次握手:建立连接时,客户端发送syn包到服务器,并将客户端状态置为SYN)SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,确认客户端的syn,同时,服务器端返回给客户端一个syn包,即此时发送给客户端的是:SYN包(服务器端syn包)+ACK包(接收到客户端的syn包确认包),此时,服务器端修改状态为SYN_RECV状态;
第三次握手:客户端收到服务器端的SYN+ACK包,向服务器发送确认包ACK,此包发送完成后,客户端和服务器端进入ESTABLISHED状态,完成三次握手。
整个过程如下图所示:
![TCP三次握手协议 - 断鸿零雁 - 断鸿零雁的博客 TCP三次握手协议 - 断鸿零雁 - 断鸿零雁的博客](http://img8.ph.126.net/0ge87LBaMKCznnUG6M1Y1g==/6598204462656183668.jpg)
状态说明:
未连接队列:在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包开设一个条目,该条目表明服务器已收到SYN包,并向客户端发出确认,正在等待客户端确认包,这些条目所标识的连接在服务器处理SYN_RECV状态,当服务器收到客户端的确认包后,删除该条目,服务器进入ESTABLISHED状态。
BACKLOG参数:表示未连接队列的最大容纳数目。
SYN-ACK重传次数:服务器端发送完SYN-ACK包后,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户端的确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意:每次重传等待的时间不一定相同。
半连接存活时间:半连接队列的条目存活的最长时间,即服务器从收到客户端发来的SYN包到确认这个报文无效的最长时间,改时间值是所有重传请求包的最长等待时间总和。这个时间也被称为TIMEOUT时间或者SYN_RECV存活时间。