http那些事

http那些事

HTTP协议是基于C/S架构进行通信的,而HTTP协议的服务器端实现程序有httpd、nginx等,其客户端的实现程序主要是Web浏览器,例如Firefox、InternetExplorer、Google
chrome、Safari、Opera等,此外,客户端的命令行工具还有elink、curl等。Web服务是基于TCP的,因此为了能够随时响应客户端的请求,Web服务器需要监听在80/TCP端口。这客户端浏览器和Web服务器之间就可以通过HTTP协议进行通信了。

这是百度百科对于http的一段描述,我们来对这段话进行一个详解。

首先对于C/S架构这样的一个定义:
C/S 即Client-Server(C/S)结构,客户端/服务器有各自的分工,客户端负责与服务器端进行通讯并对用户动作做出反馈,服务器端接受客户端数据并保存,管理数据。

解释中提到TCP:

传输控制协议(TCP,Transmission Control
Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793 [1] 定义。

这是一种传输协议,按照此协议,不同的计算机可以进行通信。点击到达TCP详解
在前端开发工作中,如何让页面能够更快更准确的响应用户动作,http的优化是不可或缺的一个环节。
当我们在浏览器地址栏输入地址到页面的呈现过程:

1、 浏览器会首先进行URL解析,

一个URL包括协议,网络地址,资源路径
协议:最常用的比如HTTP(超文本传输协议)FTP(文件传输协议)
网络地址:可以是域名或者ip地址,包括端口号,如果没有默认为80
如果是不合法的地址,会转给默认的搜索引擎,例如如果你正在使用chrome,可以在url输入框输入你想要搜索的内容,然后搜索引擎会根据关键字进行搜索。

2、DNS解析

DNS通过域名找到对应服务器的外网IP

网站中,每发送一个TCP请求,都要进行DNS解析(一但当前域名解析过一次,浏览器一般会缓存解析记录,缓存时间一般在1分钟左右,后期发送的请求如果还是这个域名,则跳过解析步骤
=>这是一个性能优化点) 真实项目中,一个大型网站,他要请求的资源是分散到不同的服务器上的(每一个服务器都有自己的一个域名解析)

WEB服务器(处理静态资源文件,例如:html/css/js等 的请求) 数据服务器(处理数据请求) 图片服务器 (处理图片请求)
音视频服务器 …

这样导致,我们需要解析的DNS会有很多次 优化技巧:DNS Prefetch 即 DNS 预获取

让页面加载(尤其是后期资源的加载)更顺畅更快一些

<meta http-equiv="x-dns-prefetch-control" content="on">
<link rel="dns-prefetch" href="//static.360buyimg.com">
<link rel="dns-prefetch" href="//misc.360buyimg.com">
<link rel="dns-prefetch" href="//img10.360buyimg.com">
<link rel="dns-prefetch" href="//img11.360buyimg.com">
<link rel="dns-prefetch" href="//img12.360buyimg.com">
.......

3、浏览器主机根据ip地址与服务器建立TCP连接

tcp三次握手
1、 客户端发送一个SYN段,并指明客户端的初始序列号,即ISN©.
2、服务端发送自己的SYN段作为应答,同样指明自己的ISN(s)。为了确认客户端的SYN,将ISN©+1作为ACK数值。这样,每发送一个SYN,序列号就会加1. 如果有丢失的情况,则会重传。
3、为了确认服务器端的SYN,客户端将ISN(s)+1作为返回的ACK数值。

tcp三次握手的目的是为了确定两台计算机可以进行通信。

4、发送HTTP请求

浏览器发 HTTP 请求要携带三样东西:请求行、请求头和请求体。
1.请求行包含请求方法、URL、协议版本

请求方法包含 8 种:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACEURL 即请求地址,由<协议>://<主机>:<端口>/<路径>?<参数> 组成,协议版本即 HTTP 版本号

2.请求头包含请求的附加信息,由关键字/值对组成,如下
// 服务器可以接受的文件格式Accept:

text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng;q=0.8,application/signed-exchange;v=b3//
指定浏览器可以支持的 Web 服务器返回的内容压缩编码类型Accept-Encoding: gzip, deflate,
浏览器支持的语言Accept-Language: zh-CN,zh;q=0.9
// 缓存机制Cache-Control:
no-cache
// 是否需要持久连接Connection: keep-alive
// 发送该请求域名下所有 Cookie值到服务器Cookie: /* 省略cookie信息 *///
指定请求的服务器的域名和端口号Host:
www.baidu.comPragma: no-cacheUpgrade-Insecure-Requests: 1
// 用户代理
UA,包含发出请求的用户信息User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like
Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0
Mobile/15A372 Safari/604.1

3.请求体,可以承载多个请求参数的数据,包含回车符、换行符和请求数据,一般在 POST 方法下存在。
网络响应
跟请求部分类似,网络响应具有三个部分:响应行、响应头和响应体。
1.响应行包含:协议版本,状态码,状态码描述
HTTP/1.1 200 OK复制代码
状态码规则如下:

1xx:指示信息–表示请求已接收,继续处理
2xx:成功–表示请求已被成功接收、理解、接受
3xx:重定向–要完成请求必须进行更进一步的操作
4xx:客户端错误–请求有语法错误或请求无法实现
5xx:服务器端错误–服务器未能实现合法的请求

4.响应头部包含响应报文的附加信息,由 名/值 对组成,如下:

// 缓存机制Cache-Control: no-cacheConnection: keep-aliveContent-Encoding:
gzip // 表示具体请求中的媒体类型信息,决定浏览器将以什么形式、什么编码读取这个文件Content-Type:
text/html;charset=utf-8 // 原始服务器消息发出的时间Date: Wed, 04 Dec 2019 12:29:13
GMT // Web 服务器软件名称Server: apache // 由服务器端向客户端发送 cookieSet-Cookie:
rsv_i=f9a0SIItKqzv7kqgAAgphbGyRts3RwTg%2FLyU3Y5Eh5LwyfOOrAsvdezbay0QqkDqFZ0DfQXby4wXKT8Au8O7ZT9UuMsBq2k;
path=/; domain=.baidu.com
这里注意下 Set-Cookie中关于网络安全方面的两个值:HttpOnly、SameSite 设置了 HttpOnly 属性的 cookie 不能使用JavaScript 经由 Document.cookie 属性、XMLHttpRequest 和 Request APIs进行访问,以防范跨站脚本攻击(XSS)。 SameSite=Lax 允许服务器设定一则 cookie不随着跨域请求一起发送,这样可以在一定程度上防范跨站请求伪造攻击(CSRF)。

5.响应主体包含回车符、换行符和响应返回数据,并不是所有响应报文都有响应数据
响应完成之后要判断 Connection 字段,如果请求头或响应头中包含 Connection: Keep-Alive ,表示建立了持久连接,这样 TCP 连接会一直保持,之后请求统一站点的资源会复用这个连接。
否则断开 TCP 连接, 请求-响应流程结束。

断开连接TCP的四次挥手

1、客户端发起中断请求,发送FIN到服务端
2、服务端收到请求,可能数据还没有发完。这个时候不会关闭socket,而是回复ACK,告诉客户端知道了
3、客户端进入Fin_Wait状态,继续等待服务端端的FIN报文。服务端端发送完毕后,会向客户端发送FIN
4、客户端客服端收到后就回复ACK,并关闭连接

5、浏览器解析渲染页面

在这里插入图片描述

浏览器解析渲染页面分为以下五个步骤:

1、根据 HTML 解析出 DOM 树
2、根据 CSS 解析生成 CSS 规则树
3、结合 DOM 树和 CSS 规则树,生成渲染树
4、根据渲染树计算每一个节点的信息
5、根据计算好的信息绘制页面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铁锅炖大鹅(e)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值