四次挥手

四次挥手,为什么是四次?

假如想象 提交于 2019-12-01 18:52:53
  上一篇博客说了三次握手为什么是是三次( 点这里 ),那么现在就介绍一下四次挥手。大家都知道TCP是全双工的,再建立连接时的三次握手中的FIN和ACK一起发送,这里就会有疑问,为什么在四次挥手的时候没有将FIN和ACK一起发送呢?带着这个问题继续向下看,答案就在其中。   说到四次挥手,顾名思义,就是在关闭连接的时候双方一共要操作四次,来看一下这四次都是怎么操作的:   从图中可以看出来,在四次挥手的时候双方一共进入了六种状态,这六种状态就是理解四次挥手的关键所在,我们来看一下 四次挥手的状态 FIN_WAIT_1:这个状态和FIN_WAIT_2状态都在再等待对方的回复,但是这两种状态是有区别的, FIN_WAIT_1就是主动方在ESTABLISHED状态的时候,想要主动关闭连接,向对方发送FIN报文,这时候就进入了FIN_WAIT_1状态。当他收到对方回复的ACK报文后,就进入了FIN_WAIT_2状态。 但是在实际操作中是很难遇到FIN_WAIT_1状态的,因为无论对方是什么情况都应该立刻回应ACK报文,但是FIN_WAIT_2状态还是可以在主动方中用netstat看到的。 FIN_WAIT_2:上面已经对FIN_WAIT_2讲解过了,当主动方进入FIN_WAIT_2时,就表示着半连接状态,也就是主动方还有数据要发给对方,这个数据就是之后的ACK,所有他要等一会儿才关闭连接。

TCP三次握手/四次挥手的作用

这一生的挚爱 提交于 2019-12-01 18:47:37
1.为什么建立连接协议是三次握手,而关闭连接却是四次握手呢? 这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。 2.为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态? 这是因为虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。 来源: CSDN 作者: kobejayandy 链接: https://blog.csdn.net/kobejayandy/article/details

简述四次挥手

泪湿孤枕 提交于 2019-12-01 18:46:18
什么是四次挥手 由于TCP连接是全双工的,断开一个TCP连接,需要客户端与服务器发送四个包来确认连接的断开 简述四次挥手的过程: 因为TCP是全双工的,因此,每个方向都要单独关闭 当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着 一方向不会再收到数据了,但是这个TCP连接上仍然能够发送数据,直到这一方也发送了FIN. 首先进行关闭的一方执行主动关闭,另一方执行被动关闭.第一个关闭的最后等待2MSL 第一次挥手: Client将FIN置为1,序号seq = M,发送给Server,进入FIN_WAIT_1状态 第二次挥手 Server收到后,将ACK置为1,ack = M+1,响应给Client,进入CLOSE_WAIT状态 Client收到响应后,进入FIN_WAIT_2状态 第三次挥手 Server在结束所有数据传输后,将F in 置为 1 ,seq=N+ 1 ,发送给Client,进入 LAST_ACK状态 第四次挥手 Client收到后,将ACK置为 1 ,ack=N+ 1 ,响应给 Server ,进入TIME_WAIT状态,等待 2 MSL后,进入CLOSED状态 Server 收到后,进入CLOSED状态 来源: CSDN 作者: brook_ 链接: https://blog.csdn.net/brook_/article

三次握手和四次挥手

假装没事ソ 提交于 2019-12-01 18:43:09
  TCP三通握手就像是两个人在50米对面看到对面的街道,但由于烟雾等原因无法100%确认,所以请求相互认识的方式相互认识。   张三首先向李思挥手致意。当李思看到张三向自己挥手时,他向对方点点头,微笑着(ack)。在看到李思的笑容之后,张三确认李思成功地认定了自己(进入了沦陷状态)。   然而,李思仍然有一些可疑的想法。他环顾四周,看看张三是否在看别人。他还需要确认一下。因此,李思也从张三招募了张。张三看到李思自言自语,知道对方正在寻求自己的确认。所以他点点头,挤了一下他的笑容(确认)。李思看到对方的笑容后,张三被证实是在招呼自己(进入既定状态)。   所以两个人加快了速度,相互拥抱并相互拥抱。   我们在这个过程中总共看到了四个动作,张三招手 - 李思点点头微笑 - 李思举手 - 张点点头微笑。其中,李斯连续两次行动,首先点头微笑(偿还另一方),然后再次招手(寻求确认)。事实上,你可以结合这两个动作,并在招手时点头和微笑(syn + ack)。然后四个动作被简化为三个动作,张三招手 - 李思点点头微笑着挥手 - 张点点头微笑。这是三次握手的本质。中间动作是两个动作的组合。   我们看到有两个中间状态,syn_sent和syn_rcvd。这两个州被称为“半开放”状态,即向对方挥手,但没有时间看到对方的点头微笑。 Syn_sent是活动开放侧的“半开”状态,而syn

简述TCP的三次握手和四次挥手的过程

