TCP的三次握手/四次挥手和TCP长连接和短连接的区别

TCP报文常用:

 Seq序号:占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记

 确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1

 标志位:

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

一.TCP的三次握手

三次握手:建立TCP连接 即建立一个TCP连接时 需要客户端和服务端发送三个包确认连接的建立 

  • 完成TCP三次握手,客户端和服务端开始传递数据
  • TCP连接如果保持 则不会有多次三次握手的产生  

第一次握手:客户端将标识位SYN设置为1 并且随机产生一个字节流值seq=J,并将该数据包发送给服务器,客户端进入SYN_SENT状态,等待服务器确认

第二次握手:服务器接收到数据包后,通过SYN=1知道客户端要求建立连接 ,服务器设置SYN=1,ACK=1,ack=J+1 来随机产生一个seq=k,将该数据包发送给客户端

来确认请求连接 服务端进入SYN_REVD状态

第三次握手:客户端接收到确认后 检查ack是否为J+1 ACK=1 如果正确 则将标识位ACK=1 ask=K+1发送给服务端 服务端检查数据包是否正确 如果正确则建立连接,并且客户端和服务端都进入ESTABLISHED状态 完成三次握手 随后客户端和服务端读可以建立连接啦

二,TCP的四次挥手

四次挥手:终止TCP连接  即断开一个TCP连接时 需要客户端和服务端共发送4个包确认断开连接 

情况一:一方主动关闭,另一方被动关闭

第一次挥手:客户端发送一个FIN 用来关闭客户端和服务端的数据传送 客户端进入FIN_WINT_1状态

第二次挥手:服务端收到FIN后 发送一个ack给客户端 确认序号为收到序号M+1 服务器进入CLOSE_WAIT状态

第三次挥手:服务端发送一个FIN  用来关闭服务端到客户端的数据传输 服务端进入LAST_ACK状态

第四次挥手:客户端收到FIN后 发送一个ACK给服务端 确认序号为N+1 服务端进入CLOSED状态 完成四次挥手

情况二:同时发起主动关闭

为何要三次握手?

为了防止服务端对客户端开启较多的无用连接,而导致的服务器的开销

网络传输有延时(有时候距离较远)如果说客户端发送包给服务器 服务器直接创建TCP连接返回内容给客户端 如果中间数据包丢失 客户端有超时时间关闭重新发送数据包 而服务端不清楚客户端连接是否成功 开启多次TCP请求

为何三次握手四次挥手?

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

 

三.查看浏览器中TCP长连接还是短连接

TCP的连接分为长连接和短连接。

长连接:指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,

一般需要自己做在线维持。连接→数据传输→保持连接→数据传输→保持连接→……→关闭连接  (减少多次TCP的三次握手和四次挥手)

短连接:短连接是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接。 连接→数据传输→关闭连接

检查F12->Network->头信息

Request Headers :Connection:keep-alive    浏览器希望服务器返回的是长连接( 长连接:连接被保持不会请求结束就关闭
Response Headers :Connection:keep-alive    服务器可以返回长连接接keep-alive 短连接接:close 
一般项目中保持长连接 

HTTP和TCP的联系?

同一个TCP连接中可以发送很多HTTP请求 一个HTTP请求一定在某一个TCP里面发送的 

在HTTP1.1中 同一个TCP连接里面连续发送多个请求 但是要按照顺序返回 前一个等待时间过长 后面依旧要排队 串行影响效率

在HTTP2中 同一个TCP连接里面连续发送多个请求不再需要按照顺序来进行返回处理 可以同时返回第一个里面的数据 和第二个里面的数据 并行处理 更大限度使web效率质的提升

对于长连接如何查看HTTP请求里需要的TCP数量?

步骤:检查F12->Network->Name/Status栏->右健->勾选Connection ID(TCP链接的id)  //记得提前勾选Disable catch禁止缓存 

 

 HTTP1.1 同一域名连续发送6条HTTP请求 建立6个TCP 从7个开始前面6个谁先加载完成 就复用谁的TCP连接

 HTTP2  同一域名可以共用同一个TCP 性能会有质的飞跃

 

猜你喜欢

转载自www.cnblogs.com/sunxiaopei/p/12575199.html