计算机网络 | 09.[TCP篇] TCP连接的建立(三次握手)

1. 三次握手概述

所谓三次握手,是指客户端和服务端在建立 TCP连接 的过程中,总共发送了三个TCP 报文。完整流程可见下图:

三次握手完整流程

概述:客户端向服务端发送 SYN 报文表示希望建立连接,服务端返回 ACK+SYN 报文表示收到并同样希望建立连接,最后由客户端发送 ACK 报文表示最终确认。

2. 为什么一定要三次握手?两次握手会出什么问题?

只有三次握手才能保证双方都具有接收和发送的能力

如果是四次握手,实际上的第二第三次握手是可以被合并的,因而没有必要;

如果是两次握手,会出现问题,这也是为什么建立TCP连接必须要进行三次握手。

由于两次握手并没有被实现过,所以两次握手可能出现的情况也随着其设定众说纷纭。我们假设两次握手的设定如下:

  • 客户端向服务端发送报文,表示希望建立连接;
  • 服务端确认后即建立连接,并 马上开始传输数据

2.1. 无法确认客户端是否具备接收能力,且不知客户端是否收到server_isn

假如只有两次握手,服务端只能确认客户端的发送能力,无法确认接收能力(因为建立连接的两次握手中,客户端对服务端的报文没有回应),也就 无法确认客户端是否收到自己发过去的server_isn

若客户端的接收能力异常,服务端发送过去的数据无法送达,就造成了资源的浪费。

原因二:确保双方都收到了对方的序列号

2.2. 无法阻止历史连接的建立

「历史连接」是指未能成功建立且已经过期的旧链接。若使用三次握手不会出现问题,如下图所示:

原因一:避免历史连接 - 三次握手阻止历史连接

如果采用两次握手,服务端一旦收到客户端的第一次握手报文,就立马建立连接。

一旦先前因网络拥塞而被延后到达的第一次握手报文被服务端接收,就会建立一条「历史连接」,服务端在历史连接中发送的数据就是无效的(因为这条连接被终止了),这就造成了资源的浪费。

两次握手与三次握手的区别

3. 若丢失了第三次握手,会怎样

第三次握手(ACK,假定seq=11) 丢失,会根据客户端建立连接后是否发送数据有不同的情况:

3.1. 客户端有发送数据

若客户端在建立连接后有发送数据,就会在收到此次报文的应答 RST立即断开连接

客户端并不知道此次发送的报文已丢失,以为连接已建立,便会开始传输数据(seq=12)。而服务端由于没有收到 第三次握手(ACK,seq=11),它期待的seq=11,和收到报文的seq=12并不匹配,便会返回 RST 以断开异常连接。

3.2. 客户端没有发送数据

若客户端在建立连接后没有发送数据,服务端会 重传第二次握手,直到超出限制后关闭连接

客户端没有收到 第三次握手(ACK),就会触发超时重传机制重新发送 第二次握手(SYN+ACK),若超过重传次数依旧没有收到客户端的确认报文,服务端就会关闭这个连接。

参考资料

TCP 是如何工作的?三次握手和 四次挥手是什么?

Tcp为啥三次握手,两次行不行?从理解的角度吃透它

小林coding - TCP连接建立

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值