你。 提交于 2019-12-01 18:42:34
三次握手: 第一次握手:客户机A发送标识位SYN=1,随机生成序列号seq=x的数据包到服务器B,服务器B由SYN=1知道客户机A建立连接,并进入SYN_SEND状态,等待服务器确认; 第二次握手:服务器B收到请求并确认联机信息后,向客户机A发送标识位SYN=1,ACK=1和随机产生的序列号seq=y,确认码ack number =x+1(客户机A发送的seq+1)的数据包,此时服务器进入SYN_RECV状态; 第三次握手:客户机A收到后检查确认码ack number是否正确,即和第一次握手发送的序列号加1结果是否相等,以及ACK标识位是否为1;若正确,客户机A发送标识位ACK = 1、seq = x + 1和确认码ack number = y + 1(服务器B发送的seq+1)到服务器B,服务器B收到后确认ACK=1和seq是否正确,若正确则完成建立连接,此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手,客户端与服务器开始传送数据.。 四次挥手: 第一次挥手:客户端A发送一个FIN=1、初始化序列号seq=u,到服务器B,用来主动关闭客户A到服务器B的数据传输,客户机A进入FIN-WAIT-1状态,等待服务器B发送FIN; 第二次挥手:服务器B收到这个FIN,它发回ACK = 1、确认序号ack number为收到的序号加1(ack number=u+1)

TCP的三次握手与四次挥手过程,各个状态名称与含义,TIMEWAIT的作用。

匆匆过客 提交于 2019-12-01 18:40:00
TCP建立连接要进行3次握手,大致流程如下:SYN(同步序号,表示此报文是一个连接请求或者连接接收报文),ACK(确认位,对接收到报文的确认),FIN(表示发送方发送完数据,用来释放一个连接) 1) 客户端向服务器端发送一个SYN J,表示客户端向服务器端发送一个连接请求报文,该报文的初始序列号为J。客户端进入SYN_SENT状态,等待服务器端确认。 2) 服务器端向客户端响应一个SYN K, 表示服务器端向客户端发送一个连接请求报文,该报文的初始序列号为K。并对SYN J进行确认ACK J+1,服务器端进入SYN_REVD状态。 3) 客户端再向服务器端发送一个确认ACK K+1。客户端和服务器端进入ESTABLISHED状态,完成三次握手,随后客户端和服务器端就可以开始传送数据了。 第四步,计算机收到服务器的确认之后,启动2MSL定时器,在time_wait状态还需再等2MSL,才会close。防止第四步的确认数据包丢失,万一确认服务器没有收到,服务器再发送FIN时,客户端还能给服务器确认。 来源: CSDN 作者: 种向日葵的小仙女 链接: https://blog.csdn.net/qiuchaoxi/article/details/79931010

TCP的三次握手和四次挥手的过程?三次握手改成两次或者四次可以吗为什么?

守給你的承諾、 提交于 2019-12-01 18:36:21
知识回顾: TCP 协议是面向连接的协议。 TCP 运输连接的三个阶段:建立连接,数据传输,释放连接 用三次握手建立连接 用四次挥手释放连接 seq (序号): TCP 连接字节流中每一个字节都会有一个编号,而本字段的值指的是本报文段所发送数据部分第一个字节的序号。 ack (确认号):表示期望收到的下一个报文段数据部分的第一个字节的编号,编号为 ack-1 及以前的字节已经收到。 SYN :当本字段为 1 时,表示这是一个连接请求或者连接接受报文。 ACK :仅当本字段为 1 时,确认号才有效。 FIN :用来释放一个连接。当本字段为 1 时,表示此报文段的发送端数据已发送完毕,要求释放运输连接。 连接建立阶段: 第一次握手:客户端的应用进程主动打开,并向服务端发出请求报文段。其首部中: SYN=1,seq=x 。 第二次握手:服务器应用进程被动打开。若同意客户端的请求,则发回确认报文,其首部中: SYN=1,ACK=1,ack=x+1,seq=y 。 第三次握手:客户端收到确认报文之后,通知上层应用进程连接已建立,并向服务器发出确认报文,其首部: ACK=1,ack=y+1 。当服务器收到客户端的确认报文之后,也通知其上层应用进程连接已建立。 在这个过程中,通信双方的状态如下图,其中 CLOSED :关闭状态、 LISTEN :收听状态、 SYN-SENT :同步已发送、

TCP的三次握手与四次挥手理解及面试题(很全面)

纵然是瞬间 提交于 2019-12-01 18:35:48
本文经过借鉴书籍资料、他人博客总结出的知识点,欢迎提问 序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。 确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。 确认ACK:占1位,仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效 同步SYN:连接建立时用于同步序号。当SYN=1,ACK=0时表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使得SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求,或连接接受报文。SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0。 终止FIN:用来释放一个连接。FIN=1表示:此报文段的发送方的数据已经发送完毕,并要求释放运输连接 PS:ACK、SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack、seq小写的单词表示序号。 字段 含义 URG 紧急指针是否有效。为1,表示某一位需要被优先处理 ACK 确认号是否有效,一般置为1。 PSH

三次握手与四次挥手

ぐ巨炮叔叔 提交于 2019-11-30 21:02:22
三次握手: 第一次握手:建立连接时,客户端发送syn(同步序列编号,syn=j)包到服务器,客户端进入SYN_SENT状态,等待服务器确认 第二次握手: 服务器收到syn包,必须确认客户端的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态 第三次握手: 客户端收到服务器的SYN+ACK包,向服务器发送确认包(ack=k+1),该包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。 四次挥手: (1)客户端进程发出连接释放报文,并且停止发送数据,释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。 (2)服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。 来源: https:/

三次握手、四次挥手!

旧时模样 提交于 2019-11-29 03:20:36
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。 ———————————————— 版权声明:本文为CSDN博主「青柚_」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_38950316/article/details/81087809 1)客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。 2)服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1