TCP 三次握手、四次挥手、和 UDP 的区别

浏览器通过 DNS 可以得到域名对应的 IP 地址,得到 IP 地址后就可以建立 TCP 连接,和服务端通信了。

在建立 TCP 连接之前,客户端和服务器之间会发送三次数据,以「确认双方的接收和发送能力」,这个过程称为三次握手(Three-way Handshake):

三次握手

第一次握手:刚开始客户端处于 CLOSED 的状态,服务端处于 LISTEN 状态。客户端给服务端发送一个同步序列编号 SYN(Synchronize Sequence Numbers)报文,并指明客户端的初始化序列号 ISN(Initial Sequence Number),此时客户端处于 SYN_SEND 状态。

第二次握手:当服务器收到客户端的 SYN 报文之后,会以自己的 SYN 报文作为应答,并且也指定了自己的初始化序列号 ISN。同时会把客户端的 ISN + 1 作为确认字符 ACK (Acknowledge character)的值,表示自己已经收到了客户端的 SYN,此时服务器处于 SYN_RECV 的状态。

第三次握手:当客户端收到 SYN 报文之后,会发送一个 ACK 报文,当然,也同样把服务器的 ISN + 1 作为 ACK 的值,表示已经收到了服务端的 SYN 报文,此时客户端处于 ESTABLISHED 状态。服务器收到 ACK 报文之后,也处于 ESTABLISHED 状态,此时,双方成功建立起了连接。

TCP三次握手

在三次握手成功后,服务端和客户端会建立 TCP 连接,开始正常地通信啦!(比如发送 HTTP 请求等)

问题一:为什么需要第三次握手?

答:首先我们要清楚三次握手的目的是:「确认双方的接收和发送能力」。前两次握手只能确认:1. 客户端的发送能力;2. 服务端的发送、接收能力。无法确认客户端的接收能力。因此我们需要第三次握手。

当我们内容传输完毕后,就要关闭 TCP 连接了,关闭之前,我们要进行四次挥手:

四次挥手

第一次挥手:在挥手之前服务端与客户端都处于 ESTABLISHED 状态。客户端发送一个 FIN (Finish) 报文,用来关闭客户端到服务器的数据传输,此时客户端处于 FIN_WAIT_1 状态。

第二次挥手:当服务端收到 FIN 之后,会发送 ACK 报文,并且把客户端的序列号值加 1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT 状态。

第三次挥手:如果服务端同意关闭连接,则会向客户端发送一个 FIN 报文,并且指定一个序列号,此时服务端处于 LAST_ACK 的状态。

第四次挥手:当客户端收到 ACK 之后,处于 FIN_WAIT_2 状态。待收到 FIN 报文时发送一个 ACK 报文作为应答,并且把服务端的序列号值 +1 作为自己 ACK 报文的序列号值,此时客户端处于 TIME_WAIT 状态。等待一段时间后会进入 CLOSED 状态,当服务端收到 ACK 报文之后,也会变为 CLOSED 状态,此时连接正式关闭。

四次挥手

TCP 和 UDP 的区别是什么?

  • TCP 是面向连接的;UDP 是面向无连接的

  • TCP 仅支持单播传输;UDP 提供了单播、多播、广播

  • TCP 稳定传输(数据不丢失不重复);UDP 不稳定传输

  • UDP 数据传输效率高,实时性好(适用于视频会议、语音通话)

TCP 如何保证数据包传输的有序可靠?

TCP主要提供了检验和、序列号/确认应答、超时重传、滑动窗口控制、拥塞控制等方法实现了可靠性传输。

  • 校验和:通过检验和的方式,接收端可以检测出来数据是否有差错和异常,假如有差错就会直接丢弃 TCP 段,重新发送。检验和总共计算3部分:TCP首部、TCP数据、TCP伪首部

  • 序列号/确认应答:发送端发送信息给接收端,接收端会回应一个包,这个包就是应答包。发送端没有收到应答包就会重发数据。这就可以保证数据的完整性。

  • 超时重发:发送出去的数据包到接收到确认包之间的时间,如果超过了这个时间会被认为是丢包了,需要重传。

  • 滑动窗口控制:超时重传的机制存在效率低下的问题,发送一个包到发送下一个包要经过一段时间才可以。所以我们就想着能不能不用等待确认包就发送下一个数据包呢?这就提出了一个滑动窗口的概念。通过对多个段进行确认应答的功能。通过下一次的确认包可以判断接收端是否已经接收到了数据,如果已经接收了就从缓冲区里面删除数据。

  • 拥塞控制:TCP 会先发出少量数据,先探明当前的网络拥堵状态后,再决定按照多大的速度传送数据。

原文链接:https://zhuanlan.zhihu.com/p/411843083 原文作者:社本

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值