TCP为什么要三次握手(三次数据传输)而不是两次?TCP为什么要释放连接?

  • TCP的运输连接

    TCP的运输连接是有三个阶段:建立连接、数据传送和连接释放。
 

  • TCP的连接过程

 假设A就是客户程序,B就是TCP服务器程序

第一次握手:A的TCP客户端给服务器端TCP会发送一个特殊的TCP数据段,其是不包含应用层数据的,单它需要一个数据段头部的一个标记字段,SYN=1(该信号是指请求和服务器端计算机的序号同步),并会发送一个初始顺序号。

第二次握手:B收到A的连接请求报文后,如果同意就会向A回复确认信息。SYN依旧为1,此事确认信息seq+1(意思应该是我收到了,我确认了你的初始序号),并且发送自己的序列号seq=y(sever_isn)。这时也是不允许携带应用层数据的。(虽然被授予连接了,但是没有获得服务器的允许连接分配缓冲区和变量)

第三次握手:A收到B的回复,允许连接数据后发送回复确认ACK置1,ack=y+1,自己为seq=x+1(不携带信息,不消耗序列号,自己本身不用确认,序列号不变)。客服也会给连接分配缓冲区合和变量,其次因为连接已经建立,所以SYN=0。

TCP为什么要三次握手(三次数据传输)而不是两次?

答:第一次,第二次握手只是告知对方的序列号初始值,但是没有实现客服和服务器都给连接分配缓冲区和变量,并不会传输数据。如果只是两次握手,只有发起方的其实序列号被确认,而服务器端的序列号得不到确认,只有服务器的缓冲区和变量分配给连接,客户机没有分配,无法进行数据传送。目的就是为了防止失效的连接请求报文段突然又传送到B,产生错误。为了实现序列号同步,实现有效可靠的数据传输。

在TCP协议中,三次握手是必要的,而不能用两次握手来建立连接。这是因为两次握手无法解决以下问题:

1. 确认双方都能接收数据:两次握手只能确定客户端和服务器之间的连接是单向的,即客户端可以向服务器发送数据,但服务器无法向客户端发送数据。如果在第一次握手时服务器没有收到客户端的SYN数据包,则无法确认客户端的状态,也就无法确定连接是否建立成功。

2. 避免历史连接的干扰:两次握手无法防止历史连接的干扰。假设在客户端向服务器发送SYN数据包后,由于网络延迟或其他原因,数据包被延迟了一段时间。此时,客户端可能已经关闭了连接,但服务器仍然会认为该连接处于打开状态,并尝试向客户端发送数据,从而导致错误和混乱。

通过三次握手,TCP协议可以解决上述问题,并确保连接的可靠性和稳定性。因此,不能用两次握手来代替三次握手。

三次握手(三次数据传输)?(源于计算机网络书籍)

TCP为什么要释放连接?

答:假设不释放连接的话,若A向B发送的某个丢失分组又回传到B(之前发送因为网络原因或其他原因丢失,B没有收到),B就会认为传输没有结束,会继续等待A的后续分组到来,这会导致过期的连接再次回传到服务器,但是A认为传输已经结束了(它的实际需要发送的数据已经全部发送),对B的载答确认不知道如何回应,就会导致服务器一直超时重传(超时重传是TCP协议保证数据可靠性的另一个重要机制,其原理是在发送某一个数据以后就开启一个计时器,在一定时间内如果没有得到发送的数据报的ACK报文,那么就重新发送数据,直到发送成功为止),那么服务器会一直发送ACK报文。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值