计算机网络


计算机网络

为什么 TCP/IP 要三次握手,两次不行吗?

要建立可靠的通信信道,三次握手是最少的次数。

TCP/IP 的三次握手分别是:

  1. 客户端发送带有 SYN 标志的数据包给服务端,这是一次握手。
  2. 服务端发送带有 SYN/ACK 标志的数据包客户端,这是二次握手。
  3. 客户端发送带有 ACK 标志的数据包给服务端,这是三次握手。

为什么要三次握手?

  • 第一次握手:Client 什么都不能确认。Server 确认了:对方发送正常,自己接收正常。
  • 第二次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常。Server 确认了:对方发送正常,自己接收正常。
  • 第三次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常。Server 确认了:自己发送、接收正常,对方发送、接收正常。

所以三次握手就能确认双发收发功能都正常,缺一不可。

为什么要传回 SYN?

接收端传回发送端所发送的 SYN 是为了告诉发送端,我接收到的信息确实就是你所发送的信号了。

SYN 是 TCP/IP 建立连接时使用的握手信号。在客户机和服务器之间建立正常的 TCP 网络连接时,客户机首先发出一个 SYN 消息,服务器使用 SYN-ACK 应答表示接收到了这个消息,最后客户机再以 ACK 消息响应。这样在客户机和服务器之间才能建立起可靠的 TCP 连接,数据才可以在客户机和服务器之间传递。

传了 SYN,为啥还要传 ACK?

双方通信无误必须是两者互相发送信息都无误。传了 SYN,证明发送方到接收方的通道没有问题,但是接收方到发送方的通道还需要 ACK 信号来进行验证。

参考:必看面试题之计算机网络:来自一位拿到了腾讯和字节双offer的大佬 - 哔哩哔哩open in new window

为什么 TCP/IP 断开连接要四次挥手?

因为 TCP 连接是全双工的,因此每个方向都必须单独进行关闭,四次挥手是实现双方正确关闭的最少次数。简单地说,因为对方可能在传输数据,所以需要提前告诉服务端,我想要关闭连接。而服务端接收到请求之后进行处理,如果有数据在传输,那么就等待数据传输完毕,再关闭连接。

  1. 第一次挥手

Client 发送一个 FIN 信号,用来关闭 Client 到 Server 的数据传送,Client 进入 FIN_WAIT_1 状态。

此时主动方发送断开连接的请求(即FIN报文)给被动方时,仅仅代表主动方不会再发送数据报文了,但被动方仍可以接收数据报文。

  1. 第二次挥手

Server 收到 FIN 后,发送一个 ACK 给 Client,确认序号为 收到序号+1(与SYN相同,一个 FIN 占用一个序号),Server 进入 CLOSE_WAIT 状态。

被动方此时有可能还有相应的数据报文需要发送,因此需要先发送 ACK 报文,告知主动方「我知道你想断开连接的请求了」。这样主动方便不会因为没有收到应答而继续发送断开连接的请求(即 FIN 报文)。

  1. 第三次挥手

Server 发送一个 FIN,用来关闭 Server 到 Client 的数据传送,Server 进入 LAST_ACK 状态。

被动方在处理完数据报文后,便发送给主动方 FIN 报文。这样可以保证数据通信正常可靠地完成。发送完 FIN 报文后,被动方进入 LAST_ACK 阶段(超时等待)。

  1. 第四挥手

Client 收到 FIN 后,Client 进入 TIME_WAIT 状态,接着发送一个 ACK 给 Server,确认序号为收到序号+1。Server 接受到消息,进入 CLOSED 状态,完成四次挥手。

参考资料:

简单说说 OSI 七层模型,都有什么协议?

OSI 七层模型分别是:应用层、表示层、会话层、运输层、网络层、数据链路层、物理层。但是更多情况下,我们将其简化成五层:应用层、运输层、网络层、数据链路层、物理层。如下图所示:

  • 应用层:直接为应用程序服务的,实现进程之间相互通讯,常用的协议有:TELNET、FTP、SMTP等。
  • 运输层:为应用程序提供端到端的传输服务,将数据封装成报文。常用的协议有:TCP协议、UDP协议。其是用户功能的最底层,又是面向通信部分的最高层。
  • 网络层:在节点之间创建逻辑链路,其将报文封装成 IP 数据报文,实现拥塞控制,常用的协议有 IP 协议。
  • 数据链路层:在通讯实体之间建立链路连接,将 IP 数据报文封装成帧,传给物理层。
  • 物理层:主要是将比特或者说0和1转化成强弱电流,然后将电流传输出去。

每层的数据服务单元为:

  • 应用层:数据
  • 运输层:报文
  • 网络层:报文分组
  • 数据链路层:帧
  • 物理层:比特

网络层,可以理解为节点之间的逻辑链路。数据链路层,可以理解成节点之间的物理链路。而网络层之上的运输层,则可以认为是网络层的组合,即因为网络层传输的数据有限,需要把运输层的数据拆分分组。

参考:必看面试题之计算机网络:来自一位拿到了腾讯和字节双offer的大佬 - 哔哩哔哩open in new window

上次编辑于: 2022/7/30 09:07:48