浏览器发起一次http请求都经历了什么?

首先是拼接http请求报文(内容:请求行,请求头,请求体,空行)

请求行的内容:1.使用什么方法进行请求(get,post,put,delete,head(head和get几乎一样,主要区别head请求服务器是不返回body的,应用场景,你想知道你要下载的文件是多大时,是否支持断点下载。 得到这些数据之后再做具体的请求。head是比get速度                                      快的。)等等)

                          2.URL字段。/user/info类似这样的。

                          3.使用的http协议版本(现在大部分的都是Http1.1版本。 http版本有 http0.9    http1.0   http1.1 

                           http2.0(对请求行和请求头进行压缩优化,支持长连接,全部使用二进制格式进行传输,使用帧传输解决http1.1队头阻塞问题)   http3.0(对http2进行优化,因为实际应用上还存在很多挑战所以这里就不细说了。))

请求头内容:基本就是一些键值对的数据:

                     Host域名,用来寻找主机的,

                     User-Agent发方的类型,以前浏览器大战的时候火狐谷歌等标识请求是哪个浏览器发出的,因为有些兼容性的问题。如果是手机发起的一般会传手机的型号厂家。

                    Connection:Keep-Alive 是否要保持长连接,如果不保持长连接的话,一次请求结束后就关闭了此次连接。

                     Accept-Language:zh-cn 支持的语言是什么。在中国一般是中文或者英文。

                    Accept:image/gif.image/jpeg,*/* 传输的数据的类型。图片或者文本或者视频等。

                    Accept-Encoding:gzip,deflate 压缩的格式是什么。使用什么方式压缩,要使用对应的解压方式对数据进行解压。 压缩的作用是增加传输效率。

                    Range 此次请求需要获取的字节的范围,做断点续传或者断点下载都可以使用这个字段。

                    Content-Length    数据的长度,告诉服务端客户端传过来Body的长度有多少

                    Content-Type   告诉服务端 Body里面的数据类型是什么

                    其他的还有很多。。。。。

空行(java表示空行: \n): 它的作用是通过一个空行,告诉服务器请求头部到此为此。

请求体(Body):请求体一般就是一些文本或者 图片或者视频或者混合的数据等。如果请求体太大的话会被进行分包多次传输。

 

 

再就是

1.拼接好请求报文之后先进行DNS域名解析。先查看浏览器的缓存是否存在已解析好的结果。 如果缓存中没有,那再查找操作系统的缓存中是否有解析好的结果。 如果操作系统的缓存中也没有找到。那就到局域网的缓存中找,如果还是没找到,就到外网的缓存对应域名机构解析,外网的缓存也没找到的话就直接到根域名机构进行解析。如果解析成功就拿到了ip地址就层层返回层层返回,通过Ip地址去访问。如果没找到,就跟上层说域名无效。那此次请求就结束了。

一个域名可能会对应多个ip地址

2,拿到ip地址之后。通过路由系统,路由系统会推荐一条最优的访问路径去访问对应的地址。这里分配最优路径是通过各种算法计算的。(如果服务器配置了CDN(服务器的代理。CDN机构在世界各地都设立了网络节点,帮助用户以最快的速度访问到所需的资源。一般都是付费使用的。)则直接访问对应的CDN。不用直接访问到根服务器。服务器一般都是设置了层层缓存(缓存的层级很多一般都使用了代理来给服务器分担压力)。)

3,根据路由的推荐路径,通过网卡,把数据发送出去,这里有无线网络信号或者由物理层的光纤等把数据发送出去。

 

其次是查看此次是否使用https安全传输协议。

①不使用https安全协议,直接明文传输

拼接好请求报文之后,转交到tcp协议层了。tcp协议是可靠传输协议。问什么说tcp是可靠传输协议呢?因为它经历了三次握手 和四次挥手操作。

三次握手:

              1,客户端向服务端发起sycn同步报文,跟服务器说我要连接你进行数据传输。

              2,服务端收到客户端发送的sycn报文后,回复ack确定报文,服务端就跟客户端说,好的我知道了。

              3,客户端收到服务端回复的ack确定报文之后,再给服务端发送一个ack确定报文,跟服务端说,好的那我准备发送数据了,你做好准备接收。这样客户端与服务端就建立了连接。然后客户端就可以发送数据给服务端了。

在这里发送请求报文的可靠性是由tcp管理的。上层拼接好的http请求报文给到tcp层之后。tcp层会对请求报文进行分包,分多次发送给服务端。分包拼包在包发送完的结尾都会有提示的。如果有发送失败在这一层会重新发送。接收到服务端返回的报文也是在这一层拼接好之后再返回到上层的。

四次挥手:

              1,客户端发送完数据之后会给服务端发送一个fin结束报文。跟服务端说,我数据发完了要和你断开连接。

               2,服务端收到fin结束报文之后,会回复客户端一个ack报文,跟客户端说好的我知道了。(这里并没有直接就断开了。)

               3,过一会服务端会再次主动给客户端发一个fin结束报文说,我要跟你段开连接了。(第2步没有直接断开是因为当时服务端可能还有数据要发给客户端。所以要进行第3步服务端主动给客户端发送断开连接报文。再次和客户确认断开。)

               4,客户端收到服务端发送的fin断开报文后,回复一个ack确定报文,说好的你断开连接吧。这样客户端与服务端的连接就断开了。

tcp层只负责拆包,分包。管理包的发送成功失败重新发送。
 

②使用https安全协议传输

使用https和http只是增加了一层ssl加密传输协议层。下面说一下这层做的事情。

这一层主要是对数据进行加密,加密的方式有对称加密和非对称加密。加密的算法也有很多种。SHA256  SHA-1 MD5等

对称加密:对称加密简单的理解就是客户端与服务端的加密解密秘钥都是相同的。相对于非对称加密,对称加密的安全性稍弱。

非对称加密:客户端与服务端的加密解密秘钥是不同的。客户端有自己的加密和解密秘钥。服务也有自己的加密和解密秘钥。非对称加密的安全性更高。

虽然非对称加密的安全性更高,但是一般情况都是使用的对称加密。因为非对称加密的速度太慢。当然有些需要安全性极高的数据传输,就可以使用非对称加密。比如第一次交换加密密钥的时候。

身份的验证:1.客户端用私钥把数据加密得到密文发给服务端。服务端收到密文之后用客户端的公钥进行解密,如果解密成功证明正在与客户端通信。

2.服务端也是用服务端的私钥对数据进行加密。客户端用服务端的公钥进行解密。解密成功并且证书是可信的,证明正在与服务端通信。

 

未完待续......

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值