TCP协议三次握手和四次挥手

2018-04-04

前戏

丢图。

正文

三次握手

在TCP协议中,为了在客户端与服务器之间传输数据,需要在二者之间建立连接。而这个连接分为三步,也就是三次握手。

第一次握手

客户端向服务器发送请求报文段(SYN=1,ACK=0,seq=x。其中SYN=1,ACK=0表示该报文段是一个连接请求报文,x为本次TCP通信的字节流的初始序号),请求发送后客户端进入SYN-SENT状态。

第二次握手

服务器接收到请求报文后如果同意连接会返回一个应答(SYN=1,ACK=1,seq=y。其中SYN=1,ACK=1表示该报文段为连接同意的应答报文,seq=y表示服务端作为发送者时,发送字节流的初始序号),应答发送后服务器进入SYN-RCVD状态。

第三次握手

客户端接收到同意连接的应答后,还需要发送一个确认报文段,表示已接收到连接同意的应答(ACK=1,seq=x+1,ack=y+1),这个报文发送后客户端便进入ESTABLISHED状态,服务器接收到报文后也进入ESTABLISHED状态,此时连接建立完成。

思考:为什么是三次握手而不是两次或四次?

如果客户端向服务器发送的连接请求丢失,那么在等待应答超时后就会再次发送新的请求。如果只有两次握手可能会导致服务器又接收到丢失的请求而一直等待连接浪费资源。第三次握手就是为了确认客户端是否收到应答,如果没人应答超时后就取消等待。

三次握手已经足够确认连接双方的状态了,不需要第四次握手。

四次挥手

TCP释放连接需要四步,也就是四次挥手。

第一次挥手

A向B发送连接释放请求(FIN=1,seq=u。FIN=1表示该报文段是一个连接释放请求,seq=u,u-1是A向B发送的最后一个字节的序号),此时A进入FIN-WAIT-1状态。

第二次挥手

B收到连接释放请求后,通知相应的应用程序连接已释放(ACK=1,seq=v,ack=u+1),并进入CLOSE-WAIT状态。A收到应答,进入FIN-WAIT-2状态。

第三次挥手

发完所有数据后,B向A发送连接释放请求(FIN=1,ACK=1,seq=w,ack=u+1),并进入LAST-ACK状态。

第四次挥手

A收到释放请求后,向B发送确认应答,此时A进入TIME-WAIT状态。该状态会持续2MSL时间,若该时间段内没有B的重发请求的话,就进入CLOSED状态,撤销TCB。当B收到确认应答后,也便进入CLOSED状态,撤销TCB。

思考:为什么建立连接只需要三次握手而断开连接需要四次挥手?

连接释放的时候,如果A向B提出了释放请求,B接收到请求后进行确认,那么A到B的连接就已经释放了。此时B还可以向A发送数据,A会直接接收。等到B的数据也发送完了之后,再向A发送连接释放请求。A收到释放请求后再向B发送终端确认,那么B到A的连接也已经释放完毕。

所以握手需要三次而挥手需要四次的原因主要是建立连接和释放连接的过程不一样,二者之间没有直接的关系。

结语

  • 写结语了吗?
  • 没有哦。