TCP/IP协议握手过程详解

1,创建链接

       在TCP/IP协议中,TCP协议提供可靠的链接服务,采用三次握手创建一个链接,如图1所示。服务器

(1)第一次握手:创建链接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND状态,等待服务器B确认。网络

(2)第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=j+1),同时本身也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。开发

(3)第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,客户端A和服务器B进入ESTABLISHED状态,完成三次握手。同步

 

  完成三次握手,客户端与服务器开始传送数据.请求

 

 

图1 TCP三次握手创建链接im

2,关闭链接

        因为TCP链接是全双工的,所以每一个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的链接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP链接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另外一方执行被动关闭。数据

(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送(报文段4)。客户端

(2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN同样,一个FIN将占用一个序号。协议

(3)服务器B关闭与客户端A的链接,发送一个FIN给客户端A(报文段6)。margin

(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)。

 

   TCP采用四次挥手关闭链接如图2所示。

 

图2  TCP四次挥手关闭链接

3,问题

1.为何创建链接协议是三次握手,而关闭链接倒是四次握手呢?

 这是由于服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它能够把ACK和SYN(ACK起应答做用,而SYN起同步做用)放在一个报文里来发送。但关闭链接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你全部的数据都所有发送给对方了,因此你能够未必会立刻会关闭SOCKET,也即你可能还须要发送一些数据给对方以后,再发送FIN报文给对方来表示你赞成如今能够关闭链接了,因此它这里的ACK报文和FIN报文多数状况下都是分开发送的。

 

2.为何TIME_WAIT状态还须要等2MSL后才能返回到CLOSED状态?

这是由于虽然双方都赞成关闭链接了,并且握手的4个报文也都协调和发送完毕,按理能够直接回到CLOSED状态(就比如从SYN_SEND状态到ESTABLISH状态那样);可是由于咱们必需要假想网络是不可靠的,你没法保证你最后发送的ACK报文会必定被对方收到,所以对方处于LAST_ACK状态下的SOCKET可能会由于超时未收到ACK报文,而重发FIN报文,因此这个TIME_WAIT状态的做用就是用来重发可能丢失的ACK报文。

 

4TCP正常创建和关闭的状态变化

TCP链接的创建能够简单的称为三次握手,而链接的停止则能够叫作 四次握手。

相关文章
相关标签/搜索