HTTP协议详细总结
计算机网络全总结:计算机网络五层体系结构总结
HTTPS协议的总结:近期更新~
文章目录
- HTTP协议
- 一、了解HTTP协议
- 浏览器背后的故事
- 两个概念
- HTTP协议的概念
- DNS的介绍
- HTTP事务处理过程
- 二、HTTP协议的特点
- 支持客户/服务器模式
- 简单快速
- 灵活
- 无连接
- 无状态
- 三、区分URI和URL
- 四、HTTP报文结构分析
- 请求报文结构
- 响应报文结构
- HTTP报文头
- 报文头常见字段
- Accept
- Accept-Encoding
- Accept-Language
- Connection
- Host
- Refer
- User-Agent
- Content-Type
- 五、HTTP请求方法分析
- GET
- POST
- PUT
- HEAD
- DELETE
- OPTIONS
- TRACE
- CONNECT
- 六、HTTP响应的状态码分析
- 介绍
- 各类状态码详解
- 常见状态码
- 2xx (4种)
- 3xx (5种)
- 4xx (4种)
- 5xx (3种)
- 七、常见认证方式
- 常见的认证方式
- BASIC认证
- DIGEST认证
- SSL客户端认证
- FormBase 认证
- 八、HTTP的长连接与短连接
- 九、HTTP中介之网关
- 网关的介绍
- 代理服务器和网关的区别
- WEB网关
- 常见的网关类型
- 十、HTTP缓存
- 简介
- 描述缓存的报文头字段
- Cache-Control
- Expires
- Last-Modified
- if-Modified-Since
- Etag
- if-None-Match
- HTTP缓存工作方式
- 缓存改进方案
- MD5 / hash缓存
- CDN缓存
- CDN缓存工作方式
- 浏览器操作对HTTP缓存的影响
- 十一、HTTP内容协商机制
- 介绍
- 内容协商方式
- 客户端驱动
- 服务器驱动
- 透明协商
- 服务器驱动内容协商方式概述
- 请求头与响应头的比对
- 近似匹配
- 十二、断点续传和多线程下载
- 简介
- 请求头Range
- 响应头Content—Range
- 断点续传过程
HTTP协议
一、了解HTTP协议
1. 浏览器背后的故事
2. 两个概念
- 文本表示图片、文字等信息
- 超文本表示文本中含有链接,可以通过链接跳转到某一页面
3. HTTP协议的概念
- 超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器
- HTTP是一个属于应用层的面向对象的协议,由于其简捷、决速的方式,适用于分布式超媒体信息系统。
4. DNS的介绍
- 通常我们访问一个网站,使用的是主机名或者域名来进行访问的。因为相对于IP地址(一组纯数字) ,域名更容易让人记住。但TCP/IP协议使用的是IP地址进行访问的,所以必须有个机制或服务把域名转换成IP地址。DNS服务就是用来解决这个问题的,它提供域名到IP地址之间的解析服务
查询映射关系的过程:
首先查找本地的host文件,查看所请求的域名是否有对应的ip地址映射,若没有,则查找本地DNS服务,若没有,找所配置的优先的网络中的DNS服务,若没有,继续在网络中向上层找:
- 如果采用转发模式,则逐层在网络中向上层找,直到找到根DNS服务,将得到的结果逐层返回
- 如果不采用转发模式,则直接查询网络中的13个DNS服务,将得到的结果直接返回
5. HTTP事务处理过程
当客户端访问Web站点时,首先会通过DNS服务查询到域名的IP地址。然后浏览器通过IP地址生成HTTP请求,并通过TCP/IP协议发送给Web服务器。Web服务器接收到请求后会根据请求生成响应内容,并通过TCP/IP协议返回给客户端。
二、HTTP协议的特点
1. 支持客户/服务器模式
客户/服务器模式工作的方式是由客户端向服务器发出请求,服务器端响应请求,并进行相应服务
2. 简单快速
- 客户向服务器请求服务时, 只需传送请求方法和路径
- 请求方法常用的有GET, HEAD, POST。每种方法规定了客户与服务器联系的类型不同
- 由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快
3. 灵活
- HТТР允许传输任意类型的数据对象
- 正在传输的类型由Content—Type(Content—Type是HTTP包中用来表示内容类型的标识)加以标记
4. 无连接
- 无连接的含义是限制每次连接只处理一个请求
- 服务器处理完客户的请求,并收到客户的应答后,即断开连接
- 采用这种方式可以节省传输时间
5. 无状态
- HTTP协议是无状态协议
- 无状态指的是客户端向服务器发送请求之后,服务器仅传回响应,并不对请求做任何的保留和记忆
- 无状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大
- 另一方面,在服务器不需要先前信息时它的应答就较快
- 可以使用Cookie和Session机制辅助记忆,二者的使用详见 文档 / 主页博客
三、区分URI和URL
- URI像一个标识,可以分为URL与URN或同时具备locators和names特性的一个东西
- URN作用就好像一个人的名字, URL就像一个人的地址
- URN确定了东西的身份, URL提供了找到它的方式
- URL是URI的一种,但不是所有的URI都是URL
- URI和URL最大的差别是“访问机制”,有访问机制的,比如http协议、ftp等协议的是URL
- URN是唯一标识的一部分,是身份信息
四、HTTP报文结构分析
1. 请求报文结构
2. 响应报文结构
3. HTTP报文头
HTTP的报文头大体可以分为四类,分别是:
通用报文头、请求报文头、响应报文头、实体报文头
请求方的http报头结构:通用报头|请求报头|实体报头
响应方的http报头结构:通用报头|响应报头|实体报头通用报文头 (请求和响应都通用的报文头)
请求报文头
响应报文头
实体报文头
4. 报文头常见字段
Accept
- 作用:浏览器端可以接受的媒体类型
- Accept:text/html 代表浏览器可以接受服务器回发的类型为text/html也就是我们常说的html文档,如果服务器无法返回text/html类型的数据,服务器应该返回一个406错误(Non Acceptable)
- Accept:*/* 代表浏览器可以处理所有类型
- 如果想要给显示的媒体类型增加优先级,则使用 q=权重值 表示;q的范围是0—1 (可精确到小数点后3位) ,且1为最大值。不指定权重q值时,默认权重为q=1.0,当服务器提供多种内容时,将会首先返回权重值最高的媒体类型
Accept-Encoding
- 作用: 浏览器声明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip, deflate)
Accept-Language
- 作用:浏览器声明自己接收的语言
举例如下:
Accept-Language: zh-cn,zh;q=0.7,en-us,en;q=0.3
客户端在服务器有中文版资源的情况下,会请求其返回中文版对应的响应,没有中文版时,则请求返回英文版响应
Connection
- Connection: keep—alive 当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接
- Connection: close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭,当客户端再次发送Request,需要重新建立TCP连接
Host
- 作用:请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的
我们在浏览器中输入: http://www.fljf.com:8080
浏览器发送的请求消息中,就会包含Host请求报头域,Host: www.fljf.com:8080
Refer
- 当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器借此可以获得一些信息用于处理
User-Agent
- 作用:告诉HTTP服务器,客户端的基本信息,比如使用的操作系统和浏览器的名称和版本
- 很多情况下我们会通过User—Agnet来判断浏览器类型,从而进行不同的兼容设计
Content-Type
- 作用:说明了报文体内对象的媒体类型
- 举例:Content-Type: text/html; charset:utf-8
常见的类型
text/html :HTML格式
text/plain :纯文本格式
text/xml :XML格式
image/gif :gif图片格式
image/jpeg :jpg图片格式
image/png :png图片格式
application/xhtml+xml :XHTML格式
application/xml :XML数据格式
application/atom+xml :Atom XML聚合格式
application/json :JSON数据格式
application/pdf :pdf格式
application/msword :Word文档格式
application/octet-stream :二进制流数据(如常见的文件下载)
multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式
五、HTTP请求方法分析
1. GET
- GET方法用来请求访问已被URI识别的资源
- 指定的资源经服务器端解析后返回响应内容
GET方法会将提交的参数显示在URL中,不安全
http://localhost/login.php?username=aa&password=1234
从上面的URL请求中,很容易就可以辨认出表单提交的内容
- 浏览器对于提交URL的长度也有所限制
2. POST
- POST方法的功能与GET类似
- 数据放在请求体中,没有直接放在请求头的URL中,较为安全,一般用于提交表单的数据,理论上URL 的长度没有限制
3. PUT
- 从客户端向服务器传送的数据取代指定的内容
- PUT方法与POST方法最大的不同是: PUT是幂等的,而POST不是幂等的
- 幂等表示取代同一个地方的内容,即更新数据,如更换头像
- 非幂等如论坛发表评论,不会取代之前已发的内容
4. HEAD
- 一般用来测试某个地址是否可以连通
- 类似于GET请求,只不过返回的响应中没有具体的内容,用于获取报头
5. DELETE
- 请求服务器删除指定的资源
6. OPTIONS
- 用来查询请求头的URL所指定的资源支持的请求方法
7. TRACE
- 回显服务器收到的请求,主要用于测试或诊断
8. CONNECT
- 开启一个客户端与所请求资源之间的双向沟通的通道,它可以用来创建隧道
六、HTTP响应的状态码分析
1. 介绍
是用以表示网页服务器超文本传输协议响应状态的3位数字代码,图片见上述响应报文的结构
2. 各类状态码详解
3. 常见状态码
2xx (4种)
- **200 OK:**表示从客户端发送给服务器的请求被正常处理并返回
- **202 Accept:**已接受请求,但未处理完成
- **204 No Content:**表示客户端发送的请求得到了成功处理,但在返回的响应报文中不含实体的主体部分(没有资源可以返回)
- **206 Patial Content:**表示客户端进行了范围请求,并且服务器成功执行了这部分的GET请求,响应报文中包含由Content-Range指定范围的实体内容
3xx (5种)
- **301 Moved Permanently:**永久性重定向,表示请求的资源被分配了新的URL,浏览器会自动定向到新的URL,之后的请求应使用更改的URL
**302 Found:**临时性重定向,表示请求的资源被分配了新的URL,客户端应继续使用原有URL
301与302的区别:前者是永久移动,后者是临时移动
**303 See Other:**表示请求的资源被分配了新的URL,应使用GET方法定向获取请求的资源
302与303的区别:后者明确表示客户端应当采用GET方式获取资源
- **304 Not Modified:**表示客户端发送附带条件(是指采用GET方法的请求报文中包含if-Match、If-Modified-Since、If-None-Match、If-Range、If-Unmodified-Since中任一首部)的请求时,服务器端允许访问资源,但是请求为满足条件的情况下返回改状态码
- **307 Temporary Redirect:**临时重定向,与303有着相同的含义,307会遵照浏览器标准不会从POST变成GET;(不同浏览器可能会出现不同的情况)
4xx (4种)
- **400 Bad Request:**表示请求报文中存在语法错误
- **401 Unauthorized Required:**未经许可,需要通过HTTP认证
- **403 Forbidden:**服务器理解客户端的请求,但服务器拒绝该次访问(访问权限出现问题)
- **404 Not Found:**表示服务器上无法找到请求的资源,除此之外,也可以在服务器拒绝请求但不想给拒绝原因时使用
5xx (3种)
- **500 Inter Server Error:**表示服务器内部发生了错误,也有可能是web应用存在的bug或某些临时的错误时
- **502 Bad Gateway:**充当网关或代理的服务器,从远端服务器接收到一个无效的请求
- **503 Server Unavailable:**表示服务器暂时处于超负载或正在进行停机维护,无法处理请求
七、常见认证方式
1. 常见的认证方式
- BASIC认证(基本认证)
- DIGEST认证(摘要认证)
- SSL客户端认证
- FormBase 认证 (基于表单认证)
2. BASIC认证
使用质询/响应的方式,直接发送经过Base64编码后的明文密码
Authorization头信息:
例:Authorization: Basic dXNlcjE6cGFzczE=
其中 dXNlcjE6cGFzczE= 是ID与密码以冒号相隔组成的字符串,再经base64编码后的结果
3. DIGEST认证
DIGEST认证同样使用质询/响应的方式,但不会像BASIC认证那样直接发送明文密码
4. SSL客户端认证
SSL客户端认证是借由HTTPS的客户端证书完成认证的方式。凭借客户端证书认证,服务器可确认访问是否来自已登录的客户端
5. FormBase 认证
- 基于表单的认证方法并不是在HTTP协议中定义的
- 使用由Web应用程序各自实现基于表单的认证方式
- 通过Cookie和Session的方式来保持用户的状态
八、HTTP的长连接与短连接
- HTTP协议是基于请求/响应模式的,因此只要服务端给了响应,本次HTTP请求就结束了
- HTTP的长连接和短连接本质上是TCP长连接和短连接
- HTTP/1.0中,默认使用的是短连接;也就是说,浏览器和服务器每进行一次HTTP操作,就建立—次连接, 结束就中断
- HTTP/1.1起,默认使用长连接,用以保持连接特性
- HTTP的长连接格式
HTTP长连接与短连接简要过程
短连接:
建立连接一数据传输一关闭连接 … 建立连接一数据传输一关闭连接
长连接:
建立连接—数据传输…(保持连接)…数据传输—关闭连接
九、HTTP中介之网关
HTTP代理服务器Nginx的使用见 文档 / 主页博客
1. 网关的介绍
- 网关可以作为某种翻译器使用,它抽象出了一种能够到达资源的方法;网关是资源和应用程序之间的粘合剂
- 网关扮演的是“协议转换器”的角色
2. 代理服务器和网关的区别
3. WEB网关
Web网关在一侧使用HTTP协议,在另一侧使用另一种协议;格式:<客户端协议>/<服务器端协议>
- (HTTP /)服务器端网关:通过HTTP协议与客户端对话,通过其他协议与服务器通信
- (/ HTTP)客户端网关:通过其他协议与客户端对话,通过HTTP协议与服务器通信
4. 常见的网关类型
- (HTTP / *)服务器端Web网关
- (HTTP / HTTPS)服务器端安全网关
- (HTTPS / HTTP)客户端安全加速器网关
资源网关:客户端通过http连接到应用程序的服务器,服务器并不回传数据,而是将请求通过网关的api
发送给运行在服务器的应用程序,此程序将响应回传给客户端
十、HTTP缓存
1. 简介
若每次相同的URL都重新请求服务器的资源,会导致服务器的压力较大,故引出了缓存机制;缓存的内容一般是css等改动频率比较低的静态资源,往往都是存在浏览器端,防止这些“多余”的请求重复的访问服务器
2. 描述缓存的报文头字段
Cache-Control
- 通用报文头,缓存控制字段
常见取值如下:
- no—store:所有内容都不缓存
- no—cache:缓存,但是浏览器使用缓存前,都会请求服务器判断缓存资源是否是最新
- max—age=x(单位 秒):请求缓存后的X秒不再发起请求
- s—maxage=x(单位 秒):代理服务器请求源站缓存后的X秒不再发起请求 (只对CDN缓存有效)
- public:客户端和代理服务器(CDN)都可缓存
- private:只有客户端可以缓存
Expires
响应头,代表资源过期时间,由服务器返回提供,是http1.0的属性在与max-age共存的情况下,优先级要低
Last-Modified
响应头,资源最新修改时间,由服务器告诉浏览器
if-Modified-Since
请求头,资源最新修改时间,由浏览器告诉服务器,和Last-Modified是一对,它两会进行对比
Etag
响应头,资源标识,由服务器告诉浏览器
if-None-Match
请求头,缓存资源标识,由浏览器告诉服务器(其实就是上次服务器给的Etag),和Etag是一对,它两会进行对比
3. HTTP缓存工作方式
**场景一:**让服务器与浏览器约定一个文件过期时间—Expires
**场景二:**让服务器与浏览器在约定文件过期时间的基础上,再加一个文件最新修改时间的对比 Last—Modified 与 if-Modified-Since
**场景三:**让服务器与浏览器在过期时间 Expires + Last-Modified 的基础上,增加一个文件内容唯一对比标记
Etag 与 lf-None- Match , 再加入一个max-age来加以代替Expires
4. 缓存改进方案
MD5 / hash缓存
对一个资源添加MD5或者Hash修改之后同时也修改其请求路径,本地没有此路径的缓存,则会发起新的请求获取到改变的内容;解决浏览器无法跳过缓存过期时间主动感知文件变化的问题
CDN缓存
- CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率
- 举个例子理解CDN缓存:原来一个城市只有一个火车票总售卖点,流量大,压力大;后来城市建立了很多代售点,居民可以就近买票;代售点称为CDN节点,可以处理一部分请求,减轻总服务器的压力
5. CDN缓存工作方式
第一次请求:
后续请求:
6. 浏览器操作对HTTP缓存的影响
无效表示不使用缓存文件,重新发起请求
十一、HTTP内容协商机制
1. 介绍
指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最为适合的资源。内容协商会以响应资源的语言,字符集,编码方式等作为判断的基准
2. 内容协商方式
客户端驱动
客户端发起请求,服务器发送可选项列表,客户端作出选择后再发送第二次请求
服务器驱动
服务器检查客户端的请求头部集并决定提供哪个版本的页面 (使用较多)
透明协商
某个中间设备(通常是缓存代理)代表客户端进行协商
3. 服务器驱动内容协商方式概述
请求头与响应头的比对
- Accept:告知服务器发送何种媒体类型 (对应的响应头) Content-Type
- Accept—Language:告知服务器发送何种语言 (对应的响应头) Content-Language
- Accept—Charset:告知服务器发送何种字符集 (对应的响应头) Content-Type
- Accept—Encoding:告知服务器采用何种编码 (对应的响应头) Content-Encoding
近似匹配
四种语言及其优先级:
Accept-Language: eniq=0.5, fr;q=0.0, nl;q=1.0, trq=0.0
十二、断点续传和多线程下载
1. 简介
- HTTP是通过在Header里两个参数实现的,客户端发请求时对应的是Range ,服务器端响应时对应的是Content—Range
- 续传成功,响应会返回状态码206
- 内容若有改动,响应会返回状态码200及新文件的内容
2. 请求头Range
- 指定第一个字节的位置和最后一个字节的位置
- 一般格式:Range:(unit=first byte pos)-[last byte pos]
- 左开右闭,但实际执行时两边都是闭区间
3. 响应头Content—Range
- 在发出带Range的请求后,服务器会在Content—Range头部返回当前接受的范围和文件总大小
- 一般格式:Content-Range: bytes (unit first byte pos) - [last byte pos]/[entity length]
在响应完成后,返回的响应头内容也不同:
- HTTP/1.1 200 Ok (不使用断点续传方式)
- НТТP/1.1 206 Partial Content (使用断点续传方式)
4. 断点续传过程
- 客户端下载一个1024K的文件,已经下载了其中512K
- 网络中断,客户端请求续传,因此需要在HTTP头中申明本次需要续传的片段 Range:bytes=512000-
- 这个头通知服务端从文件的512K位置开始传输文件直到文件全部传输完毕
- 服务端收到断点续传请求,从文件的512K位置开始传输,并且在HTTP头中增加 Content-Range:bytes 512000-/1024000
- 并且此时服务端返回的HTTP状态码应该是206,而不是200
还没有评论,来说两句吧...