HTTP协议介绍
基本介绍
- HTTP (Hyper Text Transfer Protocol) :全称超文本传输协议,是用于从万维网(www:World Wide Web)服务器传输超文本到本地浏览器的传送协议。
- web以http协议作为规范,完成从客户端到服务器端等一系列运作流程。(web是建立在http协议上通信的)HTTP协议用于客户端和服务端之间的通信
- http属于TCP/IP协议族内部的一个子集
- HTTP是一种应用层协议,是基于TCP/IP通信协议来传递数据的,其中HTTP1.0、HTTP1.1、HTTP2.0均为TCP实现,HTTP3.0基于UDP实现。现主流使用HTTP1.0和 HTTP3.O
协议:
- 为了使数据在网络上从源头到达目的,网络通信的参与方必须遵循相同的规则,这套规则称为协议,它最终体现为在网络上传输的数据包的格式。(通俗点讲,协议就是要保证网络通信的双方,能够互相对接上号。)
HTTP协议的工作过程
- 当我们在浏览器输入一个网址,此时浏览器就会给对应的服务器发送一个HTTP请求,对应的服务器收到这个请求之后,经过计算处理,就会返回一个HTTP响应。并且当我们访问一个网站时,可能涉及不止一次的HTTP请求和响应的交互过程。
HTTP协议的重要特点:
- 一发一收,一问一答
- 注意︰网络编程中,除了一发一收之外,还有其它的模式
- 多发一收:例如上传大文件
- 一发多收:例如看直播时,搜索一个词条可以得到多个视频源
- 多发多收:例如串流(steam link、moonlight等等)
URI和URL
URL
- 平时我们俗称的“网址”,其实就是URL(Uniform Resource Locator),翻译为统一资源定位符
- 互连网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它
URI
- 统一资源标识符
URI和URL
- 用字符串标识某一互联网资源,而URL表示资源的地点,可见URL是URI的子集
- 在充分理解的基础上,可以用URL替换URI
报文
- 请求报文是由请求方法,请求URI,协议版本,可选的请求首部字段和内容实体构成的
- 响应报文基本上有协议版本,状态码,用以解释状态码的原因短语,可选的响应首部字段以及实体主体构成
HTTP请求方法
GET和POST的区别
- GET习惯上会把客户端的数据通过query string 来传输(body部分是空的) ;
- POST习惯上会把客户端的数据通过body来传(query string 部分是空的)(querystring是URL的一部分,其中包含着需要传给web application的数据.)
- 一般情况,程序员会把GET请求的处理,实现成“幂等”的;对于POST 请求的处理,不要求实现成“幂等”。(幂等:一个 HTTP方法是幂等的,指的是同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。换句话说,幂等的方法不应该具有副作用。幂等性只与后端服务器的实际状态有关,而每一次请求接收到的状态码不一定相同)
- GET请求可以被缓存,可以被浏览器保存到收藏夹中;POST请求不能被缓存
关于GET请求的URL长度问题的误解(URL的最大字符长度限制)
- 网上有一种错误的解释:GET请求的长度是存在上限的,并且GET请求存在上限的原因是URL的长度存在上限。(RFC 2616标准正确的解释,没有对URL的长度有任何限制。)
- URL的长度取决因素︰实际上URL的长度取决于浏览器的实现和HTTP服务器端的实现。在浏览器端,不同的浏览器最大的长度是不同的,但是现在浏览器支持的长度一般都很长;在服务器端,一般这个长度是可以配置的
关于POST比 GET更安全的误解
- 网上有一种错误的解释:如果实现登录页面,如果使用GET实现登录,GET习惯上把数据放到query string中,此时就能看到浏览器的URL中显示当前的用户名和密码了,所以就并不安全;而 POST 习惯上会把数据放到body 中,因此登录时就不能直接看到用户名和密码,就安全
- 正确的理解:安全问题取决于是否加密以及加密算法的强度。这和将数据信息放到 query string 或body中无关,因为通过抓包,我们就可以得到这两部分的数据
关于GET只能传输文本数据的误解
- 网上有一种错误的解释:GET只能传输文本数据;POST可以传输文本数据,也可以传输二进制数据
- 正确的理解︰GET也可以传输二进制数据,虽然不能直接在query string中传输二进制数据,但是可以针对二进制数据进行urlencode,转码后就可以放到url 中 ;GET还可以直接将二进制数据放到body 中
状态码
- http状态码负责表示客户端HTTP请求的返回结果,标记服务器端的处理是否正常,通知出现的错误等工作
状态码的类别
1XX | (信息性状态码) | 表示接收的请求正在处理 |
---|---|---|
2XX | (成功状态码) | 表示请求正常处理完毕 |
3XX | (重定向状态码) | 需要进行附加操作以完成请求(为了完成请求,必须采取进一步措施) |
4XX | (客户端错误状态码) | 表示服务器无法处理请求 |
5XX | (服务器错误状态码) | 表示服务器处理请求出错 |
常见的状态码
- 200:客户端发来的请求在服务器端被正常处理,服务器成功返回网页
- 204:服务器接收的请求已成功处理,但返回的响应报文中不含实体的主体部分,即 无资源可返回。(一般在只需从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用。)
- 301:永久重定向,请求的资源已被分配新的URL,以后应使用资源现在所指的URL
- 302∶临时重定向,请求的资源已被分配新的URL,希望用户本次使用新的URL
- 304:未修改,客户端发送附带条件的请求时,服务器端允许请求访问资源,但请求未满足条(304其实与重定向没有关系。)
- 400:请求报文中存在语法错误,当错误发生时,需要修改请求的内容后再次发送请求,另外,浏览器会向对待200 OK一样对待该状态码
- 401:发送的请求需有通过HTTP认证的认证信息
- 403:对请求资源的访问被服务器拒绝了
- 404:请求的网页不存在,服务器上无法找到请求的资源x.500:服务器内部错误,服务器在执行请求时发生错误
- 503∶服务器暂时不可用,服务器暂处于超负载或正在进行停机维护,现在无法处理请求
状态码和状况都不一致
- 不少返回的状态码响应都是错误的,但是用户可能察觉不到这点,比如web应用程序内部发生错误,状态码依然返回200 OK这种情况也经常遇到
HTTP首部
- Http首部内容为客户端和服务器分别处理请求和响应,提供所需要的信息,它能起到传 递额外重要信息的作用
- 若http首部字段重复了,有的浏览器会优先处理,第一次出现的首部字段,而有些则会 优先处理,最后出现的首部字段
四种类型
- 通用首部字段
- 请求首部字段
- 响应首部字段
- 实体首部字段
Cookie
- Cookie是浏览器提供的一种让程序员在本地存储数据的能力
- 为什么需要Cookie ?
当你不小心打开某个不安全的网站,该网站就可以在你的硬盘上写一个病毒程序,那么你的电脑就挂了,因此浏览器为了保证安全性,就禁止网页中的代码访问主机的硬盘(无法在JS中读写文件),因此也就失去了持久化存储的能力,故Cookie就很重要!
HTTPS介绍
-
Http的缺点
-
HTTP协议中没有加密机制,使用明文不加密内容可能会被窃听
-
不验证通信方的身份,因此有可能遭遇伪装
-
无法证明报文的完整性,所以有可能以遭篡改
-
-
Http加上加密处理和认证以及完整性保护后即是Https
-
Https采用混合加密机制:在交换密钥环节使用公开密钥加密方式,之后的建立通信交换报文阶段则使用共享密钥加密方式。
-
https并不 是一种新的协议, 只是http通信接口部分用SSL和tls协议代替而已
-
为什么不一直使 用https?
-
与纯文本通信相比,加密通信会消耗更多的CPU及内存资源
-
当使用SSL的时候,处理速度会变慢
-
HTTP协议
-
HTTP是无状态协议(p37)
- Http是一种不保存状态,即无状态协议,协议对于发送过的请求或响应都不做持久化处理,为了实现期待的保持状态功能,引入cookie技术
-
持久连接: (节省通信量)
- 在http中,所有的连接默认都是持久连接,只要任意一端, 没有明确提出断开连接,则保持TCP连接状态
-
管线化:
- 持久连接,使得多数请求以管线化方式发送成为可能,这样就能够做到同时并行发送多个请求,而不需要一个接一个的等待响应
-
Http可 以在传输数据的过程中,通过编码提升传输效率
-
内容编码:压缩传输的内容编码指明应用在实体内容的编码格式,并保持实体信息原样压缩,内容编码后的实体由客户端接收并负责解码
-
分块传输编码:分割发送的分块传输编码,在传输大量数据时,通过把数据分割成多块,能够让浏览器逐步显示页面,使用分块传输编码的实体主体会由接收的客户端负责解码,恢复到编码前的实体主体
-
-
HTTP协议中采纳了多部分对象集合,发送的一份报文主体内可含有多类型实体f.范围请求:指定范围发送的请求,获取部分内容
-
内容协商返回最合适的内容(语言,字符集,编码方式)
web服务器
-
用单台虚拟主机实现多个入域名,使用虚拟主机的功能,可以假想有多台服务器,在相同的IP地址下,由于虚拟主机可以寄存多个不同主机名和域名的web网站,因此在发送HTTP请求时,必须在host首 部内网,反正指定主机名或域名的URI。
-
通信数据转发的程序:代理,网关和隧道。
-
代理是一种有转发功能的应用程序,接收由客户端发送的请求并转发给服务器,同时也接收服务器返回的响应并转发给客户端代理,有很多种方法。(代理 服务器会向原服务器确认资源的有效性。)
- 缓存代理会预先将资源的副本缓存保存在代理服务器上,当代理在直接收到相同的资源请求时,直接将之前缓存的资源作为响应返回
- 透明代理,不对豹纹做任何加工的代理类型
-
网关能使通信线路上的服务器提供非HTTP协议服务,能提高通信的安全性,在客户端和网关之间的通信线路,上加密,以确保连接的安全。(利用 网关可以由HTTP请求转化为其他协议通信)
-
隧道的目的是确保客户端能与服务器进行安全的通信
-
代理服务器会向原服务器确认资源的有效性
-
TCP/IP
分层管理
协议层 | 功能 | 详细说明 |
---|---|---|
应用层 | 向用户提供应用服务时通信的活动 | 比如FTP、DNS、Telnet等服务 |
传输层 | 对上层应用层提供处于网络连接中的两台计算机之间的数据传输 | 该层包括TCP、 UDP两个性质不同的协议 |
网络层 | 处理网络数据包,规定通过怎样的路径到达对方计算 与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所起机,并把数据包传输给对方 | 与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所起的作用就是在众多的选项内选择一条 |
链路层 | 用来处理连接网络的硬件部分 | 包括操作系统中的设备驱动程序和计算机中对应的网卡 |
通信传输流
确保可靠性
TCP建立连接:三次握手
TCP关闭连接:四次挥手
DSN服务
- 负责域名解析,提供通过域名查找IP地址,或逆向从IP地址反查域名服务