【底层服务/编程功底系列】「网络通信体系」带你攻克网络技术之TCP协议的三次握手和四次链接的技术盲区

简介: 【底层服务/编程功底系列】「网络通信体系」带你攻克网络技术之TCP协议的三次握手和四次链接的技术盲区

背景

当一台客户端和一台服务器进行通信时,TCP协议使用三次握手和四次挥手来建立和终止连接。

三次握手的作用

  1. 确认双方的发送和接收能力:在三次握手中,客户端和服务器需要交换彼此的序列号和确认号,以确认彼此的发送和接收能力正常,确保双方可以正常通信。
  2. 确认双方的同步连接状态:在三次握手的过程中,服务端和客户端会互相确认对方的初始序列号,以确保双方处于同步的连接状态,准备好正式传输数据。

四次挥手的作用

  1. 安全关闭连接:四次挥手确保了连接的安全关闭,双方可以在终止通信前完成数据交换和清理工作。
  2. 确保数据完整性:在四次挥手中,双方可以通过最后一次传输的数据来确认对方是否收到了所有数据,从而保证数据的完整性。

三次握手

为什么需要三次握手

即使进行N次握手,也无法百分之百地确保双方成功建立连接。这是因为一旦最后一次确认丢失,双方就陷入信息不对称的状态,即使之前的信息是对称的。成功建立连接的真正标志是双方都知道对方已经准备好传输数据,而至少需要三次握手才能实现这一点。

N次握手的案例分析

以 A 作为客户端,B 作为服务器端。

一次握手

那么 A 向 B 发送一个报文,然后双方都认为连接已经建立,这等同于使用无连接的 UDP,毫无意义。

两次握手

A 向 B 发送 SYN 报文,B 向 A 发送一个 ACK 报文(可能还包含 SYN 标志位),这时 B 已经知道 A 想要建立连接,双方的信息已基本对称,然而如果 B 到 A 的报文段丢失了,那么 A 就无法确定 B 是否收到了自己的连接请求,A 的状态成为未知,B 也知道了 A 的这种情况。

三次握手

因此需要第三次握手,即 A 向 B 发出 ACK 报文,这时双方都知道对方已经准备好传输数据(之前的时间点准备好,当前状态依然是不对称)。

三次握手解决-网络数据延迟

如果存在数据包延迟到达的情况,就会出现“已失效的连接请求报文段”,比如 A 向 B 发送的连接请求报文延迟到达 B,B 误以为这是一个新的连接请求,然后接受并发送 ACK 报文。如果是两次握手,B 此时就会进入建立状态,但这是一个错误的状态,因为 A 早已放弃了这个连接。

问题总结

无论进行多少次握手,都无法百分之百地确保成功建立连接,因为最后一次报文可能会丢失,或者出现延迟等各种情况。成功进行三次握手只能说明双方现在以相当高的概率可以进行正常通信。


四次挥手

四次挥手实际上就是两个FIN报文和两个ACK报文,这四个报文必不可少。

为什么不能学习三次握手将FIN和ACK合二为一?

A-TCP发送关闭报文

在TCP连接中,当一方(称为A)没有数据要发送时,会向另一方(称为B)发送一个FIN报文,而B必然会回复一个ACK报文。一旦B接收到FIN报文,它会通知上层应用程序。

B-TCP接收关闭报文

鉴于上层应用程序可能尚未发送完所有数据,B在这种情况下不应立即发送自己的FIN报文,即便数据已经全部发送完毕,B也不应该将FIN和ACK合二为一。

最佳做法是先发送ACK报文通知对方,然后在合适的时机才发送自己的FIN报文。

服务器主动端口

在TCP协议的C/S模式下,当TCP客户端想断开的时候,不能用 shutdown和closesocket与TCP服务器断开,只有让TCP服务器端主动断开(TCP 客户端被动断开),TCP 客户端的端口才能立刻被释放。

注意:中断连接端可以是Client端,也可以是Server端。

详细分析四次挥手

Client端-FIN阶段

假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。

Client端-FIN_WAIT阶段

Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。

Client端-TIME_WAIT阶段

Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。

Client端-CLOSED阶段

Server端收到ACK后,"就知道可以断开连接了"。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。

注意:在TIME_WAIT状态中,如果TCP client端最后一次发送的ACK丢失了,它将重新发送。TIME_WAIT状态中所需要的时间是依赖于实现方法的。典型的值为30秒、1分钟和2分钟。等待之后连接正式关闭,并且所有的资源(包括端口号)都被释放。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
1天前
|
负载均衡 网络协议 算法
不为人知的网络编程(十九):能Ping通,TCP就一定能连接和通信吗?
这网络层就像搭积木一样,上层协议都是基于下层协议搭出来的。不管是ping(用了ICMP协议)还是tcp本质上都是基于网络层IP协议的数据包,而到了物理层,都是二进制01串,都走网卡发出去了。 如果网络环境没发生变化,目的地又一样,那按道理说他们走的网络路径应该是一样的,什么情况下会不同呢? 我们就从路由这个话题聊起吧。
16 4
不为人知的网络编程(十九):能Ping通,TCP就一定能连接和通信吗?
|
23天前
|
安全 搜索推荐 网络安全
HTTPS协议是**一种通过计算机网络进行安全通信的传输协议
HTTPS协议是**一种通过计算机网络进行安全通信的传输协议
51 11
|
21天前
|
网络协议 物联网 数据处理
C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势
本文探讨了C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势。文章详细讲解了使用C语言实现网络通信程序的基本步骤,包括TCP和UDP通信程序的实现,并讨论了关键技术、优化方法及未来发展趋势,旨在帮助读者掌握C语言在网络通信中的应用技巧。
33 2
|
22天前
|
监控 网络协议 网络性能优化
网络通信的核心选择:TCP与UDP协议深度解析
在网络通信领域,TCP(传输控制协议)和UDP(用户数据报协议)是两种基础且截然不同的传输层协议。它们各自的特点和适用场景对于网络工程师和开发者来说至关重要。本文将深入探讨TCP和UDP的核心区别,并分析它们在实际应用中的选择依据。
51 3
|
1月前
|
网络协议 网络安全 网络虚拟化
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算。通过这些术语的详细解释,帮助读者更好地理解和应用网络技术,应对数字化时代的挑战和机遇。
80 3
|
1月前
|
网络虚拟化
生成树协议(STP)及其演进版本RSTP和MSTP,旨在解决网络中的环路问题,提高网络的可靠性和稳定性
生成树协议(STP)及其演进版本RSTP和MSTP,旨在解决网络中的环路问题,提高网络的可靠性和稳定性。本文介绍了这三种协议的原理、特点及区别,并提供了思科和华为设备的命令示例,帮助读者更好地理解和应用这些协议。
52 4
|
3天前
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
40 17
|
14天前
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将介绍网络安全的重要性,分析常见的网络安全漏洞及其危害,探讨加密技术在保障网络安全中的作用,并强调提高安全意识的必要性。通过本文的学习,读者将了解网络安全的基本概念和应对策略,提升个人和组织的网络安全防护能力。
|
15天前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
39 10
|
17天前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
在数字化时代,网络安全和信息安全已成为我们生活中不可或缺的一部分。本文将介绍网络安全漏洞、加密技术和安全意识等方面的内容,并提供一些实用的代码示例。通过阅读本文,您将了解到如何保护自己的网络安全,以及如何提高自己的信息安全意识。
44 10