这里写目录标题
http
一.介绍
- HTTP是一种应用层协议,基于TCP/IP实现
- HTTP1.0,HTTP1.1,HTTP2.0均为TCP实现
- HTTTP3.0为UDP实现
二.格式
- 请求格式
- 响应格式
三.URL
- 我们俗称的”网址“,其实就是 URL(Uniform Resource Locator),翻译为统一资源定位符
- 互连网上的每个文件都有一个唯一的 URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它
`协议类型:[//服务器地址[:端口号]][/资源层级 UNIX 文件路径]文件名[?查询字符串][#片段标识符]
四.方法
GET 和 POST 的区别
GET 和 POST 其实没有本质区别,使用 GET 的场景完全可以使用 POST 代替,使用 POST 的场景一样可以使用 GET 代替。但是在具体的使用上,还是存在一些细节的区别
- GET 习惯上会把客户端的数据通过 query string 来传输(body 部分是空的);
- POST 习惯上会把客户端的数据通过 body 来传输(query string 部分是空的)
- GET 习惯上用于从服务器获取数据;POST 习惯上是客户端给服务器提交数据
- 一般情况,程序员会把 GET 请求的处理,实现成“幂等”的;对于 POST 请求的处理,不要求实现成“幂等”
- GET 请求可以被缓存,可以被浏览器保存到收藏夹中;POST 请求不能被缓存
关于 GET 请求的 URL 长度问题的误解
网上有一种错误的解释:
- GET 请求的长度是存在上限的,这个上限有被说成 1024kb、2048kb 等等,并且 GET 请求存在上限的原因是 URL 的长度存在上限
- RFC 2616 标准正确的解释: HTTP 协议由 RFC 2616 标准定义,该标准中明确说明 “Hypertext Transfer Protocol – HTTP/1.1,” does not specify any requirement for URL length,即没有对 URL 的长度有任何限制
- URL 的长度取决因素: 实际上 URL 的长度取决于浏览器的实现和 HTTP 服务器端的实现。在浏览器端,不同的浏览器最大的长度是不同的,但是现在浏览器支持的长度一般都很长;在服务器端,一般这个长度是可以配置的
关于 POST 比 GET 更安全的误解
网上有一种错误的解释:
- 如果实现登录页面,如果使用 GET 实现登录,GET 习惯上把数据放到 query string 中,此时就能看到浏览器的 URL 中显示当前的用户名和密码了,所以就并不安全;而 POST 习惯上会把数据放到 body 中,因此登录时就不能直接看到用户名和密码,就安全
- 正确的理解: 安全问题取决于是否加密以及加密算法的强度。这和将数据信息放到 query string 或 body 中无关,因为通过抓包,我们就可以得到这两部分的数据
其他方法
- PUT: 与 POST 相似,但是具有幂等特性,一般用于更新
- DELETE: 删除服务器指定资源
- OPTIONS: 返回服务器所支持的请求方法
- HEAD: 与 GET 类似,只不过响应体不返回,只返回响应头
- TRACE: 能显示服务器端收到的请求,测试的时候会用到
- CONNECT: 预留,暂无使用
五.报头
header 的整体格式是键值对结构,每个键值对占一行,键和值之间使用 冒号+空格 进行分割
Host
HOST 的值表示服务器主机的地址和端口(地址可以是域名,也可以是 IP;端口号可以省略或者手动指定)
Content-Length
Content-Length 表示 body 的数据长度,长度单位是字节
Content-Type
Content-Type 表示 body 的数据格式,以下介绍三种请求中的数据格式
- application/x-www-form-urlencoded:
这是 form 表单提交的数据格式,此时 body 的格式就类似于 query string(是键值对的结构,键值对之间使用 & 分割,键与值之间使用 = 分割
- multipart/form-data
这是 form 表单提交的数据格式(需要在 from 标签上加上 enctyped=“multipart/form-data”),通常用于 HTML 提交图片或者文件
- application/json
此时 body 数据为 json 格式,json 格式就是源自 js 的对象的格式。用一个 { } 括住,里面有多个键值对,键值对之间使用逗号分割,键和值之间使用冒号分割
六.Cookie
简介
- 网页将数据保存在主机硬盘上存在安全风险,防止访问不安全网页时,将病毒写入主机,所以浏览器禁止网页访问主机硬盘,因此失去了持久化存储,
- Cookie是浏览器提供的一种让程序员才本地存储的能力
数据
- Cookie 中存储了一个字符串,是键值对结构的,键值对之间使用 ;分割,键和值之间使用 = 分割
- Cookie 这个数据可能是客户端(网页)自行通过 JS 写入的,也可能来自于服务器在 HTTP 响应的 header 中通过 Set-Cookie 字段给浏览器返回数据。
传输过程
Cookie 字段会在后续的请求中,把浏览器本地存储的这些键值对再发送回服务器
经典应用就是保持客户端的登录状态
缺陷
每次请求都要把该域名下所有的 Cookie 通过 HTTP 请求传给服务器,因此 Cookie 的存储容量是有限的
七,常见状态码
-
200 OK
表示访问成功 -
404 Not Found
表示没有找到资源:当你发送请求的 URL 在服务器中找不到该资源,就会出现 404 -
403 Forbidden
表示访问被拒绝 -
405 Method Not Allowed
表示访问的服务器不能支持请求中的方法或者不能使用该请求中的方法 -
500 Internal Server Error
表示服务器出现内部错误 -
504 Gateway Timeout
表示当前服务器负载比较大,服务器处理单条请求的时耗很长,就会出现超时情况 -
302 Move temporarily
表示临时重定向 -
301 Moved Permanently
表示永久重定向,当浏览器收到这种响应时,后续的请求都会被自动改成新的地址
八.session
九.session和Cookie区别
-
cookie:cookie是由Web服务器保存在用户浏览器上的文件(key-value格式),可以包含用户相关的信息。客户端向服务器发起请求时,会携带服务器端之前创建的cookie,服务器端通过cookie中携带的数据区分不同的用户。
-
session:session 是浏览器和服务器会话过程中,服务器会分配的一块储存空间给session。服务器默认会为客户浏览器的cookie中设置 sessionid,这个sessionid就和cookie对应,浏览器在向服务器请求过程中传输的cookie 包含 sessionid ,服务器根据传输cookie 中的 sessionid 获取出会话中存储的信息,然后确定会话的身份信息。
-
安全性:cookie数据存放在客户端上,安全性较差,session数据放在服务器上,安全性相对更高
-
大小限制:cookie有大小限制,单个cookie保存的数据不能超过4K,session无此限制,理论上只与服务器的内存大小有关;
-
服务器资源消耗:Session是保存在服务器端上会存在一段时间才会消失,当访问增多,对服务器性能有影响
-
实现机制:Session的实现常常依赖于Cookie机制,通过Cookie机制回传SessionID
https
一.工作原理
- 1.客户端端请求HTTPS,连接到server端的443端口
- 2.采用CA证书,公钥在CA证书里,证书也附带一个电子签名,用来验证证书完整行和真实性
- 3.证书传递给客户端
- 4.客户端对证书进行解析并进行验证
- 5.取出公钥,生产对称加密的随机码K
- 6.公钥加密K传递给服务器
- 7.服务器进行私钥解密,拿到K,使用对称加密进行通信
http和https的区别
- 端口不同:Http是80,https是443
- 安全性:hhtp是超文本传输,信息是明文,https是通过ssl加密传输,更加安全
- HTTPS需要拿到CA证书,需要付费
- HTTP 页面响应速度比 HTTPS 快,这个很好理解,由于加了一层安全层,建立连接的过程更复杂,也要交换更多的数据,难免影响速度。
- 由于 HTTPS 是建构在 SSL / TLS 之上的 HTTP 协议,所以,要比 HTTP 更耗费服务器资源
- 在相同网络环境中,HTTPS 相比 HTTP 无论是响应时间还是耗电量都有大幅度上升
输入网址到获取页面的过程
- 浏览器搜索自身的DNS缓存、搜索操作系统的DNS缓存、读取本地的Host文件和向本地DNS服务器进行查询等。
- 对于向本地DNS服务器进行查询,如果要查询的域名包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析(此解析具有权威性);如果要查询的域名不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析(此解析不具有权威性)。如果本地域名服务器并未缓存该网址映射关系,那么将根据其设置发起递归查询或者迭代查询;
- 浏览器获得域名对应的IP地址以后,浏览器向服务器请求建立链接,发起三次握手;
- TCP/IP链接建立起来后,浏览器向服务器发送HTTP请求;
- 服务器接收到这个请求,并根据路径参数映射到特定的请求处理器进行处理,并将处理结果及相应的视图返回给浏览器;
- 浏览器解析并渲染视图,若遇到对js文件、css文件及图片等静态资源的引用,则重复上述步骤并向服务器请求这些资源;
- 浏览器根据其请求到的资源、数据渲染页面,最终向用户呈现一个完整的页面