如何理解 TCP 网络分层
我们先来看一下 TCP 传输图,如下:
- 在应用层,各应用程序之间通过 HTTP 协议等方式进行报文传递。
- 传输层的职责在于为两台主机间的应用进程提供端到端的逻辑通信,典型的如 TCP 协议。
- 网络互连层负责主机之间的通信,将传输层生成的数据包封装成分组数据包并发送到目标主机,同时提供路由选择功能。IP 协议是网络层的核心协议,TCP 和 UDP 都使用 IP 协议作为网络层协议。该层的主要任务包括添加源地址和目标地址,以及将数据包传送至目标地址。
- 网络访问层也称为网络接口层,包括以太网、WiFi、蓝牙等工作在此层。它提供了主机连接到物理网络所需的硬件和相关协议支持。
这种分层结构带来了多方面的好处:
- 各层之间相互独立:限制了依赖关系的范围,各层使用标准化的接口,不需要知晓上下层的工作细节。对应用层协议的增加或修改不会影响传输层协议的正常运作。
- 提高了灵活性:例如,路由器无需关注应用层和传输层,分层后路由器只需加载更少的几个协议层。
- 更易于测试和维护:提高了可测试性,可以独立测试特定层的功能。如果某一层实现有了改进,可以整体替换,这有助于标准化每一层的职责,便于进行标准化。
TCP的三次握⼿
TCP 的三次握手是为了确保双方的通信能够正常建立,并且可以防止已经失效的连接请求被服务器误认为是新的连接请求。
首先,建立连接的目的是实现可靠数据传输,我们必须确保客户端和服务端能够正常发送和接收数据。如果任一方不能正常发送或接收数据,整个数据传输过程就会变得不可靠。
接下来,让我们了解为什么需要进行三次握手,而不是两次握手、四次握手。
- 当客户端和服务端刚开始时,它们都处于关闭状态。同时,服务器端始终处于监听状态,以便随时接收连接请求。
- 当某个客户端需要建立连接时,它会发送一个确定连接的报文。这个报文被称为同步报文 (Sync Packet),其中 SYN = 1,并且会生成一个随机序号 seq = x。这是第一次握手。
- 当服务端接收到连接请求报文后,它会发送一个同样带有同步标志位的确认报文。具体而言,该报文中 SYN = 1 和 ACK = 1,同时服务端也会生成一个随机序号 seq = y,并将确认序号设置为 x 1。这是第二次握手。
- 当客户端接收到服务端的确认报文后,它会发送一个用于确认服务端已接收到确认报文的确认报文(ACK)。该报文中 ACK = 1,序号 seq = x 1,确认序号 ack = y 1。这是第三次握手。
- 为什么不是两次握手?
如果只进行两次握手,假设客户端发送连接请求后并没有丢失,而是由于网络延迟或其他原因导致连接请求的报文在网络中滞留了相当长的时间,这时客户端重新发送连接请求并建立了连接。
但是第一次请求的报文最终到达了服务器,服务器会认为这是客户端发送的新的连接请求,就会认可该请求并发送确认报文给客户端,客户端也会发送确认报文给服务器。这样就会在服务器上产生了多余的连接,造成了资源的浪费。
- 为什么不是四次握手?
如果采用四次握手,假设在三次握手的过程中,客户端接收到了服务器发送的确认报文,但是由于某些原因,这个确认报文在网络中丢失了。
客户端没有收到服务器的确认,会认为连接没有建立成功,并会重发连接请求。这样会导致服务器上产生多余的连接请求,造成资源的浪费。