Web使用HTTP(HyperText Transfer Protocal) 超文本传输协议作为规范, 完成从客户端到服务端的一系列流程. 可以说 Web 是在 HTTP 协议上通信的.
1.0 网络基础TCP/IP
通常我们使用的网络是在 TCP/IP 协议族的基础上运行的, 而 HTTP 是属于 TCP/IP 族群中的一种协议. 在计算机和网络相互通信的时候, 两者都必须要遵守同一种协议.
1.1 TCP/ IP分层管理
TCP/IP协议族里最重要的一点就是分层, 每一层就只需要专注于自己任务就行了, 按层次分别为以下四层:
应用层
决定向用户提供应用服务时的通信活动, 在 TCP/IP 中预存了各类通用的应用服务. 比如: FTP(File Transfer Protocol, 文件传输协议)和 DNS(Domain Name System, 域名系统), HTTP 协议也属于这层.传输层
给两个计算机在网络中提供数据传输. TCP(传输控制协议)和 UDP(用户数据报协议)网络层
处理网上流动的数据包, 决定数据通过哪条传输路线到对方计算机并把数据传输给对方.链路层
处理连接网络的硬件部分. 网卡/ 驱动/ 光纤什么的
1.2 TCP/IP 传输流程
TCP/IP 在网络通信时, 会按照分层顺序与对方通信. 发送端从应用层往下, 接收端从应用端网上.
2.0 与 HTTP 关系密切的协议: IP/TCP 和 DNS
- 负责传输的 IP 协议
将数据包传递给对方并确认到达, 确认到达的重要条件包括: IP 地址和 MAC 地址. - 确保可靠性的 TCP 协议
为了方便传输将大数据包分割成以报文段为单位的数据包进行管理, 再将数据准确可靠的传递给对方. 那么如何准确可靠的传递给对方呢, 所以就有了TCP 的三次握手策略: 发送端先发送一个带有SYN
标志的数据包给对方, 接收端回传一个带有SYN/ACK
标志的数据包传达确认信息, 最后发送端再回传一个带有ACK
标志的数据包, 代表握手结束. - 负责域名协议的 DNS 服务
提供域名到 IP 地址之间解析服务.
2.1 HTTP 协议的通信过程
通过一整套流程来看一下, IP协议/ TCP协议 和 DNS服务在 HTTP协议的通信过程中各自发挥了什么作用.
从上图来看, 从输入一个网址到页面的展示过程大致如下:
- 域名解析(DNS 服务)
- 建立TCP, 发送 HTTP 请求(三次握手)
- 客户端向服务器发送请求(SYN)
- 服务器应答并要求确认(SYN/ACK)
- 客户端确认(ACK)
- IP 搜索对方地址, 一边中转一边传输数据包
- 服务器处理请求返回 HTTP 响应报文
- 连接结束(四次挥手)
- 客户端发送一个 FIN 来告诉服务器数据发送完毕
- 服务器收到这个 FIN 之后回发一个 ACK(这个时候服务器还可以向客户端发送数据)
- 服务器发送一个 FIN 告诉客户端服务器的数据发送完毕, 请求关闭连接
- 客户端回发 ACK 确认, 关闭连接
- 浏览器解析渲染页面
2.2 HTTP 是否保存状态
HTTP 是一种不保存状态(无状态)协议, 协议本身不会保留之前的请求或响应报文的信息. 这是为了更快的处理大量请求, 但是随着 Web 发展
很多业务都需要保存用户的状态, 因此引入 Cookie 来管理状态.
3.0 HTTP 返回状态码
状态码是用来告诉客户端从服务器响应的请求结果, 可以通过状态码知道该次请求是正常处理了还是发生了错误.
3.1 状态码的类别
类别 | 原因短句 | |
---|---|---|
1XX | 信息类 | 接收的请求正在处理 |
2XX | 成功类 | 请求正常处理完毕 |
3XX | 重定向类 | 需要附加操作完成请求 |
4XX | 客户端错误类 | 服务器无法处理请求 |
5XX | 服务器错误类 | 服务器发生错误 |
3.2 具有代表性的14种状态码
- 2XX 成功类
- 200 OK
表示请求在服务端被正常处理了 - 204 No Content
表示请求处理成功但是响应报文不包含实体的主体(本身也不允许返回实体的主体) - 206 Partial Content
服务端成功处理了客户端发出的范围请求
- 200 OK
- 3XX 重定向
- 301 Moved Permanently
永久性重定向. 请求的资源已经被分配了新的 URI 应该使用新的 URI - 302 Found
临时性重定向. 请求的资源被分配了新的 URI, 希望本次请求用新的 URI - 303 See Other
请求的资源存在另一个 URI, 应使用 GET 方法定向获取请求的资源(跟302的功能相同) - 304 Not Modified
表示请求时附带了条件, 服务端允许请求资源但为满足条件. 所以返回时, 不包含任何响应的主体部分(跟重定向并没有半毛钱关系). - 307 Temporary Redirect
临时重定向, 跟302有着同样的一样. 尽管302标准不允许 POST 变为 GET, 但是并没有人遵守; 307会遵守标准但是处理响应时, 每个浏览器有可能出现不同的情况
- 301 Moved Permanently
- 4XX 客户端错误
- 400 Bad Request
请求报文中有语法错误 - 401 Unauthorized
请求需要通过 HTTP 认证 - 403 Forbidden
请求资源访问被服务端拒绝(一般都是权限问题) - 404 Not Found
服务端上无法找到请求的资源 - 405 Not Allow
对于请求的资源, 服务端不允许使用请求中使用的方法
- 400 Bad Request
- 5XX 服务器错误
- 500 Internal Server Error
服务端在执行请求任务时发生错误 - 503 Service Unavailable
服务端暂时处于超负载或者停机维护, 无法处理请求(一般就是服务器挂了)
- 500 Internal Server Error
总结
主要为了大致了解一下 HTTP 的基础/大概的执行流程和常见的HTTP 状态码. 对于状态码之前一直分不太清301和302的区别, 简单的来说: 301 改变资源的URI 后, 如果这个资源是被保存在书签中的, 那么这时要根据新的 URI 保存; 302 表示这个资源只是临时性的移动, 之后这个 URI 可能还会变化. 那么如果也被保存在了书签中, 仍然会保留原来的 URI. 状态码中的 304 放在下次放在缓存策略中再捋一捋吧.
Create on 2018-1-3 By Cara