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