作为前端工程师-为什么我们要学习HTTP?
在讲述为什么之前,我要描述一下我在工作过程中发生过的两个例子:
- 在清除cookie的第一次ajax的POST请求会莫名变成GET请求
- 页面点击超链接跳转,结果把目标链接当作html下载了下来
这两个问题在当时对我造成了极大的困扰,为解决问题却不得其解的情况下,我甚至几度曲线救国。这两个问题我将在后面的HTTP总结篇幅中分析原因。
再抛出一个是个前端都会遇到的问题:
为什么要使用小图片合并技术(雪碧图)?
因为要减少HTTP的请求数。
因为TCP三次握手非常耗时,但是HTTP1.1默认的Connection为Keep-Alive,1.0也可以通过主动设定为保持TCP连接状态。服务端和客户端需要任意一方终止或者时间到期才会中断保持的TCP连接。
不是就无所谓了吗?非也,大量短时间相同类型的相同报文首部信息的HTTP,造成了请求资源的浪费,未压缩的首部信息实际上比一些请求主体还要冗余。
感想
-
在HTTP的学习过程中,我再次意识到计算机是一门完整性的体系学科,我们无法凭借学好任何一两门课程就可以到达完成完成程序设计乃至软件工程,HTTP包含着极多的计算机网络/计算机硬件/密码学等多门学科的知识交叉。
-
还有就是浏览器性能优化其实只有2个点:
- http
- 浏览器的渲染(有很多也是http辅助完成的)
这两点就注定我们作为一个B/S架构的程序员,然后更是作为一个前后端分离大环境下的前端开发者一定要掌握好HTTP
;
好,现在我就看过的《图解HTTP》
来逐章总结我的HTTP理解
一个重要的面试题:从地址栏输入一个网址回车到展现一个Web页面,这个过程发生了什么?
我尝试用Web和网络层面来回答一下:
我们在地址栏输入了一个域名比如www.baidu.com
,在按下回车键这一瞬间,我们的计算机并没有办法直接知道这一串字母加数字的地址到底指向哪里,换句话说资源请求发向哪个IP
,我们接触计算机或多或少会接触2个词,DNS
和域名解析
,没错,我们的浏览器会首先把人类擅长记忆的字母数字的组合串发送给就近服务商提供的DNS服务器,DNS保存了域名和IP地址的唯一映射的数据库表,我们的浏览器从DNS拿到了返回的真实地址IP
,它是一串特定格式段的数字,计算机擅长以这种方式记忆和保存。
然后浏览器对指定IP
地址发了一个应用层的HTTP
请求,它生成了针对服务端的初始请求报文。我们在这里必须要聊一下http这家伙,因为它的历史是很有趣的,HTTP
的全名是超文本传输协议(HyperText Transfer Protocol),它在诞生之初是一个研究组织的博士为了在互联网共享学习资料而建立的传输协议。然后在网景和微软大战的那些年里,Web和HTTP技术得到了极速发展和普及,但是在近些年,作为底层传输协议的HTTP却驻足不前了,它的弊端显而易见,但是因为HTTP服务器的普及率,更新换代的成本和风险存在,它的历史包袱非常难打破。
接着,为了传输方便,在HTTP所在的应用层
下面的传输层
的TCP协议
(著名的TCP三次握手,就是客户端和服务端的反复确认数据传输成功的过程)把请求报文进行分割,并在各个报文上打上标记序号以及端口号转发给网络层,在网络层的IP协议
(Internent Protocol,实现了IP和MAC地址的配套)增加了通信目的地的物理地址(MAC地址)转发给链路层。这样在我们的客户端的发送动作告一段落。
然后通过传输,请求首先到达接受服务端的链路层,然后依次递上到达应用层。值得注意的是:发送端在层与层之间传递数据的时候,每一层都会打上一个该层所属的首部信息,到了接受端就会一层一层剥去。
然后服务器对请求报文进行读取,进过处理,返回客户端需要的资源😏喏,你要的给你咯。
http
协议是tcp/ip
协议族的子集。
http
是一种不保存状态,即无状态协议。要想要保存状态,实现状态保持,就需要引用到Cookie
技术。
http 1.1
版本开始为了减少短时间内大量资源请求带来的频繁的TCP连接中断,建立了keep-alive
持久连接,一方没有明确终止,TCP连接就不中断。
HTTP方法(Method)
- GET :获取资源(主要用来请求返回响应消息主体)
- POST :传输实体主体(主要用来发送消息实体到服务端)
- PUT :传输文件(存在安全问题,所以一般不采用)
- HEAD :获得报文首部(用于确认URI的有效性及资源更新的日期时间)
- DELETE :删除文件(较少使用)
- OPTIONS :询问支持的方法
- TRACE:追踪路径(因为可能导致跨站追踪攻击,一般更不怎么使用)
- CONNECT:要求用隧道协议连接代理(主要利用SSL和TLS)
在客户端和服务器间进行HTTP协议交互的信息被称为HTTP报文。客户端发起请求的报文叫做请求报文,服务器返回的响应报文叫做响应报文。
一个HTTP报文
内容上大致可分为报文首部和报文主体。报文主体并不一定有,通常情况下。
报文首部是任何HTTP请求的关键信息点,其中包含如下:
-
请求行
包含用于请求的方法(method),请求URI和HTTP版本。
-
状态行
包含表明响应结果的状态码,原因短句和HTTP版本。
-
首部字段
包含表示请求和响应的各种条件和属性的各种首部。
-
其他
包含HTTP的RFC里未定义的首部(Cookie)等。
在HTTP传输数据时候我们一般会添加一些编码来提高传输速率。
-
压缩传输的内容编码
- gzip(GNU zip)
- compress(UNIX系统的标准压缩)
- deflate(zlib)
- identity(不进行编码)
-
我们还可以分割发送的分块输出编码
之前已经写过一篇文章介绍过了 点这里
SSL\HTTPS
cookie
XSS注入攻击、SQL注入攻击