首页 > 编程知识 正文

tcp协议三次握手四次挥手,tcp三次握手解决了什么问题

时间:2023-05-06 16:11:14 阅读:33384 作者:3306

如果TCP协议的三次握手和四次挥手三次握手只需要两次握手来建立连接,那么可能出现的情况是四次挥手为什么建立连接是三次握手,关闭连接确实是四次挥手呢? TIME_WAIT状态有什么作用? 为什么主动关闭的一方没有直接进入关闭状态释放资源? 为什么在TIME_WAIT状态变为CLOSE状态之前必须经过2MSL?

三次握手形象的比喻

用客户端的可乐落后,服务器端的衣服吓人,两人写信告白:第一次握手:

迟到的可乐对害怕的衣服说:“我喜欢你。第二次握手:

可怕的衣服告诉迟到的可乐。 明白了。 我也喜欢你。

此时害怕的服装是第三次握手:

迟到的可乐回复:我也知道。 一起吧。 此时才真正建立连接。

令牌解释SYN请求号令牌ACK确认号令牌seq序列号表示请求方发送数据的第一字节号ACK返回的确认号,表示接收方接收到收据后,即上述seq, 下一个要发送数据的第一个字节编号状态位解释CLOSEDclient表示关闭状态LISTENserver处于监听状态,等待client连接到SYN-RCVD时,server表示已接收到SYN消息当从客户端接收到ACK消息时,将进入ESTABLISHED状态。SYN-SENT指示客户端发送了SYN消息,等待服务器第二次握手的ESTABLISHED指示连接已建立第一次握手:客户端第一次发送连接请求数据。 SYN=1,ACK=0表示连接请求,将发送的具体数据的第一个字节号标记为x,并分配seq。

第二次握手:服务端收到请求后,返回客户端的SYN=1,加上自己的确认号ACK=1,将发送的具体数据的第一个字节号设为y,分配seq,客户端下一个

客户端的发送接收能力正常,服务端的发送接收能力也正常,但此时服务无法确认客户端的发送接收能力是否正常

第三次握手:客户端收到并确认服务端返回的请求后,再次发送数据,直接返回ACK=1,此处无需发送SYN=1。 为什么会这样呢? 此时,由于不是与服务端的连接请求,而是连接确认,所以只需返回ACK=1的代表确认即可。 同样,我想让发送的具体数据的第一个字节号为seq=x 1,服务端下一个发送数据的第一个字节号为ack=y 1,为什么TCP建立连接时,必须握手三次呢? 两次不行吗?

一句话的回答:主要目的3360服务器端一直在等待,防止浪费资源,

如果建立连接只需要握手两次,则可能会假定来自客户端的第一个连接请求消息段在断开连接后的某个时间到达服务器,因为网络延迟。

这是一个已经禁用的连接请求,但服务器收到此禁用请求后,客户端误以为再次发出了新的连接请求。

因此,服务器向客户端发送确认消息,同意建立连接。

如果不采用“3次握手”,只要服务器发出确认,就会建立新的连接。

由于客户端目前没有真正连接到服务器的意愿,因此不会忽略服务器的确认,也不会向服务器发送数据。

但是,由于服务器认为建立了新的连接,并且一直在等待来自客户端的数据,所以服务器的很多资源都被浪费了

“握手三次”可以防止上述现象。 例如,在上述情况下,客户端不会向服务器确认提交确认,服务器不会收到确认,因此客户端不会要求建立连接。

4挥手比喻形象

恋爱后,迟到了的可乐和可怕的煮衣服的电话粥。 依然落后的可乐作为客户端,可怕的衣服作为服务器端。 迟到的可乐和可怕的衣服搭话,第一次挥手:

迟到的可乐说:已经结束了。第二次挥手:

“是的,我知道了。 还没结束。

继续穿可怕的衣服吧。 结束后请访问第三次挥手:

可怕的衣服对迟到的可乐说:我完了。第四次挥手:

迟到的可乐送到了,我会告诉你可怕的衣服。 是的,我知道了。 等了2毫秒后,晚点的可乐没电了。

这个时候,穿完可怕的衣服,等2毫秒,如果迟到的可乐一直没有出声,这个时候,我会再说一遍。 我说完了。 收到迟到的可乐的最后答复后,就挂了电话。

状态位:FIN=1:代表要求断开连接

http://www.Sina.com/:客户端发送关闭客户端到服务器的数据传输的FIN,客户端处于FIN_WAIT_1状态。 http://www.Sina.com/:服务器收到FIN后,向客户端发送ACK,确认收到序列号

到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手 为什么建立连接是三次握手,关闭连接确是四次挥手呢?

建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。
而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。为了确保正确关闭连接,所以需要四次。

TIME_WAIT状态有什么作用,为什么主动关闭方没有直接进入CLOSED状态释放资源?

答:防止连接关闭时四次挥手中的最后一次ACK丢失:如果主动关闭方进入CLOSED状态后,被动关闭方发送FIN包后没有得到ACK确认,超时后就会重传一个FIN包。如果客户端没有TIME_WAIT状态而直接进入CLOSED状态释放资源,下次启动新的客户端就可能使用了与之前客户端相同的地址信息,有两个危害,第一种是这个刚启动的新的客户端绑定地址成功时,就会收到了一个重传的FIN包,对新连接就会造成影响。第二种是如果该新客户端向相同的服务端发送SYN连接请求,但是此时服务端处于LAST_ACK状态,要求收到的是ACK而不是SYN,因此就会发送RST重新建立请求。

为什么TIME_WAIT状态需要经过2MSL才能进入CLOSE状态?

答:MSL指的是报文在网络中最大生存时间。在客户端发送对服务端的FIN确认包ACK后,这个ACK包有可能到达不了,服务器端如果接收不到ACK包就会重新发送FIN包。所以客户端发送ACK后需要留出2MSL时间(ACK到达服务器器+服务器发送FIN重传包,一来一回)等待确认服务器端缺失收到了ACK包。也就是说客户端如果等待2MSL时间也没收到服务器端重传的FIN包,则就可以确认服务器已经收到客户端发送的ACK包

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。