| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 4-6:TCP协议之连接管理机制(三次握手、四次挥手详解) -> 正文阅读 |
|
[网络协议]4-6:TCP协议之连接管理机制(三次握手、四次挥手详解) |
文章目录本文大部分内容来自小林coding《图解网络》,感谢分享,简单整理。 一:TCP三次握手过程和状态变迁(1)三次握手过程和状态变迁过程详解TCP是面向连接的协议,所以使用TCP前必须先建立连接,而建立连接是通过三次握手完成的。 开始的时候,客户端和服务端都处于 客户端会随机初始化序号(client_isn), 将此序号置于TCP首部的【序号】字段中,同时将SYN标志位置为1,表示SYN报文。接着把第一个SYN报文发送给服务端,表示向服务器发起连接,该报文不包含应用层数据,之后客户端就处于了
客户端受到服务端报文后,还要向服务器回应最后一个应答报文。于是将该应答报文TCP首部ACK标志位置为1,其【确认应答号】字段填入server_isn+1,最后把报文发送给服务端。此次报文可以携带客户服务器的数据,之后客户端处于 一旦完成三次握手,客户端就都处于了 (2)为什么必须要三次握手?在讲述之前,我们需要再次回复是什么是TCP连接:
A:只有三次握手才可以阻止重复历史连接的初始化(主要原因)RFC793指出的TCP连接使用三次握手的主要原因:
意思是:为了防止旧的重复连接初始化造成混乱 网络环境错综复杂,它并不遵循先发先到的原则,有可能新的数据相比旧的数据会先到目标主机,而三次握手可以避免这种混乱 因此在网络拥堵的情况下,一个旧的SYN报文比新的SYN早到了服务端,那么此时服务端会返回一个SYN+ACK报文给客户端,客户端收到后可以根据自身上下文,判断这是一个历史连接,那么客户端会发送RST给服务端,中止此次连接
B:同步双方初始序列号TCP协议通信的双方,都必须维护一个【序列号】,序列号是可靠传输的关键因素,具体作用
所以当客户端发送携带【初始序列号】的SYN报文的时候,需要服务端返回一个ACK应答报文,表示客户端的SYN报文服务端已经成功接收;而当服务端发送【初始序列号】给客户端时,依然也要得到客户端的应答回应。这样一来一回,才能保证双方的序列号可以被可靠同步 四次握手其实也能够可靠的同步初始化序列号,可以把第二步和第三步优化为一步,减少通信次数 C:避免资源浪费如果仅有两次握手,当客户端的SYN请求在网络中堵塞时,客户端没有接受到ACK,就会触发重传,由于没有三次握手,所以服务端不清楚客户端是否已经收到了自己发送的建立连接的ACK确认,所以每收到一个SYN就先去建立一个连接 这样做的后果很麻烦。如果客户端的SYN堵塞了,重复发送了多次SYN报文,那么服务器在收到SYN后就会建立多个冗余的无效连接,造成资源浪费 同时这也容易受到SYN FIood(SYN洪水攻击)。 二:TCP四次挥手过程和状态变迁TCP断开连接是通过四次挥手的方式进行的,双方都可以断开连接,断开连接后主机资源将会被释放 (1)四次挥手过程和状态变迁详解具体过程如下
(2)为什么需要四次挥手?首先关闭连接时,客户端向服务端发送FIN,仅仅表示关闭的是客户端对服务端的单向信道;服务端收到客户端的FIN报文时,先回应一个ACK,表示“你先等等,可能还有数据未处理完”,等服务端不再发送数据时,才发送FIN报文给客户端表示同意现在关闭连接 所以多的那一次一般就是服务端需要等待完成数据的发送和处理,其中的ACK和FIN分开发送了 (3)什么是TIME_WAIT以及为什么TIME_WAIT是2MSLA:TIME_WAITMSL是 M a x i m u m Maximum Maximum S e g m e n t Segment Segment L i f e t i m e Lifetime Lifetime的缩写,意为报文最大生存时间,它是任何报文在网络上存在的最长时间,超过此时间报文将会被丢弃。
TIME_WAIT要等待2倍的MSL是因为网络中可能存在来自发送方的数据包,当这些发送方的数据报文被接收方处理之后又会向对方发送响应,所以一来一回需要2倍时间 2MSL的时间是从客户端接收到FIN后发送ACK开始计时的。如果在TIME-WAIT时间内,因为客户端的ACK没有传输到服务器,客户端又接收到了服务器重发的FIN报文,那么2MSL会重新计时 Linux系统中一个MSL是30s、所以Linux系统停在TIME_WAIT的时间为60s
B:为什么需要TIME_WAIT1:防止旧连接的数据包 假设TIME_WAIT没有等待时间或者等待时间过多,会发生什么呢?如下 所以TCP设计了2MSL的时间,足以让这两个方向上的数据包都自动丢弃,使原来连接的数据包在网络中自然消失,再出现的数据包一定是新建立的。 2:保证连接正确关闭 TIME_WAIT的另一个作用就是等待足够的时间以确保最后的ACK让被动关闭方接收,从而帮助其正确关闭 还是假设TIME_WAIT没有等待时间或过短,此时又会造成什么问题呢?如下 三:实践-理解TIMIE_WAIT状态 |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 17:22:40- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |