TCP为什么是三次握手和四次挥手

转载自   TCP为什么是三次握手和四次挥手

为什么建立连接是三次握手断开连接是四次挥手? 
三次握手的流程和四次挥手的流程是什么?

三次握手与四次回收分别对应TCP连接与断开过程

tcp报文格式 

标志位含义

ACK:确认序号有效。
SYN:发起一个新连接。
FIN:释放一个连接。
 

三次握手的过程

注意:三次握手的最主要目的是保证连接是双工的,可靠更多的是通过重传机制来保证的

所谓三次握手,即建立TCP连接,需要客户端和服务端总共发送至少三个包确认连接的建立。流程如下 
 
第一次握手

Client将标志位SYN置1,随机产生一个值seq=J,并将数据包发给Server 
Client进入SYN_SENT状态,等待Server确认

第二次握手

Server收到数据包后标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置1,随机产生一个值,并将数据包发给Client确认连接请求,Server进入SYN_RCVD状态

第三次握手

Client收到确认后若ACK为1,则将该数据包发送给Server,Server检查ACK为1则连接建立成功,Client与Server进入ESTABLISHED状态完成三次握手,可以传输数据

 

问题1:为什么建立连接是三次握手,四次不可以吗

第一次握手:

    Client什么都不能确认   
    Server确认了对方发送正常
第二次握手:

   Client确认:自己发送/接收正常,对方发送/接收正常
    Server确认:自己接收正常 ,对方发送正常

第三次握手:

    Client确认:自己发送/接收正常, 对方发送/接收正常
    Server确认:自己发送/接收正常,对方发送/接收正常

所以通过三次握手确认双方收发功能都正常,四次也可以但是显得比较多余。

 

TCP三次握手,如果两次握手会怎么样

设计上的缺陷 


有这样一种情况,当A发送一个消息给B,但是由于网络原因,消息被阻塞在了某个节点,然后阻塞的时间超出设定的时间,A会认为这个消息丢失了,然后重新发送消息。

当A和B通信完成后,这个被A认为失效的消息,到达了B 
对于B而言,以为这是一个新的请求链接消息,就向A发送确认, 
对于A而言,它认为没有给B再次发送消息(因为上次的通话已经结束)所有A不会理睬B的这个确认,但是B则会一直等待A的消息

这就导致了B的时间被浪费(对于服务器而言,CPU等资源是一种浪费),这样是不可行的,这就是为什么不能两次握手的原因了。

所以有了三次握手的修订 
第三次握手看似多余其实不然,这主要是为了防止已失效的请求报文段突然又传送到了服务端而产生连接的误判

 

四次挥手的过程

所谓四次挥手:即终止TCP连接,需要客户端和服务端总共发送4个包确认连接的断开。流程如下 
 
第一次挥手:

Clien发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。

第二次挥手:

Server收到FIN后,发送一个ACK给Client,Server进入CLOSE_WAIT状态。

第三次挥手:

Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。

第四次挥手:

Client收到FIN后,Client进入TIME_WAIT状态,发送ACK给Server,Server进入CLOSED状态,完成四次握手。

 

问题:为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

建立连接

因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。

关闭连接

当收到对方的FIN报文时,仅表示对方不再发送数据但还能接收收据,我们也未必把全部数据都发给了对方,所以我们可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方表示同意关闭连接。因此我们的ACK和FIN一般会分开发送。

上面是一方主动关闭,另一方被动关闭的情况,实际中还会出现同时发起主动关闭的情况,具体流程如下图 


为什么需要TIME_WAIT状态

1、可靠的终止TCP连接 
2、保证让迟来的TCP报文段有足够的时间被识别并丢弃

1)为实现TCP这种全双工连接的可靠释放

这样可让TCP再次发送最后的ACK以防这个ACK丢失(另一端超时并重发最后的FIN)这种2MSL等待的另一个结果是这个TCP连接在2MSL等待期间,定义这个连接的插口(客户的IP地址和端口号,服务器的IP地址和端口号)不能再被使用。这个连接只能在2MSL结束后才能再被使用。

2)为使旧的数据包在网络因过期而消失

每个具体TCP实现必须选择一个报文段最大生存时间MSL。它是任何报文段被丢弃前在网络内的最长时间。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323603.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTM文件中使用vue

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。 代码啊,尤其是比较重要客户的项目,即使包出去了,代码也一定要回到自己手里,不然干着急。 这个项目,已经经过两手了&#xff0c…

LVS三种模式的区别及负载均衡算法

转载自 LVS三种模式的区别及负载均衡算法 LVS简介 LVS(Linux Virtual Server)即Linux虚拟服务器,是一个虚拟的服务器集群系统,由章文嵩博士在1998年5月成立,在linux2.6后将lvs自动加入了kernel模块,我们…

王者荣耀是怎样炼成的(一)《王者荣耀》用什么开发,游戏入门,unity3D介绍

在国内,如果你没有听说过《王者荣耀》,那你一定是古董级的人物了。 《王者荣耀》(以下简称“农药”),专注于移动端(Android、IOS)的MOBA游戏。笔者看到这么火爆,就萌生了了解一下这类…

新工作感悟~辞旧迎新~

“大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂”现在是:2022年6月21日22:33:34公众号又好久没有更新啦。从以前的日更,到后来的周更,再到后来的月更……不知道会不会到不更的结局。。。最近换工作了&…

关于Spring底层原理面试的那些问题,你是不是真的懂Spring?

