TCP的三次握手/四次挥手

TCP的三次握手/四次挥手

建立TCP连接的三次握手

TCP连接的三次握手分别为:

  • 客户端发送一个带SYN标志的TCP报文到服务器,表示告诉服务器我想建立一个连接。
  • 服务器收到客户端的带SYN标志的文后,就给客户端回复一个带ACK标志和带SYN标志的报文,ACK表示回复客户端:OK,我准备好了建立连接;然后SYN表示服务器又问客户端:你准备好建立连接了么?
  • 然后客户端又要发送一个带ACK标志的TCP报文,回答服务器说:我准备好了。
    然后一个TCP连接就建立起来了。

SYN相当于询问的标志,ACK相当于回复的标志。
这里有一个问题:为什么最后客户端还要发送一次确认呢?这主要是防止已经失效了的请求报文段突然又传到了服务器,因而产生错误。
“已经失效了的请求报文段”大致是这样产生的:A发出第一个连接请求报文段并没有丢失,在一些网络结点上面长时间滞留,以致延误到连接释放以后的某个时间才到达B。本来这是一个早已失效的报文段。但B收到这个失效的报文段后,就误以为是A发出的又一次新的连接请求,于是就向A发出确认报文段,同意建立连接,如果不采用三次握手,那么只要B发出确认后,新的连接就建立了。

简化理解:

C问:我想和你建立连接可以吗?(SYN标志的报文)

S答问:可以啊!(ACK标志的响应报文)   那你现在准备好了吗?(SYN标志的报文) 

C答:准备好了! (ACK标志的响应报文)

三次: 客户端请求报文    服务端确认询问报文    客户端确认报文

释放TCP连接的四次挥手

由于TCP是全双工的,所以在释放TCP连接时,要双方都得单独关闭。意思就是服务器和客户端都要释放连接。原则是某一方主动关闭时,先发一个FIN报文来表示终止这个方向的连接,收到一个FIN报文就意味着这个方向不再有数据流动,但另一个方向仍可以有数据流动,当这一个方向也发送了FIN报文后,那么这一方的连接也可以关闭了。
释放TCP连接相对于要复杂点,具体释放TCP连接的四次挥手流程如下:

  • A发送一个FIN给B,说:我这边要传给你的数据已经传完了,我要关闭连接了。A进入FIN-WAIT-1状态,等待B确认。
  • B收到了上面的FIN报文后,回复一个ACK报文说:OK。A就关闭了A->B的连接。但是此时B还能给A发送数据,A也能接收B发来的数据。(此时A收到确认后进入FIN-WAIT-2状态。TCP处于半关闭状态)
  • 当B也发送完数据后,就给A发送一个FIN报文说:我这边要传给你的数据也已经传完了,我也要关闭连接了。(B进入LAST-ACK状态,等待A确认)
  • A收到了上面的报文后,回复一个ACK报文说:OK。A进入TIME-WAIT状态。现在TCP连接还没有释放掉,然后经过等待计时器(TIME-WAIT timer)设置的时间2MSL后,A才进入CLOSE状态。

然后,当A撤销相应的传输控制块TCB后,一个TCP连接就关闭了。

简化理解:

C:我要关闭了,发送询问报文。然后开始等待。。。

S:收到。 然后C就关闭了C ----> S的连接。

S: 我要关闭了,发送询问报文。然后开始等待。。。

C:收到。然后S就关闭了S ---> C的连接。      TCP连接关闭。

      但TCP连接还没有释放掉,然后经过等待计时器(TIME-WAIT timer)设置的时间2MSL后,C才进入CLOSE状态。

转载自:http://www.jianshu.com/p/1f512687ea19

原文地址:https://www.cnblogs.com/njqa/p/6419632.html