什么是无状态协议?怎么解决HTTP协议无状态?
-
无状态协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息。
-
也就是说,当客户端一次HTTP请求完成以后,客户端再发送一次HTTP请求,HTTP并不知道当前客户端是一个”老用户“。
-
可以使用Cookie来解决无状态的问题,Cookie就相当于一个通行证,第一次访问的时候给客户端发送一个Cookie,当客户端再次来的时候,拿着Cookie(通行证),那么服务器就知道这个是”老用户“。
cookie的用处
· 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
· 个性化设置(如用户自定义设置、主题等)
· 浏览器行为跟踪(如跟踪分析用户行为等)
浏览器禁用cookie怎么办?
此时无法使用 Cookie 来保存用户信息,只能使用 Session。除此之外,不能再将 Session ID 存放到 Cookie 中,而是使用 URL 重写技术,将 Session ID 作为 URL 的参数进行传递。
把用户可能点的每一个超链接后面,都跟上用户的sessionid号。
解释下什么是URI,什么是URL
URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源。
-
Web上可用的每种资源如HTML文档、图像、视频片段、程序等都是一个来URI来定位的
-
URI一般由三部组成:
-
①访问资源的命名机制
-
②存放资源的主机名
-
③资源自身的名称,由路径表示,着重强调于资源。
URL是uniform resource locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。
-
URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上,特别是著名的Mosaic。
-
采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。URL一般由三部组成:
-
①协议(或称为服务方式)
-
②存有该资源的主机IP地址(有时也包括端口号)
-
③主机资源的具体地址。如目录和文件名等
URN,uniform resource name,统一资源命名,是通过名字来标识资源,比如mailto:java-net@java.sun.com。
-
URI是以一种抽象的,高层次概念定义统一资源标识,而URL和URN则是具体的资源标识的方式。URL和URN都是一种URI。笼统地说,每个 URL 都是 URI,但不一定每个 URI 都是 URL。这是因为 URI 还包括一个子类,即统一资源名称 (URN),它命名资源但不指定如何定位资源。上面的 mailto、news 和 isbn URI 都是 URN 的示例。
在Java的URI中,一个URI实例可以代表绝对的,也可以是相对的,只要它符合URI的语法规则。而URL类则不仅符合语义,还包含了定位该资源的信息,因此它不能是相对的。
在Java类库中,URI类不包含任何访问资源的方法,它唯一的作用就是解析。
常用的HTTP方法有哪些?解释一下哪些是幂等的
-
GET: 用于请求访问已经被URI(统一资源标识符)识别的资源,可以通过URL传参给服务器
-
POST:用于传输信息给服务器,主要功能与GET方法类似,但一般推荐使用POST方式。
-
PUT: 传输文件,报文主体中包含文件内容,保存到对应URI位置。
-
HEAD: 获得报文首部,与GET方法类似,只是不返回报文主体,一般用于验证URI是否有效。
-
DELETE:删除文件,与PUT方法相反,删除对应URI位置的文件。
- OPTIONS:查询相应URI支持的HTTP方法。
幂等的 HTTP 方法,同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。换句话说就是,幂等方法不应该具有副作用(统计用途除外)。
所有的安全方法也都是幂等的。
在正确实现的条件下,GET,HEAD,PUT 和 DELETE 等方法都是幂等的,而 POST 方法不是。
GET /pageX HTTP/1.1 是幂等的,连续调用多次,客户端接收到的结果都是一样的:
GET /pageX HTTP/1.1 GET /pageX HTTP/1.1 GET /pageX HTTP/1.1 GET /pageX HTTP/1.1
POST /add_row HTTP/1.1 不是幂等的,如果调用多次,就会增加多行记录:
POST /add_row HTTP/1.1 -> Adds a 1nd row POST /add_row HTTP/1.1 -> Adds a 2nd row POST /add_row HTTP/1.1 -> Adds a 3rd row
DELETE /idX/delete HTTP/1.1 是幂等的,即使不同的请求接收到的状态码不一样:
DELETE /idX/delete HTTP/1.1 -> Returns 200 if idX exists DELETE /idX/delete HTTP/1.1 -> Returns 404 as it just got deleted DELETE /idX/delete HTTP/1.1 -> Returns 404
HTTPS和HTTP有什么区别
1.对称密钥加密
对称密钥加密(Symmetric-Key Encryption),加密和解密使用同一密钥。
· 优点:运算速度快;
2.非对称密钥加密
非对称密钥加密,又称公开密钥加密(Public-Key Encryption),加密和解密使用不同的密钥。
密钥成对出现(且根据公钥无法推知私钥,根据私钥也无法推知公钥),加密解密使用不同密钥(公钥加密需要私钥解密,私钥加密需要公钥解密),相对对称加密速度较慢,典型的非对称加密算法有RSA、DSA等,示意图如下:
· 优点:可以更安全地将公开密钥传输给通信发送方;
3. HTTPS 采用的加密方式
HTTPS 采用混合的加密机制,使用非对称密钥加密 ‘用于传输的对称密钥’ 来保证传输过程的安全性,之后使用对称密钥加密进行通信来保证通信过程的效率。
认证
通过使用 证书 来对通信方进行认证。
数字证书认证机构(CA,Certificate Authority)是客户端与服务器双方都可信赖的第三方机构。
服务器的运营人员向 CA 提出公开密钥的申请,CA 在判明提出申请者的身份之后,会对已申请的公开密钥做数字签名,然后分配这个已签名的公开密钥,并将该公开密钥放入公开密钥证书后绑定在一起。
进行 HTTPS 通信时,服务器会把证书发送给客户端。客户端取得其中的公开密钥之后,先使用数字签名进行验证,如果验证通过,就可以开始通信了。
HTTPS其实是有两部分组成:HTTP + SSL / TLS(SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。),
也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据
-
一、首先HTTP请求服务端生成证书,客户端对证书的有效期、合法性、域名是否与请求的域名一致、证书的公钥(RSA加密)等进行校验;
-
二、客户端如果校验通过后,就根据证书的公钥的有效, 生成随机数,随机数使用公钥进行加密(RSA加密);
-
三、消息体产生的后,对它的摘要进行MD5(或者SHA1)算法加密,此时就得到了RSA签名;
-
四、发送给服务端,此时只有服务端(RSA私钥)能解密。
- 五、解密得到的随机数,再用AES加密,作为密钥(此时的密钥只有客户端和服务端知道)。
-
在服务器端存在一个公钥及私钥
-
客户端从服务器取得这个公钥
-
客户端产生一个随机的密钥
-
客户端通过公钥对密钥加密(非对称加密)
-
客户端发送到服务器端
-
服务器端接受这个密钥并且以后的服务器端和客户端的数据全部通过这个密钥加密(对称加密)
HTTPS通信过程的时序图如下:
图3 HTTPS通信时序图
正如上图所示,我们能保证下面几点:
-
客户端产生的密钥只有客户端和服务器端能得到
-
加密的数据只有客户端和服务器端才能得到明文
-
客户端到服务端的通信是安全的
当然实际的SSL实现算法复杂的多,并有数据校验、身份验证等功能,如果需要更多了角请参看RFC2246及RFC4346文档
HTTP/1.1新特性
· 默认是长连接
· 支持流水线:连续放松请求,不必等待相应。
· 支持同时打开多个 TCP 连接
· 支持虚拟主机
· 新增状态码 100
· 支持分块传输编码
· 新增缓存处理指令 max-age
HTTP优化方案
我下面就简要概括一下:
-
TCP复用:TCP连接复用是将多个客户端的HTTP请求复用到一个服务器端TCP连接上,而HTTP复用则是一个客户端的多个HTTP请求通过一个TCP连接进行处理。前者是负载均衡设备的独特功能;而后者是HTTP 1.1协议所支持的新功能,目前被大多数浏览器所支持。
-
内容缓存:将经常用到的内容进行缓存起来,那么客户端就可以直接在内存中获取相应的数据了。
-
压缩:将文本数据进行压缩,减少带宽
-
SSL加速(SSL Acceleration):使用SSL协议对HTTP协议进行加密,在通道内加密并加速
-
TCP缓冲:通过采用TCP缓冲技术,可以提高服务器端响应时间和处理效率,减少由于通信链路问题给服务器造成的连接负担。