声明:以下内容多参考整理于网络文章
一.缘起
之前去面试时,面试官几乎没有问其他问题,整场面试下来,死磕协议的知识不放,由于自己在这方面准备并不是很充分,回答的并不是很好,于是回来结合面试的情况,查了很多的资料,认真地了解一下HTTP协议,如果写的不好的地方,留言指出。
二.HTTP概述:
HTTP ( HyperText Transfer Protocal
),全称为超文本传输协议。HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答的标准。通常,由HTTP客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,比如"HTTP/1.1 200 OK",以及返回的内容,如请求的文件、错误消息、或者其它信息。
三.HTTP特点:
- 支持客户端、服务端模式
- 简单快速:客户向服务器请求服务时,只需要传送请求方法和路径。由于HTTP协议简单,使得通信速度比较快
- 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记
- 无连接:每次连接只处理一个请求,服务器处理完客户请求,收到用户的应答后,便断开连接,这种方式可以节省传输时间
- 无状态:无状态是指协议对于事物处理没有记忆能力。不对请求和响应之间的通信状态进行保存,缺少状态意味着如果后续处理需要前面的信息,则它必须重传,无状态协议解决办法: 1、通过、Cookie 2、通过Session会话保存
四.TCP/IP
TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。
五.TCP/IP参考模型
应用层:负责处理特定的应用程序细节。简单网络管理SNMP协议,简单网络传输SMTP,域名解析DNS,文件下载FTP协议,远程协助,Telnet协议,超文本传输HTTP等等。
传输层:主要为两台主机上的应用提供端到端的通信。TCP协议和UDP协议
网络层:处理分组在网络中的活动,比如分组的选路。IP协议等
网络接口层:包括操作系统中的设备驱动程序、计算机中对应的网络接口卡
六.HTTP与HTTPS的区别
概述:
HTTP协议传输的数据都是未加密的,也就是明文的,可以用抓包工具直接抓下来并且可见,而HTTPS则是利用了网景公司设计的SSL(Secure Sockets Layer)协议对HTTP协议传输的数据进行加密,SSL 依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。抓包工具抓下来的是密文,大幅增加了中间人攻击的成本。简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比HTTP协议安全
主要区别:
- HTTP的URL由
http://
起始且默认使用端口80,而HTTPS的URL由https://
起始且默认使用端口443 - HTTP是超文本传输协议,信息是明文传输,HTTPS则是具有安全性的 SSL 加密传输协议
- HTTP的连接很简单,是无状态的,HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 http 协议安全
七.HTTP1.0与HTTP2.0的区别
HTTP 2.0 的出现,相比于 HTTP 1.x ,大幅度的提升了 web 性能
1.多路复用
多路复用允许通过单一的HTTP2.0连接同时发起多重的请求-响应消息,而在HTTP1.0中,浏览器客户端在同一时间,针对同一域名的请求有一定数量的限制,超出限制数目的请求会被阻塞HTTP2.0 可以很容易的去实现多流并行而不用依赖建立多个 TCP 连接,HTTP2.0 把 HTTP 协议通信的基本单位缩小为一个一个的帧,这些帧对应着逻辑流中的消息。并行地在同一个 TCP 连接上双向交换消息。
2.二进制分帧
HTTP2.0在应用层(HTTP2.0)和传输层(TCP/UDP)之间增加一个二进制分帧层,在二进制分帧层中,HTTP2.0会将所有的信息分割为更小的消息和帧,并采用二进制格式编码
HTTP2.0 通信都在一个连接上完成,这个连接可以承载任意数量的双向数据流。
在过去, HTTP 性能优化的关键并不在于高带宽,而是低延迟。TCP 连接会随着时间进行自我「调谐」,起初会限制连接的最大速度,如果数据成功传输,会随着时间的推移提高传输的速度。这种调谐则被称为TCP 慢启动。由于这种原因,让原本就具有突发性和短时性的 HTTP 连接变的十分低效。HTTP/2 通过让所有数据流共用同一个连接,可以更有效地使用 TCP 连接,让高带宽也能真正的服务于HTTP 的性能提升。
3.首部压缩
HTTP/1.1并不支持 HTTP 首部压缩,为此 SPDY 和 HTTP/2 应运而生, SPDY 使用的是通用DEFLATE 算法,而 HTTP/2 则使用了专门为首部压缩而设计的 HPACK 算法。
4.服务端推送
服务端推送是一种在客户端请求之前发送数据的机制。在 HTTP/2 中,服务器可以对客户端的一个请求发送多个响应。服务端推送让 HTTP1.x 时代使用内嵌资源的优化手段变得没有意义;如果一个请求是由你的主页发起的,服务器很可能会响应主页内容、logo 以及样式表,因为它知道客户端会用到这些东西。这相当于在一个 HTML 文档内集合了所有的资源,不过与之相比,服务器推送还有一个很大的优势:可以缓存!也让在遵循同源的情况下,不同页面之间可以共享缓存资源成为可能。
八.URL的组成
协议+主机名+路径+参数
九.HTTP请求
HTTP请求报文分为三个部分:请求行,请求头,请求体
1.请求行
请求行包括三个方面:请求方法、请求地址、协议版本
HTTP/1.1 协议中共定义了八种方法(也叫“动作”)来以不同的方式操作指定的资源
方法名 | 功能 |
---|---|
GET | 向指定的资源发出“显示”请求,使用 GET 方法应该只用在读取数据上,而不应该用于产生“副作用”的操作中 |
POST | 指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求文本中。这个请求可能会创建新的资源或者修改现有资源,或两者皆有。 |
PUT | 向指定资源位置上传其最新内容 |
DELETE | 请求服务器删除 Request-URI 所标识的资源 |
OPTIONS | 使服务器传回该资源所支持的所有HTTP请求方法。用* 来代替资源名称,向 Web 服务器发送 OPTIONS 请求,可以测试服务器功能是否正常运作 |
HEAD | 与 GET 方法一样,都是向服务器发出指定资源的请求,只不过服务器将不传回资源的本文部分,它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中关于该资源的信息(原信息或称元数据) |
TRACE | 显示服务器收到的请求,主要用于测试或诊断 |
CONNECT | HTTP/1.1 中预留给能够将连接改为通道方式的代理服务器。通常用于 SSL 加密服务器的链接(经由非加密的 HTTP 代理服务器) |
下面介绍常用方法GET与POST的区别:
- GET:一般用于信息获取,使用URL传递参数并且可见,传递参数数量有限
- POST:一般用于提交数据,参数不可见,传递参数数量无限制
注意:
- 安全性讲,get和post都一样,没啥所谓的哪个更安全
get请求参数在url地址上,直接暴露,post请求的参数放Request body部分,按F12也直接暴露了,所以没啥安全性可言
- GET和POST有一个重大区别,简单的说:
GET产生一个TCP数据包;POST产生两个TCP数据包
原因是:
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据)
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)
什么情况下使用POST请求:
无法使用缓存文件(更新服务器上的文件或数据库),GET能请求缓存,POST不能
向服务器发送大量数据(POST 没有数据量限制)
发送包含未知字符的用户输入时,POST 比 GET 更稳定也更可靠
2.请求头
请求头可用于传递一些附加信息,格式为:键: 值
,注意,冒号后面有一个空格:
常见的请求 Header
名称 | 作用 |
---|---|
Authorization | 用于设置身份认证信息 |
User-Agent | 用户标识,如:OS 和浏览器的类型和版本 |
If-Modified-Since | 值为上一次服务器返回的Last-Modified 值,用于确定某个资源是否被更改过,没有更改过就从缓存中读取 |
If-None-Match | 值为上一次服务器返回的 ETag 值,一般会和If-Modified-Since |
Cookie | 已有的Cookie |
Referer | 标识请求引用自哪个地址,比如你从页面 A 跳转到页面 B 时,值为页面 A 的地址 |
Host | 请求的主机和端口号 |
请求和响应常见通用的 Header
名称 | 作用 |
---|---|
Content-Type | 请求体/响应体的类型,如:text/plain、application/json |
Accept | 说明接收的类型,可以多个值,用, (英文逗号)分开 |
Content-length | 请求体/响应体的长度,单位字节 |
Content-Encoding | 请求体/响应体的编码格式,如 gzip、deflate |
Accept-Encoding | 告知对方我方接受的 Content-Encoding |
ETag | 给当前资源的标识,和Last-Modified 、If-None-Match 、If-Modified-Since 配合,用于缓存控制 |
Cache-Control | 取值一般为no-cache 、max-age=xx ,xx为整数,表示资源缓存有效期(秒) |
3.请求体
请求体(又叫请求正文)是 post 请求方式中的请求参数,以 key = value 形式进行存储,多个请求参数之间用&连接,如果请求当中请求体,那么在请求头当中的 Content-Length 属性记录的就是该请求体的长度
十.HTTP响应
HTTP响应报文分为三个部分:响应状态行,响应头,响应体
1.响应状态行
状态码 | 对应的信息 |
---|---|
1XX | 提示信息—表示请求已接收,继续处理 |
2XX | 用于表示请求已被成功接收、理解、接收 |
3XX | 用于表示资源(网页等)被永久转移到其它 URL,也就是所谓的重定向 |
4XX | 客户端错误—请求有语法错误或者请求无法实现 |
5XX | 服务器端错误—服务器未能实现合法的请求 |
常见状态码
2XX 成功
- 200 OK,表示从客户端发来的请求在服务器端被正确处理
- 204 No content,表示请求成功,但响应报文不含实体的主体部分
- 206 Partial Content,进行范围请求
3XX 重定向
- 301 moved permanently,永久性重定向,表示资源已被分配了新的 URL
- 302 found,临时性重定向,表示资源临时被分配了新的 URL
- 303 see other,表示资源存在着另一个 URL,应使用 GET 方法丁香获取资源
- 304 not modified,表示服务器允许访问资源,但因发生请求未满足条件的情况
- 307 temporary redirect,临时重定向,和302含义相同
4XX 客户端错误
- 400 bad request,请求报文存在语法错误
- 401 unauthorized,表示发送的请求需要有通过 HTTP 认证的认证信息
- 403 forbidden,表示对请求资源的访问被服务器拒绝
- 404 not found,表示在服务器上没有找到请求的资源
5XX 服务器错误
- 500 internal sever error,表示服务器端在执行请求时发生了错误
- 503 service unavailable,表明服务器暂时处于超负载或正在停机维护,无法处理请求
2.响应头
响应头同样可用于传递一些附加信息
常见的响应 Header
名称 | 作用 |
---|---|
Date | 服务器的日期 |
Last-Modified | 该资源最后被修改的时间 |
Transfer-Encoding | 取值一般为 chunked,出现在 Content-Length 不能确定的情况下,表示服务器不知道响应板体的数据大小,一般同时出现Content-Encoding 响应头 |
Set-Cookie | 设置 Cookie |
Location | 重定向到另一个 URL,如输入浏览器就输入 baidu.com 回车,会自动跳转到[www.baidu.com] 就是通过这个响应头控制的 |
Server | 后台服务器 |
3.响应体
响应体也就是网页的正文内容,一般在响应头中会用 Content-Length 来明确响应体的长度,便于浏览器接收,
对于大数据量的正文信息,也会使用 chunked 的编码方式。
十一.浏览器输入url按回车背后经历了哪些
1、首先,在浏览器地址栏中输入url,先解析url,检测url地址是否合法
2、浏览器先查看浏览器缓存-系统缓存-路由器缓存,如果缓存中有,会直接在屏幕中显示页面内容。若没有,则
跳到第三步操作。
浏览器缓存:浏览器会记录DNS一段时间,因此,只是第一个地方解析DNS请求;
操作系统缓存:如果在浏览器缓存中不包含这个记录,则会使系统调用操作系统,获取操作系统的记录(保存最近
的DNS查询缓存);
路由器缓存:如果上述两个步骤均不能成功获取DNS记录,继续搜索路由器缓存;
ISP缓存:若上述均失败,继续向ISP搜索。
3、在发送http请求前,需要域名解析(DNS解析),解析获取相应的IP地址。
4、浏览器向服务器发起tcp连接,与浏览器建立tcp三次握手。
5、握手成功后,浏览器向服务器发送http请求,请求数据包。
6、服务器处理收到的请求,将数据返回至浏览器
7、浏览器收到HTTP响应
8、浏览器解码响应,如果响应可以缓存,则存入缓存。
9、 浏览器发送请求获取嵌入在HTML中的资源(html,css,javascript,图片,音乐······),对于未知类型,会弹出对话框。
10、 浏览器发送异步请求。
11、页面全部渲染结束。