您的位置:首页 > 理论基础 > 计算机网络

tcp的建立和终止(三次握手和四次挥手)

2017-02-07 22:58 441 查看
    关于tcp的建立和终止(三次握手和四次挥手)的文章有很多,写这篇文章只是为了自己能更好的理解tcp协议

,有助于发现自己理解错误的地方,有不正确的地方,请大家指出。


一. 三次握手



  




(1)server做好client连接自己的准备(建立socket,bind绑定端口,listen监听连接),我们称之为被动打开。

(2)client 调用connect连接server,此时客户端会发送一个int型SYN:j(同步编号),client进入SYN_SENT状态

(3)服务器收到客户端的请求后,会发送一个ACK:j+1(相应客户端的请求),同时自己也会发送一个SYN:k,进入SYN_RCVD状态

(4)客户端收到服务器的应答和SYN后发送ACK:k+1进入ESTABLISHED状态,服务器收到后检验 ACK编号等于k+1进入ESTABLISHED状态后建立连接。

二.四次挥手



  



    建立一个连接需要三次握手,而终止一个连接要经过 4次握手。这由TCP的半关闭(half-closed)造成的。既然一个TCP连接是全双工(即数据在两个方向上能同时传递) ,因此每个方向必须单独地进行关闭。这原则就是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向连接。当一端收到一个FIN,它必须通知应用层另一端几经终止了那个方向的数据传送。发送FIN通常是应用层进行关闭的结果。收到一个FIN只意味着在这一方向上没有数据流动。

    (1)client调用close主动关闭连接,发送一个FIN:m(完成编号)表示数据发送完成,进入FIN_WAIT_1状态

    (2)server收到client的关闭请求后(被动关闭),tcp关闭client->server的数据通道,并发送ACK:m+1表示收到关闭请求进入CLOSE_WAIT状态,client收到ACK后进入FIN_WAIT_2状态

    (3)一段时间后(这里server端虽然关闭了接收端但是还可能有未发送玩的数据(server->client),因此server会继续发送未发送玩的数据),等数据发送完之后,server会再向client发送一个FIN:n,进入LAST_ACK状态

    (4)接受到server的fin之后,tcp关闭server->client的数据通道,并发送ACK:n+1,client进入TIME_WAIT状态,最后server收到ack后tcp close进入CLOSED状态。

这里我们要注意的是TIME_WAIT和CLOSE_WAIT.

    首先TIME_WAIT是主动关闭连接的一方保持的状态,对于服务器来说他本身也可能作为client连接其他的serve,在这个过程中可能由于网络波动或者主动关闭连接,从而进入TIME_WAIT的状态,然后在保持这个状态2MSL(max segment lifetime)时间之后,彻底关闭回收资源。为什么要这么做?  

    1.防止上一次连接中的包,迷路后重新出现,影响新连接(经过2MSL,上一次连接中所有的重复包都会消失)

    2. 可靠的关闭TCP连接。在主动关闭方发送的最后一个 ack ,有可能丢失,这时被动方会重新发fin, 如果这时主动方处于 CLOSED 状态 ,就会发送RST reset。所以主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。另外这么设计TIME_WAIT 会定时的回收资源,并不会占用很大资源的,除非短时间内接受大量请求或者受到攻击。在TIME_WAIT状态时两段的端口不能使用,要等到2MSL才能继续使用,在此期间任何迟到的报文端都将被丢弃,因此如果我们在此期间要马上重连就要通过设置SO_REUSEADDR来达到此目的。

    其次是CLOSE_WAIT,这种情况下一半是被动关闭方关闭了连接但没有释放连接造成的,大多数情况下是服务器程序错误造成的。更多关于这两种状态的信息请看下面的链接:点击打开链接
最后献上一张tcp状态转化图




     
这个对照上面的应该很好理解,不在叙述。



    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: