网络协议 传输层协议 TCP:TCP 为什么握手是 3 次、挥手是 4 次?

TCP 和 UDP 是今天应用最广泛的传输层协议,拥有最核心的垄断地位。今天互联网的整个传输层,几乎都是基于这两个协议打造的。无论是应用开发、框架设计选型、做底层和优化,还是定位线上问题,只要碰到网络,就逃不开 TCP 协议相关的知识。在面试中 TCP 一直是一个高频考察内容,外加 TCP 关联的知识比较多,因此面试题五花八门。

在介绍今天的主题之前,我先提一道高频面试题:TCP 协议为什么握手是 3 次,挥手却是 4 次?下面请你带着这个问题,开启今天的学习。

TCP 协议


要想把开篇这道面试题回答得漂亮,我们有必要先说一下概念,然后我再逐字给你解读。

TCP(Transport Control Protocol)是一个传输层协议,提供 Host-To-Host 数据的可靠传输,支持全双工,是一个连接导向的协议。

这里面牵涉很多概念,比如主机到主机、连接、会话、双工/单工及可靠性等,接下来我会为你逐一解释。

主机到主机(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 地址给底层的互联网层处理。 

互联网层,也叫网络层(Netowrk Layer),提供地址到地址的通信,IP 协议就在这一层工作。互联网层解决地址到地址的通信,但是不负责信号在具体两个设备间传递。因此,网络层会调用下方的链路层在两个相邻设备间传递信息。当信号在两个设备间传递的时候,科学家又设计出了物理层封装最底层的物理设备、传输介质等,由最下方的物理层提供最底层的传输能力。

以上的 5 层架构,我们称为互联网协议群,也称作 TCP/IP 协议群。总结下,主机到主机(Host-To-Host)为应用提供应用间通信的能力。

TCP 的握手和挥手


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

TCP 协议的基本操作


TCP 协议有这样几个基本操作:

  • 如果一个 Host 主动向另一个 Host 发起连接,称为 SYN(Synchronization),请求同步
  • 如果一个 Host 主动断开请求,称为 FIN(Finish),请求完成
  • 如果一个 Host 给另一个 Host 发送数据,称为 PSH(Push),数据推送

以上 3 种情况,接收方收到数据后,都需要给发送方一个 ACK(Acknowledgement)响应。请求/响应的模型是可靠性的要求,如果一个请求没有响应,发送方可能会认为自己需要重发这个请求。

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


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

按照这个思路,你可以看看建立连接是不是需要 3 次握手:

1.客户端发消息给服务端(SYN)

2.服务端准备好进行连接

3.服务端针对客户端的 SYN 给一个 ACK

你可以能会问,到这里不就可以了吗?2 次握手就足够了但其实不是,因为服务端还没有确定客户端是否准备好了。比如步骤 3 之后,服务端马上给客户端发送数据,这个时候客户端可能还没有准备好接收数据。因此还需要增加一个过程。

接下来还会发生以下操作:

4.服务端发送一个 SYN 给客户端

5.客户端准备就绪

6.客户端给服务端发送一个 ACK

你可能会问,上面不是 6 个步骤吗? 怎么是 3 次握手呢?下面我们一起分析一下其中缘由。

  • 步骤 1 是 1 次握手
  • 步骤 2 是服务端的准备,不是数据传输,因此不算握手
  • 步骤 3 和步骤 4,因为是同时发生的,可以合并成一个 SYN-ACK 响应,作为一条数据传递给客户端,因此是第 2 次握手
  • 步骤 5 不算握手
  • 步骤 6 是第 3 次握手

为了方便你理解步骤 3 和步骤 4,这里我画了一张图。可以看到下图中 SYN 和 ACK 被合并了,因此建立连接一共需要 3 次握手,过程如下图所示:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1. 计算机网络各层有哪些协议? 计算机网络通常分为七层,自上而下分别是应用层、表示层、会话层、传输层、网络层、数据链路层和物理层。各层的协议如下: - 应用层:HTTP、FTP、SMTP、DNS、DHCP等。 - 表示层:JPEG、MPEG、ASCII等。 - 会话层:RPC、SSH、TLS等。 - 传输层TCP、UDP等。 - 网络层:IP、ICMP、ARP等。 - 数据链路层:PPP、Ethernet、WLAN等。 - 物理层:IEEE 802.3、IEEE 802.11等。 2. TCP和UDP协议的区别? TCP和UDP都是传输层协议,但是它们有以下区别: - TCP是面向连接的协议,UDP是无连接的协议。 - TCP提供可靠的数据传输,UDP提供不可靠的数据传输。 - TCP保证数据顺序,UDP不保证数据顺序。 - TCP有流量控制和拥塞控制等机制,UDP没有这些机制。 3. TCP为什么需要三握手和四挥手TCP采用三握手来建立连接,四挥手来断开连接。三握手是为了确保双方的通信能力和可靠性,具体过程如下: - 第一握手:客户端向服务器发送请求,请求建立连接。 - 第二握手:服务器接收到请求,并向客户端发送同意连接的信号。 - 第三握手:客户端接收到服务器的信号,向服务器发送确认信号。 四挥手是为了彻底断开连接,具体过程如下: - 第一挥手:客户端向服务器发送断开连接的请求。 - 第二挥手:服务器接收到请求,并向客户端发送确认信号。 - 第三挥手:服务器向客户端发送断开连接的请求。 - 第四挥手:客户端接收到请求,并向服务器发送确认信号。 4. HTTP和HTTPS协议的区别? HTTP和HTTPS都是应用层协议,但是它们有以下区别: - HTTP是明文传输,HTTPS是加密传输。 - HTTP不提供身份验证和数据完整性保护,HTTPS提供身份验证和数据完整性保护。 - HTTP不需要证书,HTTPS需要证书。 5. 计算机网络状态码都有哪些? 计算机网络状态码表示服务器对客户端请求的响应状态,常见的状态码有以下几种: - 1xx:信息类,表示服务器已接收到请求,正在处理。 - 2xx:成功类,表示服务器已成功处理请求。 - 3xx:重定向类,表示客户端需要采取进一步的操作才能完成请求。 - 4xx:客户端错误类,表示客户端的请求有误。 - 5xx:服务器错误类,表示服务器在处理请求时发生了错误。 6. cookie和session的区别? cookie和session都是用于记录客户端状态的机制,但是它们有以下区别: - cookie是保存在客户端的,session是保存在服务器端的。 - cookie可以设置过期时间,session默认关闭浏览器就失效。 - cookie的大小有限制,session的大小没有限制。 - cookie不安全,可以被篡改,session相对安全。 7. 从浏览器输入url发生了什么? 从浏览器输入url,大致流程如下: - DNS解析:将域名解析成IP地址。 - 建立TCP连接:浏览器向服务器发起TCP连接请求。 - 发送HTTP请求:浏览器向服务器发送HTTP请求。 - 服务器处理请求并返回HTTP响应:服务器接收到请求后,处理并返回HTTP响应。 - 关闭TCP连接:浏览器接收到响应后,关闭TCP连接。 8. MySQL的drop、delete与truncate的区别? drop、delete和truncate都是用于删除数据的命令,但是它们有以下区别: - drop用于删除整个表,包括表结构和数据。 - delete用于删除表中的数据,但是不删除表结构。 - truncate用于删除表中的数据,但是不删除表结构,且速度比delete更快。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值