TCP三次握手
- TCP标志位
TCP在其协议头中使用大量的标志位或者说1位(bit)布尔域来控制连接状态,一个包中有可以设置多个标志位。
TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:
- TCP标志位,有6种标示:
SYN表示建立连接,
FIN表示关闭连接,
ACK表示响应,
PSH表示有 DATA数据传输,
RST表示连接重置。
URG(紧急)
我们常用的是以下三个标志位
序号:表示发送的数据字节流,确保TCP传输有序,对每个字节编号
确认序号:发送方期待接收的下一序列号,接收成功后的数据字节序列号加 1。只有ACK=1时才有效。
- SYN - 创建一个连接 确认序号的标志,ACK=1表示确认号有效,ACK=0表示报文不含确认序号信息
- FIN - 终结一个连接 结束标志,用于释放连接,为1表示关闭本方数据流
- ACK - 确认接收到的数据 ACK=1表示确认号有效,ACK=0表示报文不含确认序号信息
- 三次握手
所谓三次握手是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。
第一次握手:主机客户端发送位码为 syn=1,随机产生seq number=1234567的数据包到服务器,主机服务器由syn=1知道,客户端要求建立联机;
第二次握手:主机服务器收到请求后要确认联机信息,向客户端发送ack number=(主机客户端的seq+1),syn=1,ack=1,随机产生seq=7654321的包
第三次握手:主机客户端收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机服务器收到后确认seq值与ack=1则连接建立成功。
完成三次握手,主机客户端与主机服务器开始传送数据。
- 四次挥手
第一次挥手:客户端发送了一个FIN报文,报文中会指定一个序列号,此时客户端状态为FIN_WAIT1状态
第二次挥手:服务端收到FIN之后,会发送ACK报文,并且把客户端的序列号+1作为ACK报文的序列号值,表明已经收到客户端的报文了,此时服务端处于CLOSE_Wait状态
第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发给FIN报文,且指定一个序列号,此时服务端处于LAST_ACK状态。
第四次挥手:客户端收到FIN之后,一样发送一份ACK报文作为应答,并且把服务器的序列号+1作为自己的ACK报文的序列号值,此时客户端处于TIME_wait状态,注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,才进入CLOSED状态。服务器只要收到了客户端发出的确认,立即进入CLOSED状态。