计算机网络速通(二) 传输层协议 TCP:TCP为什么握手是 3 次,挥手是四次?

本文最后更新于:2024年9月30日 下午

TCP 和 UDP 是当今应用最广泛的传输层协议,当今互相网的整个传输层几乎都是基于这两个协议打造的。(应用开发、框架设计选型、做底层和优化,只要碰到网络,肯定逃不开 TCP 协议的相关知识)

network1

如何理解上图的概念:主机到主机、连接、会话、双工/单工及可靠性

主机到主机:TCP 提供的是主机到主机的传输,一台主机通过 TCP 发送数据给另一台主机。

  • 为什么 TCP 往上是应用到应用的协议:例如:微信发消息给张三,微信客户端(微信的聊天服务)他们都是应用。微信有自己的协议(应用到应用的协议)。但是,微信的协议想要工作,就需要一个主机到主机的协议 (TCP) 帮他们通信。但 TCP 协议的上层有太多的应用,因此 TCP 上层的应用层协议使用 TCP 协议的时候需要告知 TCP 是哪个应用--端口号(区分应用)。 network1

  • TCP 要实现主机到主机之间的通信就需要主机们的网络地址(IP 地址),但是 TCP 不负责实际地址到地址的传输。因此 TCP 协议把 IP 地址交给底层的互联网层(网络层)去处理。

    • 因此网络层提供的是地址(IP)到地址的通信协议,但是网络层只提供地址到地址的通信,不负责信号在具体的两个设备间传递。
    • 因此网络层又会调用下方的数据链路层在两个设备之间传递信息,当信号在两个设备间传递的时候,科学家们又设计出物理层去封装最底层的设备、传输介质等,由最下方的物理层提供底层的传输能力。
    • 以上的五层架构称之为互联网协议群(TCP/IP)协议群
  • 总结:主机到主机是为应用提供应用间通信的能力。

连接

  • 连接:通信双方的一个约定,目标是让两个在通信的程序之间产生一个契约,保证两个程序都在线而且尽快地响应对方的请求。
    • 设计上,连接是一种传输数据的行为,传输之前,建立一个连接,具体来说,数据收发双方的内存中都需要建立一个用于维护数据传输状态的对象。比如说双方的 IP 和端口是多少?现在发送了多少数据了?状态是健康的吗?传输速度如何?
  • 总结:连接是网络行为状态的记录。

会话

  • 会话:会话是应用的行为,例如张三和你聊天,你和张三建立的是一个会话。你和张三聊天,你们之间创建一个聊天窗口,这个就是会话。当你开始打字的时候,开始传输数据,你和微信服务器之间建立的是一个连接,如果你们聊一段时间,各自休息了,约定先不要关微信,一个小时之后在回来,那么连接是断开的,但是会话没有断开,因为聊天窗口没有关,所以会话还在。
    • 在有些系统设计当中,会话会自动重连(也就是重新创建连接),或者帮助创建连接。
    • 此外,会话也负责在多次连接中保存状态,比如HTTP Session 在多个 HTTP 请求(连接)间保持状态。
  • 总结:会话是应用层的概念,连接是传输层的概念。 ## 什么是单工?什么是双工?
  • 在任何一个时刻,数据如果只能单向发送,就是单工,因此单工最少需要一条线路;
  • 如果在某个时刻可以向一个方向传输,也可以向另一个方向返方向传输,允许这样交替进行,则称之为半双工;至少需要一条线路;
  • 如果任何时刻的数据都可以收发,则称之为全双工,至少大于一条线路。
  • 线路,是一个抽象的概念,可以并发地处理信号,达到模拟双工的目的。 TCP 是一个双工协议,数据任何时候都可以双向传输。这就意味着服务端和客户端端他们是平等的发送和接收数据。因此客户端和服务端在 TCP协议中有一个平等的名词 Host(主机) network1

什么是可靠性?

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

TCP 的握手和挥手

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

TCP 协议的基本操作

  • 如果一个 Host 主动向另一个 Host 发起连接,称为SYN(Synchronization),请求同步。
  • 如果一个 Host 主动断开请求,称为 FIN(Finish),请求完成。
  • 若干一个 Host 给另一个 Host发送数据,称为 PSH(Push),数据推送。 以上三种情况接收方收到数据后,都需要给发送方一个 ACK 响应。请求响应是一个可靠性的要求,如果一个请求没有响应,那么发送方会认为自己需要重发这个请求。

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

