TCP 3次握手,4次断开规则的详细描述

1.TCP 三次握手的过程:

 
假设客户端向服务器发起 TCP 连接。


 
1. 1第一次握手:

     客户端的 TCP 程序首先向服务器的 TCP 程序发送一个 TCP 报文。这个报文不包含数据,且它的 SYN 标志位被置为 1,表示这是一条建立连接的 TCP 报文段,因此这个报文段也被称为 SYN 报文段。客户端的 TCP 程序随机选择一个序号作为客户端报文的初始序号(假设序号为 client_isn),放入这个报文段的序号部分。这个报文段由运输层传递到网络层后,被封装在一个 IP 数据报中发往服务器。


1.2 第二次握手:

    包含 SYN 报文段的 IP 数据报被服务器接收,服务器的网络层将 SYN 数据报抽取出来,交给运输层,同时服务器为该 TCP 连接分配资源(包括发送缓存、接收缓存和变量等),并向客户发送允许连接的 TCP 报文段。这条允许连接的报文段不包含数据,SYN 标志位也被置为 1,同时它的 ACK 标志位也被置为 1,表示它是 SYN 报文段的确认报文,所以这条允许连接的报文段也被称为 SYNACK 报文段。服务器随机选择一个序号,作为服务器报文段的初始序号(假设称为 server_isn),并将其放入 SYNACK 报文段的序号部分,同时确认号字段被设置为 client_isn + 1(SYN 报文段的序号 + 1)。这个报文段可以解释为服务器向客户端说:“我收到了你的连接请求,我允许你连接,我的初始序号是 server_isn”。


1.3 第三次握手:

   当客户端接收到 SYNACK 报文段后,它也将为 TCP 连接分配资源(缓存和变量),同时生成一条 SYNACK 报文段的确认报文,并发送给服务器。由于经过上面两个步骤,已经算是建立了连接,所以这次的 SYN 标志位将被置为 0,而不是 1(ACK 标志位是 1)。同时,这条报文段的序号被设置为 client_isn + 1(第一条客户报文的序号是 client_isn,而这是它的下一条,所以 + 1),而确认序号被设置为 server_isn + 1(第一条服务器报文的序号是 server_isn,客户端成功接收,所以期望服务器下一次发送 server_isn + 1)。和上面两条报文不同,第三条报文可以携带数据,比如 HTTP 的请求就是在 TCP 的第三次握手报文中发送到服务器的。
 
经过上面这三个步骤,TCP 连接就算正式建立完毕,客户端和服务器可以相互发送数据了。


 
2.TCP 四次断开的过程:


 
由于 TCP 连接是全双工的,因此每个方向都必须单独进行关闭。


 
2.1 第一次断开:

    客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部的 FIN 标志位被置为 1,其序列号为 seq = u(等于前面已经传送过来的数据的最后一个字节的序号加 1),此时,客户端进入 FIN-WAIT-1(终止等待 1)状态。TCP 规定,FIN 报文段即使不携带数据,也要消耗一个序号。


2.2 第二次断开:

    服务器收到连接释放报文,发出确认报文,ACK 标志位为 1,ack = u + 1,并且带上自己的序列号 seq = v,此时,服务端就进入了 CLOSE-WAIT(关闭等待)状态。TCP 服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个 CLOSE-WAIT 状态持续的时间。


2. 3第三次断开:

     服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN 标志位为 1,ack = u + 1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为 seq = w,此时,服务器就进入了 LAST-ACK(最后确认)状态,等待客户端的确认。


2.4第四次断开:

     客户端收到服务器的连接释放报文后,必须发出确认,ACK 标志位为 1,ack = w + 1,而自己的序列号是 seq = u + 1,此时,客户端就进入了 TIME-WAIT(时间等待)状态。注意此时 TCP 连接还没有释放,必须经过 2×MSL(最长报文段寿命)的时间后,当客户端撤销相应的 TCB 后,才进入 CLOSED 状态。服务器只要收到了客户端发出的确认,立即进入 CLOSED 状态。同样,撤销 TCB 后,就结束了这次的 TCP 连接。可以看到,服务器结束 TCP 连接的时间要比客户端早一些。


 
3.为什么是三次握手而不是两次:


 
     两次握手是必要的,第一次握手客户端将 SYN 报文发送到服务器,服务器接收到报文后,可确认客户端到服务器是可达的;服务器向客户端发送响应的 SYNACK 报文,客户端接收到后,可确认服务器到客户端也是可达的。但这还不够,TCP 客户端和服务器的握手过程不仅是确认互相可达,更重要的是一个同步的过程,SYN 即同步(synchronize)的缩写。
 
     TCP 报文的初始序号不是从 0 开始,而是一个随机的序号,所谓的同步就是 TCP 客户端和服务器互相同步初始序号的过程。第一次握手客户端发送 SYN 报文,将自己的初始序号发送到了服务器;服务器接收到后,向客户端发送 SYNACK 报文段,告诉客户端已收到其初始序号,同时在这个报文段中带上自己的初始序号。此时第三次握手的作用就是客户端在告诉服务器,自己已收到它的初始序号,完成了同步,可以开始相互传输数据了。
 
     若没有第三次握手,服务器将无法保证客户端接收到了自己的 SYNACK 报文段。若此时 SYNACK 报文段丢失,客户端不知道服务器的初始序号,将无法处理之后到达客户端的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值