前言:
在看课的过程中,发现自己对HTTP协议不太理解,结合MarsCode AI,我对HTTP协议进行了一个简单的梳理。
1. 基本介绍
- HTTP(Hyper Text Transfer Protocol): 全称超文本传输协议,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。
- 简单来说,HTTP 是浏览器和服务器之间进行沟通的一种方式/规范/约束
- 基于TCP/IP 协议来传递数据
2. 特点
-
简单、快速:客户端向服务器请求服务时,仅需传送请求方法和路径
-
无状态:无状态是指协议对于事务处理没有记忆能力。HTTP协议本身不对事务处理有记忆能力,每个请求都是独立的。
-
支持多种架构模式:
- B/S 模式(浏览器/服务器模式)
- C/S 模式(客户端/服务器模式)
-
一发一收,一问一答:
-
3. 常见HTTP 状态码及字段
状态码:
1xx: 提示信息,标识目前是协议处理的中间状态,还需要后续的操作。2xx: 成功,报文已经收到并被正确处理。(eg. 200,204,206)- 200 - 请求成功
3xx: 重定向,资源位置发生变动,需要客户端重新发送请求。(eg. 301,302,304)- 301 - 资源(网页等)被永久转移到其它URL
- 302 - 临时重定向
- 304 - 正常的状态码,客户端请求未发生变化
4xx: 客户端错误,请求报文有误,服务器无法处理。(eg. 400,403,404)- 403 - forbidden 权限不足,权限问题(nginx. conf 配置文件的 user 是 nginx)
- 404 - 请求的资源(网页等)不存在(nginx服务器问题)
- 405 Method Not Allowed。表示访问的服务器不能支持请求中的方法或者不能使用该请求中的方法
5xx: 服务器错误,服务器在处理请求时内部发生错误。(eg. 500,501,502,503)- 500 - 内部服务器错误(后端服务器问题)
- 502 - 网关错误 bad gateway 字段:
- Host:客户端发送请求时用来指定服务器的域名。
- Content-Length:服务器本次回应的数据长度
- Connection:用于控制当前网络连接的管理和行为。主要用于指示是否需要在完成当前请求和响应后,保持连接的持续性,以及指定在连接期间哪些其他头部字段是“仅限于该连接的”(即“hop-by-hop”)而不会被转发到下一个中间节点(如代理服务器)。
- 常见字段
keep-alive:保持连接的持续性close:在完成当前请求/响应后,立即关闭连接Upgrade:用于协议升级,如从HTTP切换到WebSocket。通过Upgrade字段指定新的协议名称。
- 常见字段
- Content-Type:用于服务器回应时,告诉客户端本次数据时什么格式
- Content-Encoding:说明数据的压缩方法,标识服务器返回的数据使用了什么压缩格式。
4. HTTP 协议格式
HTTP 请求格式:
- 首行:标明了请求方法,URL,HTTP 版本号。
- 协议头(请求头):包括上述字段。
- 空行:空行是协议头结束的标志。
- 正文(请求体) HTTP 响应格式:
- 首行:版本号,状态码,状态码解释
- 协议头(响应头):包括上述字段
- 空行
- 正文(响应体)
5. HTTP 请求
URL:(Uniform Resource Locator),翻译为统一资源定位符 URL 参数众多,此处不一一列举。 HTTP 方法:
| 方法 | 描述 |
|---|---|
| GET | 请求指定的页面信息,并返回实体主体 |
| HEAD | 类似于 GET,只是返回的响应中没有具体内容,用于获取报头 |
| POST | 向指定资源提交数据进行处理请求。数据被包含在请求体中。POST 可能会导致新的资源的建立 or 已有资源的修改 |
| PUT | 从客户端向服务器传送的数据取代指定的文档的内容 |
| DELETE | 请求服务器删除指定的页面 |
| CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器 |
| OPTIONS | 允许客户端查看服务器的性能 |
| TRACE | 回显服务器收到的请求,主要用于测试 or 判断 |
这里选常用的 GET 和 POST 进行介绍:
GET 方法
介绍: GET 是最常用的 HTTP 方法,常用于获取服务器上的某个资源。以下几种方式都会触发 GET 方法的请求
- 在浏览器中直接输入 URL 回车或点击浏览器收藏夹中的链接,此时浏览器就会发送出一个 GET 请求。
- HTML 中的 link、img、script 等标签的属性中放的 URL,浏览器也会构造出 HTTP GET 请求
- 使用 Javascript 的 ajax,能构造出 HTTP GET 请求
- 各种编程语言(只要能够访问网络),就都能够构造出 HTTP GER 请求 特点:
- 首行里面的第一个部分就是 GET
- URL 里面的 query string 可以为空,也可以不为空
- GET 请求的 header 有若干个键值对
- GET 请求的 body 一般是空的
POST 方法
介绍: POST 方法也是一种常见的方法,多用于提交用户输入的数据给服务器(如登录页面)。以下几种方法都会触发 POST 方法的请求
- 通过 HTML 中的 form 标签可以构造 POST 请求
- 使用 JavaScript 的 ajax 可以构造 POST 请求 特点:
- 首行第一个部分就是 POST
- URL 里面的 query string 一般是空的
- POST 请求的 header 里面有若干个键值对
- POST 请求的 body 一般不为空(body 的具体数据格式,由 header 中的 Content-Type 来描述;body 的具体数据长度,由 header 中的 Content-Length 来描述
GET 和 POST 区别:
- GET可以存在 cache 中,POST 不可以(即 GET 请求可以被缓存)
- GET 请求在URL 中传递的参数是有长度限制的,POST 对长度没有限制。
- GET 参数通过URL传递,POST 放在RequestBody 中
- GET 习惯上会把客户端的数据通过 query string 来传输(body 部分是空的);
- POST 习惯上会把客户端的数据通过 body 来传输(query string 部分是空的)
- GET 请求参数会完整的保留在浏览器的历史记录中,POST**请求参数不会保留。
- GET会产生一个 TCP 数据包,POST产生两个 TCP 数据包
- 对于 GET 请求,浏览器会把HTTP Header 和 Data 一起发送出去,服务器再响应 200(如果正确)。
- 对于 POST 请求,浏览器会先发送 Header,服务器会响应 100(已经收到请求的第一部分,正在等待其余部分),浏览器再次发生 Data,服务器返回 200(请求成功)。但并不是所有的浏览器都会在 POST 中发送两次包,FireFox 就只发送一次。
- 一般情况,程序员会把 GET 请求的处理,实现成“幂等”的;对于 POST 请求的处理,不要求实现成“幂等”。
何为幂等 ?
- 指的是同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。
- 即:多次执行相同的操作,结果都是相同的
- 换句话说:幂等的方法不应该具有副作用。
- 在正确的条件下,GET、HEAD、PUT 和 DELETE 等方法是幂等的;POST 方法不是幂等的
- 幂等性只与后端服务器的实际状态有关,而每一次请求接收到的状态码不一定相同
何为安全 ?
- 在 HTTP 协议里,安全是指请求方法不会破坏服务器上的资源
6. Cookie
Cookie 是什么?
Cookie:Cookie 是由服务器生成并存储在用户浏览器中的小型文本文件。每当浏览器向服务器发送请求时,相关的Cookie信息会随请求一起发送到服务器。通过这种方式,Cookie可以帮助服务器识别用户、记住用户的偏好设置以及维护用户会话状态。
Cookie 存的是什么?
Cookie 中存储了一个字符串,是键值对结构的,键值对之间使用 ; 分割,键和值之间使用 = 分割
Cookie 到哪去?
7. HTTP 和 HTTPS 的区别
- HTTP 是超文本传输协议,信息是明文传输,存在安全风险的问题。HTTPS 则解决 HTTP 不安全的缺陷,在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输
- HTTP 连接建立相对简单,在进行TCP 三次握手之后便可进行 HTTP 的报文传输。而 HTTPS 在 TCP 三次握手之后,还需要进行 SSL/TLS 的握手过程,才可进入加密报文传输
- 两者的默认端口不一致,HTTP 默认端口是 80 ,HTTPS的默认端口是 443
- HTTPS 协议需要向 CA (证书权威机构)申请数字证书,来保证服务器的身份是可信的
总结
在看字节内部课有关网络这一部分的时候,我借助MarsCode AI 帮助我理清了课程中的知识点,并对HTTP协议进行了进一步的深入。