转载自 关于Spring底层原理面试的那些问题,你是不是真的懂Spring? 1.什么是 Spring 框架?Spring 框架有哪些主要模块? Spring 框架是一个为 Java 应用程序的开发提供了综合、广泛的基础性支持的 Java 平台。Spring帮助开发者解…

ASP.NET Core Web服务器 Kestrel和Http.sys 特性详解

1.1. 名词解释 内核态: CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. CPU也可以将自己从一个程序切换到另一个程序。 用户态: 只能受限的访问内存, 且不允许访问外围设备. 占用CPU的能力被剥夺, CPU资源可以被其他程序获取。 1.2. Kestrel基本工作原理 Kestrel是…

Failed to execute

今天用dev c无论打编译什么都是出现如下结果: 后来终于找到解决办法了: 原来是这里出现问题了,我的电脑是32位的,必须也是32位的编译系统。否则不管输入什么都是上面的结果; 所以以后不管下载软件还是编译东西第一步一定要看自…

asp.net core 2.0 web api基于JWT自定义策略授权

JWT(json web token)是一种基于json的身份验证机制,流程如下: 通过登录,来获取Token,再在之后每次请求的Header中追加Authorization为Token的凭据,服务端验证通过即可能获取想要访问的资源。关于JWT的技术,…

BATJ面试必会|Jvm 虚拟机篇

转载自 BATJ面试必会|Jvm 虚拟机篇 目录 一、运行时数据区域 程序计数器 Java 虚拟机栈 本地方法栈 堆 方法区 运行时常量池 直接内存 二、垃圾收集 判断一个对象是否可被回收 引用类型 垃圾收集算法 垃圾收集器 三、内存分配与回收策略 Minor GC 和 Full GC 内存…

让网页背景颜色改变

如何改变背景的颜色呢&#xff0c;这里提供一个方法 <!DOCTYPE html> <html><head><style type"text/css">body {background-color: red}p {margin-left: 1px}</style><title>我yi癫狂</title></head><body>…

糊涂工具类真是场景下请求http接口的案例

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 现在是&#xff1a;2022年7月7日13:46:07 前言 今天有个这样的需求&#xff0c;PC端需要查看一下哪些天有数据&#xff0c;但是哪些有有没有数据我这边还看不出来&#xff0c;得请求别的系…

体验 ASP.NET Core 中的多语言支持(Localization)

首先在 Startup 的 ConfigureServices 中添加 AddLocalization 与 AddViewLocalization 以及配置 RequestLocalizationOptions &#xff08;这里假设使用英文与中文&#xff09;&#xff1a; public void ConfigureServices(IServiceCollection services) { services.AddLoca…

java中复杂业务情况下的集合操作(增减集合同步数据)

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 现在是&#xff1a;2022年7月5日16:14:28 前言 今天分享个案例&#xff0c;需求是这样的&#xff1a;一个团组中是可以包含多个会员&#xff0c;在给团组创建训练方案时&#xff0c;本质上…

springboot整合spring @Cache和Redis

转载自 springboot整合spring Cache和Redis spring基于注解的缓存 对于缓存声明&#xff0c;spring的缓存提供了一组java注解: Cacheable:触发缓存写入。CacheEvict:触发缓存清除。CachePut:更新缓存(不会影响到方法的运行)。Caching:重新组合要应用于方法的多个缓存操作。…

段落分开

分三段 <!DOCTYPE html> <html><head></head><body><p>This is a paragraph.</p> <p>This is another paragraph.</p> <p>这是网页设计中定义段落的标记&#xff0c;称为开始标记&#xff0c;称为结束标记。把一…

辞旧迎新,新工作感悟!

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 现在是&#xff1a;2022年6月21日22:33:34 公众号又好久没有更新啦。从以前的日更&#xff0c;到后来的周更&#xff0c;再到后来的月更……不知道会不会到不更的结局。。。 最近换工作了…

ASPNET Core 2.x中的Kestrel服务器

Kestrel是一个基于libuv的跨平台ASP.NET Core web服务器&#xff0c;libuv是一个跨平台的异步I/O库。ASP.NET Core模板项目使用Kestrel作为默认的web服务器。 Kestrel支持以下功能&#xff1a; HTTPS用于启用不透明升级的WebSockets位于Nginx之后的高性能Unix sockets Kestr…

全文搜索!收藏这篇Solr ElasticSearch 长文就可以搞定

转载自 全文搜索&#xff01;收藏这篇Solr ElasticSearch 长文就可以搞定 摘自&#xff1a;JaJian博кē Java后端技术编者说&#xff1a;文章从浅到深&#xff0c;描述了什么是全文搜索&#xff0c;为什么要使用全文搜索&#xff0c;Solr和ElasticSearch的发展和比较。文章比…

网页弹框弹出

完成这个功能需要在 弹框弹出 点击之后 才会显示内容 <!DOCTYPE html> <html><head><title>对话框测试</title><script>alert("对话框测试");</script></head><body>对话框测试&#xff1a;</body> …

Azure School与开源

距离Azure School(https://school.azure.cn/) 的正式上线时间&#xff0c;2017.8.3&#xff0c;已经过去了20多天了。这20多天得到了很多有帮助的建议和反馈&#xff0c;小伙伴们都很给力&#xff0c;互相帮助扶持&#xff0c;调整产品不正确的地方&#xff0c;快速迭代新的功能…