1.HTTP 无状态
HTTP协议不会对请求和响应的状态做持久化处理,每次服务器端不知道客户端的状态。
优点:节省服务器的资源。
缺点:每次请求就需要发送重复、复杂的信息。
2.长连接、短连接
长连接是指连接一旦确立,除非有一方主动提出断开连接,否则连接就一直保持。
HTTP1.0是短连接,一个请求需要建立一次连接,请求完毕后就断开连接。
HTTP1.1是长连接,一个连接可以发送多个请求,不过请求需要排队,后面的请求等前面的请求返回才能获取执行机会。
HTTP2.0是连接复用。
3.Session 和 Cookie 的区别
Cookie是以字符串的形式保存在客户端的,主要是 name 用户名、过期期限、Session ID 等信息;而 Session 是以任意形式保存在服务器端,在服务器端会为每个客户端分配一个 Session ID 和对应的空间以供数据存取,是 类 Hashtable 的。
Cookie 可以指定作用域,浏览器关闭直到达到存活期限才会消失,而 Session 作用域是整个网页,浏览器关闭就消失。
Cookie 可以编辑伪造,相对不安全。
过程:客户端第一次向服务器发送请求,服务器响应时携带 Cockie 信息,报文中会有 set Session 写入 Session ID,并提醒客户端保存 Cookie ,然后客户端会把 Cookie 以文本形式保存在本地,之后每次发送请求都会携带 Cookie,那服务器端解析报文就可以获取到 Session ID,到客户端对应空间去存取数据。
4.在地址栏输入 URL 到出现页面发生了什么
首先会用 DNS协议 把域名解析成 IP 地址,先到浏览器的缓存中,找不到再到操作系统的缓存中(Hosts 文件),找不到再到 路由器的缓存中,再找不到就到 本地 DNS 服务器,如果有转发器就会转发给上级服务器,然后上级服务器再向上递归查找;否则就转发给 根DNS 服务器,向下递归查找。
接下来看应用层,会用 HTTP 协议发送请求报文。
再到传输层,用 TCP 可靠传输。
接下来是网络层,需要用 ARP 协议获取 IP 地址对应的 MAC 地址,如果不在一个局域网需要中转。
最后到网络接口层,会通过数据链路层进行传输。
至此,客户端发送请求完毕。
服务器这边先从数据链路层开始,逐步去除首部,向上一层发送数据,到 传输层 TCP 会对报文进行按序重组,接下来到应用层进行 HTTP 响应。
之后浏览器会对页面进行渲染。
5.HTTP 中 GET 和 POST 方法的区别
都是 HTTP 中的方法,在 RFC(修订意见,是用于规范 HTTP 的文档)中规定:
GET 用于获取资源,参数放在 URL 中,是安全的,无副作用的,幂等的,可缓存的。除了检索资源以外,不应该有其他操作。
POST 用于获取传输主体中的实体,参数放在报文的 body 中,是不安全的,有副作用的,非幂等的,可缓存的。
这里的安全性是相对于服务器而言的,如果只是获取资源,就不会改服务器上的资源,就认为是安全的。
幂等是说,一次请求 和 多次请求 获得的结果一样,POST 一般重复请求的话就会弹出提示框,因为非幂等可能导致不同的结果。
以上是 RFC 对于 HTTP 协议的规范,但是具体的 浏览器 和 服务器 对于 HTTP 协议的实现,可能是有出入的,比如 RFC 没有限制 URL 的长度,但是有些浏览器会限制,而且服务器为了性能和安全可能不允许过长的 URL;
还有比如谷歌浏览器 对于 报文 会将 header 和 body 分开发送,所以看上去 使用 POST 方法 就像是分两次发送的。而且 RFC 规定 GET 和 POST 都是可缓存的,不过在一些浏览器的实现中,POST 是不可缓存的。GET 规定参数应该放在 URL 中,其实放置在 body 也是可以的。
GET 的参数放在 URL 中,相对来说不安全,比如 密码 这样的参数,而 其实 POST 也是不安全的,通过抓包就可以获取报文内容,如果想要安全传输,应该用 HTTPS 加密。
从报文角度来看,它们只是方法名称不同而已。
6.HTTP协议的状态码
状态码 表示 客户端发送请求后,服务器对于请求处理的状态。
1XX 表示正在响应请求。
2XX 表示正常处理请求,响应成功。如:200:OK;
204:正常处理,但无资源可返回;
206:进行的是范围请求,服务器成功响应了这部分请求。
3XX 表示重定向。如:301:永久性重定向,表示请求的资源已被分配了新的 URI,以后应该使用资源现在所指的 URI;
302:临时重定向,表示请求的资源已被分配了新的 URI,希望本次能使用 新的 URI 访问:
303:See other:请求中有其他 URI ,应使用 GET 方法定向获取请求的资源。
4XX 表示客户端错误状态码。如:400:客户端语法有问题。
401:HTTP认证失败,或者是用户认证失败。
404:找不到资源;
5XX 表示服务器端错误状态码。如:500:Internal 服务器内部出现bug 或 故障。
501:服务器可以无理由地拒绝请求。
503:服务器超负载或处于停机维护。
7.HTTPS 和 HTTP 的区别
HTTPS=HTTP+通信加密+证书+完整性验证。
HTTPS 是把 HTTP 的部分接口替换成 SSL(安全套接字)+TSL(安全传输层)。
原先 HTTP 是与下层的 TCP 进行通信, HTTPS 是先建立 SSL 连接,再通过 SSL 与 TCP 进行通信。
SSL 采用混合加密:先用非对称性加密,使客户端与服务器端安全地交换密钥,接下来使用对称加密传输信息。
HTTPS具体通信过程:
(1)客户端发送 ClientHello 报文,协商加密算法、密钥长度、HTTP 版本号。
(2)服务器响应 ServerHello 报文。
(3)服务器发送含有证书的报文,证书与服务器的公钥是绑定在一起的,这样客户端就可以获取到服务器的密钥。
(4)服务器发送 HelloDone 报文,至此 握手协商阶段结束。
(5)客户端生成随机数作为密钥,并使用服务器的公钥加密。
(6)客户端发送报文提醒服务器对密钥进行解密。
(7)客户端发送 验证 报文。
(8)服务器对密钥进行解密,并发报文响应。
(9)服务器响应 验证 报文。
此后使用应用层的 HTTP 协议。
报文中会用到 MAC [信息认证码] 保证报文数据完整性。
证书:服务器的运行商会向 CA [数字证书认证机构] 注册自己的信息,CA 认证后会进行数字签名并颁发证书,证书与公钥绑定。
8.HTTP协议报文
分为请求报文 和 响应报文。
请求报文首先是方法,除了常用的 GET、POST之外,还有 HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。
然后是请求头标:以键值对的形式,包含的 客户端的信息,比如请求的服务器地址、浏览器类型、客户端可以接受的MIME 列表。
接下来是空行,表示请求头标结束,然后是请求内容。
响应报文首先是状态行,包括 HTTP 版本号、状态代码、描述信息。
然后是响应头标,包含服务器信息。
接下来是空行,然后是响应内容。