这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记
一、Web与网络
-
HTTP 历史版本:HTTP/0.9、HTTP/1.0、HTTP/1.1、HTTP/2.0
-
TCP/IP 协议族分层:应用层、传输层、网络层、网际接口层
- 应用:为操作系统或网络应用程序提供访问网络服务接口
- 传输:提供端到端的可靠报文传递和错误恢复
- 网络:负责数据包从源到宿的传递和网际互连
- 网际:确保原始的数据可在各种物理媒体上传输
-
URI :包含 URL 和 URN
- URI (Uniform Resource Identifier,统一资源标识符)
- URL (Uniform Resource Locator,统一资源定位符)
- URN (Uniform Resource Name,统一资源名称)
二、HTTP
- HTTP 无状态(stateless)协议;为了更快处理大量事务,确保协议的可伸缩性
- 后面为了保持状态,引入了 Cookie
1、请求响应头部
1.1、请求头
1.2、响应头
2、HTTP 方法
-
GET:获取资源(也就可以传输实体主体)
-
HEAD:获取报文首部
- 和 GET 方法一样,但是不返回报文实体主体部分。
- 主要用于确认 URL 的有效性以及资源更新的日期时间等
-
POST:传输实体主体
-
PUT:上传文件
- 不带验证机制
- PUT 也可以用于修改资源,但是只能完全替代原始资源
-
PATCH:对资源进行部分修改
-
DELETE:删除文件
- 不带验证机制
-
OPTIONS:查询支持的方法
-
CONNECT:要求在与代理服务器通信时建立隧道
- 使用 SSL和 TLS协议把通信内容加密后经网络隧道传输
-
TRACE:追踪路径
- 服务器会将之前请求的通信路径返回给客户端。
- 可以查询请求如何被中转代理的
2.1、GET 与 POST 的区别
-
一般,GET 用于获取资源,而 POST 用于传输实体主体
-
从编码的角度,GET 只能进行 URL 编码,只能接收 ASCII 字符,而 POST 没有限制。
-
从请求的角度
- GET 的参数是以查询字符串出现在 URL 中,POST 的参数存储在实体主体中
- GET一次性请求,POST分header头部和body实体两部份请求
-
安全性
- GET 方法是安全的(不会改变服务器状态),而 POST 却不是
- 因为 POST 的目的是传送实体主体内容,服务器可能把这个数据存储到数据库中
-
幂等性
- 幂等的 HTTP 方法,同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的
- 所有的安全方法也都是幂等的,在正确实现的条件下,GET,HEAD,PUT 和 DELETE 等方法都是幂等的,而 POST 方法不是
-
可缓存
- 请求报文的 HTTP 方法本身是可缓存的
- 包括 GET 和 HEAD
- 但是 PUT 和 DELETE 不可缓存,POST 在多数情况下不可缓存的。
- 请求报文的 HTTP 方法本身是可缓存的
2.2、为何GET比POST更快
2.2.1、get与post请求过程
-
post在真正接受数据之前会先将请求头发送给服务器进行确认,然后才真正发送数据 -
post 请求过程
- 浏览器请求
tcp连接(第一次握手),服务器答应进行tcp连接(第二次握手) - 浏览器确认,并发送
post请求头(第三次握手,这个报文比较小,所以http会在此时进行第一次数据发送) - 服务器返回
100 continue响应 - 浏览器开始发送数据
- 服务器返回
200 ok响应
- 浏览器请求
-
get 请求过程
- 浏览器请求
tcp连接(第一次握手),服务器答应进行tcp连接(第二次握手) - 浏览器确认,并发送
get请求头和数据(第三次握手) - 服务器返回
200 ok响应
- 浏览器请求
2.2.2、缓存
- get 会被浏览器缓存,第二次相同请求时间更快
- post 不会被缓存,即使传入相同的数据,其耗时基本不变
2.2.3、post 不能进行管线化传输
- 在
http/1.1中,有一种称为管道通信的方式进行速度优化 - 把需要发送到服务器上的所有请求放到输出队列中
- 在第一个请求发送出去后,不等到收到服务器的应答,第二个请求紧接着就发送出去
- 目前只有幂等性的HTTP方法才被允许管线化传输
2.3、GET与POST谁更安全
-
post 安全(对于传输内容)
- GET请求通过URL(请求行)提交数据,在URL中可以看到所传参数。POST通过“请求体”传递数据,参数不会在url中显示
- GET请求提交的数据有长度限制,POST请求没有限制。
- GET请求返回的内容可以被浏览器缓存起来。而每次提交的POST,浏览器不会缓存POST请求返回的内容。
-
get 安全(对于服务器)
- GET对数据进行查询,POST主要对数据进行增删改!简单说,GET是只读,POST是写。
- HTTP协议中提到GET是安全的方法,其意思是说GET方法不会改变服务器端数据,所以不会产生副作用
3、HTTP 状态码
- 状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果。借助状态码,用户可以知道服务器端是正常处理了请求,还是出现了错误。
3.1、信息
100 Continue: 表明到目前为止都很正常,客户端可以继续发送请求或者忽略这个响应
3.2、成功
200 ok204 No Content: 请求已经成功处理,但是返回的响应报文不包含实体的主体部分。一般在只需要从客户端往服务器发送信息,而不需要返回数据时使用。206 Partial Content: 表示客户端进行了范围请求,响应报文包含由 Content-Range 指定范围的实体内容。
3.3、重定向
301 Moved Permanently: 永久性重定向302 Found: 临时性重定向303 See Other: 和 302 有着相同的功能,但是 303 明确要求客户端应该采用 GET 方法获取资源。304 Not Modified: 如果请求报文首部包含一些条件,如果不满足条件,则服务器会返回 304 状态码。307 Temporary Redirect: 临时重定向,与 302 的含义类似,但是 307 要求浏览器不会把重定向请求的 POST 方法改成 GET 方法。
3.4、客户端错误
400 Bad Request: 请求报文中存在语法错误。401 Unauthorized: ,则表示用户认证失败。403 Forbidden: 请求被拒绝。404 Not Found
3.5、服务器错误
500 Internal Server Error: 服务器正在执行请求时发生错误。503 Service Unavailable: 服务器暂时处于超负载或正在进行停机维护,现在无法处理请求
4、HTTTP 首部
4.1、HTTP 首部字段
- 使用首部字段是为了给浏览器和服务器提供报文主体大小、所使用的语言、认证信息等内容。
- HTTP首部字段是由首部字段名和字段值构成的,中间用冒号
:分隔。
如:keep-alive : timeout=15, max=100
4.1.1、HTTP首部出现重复字段
- 当HTTP报文首部中出现了两个或两个以上具有相同首部字段名时,根据浏览器内部处理逻辑的不同,结果可能并不一致。
- 有些浏览器会优先处理第一次出现的首部字段,而有些则会优先处理最后出现的首部字段。
4.1.2、字段类型
- 通用首部字段
- 请求首部字段
- 响应首部字段
- 实体首部字段
5、关于 HTTP 内信息
5.1、多部分对象集合
-
发送邮件时,我们可以在邮件里写入文字并添加多份附件。这是因为采用了MIME机制,它允许邮件处理文本、图片、视频等多个不同类型的数据。
-
例如,图片等二进制数据以ASCII码字符串编码的方式指明,就是利用MIME来描述标记数据类型。而在MIME扩展中会使用一种称为多部分对象集合( Multipart) 的方法,来容纳多份不同类型的数据。
-
HTTP协议中也采纳了多部分对象集合(需要在 http 首部加 Content - type 字段),发送的一份报文主体内可含有多类型实体。通常是在图片或文本文件等上传时使用。
- multipart/form-data:在 Web 表单文件上传时使用
- multipart/byteranges:状态码206响应报文包含了多个范围的内容时使用
5.2、范围请求
-
可恢复机制,是指能从之前下载中断处恢复下载。
-
要实现该功能需要指定下载的实体范围。像这样,指定范围发送的请求叫做范围请求
- 对一份10 000字节大小的资源,如果使用范围请求,可以只请求5001~10 000字节内的资源。
- 执行范围请求时,会用到首部字段Range来指定资源的byte范围。byte范围的指定形式如下。
5.3、内容协商
-
同一个Web网站有可能存在着多份相同内容的页面。比如英语版和中文版的Web页面,它们内容上虽相同,但使用的语言却不同。
-
当浏览器的默认语言为英语或中文,访问相同URI 的 Web页面时,则会显示对应的英语版或中文版的 Web页面。这样的机制称为内容协商( Content Negotiation)。
-
内容协商机制是指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最为适合的资源。内容协商会以响应资源的语言、字符集、编码方式等作为判断的基准。
-
包含在请求报文中的某些首部字段(如下)
Accept、Accept-Charest、Accept-Encoding、Accept-language、Content-Language
-
服务器驱动协商、客户端驱动协商、透明协商
6、HTTP 编码传输
- HTTP在传输数据时可以按照数据原貌直接传输,也可以在传输过程中通过编码提升传输速率。通过在传输时编码,能有效地处理大量的访问请求。但会消耗更多的CPU等资源。
6.1、报文主体与实体主体的差异
- 报文(message) :HTTP通信中的基本单位,由8位组字节流组成,通过HTTP通信传输。
- 实体(entity) :作为请求或响应的有效载荷数据被传输,其内容由实体首部和实体主体组成。
- HTTP报文的主体用于传输请求或响应的实体主体。通常,报文主体等于实体主体。只有当传输中进行编码操作时,实体主体的内容发生变化,才导致它和报文主体产生差异。
6.2、压缩传输的内容编码
- 内容编码指明应用在实体内容上的编码格式,并保持实体信息原样压缩。内容编码后的实体由客户端接收并负责解码。
- 常用的内容编码:gzip、compress(unix 标准压缩)、deflate、identity(不编码)
6.3、分块传输编码
- 在HTTP通信过程中,请求的编码实体资源尚未全部传输完成之前,浏览器无法显示请求页面。在传输大容量数据时,通过把数据分割成多块,能够让浏览器逐步显示页面。
- 分块传输编码会将实体主体分成多个块。每一块都会用十六进制来标记块的大小,而实体主体的最后一块会使用“O(CR+LF)”来标记。
- 使用分块传输编码的实体主体会由接收的客户端负责解码,恢复到编码前的实体主体。