IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> TCP三次握手四次挥手 -> 正文阅读

[网络协议]TCP三次握手四次挥手

前言

最近在看网络方面的知识,对于TCP的三次握手和四次挥手,一直感觉不是很理解,在知乎上了这篇文章,感觉挺好的,所以转一下。
知乎原文链接

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

很久很久以前,还没有互联网,大家通信主要靠写信。小扎和小美是高中同学,互相有好感,大学两个人去了不同的城市上学。小扎在大学感到了空虚寂寞冷,鼓起勇气写信向小美表白。

小扎寄出去信后,心里一直很紧张,又怕万一地址不对,信寄不到怎么办呢? 小美收到小扎的信后,按耐不住心中的惊喜,这个小扎终于开窍了啊。于是马上回了一封信,小美也担心小扎收不到信,提醒小扎收到信后马上回信。

小扎收到小美的信后,知道自己给小美的地址是对的,小美的地址也是对的,双方的信都能收到。小美一定担心她的信我没收到吧?于是小扎又马上给小美回了一封信。

小美收到信后,知道双方的地址没有错,双方的信都能收到,就放心了。他们两个人就不停的来来回回寄了很多很多信,热恋中的情侣最费纸了。。。

很多年以后计算机出现了,有一种叫做TCP的协议负责计算机之间的网络连接,客户端和服务器就想当年的小扎和小美一样开始通信了。1.客户端发送 SYN数据包,并设置seq序列号为j,客户端进入 SYNC_SENT 状态(小扎给小美写信表白)

2.服务器端收到数据包后,返回一个SYN包设置seq=k,同时返回一个ACK的包设置seq=j+1,进入SYN_RCVD状态。(小美给小扎回信同意建立恋爱关系,小扎收到信后,确认他们之间的通信没有问题)

3.客户端收到ACK包后,表示客户端到服务器端的单向连接成功,客户端的状态变成ESTABLISED,同时客户端会对服务器端的SYN包进行应答,返回一个ACK包,seq为k+1。服务器端收到客户端的ACK包后,进入ESTABLISED状态,表示服务端到客户端的连接成功。(小扎给小美回信表示收到小美的信了,小美收到信后,确认他们之间的通信没有问题)

自此,它们就连接上了,可以放心的互相发送数据了。下面来一张正经点的图:

也许你会有疑问,为什么一定要三次握手?两次行不行?答案是不行。按上面的故事举例,第一次握手:小扎写信向小美表白;第二次握手:小美向小扎回信;注意,这时候小扎(客户端)的连接建立成功了,因为小扎(客户端)已经可以确定自己的发送和接收都没有问题。但是小美(服务器)只是收到了小扎(客户端)的来信,确定了自己接收数据没问题,但是自己寄出去的信小扎(客户端)能不能收到还不确定。于是有了第三次握手:小扎向小美寄出了确认回信。小美(服务器)收到信后,就是知道自己发送数据的功能没问题,小扎确实收到信了,确认连接建立成功了。

小扎和小美热恋了几年后,他们之间的感觉越来越微妙,慢慢的小美发现小扎对自己的关心越来越少了。终于小扎抵不住异地恋的痛苦,移情别恋了,看上了新来的学妹,小扎决定分手了,给小美寄了封分手信。

分手就算了,居然还有脸要回送我的东西!渣男!小美,收到信后,气得跳脚,立马回了封信,让他滚蛋。

第二天,小美就去邮局,把渣男送给她的东西都打包寄还了给他。小美还不忘在信中提醒,收到东西之后给我回封信,不要到时候耍赖说没收到,我再也不想看见你了!渣男!

小扎收到小美寄的包裹之后,立马回了封信,说东西收到了,我们以后也别联系了。

一段恋情就这么结束了。。。

情侣之间分分合合,当然计算机之间的连接也经常需要断开连接,断开的方式竟然和情侣之间很相似。
1.客户端发送一个FIN包,表示要断开连接,并设置seq序列号为m到服务器端,客户端进入FIN_WAIT_1状态。(小扎写分手信给小美,进入等待回信的状态)

2.服务器端收到客户端的FIN包后,就知道客户端想要断开连接了,于是返回一个ACK包,设置seq为m+1,服务器端进入CLOSE_WAIT状态。服务器端对客户端说,我知道你想要断开连接了,不过先等等,我这还有些数据没发完,你等我发完再关闭。客户端收到服务器端的确认后,进入FIN_WAIT_2状态,客户端现在只接收服务器端的数据,不再发送数据。(小美回信给小扎,同意分手,但是东西要整理下再寄给小扎,小扎进入等待包裹状态)

3.服务器端发送完所有数据之后,发送一个FIN报文,设置seq序列号为n,进入LAST_ACK状态,表示我的数据都已经发送完了,你可以断开连接了。(小美给小扎寄回包裹,表示我们已经两清了,你收到之后给我回个信,就可以滚蛋了)

4.客户端收到服务器端的FIN包后,返回一个ACK包,设置seq序列号为n+1,客户端就进入了TIME-WAIT(时间等待)状态。服务器只要收到了客户端发出的确认,立即进入CLOSED状态,关闭的连接。(小扎回信给小美说,你的包裹我收到了,我们以后不用再联系了)

6.注意此时TCP连接还没有释放,必须经过2MSL(最长报文段寿命)的时间后,才进入CLOSED状态。(小扎。。。编不下去了。。。)

自此,客户端和服务器端就断开了连接。下面来一张正经点的图:

为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?讲道理,四个报文都发送完毕,我们应该可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的。如果客户端发送出最后的ACK回复,服务器没有收到,服务器将不断重复发送FIN报文。所以客户端不能立即关闭,它必须确认服务器端接收到了该ACK。客户端会在发送出ACK之后进入到TIME_WAIT状态,同时设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么客户端会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,客户端都没有再次收到FIN,那么客户端推断ACK已经被成功接收,则结束TCP连接。

TCP断开连接为什么比建立连接多一个步骤呢?其实很简单,因为谈恋爱的时候还没有共同财产,但是分手的时候还需要分东西呀!

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-07-29 12:01:15  更:2021-07-29 12:01:35 
 
开发: 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 18:20:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码