【底层服务/编程功底系列】「网络通信体系」带你攻克网络技术之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搭建和管理企业级网站应用
相关文章
|
9天前
|
安全 网络协议 网络安全
【Azure APIM】APIM服务配置网络之后出现3443端口不通,Management Endpoint不健康状态
如果没有关联的网络安全组,则阻止所有网络流量通过子网和网络接口。
52 30
|
1月前
|
前端开发 网络协议 安全
【网络原理】——HTTP协议、fiddler抓包
HTTP超文本传输,HTML,fiddler抓包,URL,urlencode,HTTP首行方法,GET方法,POST方法
|
1月前
|
网络协议 安全 网络安全
探索网络模型与协议:从OSI到HTTPs的原理解析
OSI七层网络模型和TCP/IP四层模型是理解和设计计算机网络的框架。OSI模型包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,而TCP/IP模型则简化为链路层、网络层、传输层和 HTTPS协议基于HTTP并通过TLS/SSL加密数据,确保安全传输。其连接过程涉及TCP三次握手、SSL证书验证、对称密钥交换等步骤,以保障通信的安全性和完整性。数字信封技术使用非对称加密和数字证书确保数据的机密性和身份认证。 浏览器通过Https访问网站的过程包括输入网址、DNS解析、建立TCP连接、发送HTTPS请求、接收响应、验证证书和解析网页内容等步骤,确保用户与服务器之间的安全通信。
125 3
|
1月前
|
5G 数据安全/隐私保护
如果已经链接了5Gwifi网络设备是否还能搜索到其他5Gwifi网络
当设备已经连接到一个5G Wi-Fi网络时,它仍然有能力搜索和发现其他可用的5G Wi-Fi网络。这里所说的“5G Wi-Fi”通常指的是运行在5GHz频段的Wi-Fi网络,而不是与移动通信中的5G网络(即第五代移动通信技术)混淆。
|
2月前
|
安全 搜索推荐 网络安全
HTTPS协议是**一种通过计算机网络进行安全通信的传输协议
HTTPS协议是**一种通过计算机网络进行安全通信的传输协议
89 11
|
1月前
|
算法 安全 网络安全
网络安全服务
机密主要利用密码学技术加密文件实现,完整主要利用验证码/Hash技术,可用**主要灾备来保障。 网络环境下的身份鉴别,当然还是依托于密码学,一种可以使用口令技术,另一种则是依托物理形式的鉴别,如身份卡等。其实更为安全的是实施多因子的身份认证,不只使用一种方式。数字签名可以用来保证信息的完整性,比如RSA就可以用于数字签名: 若A向B发送信息m则先用自己的保密密钥(私钥)对m加密,然后用B的公钥第二次加密,发送个B后,B先用自己的私钥解密一次,再用A的公钥解密即可。 Kerberos使用对称密码算法来实现通过可信第三方密钥分发中心的认证服务,已经成为工业界的事实标准。
58 3
|
2月前
|
网络协议 物联网 数据处理
C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势
本文探讨了C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势。文章详细讲解了使用C语言实现网络通信程序的基本步骤,包括TCP和UDP通信程序的实现,并讨论了关键技术、优化方法及未来发展趋势,旨在帮助读者掌握C语言在网络通信中的应用技巧。
73 2
|
2月前
|
监控 网络协议 网络性能优化
网络通信的核心选择:TCP与UDP协议深度解析
在网络通信领域,TCP(传输控制协议)和UDP(用户数据报协议)是两种基础且截然不同的传输层协议。它们各自的特点和适用场景对于网络工程师和开发者来说至关重要。本文将深入探讨TCP和UDP的核心区别,并分析它们在实际应用中的选择依据。
91 3
|
1月前
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
77 17
|
1月前
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将介绍网络安全的重要性,分析常见的网络安全漏洞及其危害,探讨加密技术在保障网络安全中的作用,并强调提高安全意识的必要性。通过本文的学习,读者将了解网络安全的基本概念和应对策略,提升个人和组织的网络安全防护能力。

热门文章

最新文章