ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

三次握手和四次挥手

2021-09-30 18:03:26  阅读:142  来源: 互联网

标签:挥手 报文 连接 四次 FIN 握手 服务端 客户端


面试官在面试时特别喜欢问这个问题,所以本人最近在学习网络层面相关的知识时,特别留意了一下这个问题。

1、首先先来了解一下HTTP的工作原理

  1. 首先客户端和服务端先建立连接(TCP三次握手)

  2. 发送HTTP请求

  3. 服务器接受请求并返回HTTP响应

  4. 客户端收到响应后断开连接(TCP四次挥手)

  5. 客户端浏览器解析HTML内容

2、HTTP三次握手

 

1、第一次握手:客户端向服务端发出连接请求,将标志位SYN置为1,随机产生一个值seq=J;客户端进入SYN_SENT状态,等待服务器端确认

2、 第二次握手:服务端响应客户端,并要求确认,将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K;服务器端进入SYN_RCVD状态

3、第三次握手:客户端校验(ackJ+1 && ACK1),校验通过将标志位ACK置为1,ack=K+1响应服务端;服务端收到后校验(ackK+1 && ACK1),校验通过连接建立成功;客户端、服务端

为什么要三次握手?

一句话,主要防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。

如果使用的是两次握手建立连接,假设有这样一种场景,客户端发送了第一个请求连接并且没有丢失,只是因为在网络结点中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时此前滞留的那一次请求连接,网络通畅了到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费。

如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文并且回复了确认报文,但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。
 

 3、HTTP四次挥手

 

1、第一次挥手:客户端向服务端发出断开请求,将标志位FIN置为M;客户端进入FIN_WAIT_1状态

2、第二次挥手:服务端响应客户端,发送ack=M+1;客户端进入FIN_WAIT_2状态

3、第三次挥手:服务端向客户端发送请求,将标志位FIN置为N;服务端进入LAST_ACK状态

4、第四次挥手:客户端响应服务端,发送ack=N+1; 客户端进入TIME_WAIT状态,等待2MSL后没后收到回复证明服务端已关闭连接,此时客户端就关闭连接完成四次挥手

为什么要四次挥手?

在关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。

标签:挥手,报文,连接,四次,FIN,握手,服务端,客户端
来源: https://blog.csdn.net/EricYep/article/details/120561945

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有