TCP 协议为什么握手是 3 次,挥手却是 4 次?

TCP 协议为什么握手是 3 次,挥手却是 4 次?


TCP(Transport Control Protocol)是一个传输层协议,提供 Host-To-Host 数据的可靠传输,支持全双工,是一个连接导向的协议。
TCP 提供的是 Host-To-Host 传输,一台主机通过 TCP 发送数据给另一台主机。这里的主机(Host)是一个抽象的概念,可以是手机、平板、手表等。收发数据的设备都是主机,所以双方是平等的。
在这里插入图片描述


TCP 协议往上是应用到应用(Application-To-Application)的协议。而 TCP 上层有太多的应用,不仅仅有微信,还有原神、抖音、网易云音乐……因此 TCP 上层的应用层协议使用 TCP 能力的时候,需要告知 TCP 是哪个应用——这就是端口号。端口号用于区分应用。TCP 要实现主机到主机通信,就需要知道主机们的网络地址(IP 地址),但是 TCP 不负责实际地址到地址(Address-To-Address)的传输,因此 TCP 协议把 IP 地址给底层的互联网层处理。
互联网层,也叫网络层(Network Layer),提供地址到地址的通信,IP 协议就在这一层工作。互联网层解决地址到地址的通信,但是不负责信号在具体两个设备间传递。因此,网络层会调用下方的链路层在两个相邻设备间传递信息。当信号在两个设备间传递的时候,科学家又设计出了物理层封装最底层的物理设备、传输介质等,由最下方的物理层提供最底层的传输能力。
以上的 5 层架构,我们称为互联网协议群,也称作 TCP/IP 协议群。总结下,主机到主机(Host-To-Host)为应用提供应用间通信的能力。

连接和会话

连接(Connection)——连接是数据传输双方的契约。
连接是通信双方的一个约定,目标是让两个在通信的程序之间产生一个默契,保证两个程序都在线,而且尽快地响应对方的请求,这就是连接(Connection)。设计上,连接是一种传输数据的行为。连接是网络行为状态的记录。
连接关联的还有一个名词,叫作会话(Session),会话是应用的行为。有些系统设计中,会话会自动重连(也就是重新创建连接),或者帮助创建连接。

双工/单工问题

在任何一个时刻,如果数据只能单向发送,就是单工,所以单工需要至少一条线路。如果在某
个时刻数据可以向一个方向传输,也可以向另一个方向反方向传输,而且交替进行,叫作半双
工;半双工需要至少 1 条线路。最后,如果任何时刻数据都可以双向收发,这就是全双工,全
双工需要大于 1 条线路。当然这里的线路,是一个抽象概念,你可以并发地处理信号,达到模
拟双工的目的。

TCP 是一个双工协议,数据任何时候都可以双向传输。这就意味着客户端和服务端可以平等地
发送、接收信息。正因为如此,客户端和服务端在 TCP 协议中有一个平等的名词——Host

(主机)。

可靠性

可靠性指数据保证无损传输。如果发送方按照顺序发送,然后数据无序地在网络间传递,就必
须有一种算法在接收方将数据恢复原有的顺序。另外,如果发送方同时要把消息发送给多个接
收方,这种情况叫作多播,可靠性要求每个接收方都无损收到相同的副本。多播情况还有强可
靠性,就是如果有一个消息到达任何一个接收者,那么所有接受者都必须收到这个消息。

TCP 的握手和挥手

TCP 是一个连接导向的协议,设计有建立连接(握手)和断开连接(挥手)的过程。TCP 没有
设计会话(Session),因为会话通常是一个应用的行为。

TCP 协议的基本操作

TCP 协议有这样几个基本操作:
如果一个 Host 主动向另一个 Host 发起连接,称为 SYN(Synchronization),请求同步;
如果一个 Host 主动断开请求,称为 FIN(Finish),请求完成;
如果一个 Host 给另一个 Host 发送数据,称为 PSH(Push),数据推送。
以上 3 种情况,接收方收到数据后,都需要给发送方一个 ACK(Acknowledgement)响应。
请求/响应的模型是可靠性的要求,如果一个请求没有响应,发送方可能会认为自己需要重发这
个请求。

建立连接的过程(三次握手)

因为要保持连接和可靠性约束,TCP 协议要保证每一条发出的数据必须给返回,返回数据叫作
ACK(也就是响应)。
在这里插入图片描述

  1. 客户端发消息给服务端(SYN)
  2. 服务端准备好进行连接
  3. 服务端针对客户端的 SYN 给一个 ACK
  4. 服务端发送一个 SYN 给客户端
  5. 客户端准备就绪
  6. 客户端给服务端发送一个 ACK.
    为什么6个 步骤确实三次握手呢?
    步骤 1 是 1 次握手;
    步骤 2 是服务端的准备,不是数据传输,因此不算握手;
    步骤 3 和步骤 4,因为是同时发生的,可以合并成一个 SYN-ACK 响应,作为一条数据
    传递给客户端,因此是第 2 次握手;
    步骤 5 不算握手;
    步骤 6 是第 3 次握手。
    步骤 3 和步骤 4,看到下图中 SYN 和 ACK 被合并了,因此建立连接一共需要 3 次握手。
    在这里插入图片描述

断开连接的过程(4 次挥手)

  1. 客户端要求断开连接,发送一个断开的请求,这个叫作(FIN)。

  2. 服务端收到请求,然后给客户端一个 ACK,作为 FIN 的响应。

  3. 这里你需要思考一个问题,可不可以像握手那样马上传 FIN 回去?
    其实这个时候服务端不能马上传 FIN,因为断开连接要处理的问题比较多,比如说服务
    端可能还有发送出去的消息没有得到 ACK;也有可能服务端自己有资源要释放。因此断
    开连接不能像握手那样操作——将两条消息合并。所以,服务端经过一个等待,确定可
    以关闭连接了,再发一条 FIN 给客户端。

  4. 客户端收到服务端的 FIN,同时客户端也可能有自己的事情需要处理完,比如客户端有
    发送给服务端没有收到 ACK 的请求,客户端自己处理完成后,再给服务端发送一个
    ACK。
    在这里插入图片描述

总结

  1. TCP 提供连接(Connection),让双方的传输更加稳定、安全。

  2. TCP 没有直接提供会话,因为应用对会话的需求多种多样,比如聊天程序会话在保持双
    方的聊天记录,电商程序会话在保持购物车、订单一致,所以会话通常在 TCP 连接上进
    一步封装,在应用层提供。

  3. TCP 是一个面向连接的协议(Connection -oriented Protocol),说的就是 TCP 协议
    参与的双方(Host)在收发数据之前会先建立连接。后面我们还会学习 UDP 协议,
    UDP 是一个面向报文(Datagram-oriented)的协议——协议双方不需要建立连接,
    直接传送报文(数据)。

  4. 最后,连接需要消耗更多的资源。比如说,在传输数据前,必须先协商建立连接。因
    此,不是每种场景都应该用连接导向的协议。像视频播放的场景,如果使用连接导向的
    协议,服务端每向客户端推送一帧视频,客户端都要给服务端一次响应,这是不合理的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值