TCP协议建立连接的三次握手四次挥手机制

   1,三次握手建立连接

    初始状态:服务器调用LISTEN原语。由CLOSED状态进入被动等待连接请求状态。

           第一次握手:此时客户执行一个CONNECT原语,同时指定一下参数,我要连接的IP地址呀,端口呀,我愿意接受的最大TCP分段长度呀,等等各种必需的信息,放在一个TCP数据段上发送出去,这个数据段上的SYN=X。此时客户端进入SYN_SENT状态【应用程序已经打开连接】

         第二次握手:此时服务端已执行LISTEN状态,即进入监听状态,发现了SYN=X的TCP数据段,于是他说,好,我收到了,给你发一个确认的ACK=X+1(表示我收到了你的SYN=X的TCP数据段),但是我服务器端怎么知道我的确认信息会被你收到呢,于是我这个TCP数据段也加个SYN=Y。把这个TCP段(ACK=X+1,SYN=Y)的发给客户端,此时服务端进入SYN _RCVD状态【一个连接请求已经到达,等待ACK】

       第三次握手:客户端收到服务端发来的TCP数据段(ACK=X+1,SYN=Y),此时客户端就明白,好,现在我知道我之前发的ACK=X的已经被你收到了。我发一个ACK=Y+1的TCP数据段告诉你我收到了,同时客户端进入ESTABLISHED状态,当服务端收到客户端发来的ACK=Y+1的TCP数据段时,好的,现在,服务段也进入ESTABLISHED状态。三次握手完成。TCP连接建立。

   2.四次挥手TCP连接的释放

    把客户端和服务器端之间这条全双工的信道看做两条相互独立单工的信道,当一端需要断开连接时发送一个设置了Fin的TCP段,当对方收到时会返回一个ACK,断开这条单向连接,需要断开的那一端停止发送数据。如此需要四次挥手。但由于当收到FIN发送ACK的时候会顺便捎带一条FIN2,所以其实只发送了三条数据段。此时会有所谓的两军队问题出现。解决办法是:当我发出Fin后在两倍最大分组生存期内应答仍未到达时直接释放这个方向的连接。另一方会慢慢注意到这一侧已经不再应答时也会关掉。

               关于 释放TCP连接具体的实现细节

              假设客户端要释放连接执行CLOSE原语,进入FIN_WAIT1状态,发送fin1,服务器端收到fin1时,发送一个ACK1确认收到并捎带一个fin2,服务器端进入 CLOSE WAIT 状态。

客户端收到fin2时进入FIN_WAIT2状态,并发送一个对FIn2的确认ACK2;当服务器收到ACK2时进入LAST_WAIT状态.等待完一个分组的最大生存时间。进入CLOSED状态。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值