因为要保持连接的可靠性约束,TCP 协议要保证每一条发出的数据必须给返回。返回的数据也叫 ACK 响应。 因此建立连接需要三次握手,如下图: 1. 首先客户端要发送消息给服务端(SYN),发送一次同步请求; 2. 服务端准备好之后进行连接 3. 服务端针对好客户端的 SYN 给一个 ACK(到这里两次握手你可能会觉得足够了,但是其实并不是,因为服务端还不能确定客户端是否准备好了:比如说,步骤三之后,服务端马上给客户端发送数据,这个时候客户端可能还没有好去接收数据,因此还需要增加一个过程) 4. 服务端还需要发送一个 SYN 给客户端 5. 客户端准备就绪之后之后 6. 客户端给服务端发送一个 ACK

上述分为六步,步骤一为 1 次握手,步骤三四是同时发生,可以合并为一个 SYN-ACK 的响应,作为一条数据传递给客户端,因此算第二次握手,步骤 6 算第三次握手。因此建立连接需要三次握手。

进一步思考:SYN、ACK、PSH 这些常见的表示位,在传输中如何表示: - 一种思路:为 TCP 协议增加协议头,在协议头中取多位(bit),其中 SYN、ACK、PSH 都占 1 位。如果 SYN 位为 1,则称 SYN 开启。这种设计称之为标识(Flag)

network1

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

继续上面的思路,若是客户端要求断开连接: 1. 客户端发送一个 FIN 到服务端; 2. 服务端接收到请求之后要马上给客户端一个 ACK 作为 FIN 的一个响应(思考:可不可以像握手那样马上传 FIN 回去?答案是不能:因为断开连接需要处理的问题比较多,比如说服务端可能还有已经发出但是但是没有收到 ACK 的消息,也可能服务端有自己的资源需要释放,因此断开连接不能像握手那样操作,将两条消息合并) 3. 因此服务端等待,确定关闭连接了在发一条 FIN 给到客户端 4. 客户端接收到服务端的 FIN, 同时客户端也有可能有自己的事情需要处理完,比如说客户端有发送给服务端,但是没有收到 ACK 的请求,客户端自己处理完成之后,在给服务端发送一个 ACK;

总结

  1. TCP 提供连接(connection),让双方的传输更加稳定、安全;
  2. TCP 没有直接提供会话,因为应用会话的需求多种多样,比如聊天程序会话在保持双方的聊天记录,电商程序会话在保持购物车、订单一致,所以会话通常在 TCP 连接上进一步封装,在应用层提供;
  3. TCP 是一个面向连接的协议,说的就是 TCP 协议参与的双方(Host)在收发数据之前会建立连接。后面我还会写一个 UDP 协议,UDP 是一个面向报文的协议—--协议双方不需要建立连接,直接传送报文(数据);
  4. 连接需要消耗更多的资源;比如说,在传输数据前,必须先协商建立连接,因此,不是每种场景都应该用连接导向的协议。像视频播放的场景,如果使用连接导向的协议,服务端每向客户端推送一帧视频,客户端都要给服务端一次响应,这是不合理的。

思考题

TCP 为什么是三次握手,4 次挥手?

  • TCP 是一个双工协议,为了让双方都保证,建立链接的时候,连接双方都需要向对方发送 SYC(同步请求) 和 ACK(响应),握手阶段双方都没有反锁的工作,因此一方向另一方发起同步(SYC)之后,另一方可以将自己的 SYC 和 ACK 打包作为一条消息回复,因此 3 次握手—--需要三次数据传输;
  • 挥手阶段,双方都可能有未完成的工作。收到挥手请求的一方,必须马上做出回应(ACK),表示接收到了挥手请求。类比现实世界中,你收到一个 offer,出于礼貌你先回复考虑一下,然后思考一段时间再回复 HR 最后的结果。最后等待所有工作结束,再发送请求中断连接(FIN),因此是 4 次挥手。 network1

计算机网络速通(二) 传输层协议 TCP:TCP为什么握手是 3 次,挥手是四次?
https://zzmes.github.io/2024/09/27/network2/
作者
YangYangYang
发布于
2024年9月27日
许可协议