http/1.1,http/2和http/3、三次握手和四次挥手

1.http/1.1

tcp三次握手(syn,syn ack ,ack)建立TCP连接。

1个网页一般由多个文件组成,最基本的就是html、css、js和图片文件。对于http协议来说,我们打开1个网页需要TCP三次握手,建立TCP连接,才正式进行请求。服务器先发送html文件给我们,其他文件不会发给我吗。我们浏览器在收到html文件以后,根据html里面的内容再向服务器一次请求Css、Js等文件。如果请求队伍里面有一个文件没有收到,后面的文件也无法接收,就会造成http队头阻塞。最老的http是一次一个请求响应。

http1.1默认说持久连接(keep-alive),请求和响应放在同一个连接里面,但是只有一个连接速度太慢,连接太多会造成DDos攻击。所以各家浏览器允许的持久连接数都不太相同。谷歌默认的是同时6个连接。http1.1当中有个管线化技术,单个连接可以发送多个请求,但是响应的时候按发送的顺序进行接收,就会造成很大的执行难度。(网络协议很难解决,所以开发层面会将小图标全部做成一张图片,在用js或者css把小图标分布到网站的各个部分,减少请求次数。)(Data Urls,图片用base64编码,然后就可以以字符的形式写进html或者css里面,但是编码的结果很长)(网站弄出多个域,使得浏览器可以下载这些资源,5张图片设置5个域名,然后浏览器就会同时下载了,就不用等前面资源下载后轮到下一个资源,也就是域名分片,但是开发复杂度提高)(把js、css加入到html中)。

TCP三次握手、TCP慢启动(减少网络的拥堵,拥塞控制)

http1.1的首部没有压缩且是明文。而且http1.1的请求和响应都有首部,包括很多重复的开销。

2.http/2

http/2的多路复用解决http/1.1的队头阻塞问题,减少了等待的时间。单个TCP连接进行交错发送请求和响应,请求和响应互不影响。

请求和响应被划分成各个不同的帧。帧可以分为首部帧和数据帧。把原本HTTP报文的首部和实体拆分成2个部分。

(http/2帧包括 长度、类型、标志、R、流标识符、负载)

流标识符可以按照顺序进行组合,而且帧类型中可以设置优先级标注流的权重。

http/2解决http/1.1的首部不压缩的问题,也就是http2进行了首部压缩,采用了HPACK的压缩算法。HPACK算法要求浏览器和服务器都保存一张静态只读的表。cookie的信息可以作为动态信息加入到动态表。Http/2的帧不是ASCII编码的报文,而是被提前转化为二进制的帧,解析起来更有效率。

(服务器推送可能会造成DDos攻击,有安全性问题)

http/2解决了应用层面的问题,但是http/2的传输层是基于tcp协议。tcp协议是由操作系统内核实现的。而且http2产生的那个年代也有tls了,为了传输的安全性,http2也会结合tls1.3一起使用,可加可不加但是不加浏览器会有安全提示。

原本tls1.2对应四次挥手,tls1.3调整成一来一回2次

3.http/3

http/3把tcp和tls的握手过程整合在一起了,减少了来回的开销。传输层用的UDP协议,并且添加了QUIC协议(整合了TCP和TLS),所以http3默认是使用加密传输。

QUIC帧包括:类型、流标识符、偏移量、数据长度、负载

用连接ID标识为同一个连接。http3的应用层没有帧的概念,把数据帧移到了QUIC帧里面,相当于在传输层有了数据帧,从源头解决数据阻塞的问题,实现多路复用。QUIC帧被封装为QUIC数据包,QUIC数据包包括标志、负载、连接ID。如果网络发送全面改变(wifi变4G网络),也就是Ip地址变了,但是客户端和服务器端已经协商好了连接ID,所以用连接id识别同一个连接,避免再次握手。QUIC数据包把QUIC帧加密,在TLS握手后,QUIC帧被加密了,QUIC数据包会被UDP封装成数据段,UDP加上端口号。选择hhtp3进行通信,QUIC就像TCP一样建立连接了。

4.三次握手、四次挥手

(1)三次握手

套接字socket=IP地址:端口号

TCP报文有syn、ack和fin等标识(1开启标识,0关闭标识)

1)首先在客户端发送TCP报文的时候,会把SYN开启(同步),

