统一资源定位符(Uniform Resource Locator,缩写:URL),是对资源的引用和访问该资源的方法。俗称网址,就是浏览器地址栏里面的内容。
URL 语法为:protocol://userInfo@host:port/path?query#fragment
URI 与 URL 类似,统一资源标志符(Uniform Resource Identifier,缩写:URI),提供了一种识别资源的方法。但与 URL 不同的是,URI 不提供定位所述资源的方法。
URI 的最常见的形式是统一资源定位符(URL),经常指定为非正式的网址。由此,可以看出 URI 是 URL 的超集,并且每个 URL 本质上也是一个 URI。
URI 是 URL 的父级,URL 是 URI 的子级。可能有人就奇怪了,明明是 URL 包含了 URI 为啥 URI 反而是父级?想要理解这个概念,最好的说明就是 Java 的继承关系。URL 继承了 URI 。因为 URL 继承了所有 URI 的内容,所以它比 URI 更加详细,但是 URI 是它的父级。
网络协议就是计算机之间通信过程中要遵循的一些约定好的规则。
常见网络协议:
名称 | 作用 | 默认端口 |
---|---|---|
TCP(Transmission Control Protocol,传输控制协议) | 一种可靠的面向连接的传送服务。 | 无 |
UDP (User Datagram Protocol,用户数据报协议) | 提供了无连接的数据包服务,该服务提供了不可靠的、“尽力而为”的初步传送。 | 无 |
IP (Internet Protocol,Internet 协议) | 一个无连接的协议,主要负责在主机之间寻址,并为数据包设定路由。 | 无 |
HTTP(HyperText Transfer Protocol,超文本传输协议) | 主要的 web 浏览器和 web 服务器支持使用。 | 80 |
HTTPS(Hyper Text Transfer Protocol over SecureSocket Layer,安全超文本传输协议) | 在 HTTP 的基础上通过传输加密和身份认证保证了传输过程的安全性 | 433 |
SMTP(Simple Mail Transfer Protocol,简单邮件传输协议) | 是为网络系统间的电子邮件交换而设计的。 | 25 |
DNS(Domain Name Service, 域名解析服务) | 作用是将域名转换为 IP 地址,或将 IP 地址转换为域名,用于解析完全合格域名。 | 53 |
互联网协议按照功能不同分为 OSI 七层或 TCP/IP 五层或 TCP/IP 四层。
DNS(DOMAIN NAME SYSTEM) 是一个域名系统,是万维网上作为域名和 IP 地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的 IP 数串。
通过主机名,最终得到该主机名对应的 IP 地址的过程叫做域名解析(或主机名解析)。在解析域名时,可以首先采用静态域名解析的方法,如果静态域名解析不成功,再采用动态域名解析的方法,域名是互联网上的身份标识,是不可重复的唯一标识资源。
第一步:客户机提出域名解析请求,并将该请求发送给本地域名服务器。
第二步:当本地域名服务器收到请求后,就先查询本地缓存,如果有该纪录项,则本地域名服务器就直接把查询结果返回。
第三步:如果本地缓存中没有该纪录,则本地域名服务器就直接把请求发给根域名服务器,然后根域名服务器再返回给本地域名服务器一个所查询域(根子域) 主域名服务器地址。
第四步:本地服务器再向返回域名服务器发送请求,然后接受请求服务器查询自己缓存,如果没有该纪录,则返回相关下级域名服务器地址。
第五步:重复第四步,直到找到正确纪录。
第六步:本地域名服务器把返回结果保存到缓存,以备下一次使用,同时还将结果返回给客户机。
三次握手的本质就是确定发送端和接收端具备收发信息的能力,在能流畅描述三次握手的流程及其中的字段含义作用的同时还需要记住每次握手时接收端和发送端的状态。
先看一张很经典的图,发送端有 CLOSED、SYN-SENT、ESTABLISHED 三种状态,接收端有 CLOSED、LISTEN、SYN-RCVD、ESTABLISHED 四种状态。
第一次握手:客户端向服务端发起建立连接请求,客户端会随机生成一个起始序列号 x,客户端向服务端发送的字段中包含标志位 SYN=1,序列号 seq=100。第一次握手前客户端的状态为 CLOSE,第一次握手后客户端的状态为 SYN-SENT。此时服务端的状态为 LISTEN? 第二次握手:服务端在收到客户端发来的报文后,会随机生成一个服务端的起始序列号 y,然后给客户端回复一段报文,其中包括标志位 SYN=1,ACK=1,序列号 seq=y,确认号 ack=x+1。第二次握手前服务端的状态为 LISTEN,第二次握手后服务端的状态为 SYN-RCVD,此时客户端的状态为 SYN-SENT。(其中 SYN=1 表示要和客户端建立一个连接,ACK=1 表示确认序号有效)? 第三次握手:客户端收到服务端发来的报文后,会再向服务端发送报文,其中包含标志位 ACK=1,序列号 seq=x+1,确认号 ack=y+1。第三次握手前客户端的状态为 SYN-SENT,第三次握手后客户端和服务端的状态都为 ESTABLISHED。
和三次握手一样,先看一张非常经典的图,客户端在四次挥手过程中有 ESTABLISHED、FIN-WAIT-1、FIN-WAIT-2、TIME-WAIT、CLOSED 等五个状态,服务端有 ESTABLISHED、CLOSE-WAIT、LAST-ACK、CLOSED 等四种状态。
第一次挥手:客户端向服务端发送的数据完成后,向服务端发起释放连接报文,报文包含标志位 FIN=1,序列号 seq=u。此时客户端只能接收数据,不能向服务端发送数据。
第二次挥手:服务端收到客户端的释放连接报文后,向客户端发送确认报文,包含标志位 ACK=1,序列号 seq=V,确认号 ack=u+1。此时客户端到服务端的连接已经释放掉,客户端不能像服务端发送数据,服务端也不能向客户端发送数据。但服务端到客户端的单向连接还能正常传输数据。
第三次挥手:服务端发送完数据后向客户端发出连接释放报文,报文包含标志位 FIN=1,标志位 ACK=1,序列号 seq=w,确认号 ack=u+1。
第四次挥手:客户端收到服务端发送的释放连接请求,向服务端发送确认报文,包含标志位 ACK=1,序列号 seq=u+1,确认号 ack=w+1。
超文本传输协议,是一个基于请求与响应,无状态的,应用层的协议,常基于 TCP/IP 协议传输数据,互联网上应用最为广泛的一种网络协议,所有的 WWW 文件都必须遵守这个标准。设计 HTTP 的初衷是为了提供一种发布和接收 HTML 页面的方法。
发展历史:
版本 | 时间 | 内容 | 发展现状 |
---|---|---|---|
HTTP/0.9 | 1991 年 | 不涉及数据包传输,规定客户端和服务器之间通信格式,只能 GET 请求 | 没有作为正式的标准 |
HTTP/1.0 | 1996 年 | 传输内容格式不限制,增加 PUT、PATCH、HEAD、 OPTIONS、DELETE 命令 | 正式作为标准 |
HTTP/1.1 | 1997 年 | 持久连接(长连接)、节约带宽、HOST 域、管道机制、分块传输编码 | 2015 年前使用最广泛 |
HTTP/2 | 2015 年 | 多路复用、服务器推送、头信息压缩、二进制协议等 | 逐渐覆盖市场 |
HTTP 状态码负责表示客户端 HTTP 请求的返回结果、标记服务器的处理是否正常、通知出现的错误等工作。
状态码分类:
类别 | 原因短语 | |
---|---|---|
1XX | Informational(信息性状态码) | 接收的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完毕 |
3XX | Redirection(重定向) | 需要进行附加操作以完成请求 |
4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5XX | Server Error(服务器错误状态码) | 服务器处理请求出错 |
常见状态码:
根据 HTTP 标准,HTTP 请求可以使用多种请求方法。
HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD 方法。
HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
方法 | 描述 |
---|---|
GET | 请求指定的页面信息,并返回实体主体。 |
HEAD | 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头 |
POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立或对已有资源的修改。 |
PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 |
DELETE | 请求服务器删除指定的页面。 |
CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。 |
OPTIONS | 允许客户端查看服务器的性能。 |
TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
PATCH | 是对 PUT 方法的补充,用来对已知资源进行局部更新 。 |
HTTPS 是身披 SSL 外壳的 HTTP。
HTTPS 是一种通过计算机网络进行安全通信的传输协议,经由 HTTP 进行通信,利用 SSL/TLS 建立全信道,加密数据包。HTTPS 使用的主要目的是提供对网站服务器的身份认证,同时保护交换数据的隐私与完整性。
SSL 协议 (Secure Socket Layer) 是一种安全传输协议,SSL 是 SecureSocketLayer 的缩写,即安全套接层协议。
TLS(Transport Layer Security) 传输层安全是 IETF 在 SSL3.0 基础上设计的协议,实际上相当于 SSL 的后续版本。
对称加密:也称为对称密码,是指在加密和解密时使用同一密钥得加密方式。
常用对称加密算法:
非对称加密之所以不对称,指的就是加密用一个密钥,而解密的时候用的是另外一个密钥。
常用非对称加密算法:
HTTP 协议本身是无状态的。什么是无状态呢?即服务器无法判断用户身份。
Cookie 实际上是一小段的文本信息(key-value 格式)。客户端向服务器发起请求,如果服务器需要记录该用户状态,就使用 response 向客户端浏览器颁发一个 Cookie。客户端浏览器会把 Cookie 保存起来。
当浏览器再请求该网站时,浏览器把请求的网址连同该 Cookie 一同提交给服务器。服务器检查该 Cookie,以此来辨认用户状态。
打个比方,我们去银行办理储蓄业务,第一次给你办了张银行卡,里面存放了身份证、密码、手机等个人信息。当你下次再来这个银行时,银行机器能识别你的卡,从而能够直接办理业务。
在 WEB 开发中,服务器可以为每个用户浏览器创建一个会话对象(session 对象)。
注意:一个浏览器独占一个 session 对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的 session 中,当用户使用浏览器访问其它程序时,其它程序可以从用户的 session 中取出该用户的数据,为用户服务。
Token 是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个 Token 便将此 Token 返回给客户端,以后客户端只需带上这个 Token 前来请求数据即可,无需再次带上用户名和密码。
基于 Token 的身份验证是无状态的,我们不用将用户信息存在服务器或 Session 中。这种概念解决了在服务端存储信息时的许多问题。没有 session 信息意味着你的程序可以根据需要去增减机器,而不用去担心用户是否登录和已经登录到了哪里。
Asynchronous JavaScript And XML(异步 JavaScript 及 XML)实现异步请求的技术。
什么是同步请求?
场景:页面上有一个 a 标签,用户点击 a 标签,浏览器发出一个请求,然后服务器给出一个响应。(请求,其实是用户的操作,触发的)
什么是异步请求?
向服务器发送请求的时候,我们不必等待结果,而是可以同时做其他的事情,等到有了结果我们可以再来处理这个事。
JSON(JavaScript Object Notation) 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案(有点类似于正则表达式,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换。
JSON 的结构分为两种:
"名/值"对的集合:
对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
例子:{ "name":"阿土","age":20 }
值的有序列表:
数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
在上面两种 JSON 对象中可以使用的值包括有:
REST 这个词是 2000 年 Roy Fielding 在他的博士论文中提出的,Fielding 参与了 HTTP 协议的设计。
REST 是 Representational State Transfer(表现层状态转移)的缩写,如果一个架构符合 REST 原则,就称它为 RESTful 架构。
RESTful API 就可以理解成“符合 REST 风格的 API”,请求 = 动词 + 宾语。
动词使用五种 HTTP 方法,对应 CRUD 操作。
GET:从服务器获取资源
POST:在服务器新建一个资源
PUT:在服务器更新资源(客户端提供改变后的完整资源)
PATCH:在服务器更新资源(客户端提供改变的属性)
DELETE:从服务器中删除资源
RESTful 风格 API 例子:
GET /zoos: 列出所有动物园
POST /zoos: 新建一个动物园
GET /zoos/:id: 获取某个指定动物园的信息
PUT /zoos/:id: 更新某个指定动物园的全部信息
PATCH /zoos/:id 更新某个指定动物园的部分信息
DELETE /zoos/:id: 删除某个动物园
GET /zoos/:id/animals 列出某个指定动物园的所有动物
DELETE /zoos/:id/animals/:id: 删除某个指定动物园的指定动物