TCP三次握手/四次挥手
TCP的
三次握手
和四次挥手
实质就是TCP通信的连接和断开。
三次握手
- 任何基于TCP的应用,在发送数据之前,都需要由TCP进行三次握手进行连接
握手流程: |
---|
三次握手原理
- 第1次握手:客户端发送一个带有SYN(synchronize)标志的数据包给服务端
- 详细:客户端发送建立连接的请求,请求中包含seq(序列号)和SYN,此
seq是发送端随即生成
。SYN字段为1标识需要建立TCP连接**(syn=1,seq=x,x为随机值)。**
- 详细:客户端发送建立连接的请求,请求中包含seq(序列号)和SYN,此
- 第2次握手:服务端接收成功后,回传一个带有SYN/ACK标志的数据包传递确认信息,表示我收到了
- 详细:服务端回复客户端的请求,回复的报文包含syn,seq,ack,此seq是
回复端
随机生成,syn置为1表示需要建立一个连接,并生成ack字段,ack的数值为seq+1,确认收到客户端发来的信息。(syn=1,seq=y,ack=x+1)。
- 详细:服务端回复客户端的请求,回复的报文包含syn,seq,ack,此seq是
- 第3次握手:客户端再回传一个带有ACK标志的数据包,表示我知道了,握手结束
- 客户端收到服务端发送的TCP建立验证请求后,会使自己的序列号加1表示,并且再次回复ACK验证请求,在服务端发过来的seq上加1进行回复。(SYN=1,ACK=y+1,seq=x+1)。
- 其中:SYN标志位数置1,表示发起一个连接;ACK表示序列号有效,确认收到消息。
四次挥手
TCP连接是全双工,因此每个方向都必须单独进行关闭。只要一方发送完数据就能发送FIN来终止该方向的连接;收到一个FIN意味着该方向没有数据流动;先关闭的一方为执行主动关闭,而另一方执行被动关闭
四次挥手原理
- 第1次挥手:客户端发送一个FIN,用来关闭客户端到服务端的数据传送,客户端进入FIN_WAIT_1状态
- 客户端报文发送断开请求,请求中包含seq序列号、fin,fin为1表示需要断开tcp连接。(FIN=1,seq=x,x由客户端随机生成)
- 第2次挥手:服务端收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),服务端进入CLOSE_WAIT状态
- 服务端回复客户端的断开请求,回复的报文中包含ack、seq、fin,ack为ack+1确认收到客户端发来的信息,seq随机生成,fin置为1表需要断开连接**(FIN=1,ACK=x+1,seq=y,y由服务端随机生成)**
- 第3次挥手:服务端发送一个FIN,用来关闭服务端到客户端的数据传送,服务端进入LAST_ACK状态
- 服务端回复完客户端的断开请求后,不会马上进行TCCP连接的断开,会先确保断开前,所有传输的数据是否已经传输完毕,一旦确认传输完毕,会讲回复报文的fin置为1,并产生随机seq。(FIN=1,ACK=x+1,seq=z,z由服务端随机生成)
- 第4次挥手:客户端收到FIN后,客户端t进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,服务端进入CLOSED状态,完成四次挥手
- 客户端收到服务端的断开请求,回复服务端的断开请求,包含随机seq和ack,ack会在断开请求的seq基础+1,从而完成服务端请求的验证回复。(FIN=1,ACK=z+1,seq=h,h为客户端随机生成)
- 其中:FIN标志位数置1,表示断开TCP连接。