HTTP 相关知识
1.HTTP 的概念
超文本传输协议(HTTP)是用于传输诸如 HTML 的超媒体文档的应用层协议。它被设计用于 Web 浏览器和 Web 服务器之间的通信,但它也可以用于其他目的。HTTP 遵循经典的客户端 - 服务端模型,客户端打开一个连接以发出请求,然后等待它收到服务器端响应。HTTP 是无状态协议,意味着服务器不会在两个请求之间保留任何数据(状态)。虽然通常基于 TCP / IP 层,但可以在任何可靠的传输层上使用
2.URL 和 URI
URI:uniform resource identifier 统一资源标识符,一种资源的标识,它是一种抽象的资源标识,即可以是相对的,也可以是绝对的。
URL:uniform resource location 统一资源定位符,一用来标识抽象或物理资源的一个紧凑字符串。
3.HTTP 报文
HTTP 报文由报文首部、空行、报文主体构成:
其中的空行用于区分报文首部和报文主体内容,是由一个回车符和一个换行符组成的。无论是请求报文还是响应报文都需要有报文首部,而报文主体有些请求报文是没有的。而请求报文的一般格式如下:
而响应报文的格式是这样的:
其中最常见的属性如下:
URL, 即 http 访问的地址
request method, 报文的请求方式
status code, 状态码以及状态短语
Accept Encoding, 内容编码
Connection, 连接方式
Cookie, 添加的 cookie 内容
Host, 目标主机
User-Agent, 客户端浏览器的相关信息
Set-Cookie, 指定想要在 Cookie 中保存的内容
请求方式 (request method)——常见 GET 和 POST
GET 方法可以用来请求访问已经被 URL 识别的资源。指定的资源经过服务端解析后返回响应的内容。简单来说,就是请求的资源是文本的话,那么就保持原样返回。
POST 方法可以用来传输实体的主体。
两者区别:
1. 使用目标不同
POST 与 GET 都用于获取信息,但是 GET 方式仅仅是查询,并不对服务器上的内容产生任何作用结果;每次 GET 的内容都是相同的。POST 则常用于发送一定的内容进行某些修改操作。
2. 大小不同
由于不同的浏览器对 URL 的长度大小有一定的字符限制,因此由于 GET 方式放在 URL 的首部中,具体的大小要依浏览器而定。POST 方式则是把内容放在报文内容中,因此只要报文的内容没有限制,它的大小就没有限制。
3. 安全性不同
上面也说了 GET 是直接添加到 URL 后面的,直接就可以在 URL 中看到内容。而 POST 是放在报文内部的,用户无法直接看到。
总的来说,GET 用于获取某个内容,POST 用于提交某种数据请求,从使用场景来看,一般用户注册的内容是私密的,应该使用 POST 方式来保持私密,而当需要查询某个内容时,需要快速响应,则使用 GET。
常见 status code 状态码
200 通常的成功 OKGET:请求的对应资源会作为响应返回。响应将包含描述或操作的结果。POST:返回处理对应请求的结果
204 成功处理请求,没有返回任何内容 No Content 表示服务器接收到的请求已经处理完毕,但是服务器不需要返回响应。比如,客户端是浏览器的话,那么浏览器显示的页面不会发生更新。
206 Partial Content 成功处理了部分 GET 请求
301 Moved Permanently 请求的网页已永久移动到新位置,永久性重定向
302 Found 网站临时性重定向,暂时不能访问(备案、被查)
303 See Other 该状态码表示由于请求对应的资源存在另一个 URI,并指定必须使用 GET 方法定向获取请求的资源。和 302 不同的是,302 是不会改变上次的请求方法
304 Not Modified 访问不了,并返回和上次一样的话, 表示资源未被修改过,还是和上次访问时一样。
307 Temporary Redirect 临时重定向,和 302、303 类似,不同的是,不会指定客户端要用什么样的方法请求,
400 Bad Request 表示客户端中存在语法错误,导致服务器无法理解该请求。客户端需要修改请求的内容后再次发送请求。
401 Unauthorized 即用户没有必要的凭据。该状态码表示当前请求需要用户验证。
403 Forbidden 服务器已经理解请求,但是拒绝执行它。
404 Not Found 服务器找不到请求的网页。
500 Internal Server Error 服务器遇到错误,无法完成请求。
503 Service Unavailable 由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是暂时的.
内容编码 Accept Encoding
由于有些报文的内容会过大,为了减少传输时间,HTTP 会采取一些压缩的措施,例如上面的报文信息中,Accept-Encoding 就定义了内容编码的格式 gzip。
总的来说内容编码的格式有以下几种:gzip:GNU 压缩格式 compress:UNIX 系统的标准压缩格式 deflate: 是一种同时使用了 LZ77 和哈夫曼编码的无损失压缩格式 identity: 不进行压缩持久化 connection
正常发送 HTTP 时,我们需要建立 TCP 的连接,然后再发送报文:
如果每次都要发送 HTTP 报文都需要经历上面的拿过过程,无疑将会耗费很多时间在建立和断开连接的过程中,因此 HTTP 使用了 connection 属性,用于指定连接的方式,当当设置成 keep-alive 时,就会建立一条持久化的连接。这样就不需要每次都建立连接在中断连接:
(HTTP1.1 中 connection 默认开启 keep-alive)报文首部总结
4.HTTP 方法
HTTP 支持几种不同的请求命令,这些命令被称为 HTTP 方法(HTTP method)。每 条 HTTP 请求报文都包含一个方法。这个方法会告诉服务器要执行什么动作(获取 一个 Web 页面、运行一个网关程序、删除一个文件等)。
下表是一些常见的 HTTP 方法:
PUT 传输文件
PUT 方法用于传输文件,就像 FTP 协议的上传一样,要求在请求报文的主题中包含文件内容,然后保存到请求 URI 指定的位置。由于 PUT 方法不带验证机制,任何人都可以任何人都可以上传文件,存在安全性问题,因此一般的 web 网站不适用该方法。
DELETE 删除文件
DELETE 方法用来删除文件,是与 put 相反的方法,DELETE 方法按照请求 url 删除指定的资源。其本质和 PUT 方法一样不带验证机制,所以建议少用 DELETE 方法。
HEAD 获取报文首部
HEAD 和 GET 方法一样,只是不返回报文主体部分,通常用于确认 url 的有效性及资源更新的日期时间等。
5.HTTPS 的概念
HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的 HTTP 通道,简单来说就是是 HTTP 的安全版本,即在 HTTP 下加入 SSL 层,HTTPS 的安全基石是 SSL,因此加密的详细内容就需要 SSL。
由于 HTTP 有以下几个缺点:
传输的时候使用明文,这显然会被不法者截取干一些见不得人的勾当。没有认证机制,这样我们就可以伪造一些 HTTP 访问,这显然会造成一些困扰。比如 Jmeter 就是典型的例子,伪造一大堆的 HTTP URL 然后压力测试,这也就是 DOS 攻击的一种。无法验证报文的完整性,比如一个 HTTP 的报文已经被不法者截取并且篡改,而服务器端却无法验证。
HTTP 与 HTTPS 的区别
正是由于以上这些缺点,HTTPS 作出了以下一些改变:
HTTP 是明文传输,HTTPS 通过 SSL\TLS 进行了加密;
HTTP 的端口号是 80,HTTPS 是 443;
HTTPS 需要到 CA 申请证书,一般免费证书很少,需要交费;
HTTP 的连接很简单,是无状态的。而 HTTPS 协议则是由 SSL+HTTP;协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全;
HTTPS 的缺点:
通信的速度变慢,由于需要加密,一个握手就多了好几个往返;对用户的机器负载的增加。
补充:HTTP 协议与 TCP 协议
TCP 协议对应于传输层,而 HTTP 协议对应于应用层,从本质上来说,二者没有可比性。Http 协议是建立在 TCP 协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次 Http 请求。Http 会通过 TCP 建立起一个到服务器的连接通道,当本次请求需要的数据完毕后,Http 会立即将 TCP 连接断开,这个过程是很短的。所以 Http 连接是一种短连接,是一种无状态的连接。所谓的无状态,是指浏览器每次向服务器发起请求的时候,不是通过一个连接,而是每次都建立一个新的连接。如果是一个连接的话,服务器进程中就能保持住这个连接并且在内存中记住一些信息状态。而每次请求结束后,连接就关闭,相关的内容就释放了,所以记不住任何状态,成为无状态连接。
6.TCP 与 UDP 的区别
TCP 面向连接 (如拨打电话要先拨号建立连接);UDP 是无连接的,即发送数据之前不需要建立连接;
TCP 提供可靠的服务。即通过 TCP 连接传送的数据,无差错,不重复,且按序到达;UDP 尽最大努力交付,即不保证可靠交付;
TCP 面向字节流,实际上是把 TCP 数据看成一连串无结构的字节流;UDP 是面向报文的,UDP 没有拥塞控制,因此网络上出现拥塞不会使源主机的发送效率降低(对实时应用很有用,如 IP 电话,实时视频会议等);
每一条 TCP 连接只能是点到点;UDP 支持一对一,一对多,多对一,多对多的交互通信;
TCP 的首部开销20字节;UDP 的首部开销小,只有8个字节;
TCP 的逻辑通信信道是全双工的可靠信道;UDP 则是不可靠信道;
7. 流媒体协议:
RTP、RTCP、RTSP、MMS、HLS、HTTP progressive streaming 当前在 internet 上传送音频和视频等信息主要有两种方式: 下载,完整下载一个视频,再去播放流式传输,如优酷、爱奇艺等视频网址
作用:RTP 位于传输层(通常是 UDP)之上,应用程序之下,实时语音、视频数据经过模数转换和压缩编码处理后,先送给 RTP 封装成为 RTP 数据单元,RTP 数据单元被封装为 UDP 数据报,然后再向下递交给 IP 封装为 IP 数据包。这么说 RTP 是没有保证传输成功的,要保证成功,就要用到 RTCP,RTCP 消息含有已发送数据的丢包统计和网络拥塞等信息,服务器可以利用这些信息动态的改变传输速率,甚至改变净荷的类型。RTCP 消息也被封装为 UDP 数据报进行传输。
部分参考:https://juejin.im/post/5afad7…