TCP是全双工的,所以可以支持互发信息。

2)服务器此时会把SYN和ACK(确认)开启,服务器也生成自己的序号。确认号等于对方的序号+1.

3)客户端进行确认,这边的序号用对方的确认号确认。

握手之后建立连接,客户端发起http请求,服务器端响应内容。

版本2:

在该过程中发送了三包数据,所以称为3次握手。

为什么要建立三次握手,而不是两次握手。

服务端回复完SYN+ACK包就建立连接,防止已失效的报文返回到服务器端引起错误。

比如SYN1包因为网络节点的原因被滞留,所以重发SYN2包,这次SYN2包顺利正常到达。服务端回复SYN+ACK包之后就建立了连接。第一包阻塞的节点又突然恢复,第一包的SYN包又送到服务端。这时服务端会误认为是客户端又发起了1个新的连接。从而在 握手之后进入等待状态。也就是客户端认为是1个连接,但是服务器端认为是2个连接,造成了状态不一致。

三次握手中,如果服务端收不到客户端的ACK包,自然不会认为连接建立成功。三次握手是为了解决网络信道不可靠的问题。为了在不可靠的信道建立起可靠的连接。经过三次握手之后,客户端和服务端都进入了数据传输状态。

一包数据可以拆成多包发送,如何处理丢包问题。以及数据包到达的先后顺序不同,如何处理乱序问题。t为了解决以上问题,tcp为每一个连接建立发送缓冲区,从建立连接后的第一个字节序列号为0,后面的每个字节的序列号都会增加1.发送数据时,从发送缓冲区取一部分数据组成发送报文,在tcp头会附带序列号和长度,接收端在收到数据后,需要回复确认报文,确认报文中的ACK=序列号+长度=下一包起始序列号。能够使发送端确认发送的数据已经被对方收到。

为什么客户端要进行超时等待时间,这时需要等待服务端收到ACK包。因为客户端在发送完最后一包ACK包就释放了连接。一旦ACK包在网络中丢失,服务端就一直处于最后确认的状态。如果客户端发送最后一包ACK包后,等待一段时间,这时服务端因为没有收到ACK包,会重发FIN包。客户端会响应这个FIN包,重发ACK包并刷新超时时间。

··················

UDP协议是无连接的,就是把数据包从网卡发送出去,数据包之间并没有状态上的联系。资源占用少。

TCP(稳定可靠):传输文件、发送邮件、浏览网页。

UDP:速度快,但是可能产生丢包,适用于对实时性要求较高的,对少量丢包并没有太大要求的场景。(比如域名查询、视频直播、语音通话、VPN(隧道网络)。

三次握手解决信道不一致

(2)四次挥手

注意:客户端和服务端都能发起 关闭请求。

假设是客户端主动发起关闭请求

客户端会在报文中开启FIN和ACK控制位

相关推荐
文火冰糖的硅基工坊3 小时前
[创业之路-640]:通信行业供应链 - 通信网的发展趋势:IP化统一 、云网融合 、算网协同 、FMC(固定移动融合)、空天地一体化
网络·网络协议·tcp/ip·系统架构·通信·产业链
我也要当昏君3 小时前
4.1 网络层的功能 (答案见原书 P134)
网络·智能路由器
apple_ttt3 小时前
专栏导航:《数据中心网络与异构计算:从瓶颈突破到架构革命》
网络·架构·异构计算·数据中心网络
liulilittle6 小时前
DNS泄露检测技术剖析:原理、实现
网络·ip·dns·泄露·通信·test·leak
ZHOU_WUYI6 小时前
构建实时网络速度监控面板:Python Flask + SSE 技术详解
网络·python·flask
lisw058 小时前
大模型的第一性原理考量:基于物理本质与数学基础的范式重构
网络·人工智能·机器学习
拾忆,想起8 小时前
RabbitMQ死信交换机:消息的“流放之地“
开发语言·网络·分布式·后端·性能优化·rabbitmq
2501_915918418 小时前
Video over HTTPS,视频流(HLSDASH)在 HTTPS 下的调试与抓包实战
网络协议·http·ios·小程序·https·uni-app·iphone
存储服务专家StorageExpert8 小时前
NetApp存储基本概念科普:物理层到逻辑层
linux·服务器·网络·netapp存储·存储维护