HTTP协议和HTTPS协议初探

概况

HTTP是hypertext transfer protocol(超文本传输协议)的简写。它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEBserver之间交换数据的过程。

HTTP是一个属于应用层的面向对象的协议,因为其简捷、高速的方式,适用于分布式超媒体信息系统。它于1990年提出。经过几年的使用与发展。得到不断地完好和扩展。眼下在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,并且HTTP-NG(Next Generation of HTTP)的建议已经提出。

主要特点

HTTP协议的主要特点可概括例如以下:

  • 1.支持客户/server模式。

  • 2.简单高速:客户向server请求服务时,仅仅需传送请求方法和路径

    请求方法经常使用的有GET、HEAD、POST。每种方法规定了客户与server联系的类型不同。因为HTTP协议简单。使得HTTPserver的程序规模小,因而通信速度非常快。

  • 3.灵活:HTTP同意传输随意类型的数据对象

    正在传输的类型由Content-Type加以标记

  • 4.无连接:无连接的含义是限制每次连接仅仅处理一个请求。server处理完客户的请求,并收到客户的应答后,即断开连接。採用这样的方式能够节省传输时间。
  • 5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着假设兴许处理须要前面的信息。则它必须重传,这样可能导致每次连接传送的数据量增大。

    还有一方面,在server不须要先前信息时它的应答就较快


HTTP协议

HTTP协议具体解释之URL

http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议。常基于TCP的连接方式,HTTP1.1版本号中给出一种持续连接的机制,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。

HTTP URL (URL是一种特殊类型的URI,包括了用于查找某个资源的足够的信息)的格式例如以下:


http://host[":"port][abs_path]

http表示要通过HTTP协议来定位网络资源;

host表示合法的Internet主机域名或者IP地址;

port指定一个端口号。为空则使用缺省端口80;

abs_path指定请求资源的URI。

假设URL中没有给出abs_path,那么当它作为请求URI时,必须以“/”的形式给出,通常这个工作浏览器自己主动帮我们完毕。

举例:

eg: http:192.168.0.1:8080/index.jsp

HTTP协议具体解释之请求

http请求由三部分组成,各自是:请求行、消息报头、请求正文

请求行

请求行以一个方法符号开头,以空格分开。后面跟着请求的URI和协议的版本号,格式例如以下:

Method Request-URI HTTP-Version CRLF

当中 :

Method表示请求方法。

Request-URI是一个统一资源标识符;

HTTP-Version表示请求的HTTP协议版本号。

CRLF表示回车和换行(除了作为结尾的CRLF外,不同意出现单独的CR或LF字符)。

请求方法(全部方法全为大写):

  • GET    请求获取Request-URI所标识的资源
  • POST   在Request-URI所标识的资源后附加新的数据
  • HEAD   请求获取由Request-URI所标识的资源的响应消息报头
  • PUT    请求server存储一个资源。并用Request-URI作为其标识
  • DELETE  请求server删除Request-URI所标识的资源
  • TRACE   请求server回送收到的请求信息,主要用于測试或诊断
  • CONNECT  保留将来使用
  • OPTIONS  请求查询server的性能,或者查询与资源相关的选项和需求

应用举例:

GET方法:在浏览器的地址栏中输入网址的方式訪问网页时,浏览器採用GET方法向server获取资源。eg:GET /form.html HTTP/1.1 (CRLF)

POST方法:要求被请求server接受附在请求后面的数据,经常使用于提交表单。

eg:POST /reg.jsp HTTP/ (CRLF)

Accept:image/gif,image/x-xbit,… (CRLF)

HOST:XXX.XX.XX (CRLF)

Content-Length:22 (CRLF)

Connection:Keep-Alive (CRLF)

Cache-Control:no-cache (CRLF)

(CRLF) //该CRLF表示消息报头已经结束。在此之前为消息报头

user=username&pwd=password//此行下面为提交的数据

HEAD方法与GET方法差点儿是一样的。对于HEAD请求的回应部分来说。它的HTTP头部中包括的信息与通过GET请求所得到的信息是同样的。利用这种方法,不必传输整个资源内容。就能够得到Request-URI所标识的资源的信息。

该方法经常使用于測试超链接的有效性,能否够訪问。以及近期是否更新


请求报头后述

请求正文


HTTP协议具体解释之响应

在接收和解释请求消息后。server返回一个HTTP响应消息。

HTTP响应也是由三个部分组成,各自是:状态行、消息报头、响应正文

状态行格式例如以下


HTTP-Version Status-Code Reason-Phrase CRLF

当中:

HTTP-Version表示serverHTTP协议的版本号;

Status-Code表示server发回的响应状态代码;

Reason-Phrase表示状态代码的文本描写叙述。

状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:

  • 1xx:信息响应类,表示接收到请求并且继续处理
  • 2xx:处理成功响应类,表示动作被成功接收、理解和接受
  • 3xx:重定向响应类,为了完毕指定的动作。必须接受进一步处理
  • 4xx:client错误。客户请求包括语法错误或者是不能正确运行
  • 5xx:服务端错误,server不能正确运行一个正确的请求

常见状态代码、状态描写叙述、说明:

  • 200 OK //client请求成功
  • 400 Bad Request //client请求有语法错误,不能被server所理解
  • 401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
  • 403 Forbidden //server收到请求,可是拒绝提供服务
  • 404 Not Found //请求资源不存在,eg:输入了错误的URL
  • 500 Internal Server Error //server发生不可预期的错误
  • 503 Server Unavailable //server当前不能处理client的请求,一段时间后可能恢复正常

    eg:HTTP/1.1 200 OK (CRLF)

响应报头后述

响应正文就是server返回的资源的内容

HTTP协议具体解释之消息报头

HTTP消息由client到server的请求和server到client的响应组成。请求消息和响应消息都是由開始行(对于请求消息,開始行就是请求行,对于响应消息。開始行就是状态行),消息报头(可选),空行(仅仅有CRLF的行),消息正文(可选)组成。

HTTP消息报头包括普通报头、请求报头、响应报头、实体报头。

每个报头域都是由名字+“:”+空格+值 组成,消息报头域的名字是大写和小写无关的。

普通报头

在普通报头中,有少数报头域用于全部的请求和响应消息,但并不用于被传输的实体。仅仅用于传输的消息。

eg:Cache-Control 用于指定缓存指令,缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(一个消息的缓存指令不会影响还有一个消息处理的缓存机制)。HTTP1.0使用的相似的报头域为Pragma。

  • 请求时的缓存指令包括:no-cache(用于指示请求或响应消息不能缓存)、no-store、max-age、max-stale、min-fresh、only-if-cached;
  • 响应时的缓存指令包括:public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage.

eg:为了指示IE浏览器(client)不要缓存页面,server端的JSP程序能够编写例如以下:

response.setHeader("Cache-Control","no-cache");
//response.setHeader("Pragma","no-cache");作用相当于上述代码,通常两者//合用

这句代码将在发送的响应消息中设置普通报头域:Cache-Control:no-cache

Date普通报头域表示消息产生的日期和时间

Connection普通报头域同意发送指定连接的选项。

比如指定连接是连续,或者指定“close”选项,通知server,在响应完毕后。关闭连接.

请求报头

请求报头同意client向server端传递请求的附加信息以及client自身的信息。

经常使用的请求报头:

  • Accept请求报头域用于指定client接受哪些类型的信息。

    举例:

    Accept:image/gif,表明client希望接受GIF图象格式的资源。

    Accept:text/html。表明client希望接受html文本。

  • Accept-Charset请求报头域用于指定client接受的字符集

    举例:Accept-Charset:iso-8859-1,gb2312.

    假设在请求消息中没有设置这个域,缺省是不论什么字符集都能够接受。

  • Accept-Encoding请求报头域相似于Accept。可是它是用于指定可接受的内容编码

    举例:Accept-Encoding:gzip.deflate.

    假设请求消息中没有设置这个域server假定client对各种内容编码都能够接受。

  • Accept-Language请求报头域相似于Accept,可是它是用于指定一种自然语言。

    举例:Accept-Language:zh-cn.

    假设请求消息中没有设置这个报头域,server假定client对各种语言都能够接受。

  • Authorization 请求报头域主要用于证明client有权查看某个资源。当浏览器訪问一个页面时。假设收到server的响应代码为401(未授权),能够发送一个包括Authorization请求报头域的请求,要求server对其进行验证。

  • Host请求报头域主要用于指定被请求资源的Internet主机和端口号。它通常从HTTP URL中提取出来的。发送请求时。该报头域是必需的。

    比方 我们在浏览器中输入:http://www.imooc.com/index.jsp

    浏览器发送的请求消息中,就会包括Host请求报头域。例如以下:Host:www.imooc.com

    此处使用缺省端口号80。若指定了端口号,则变成:Host:www.imooc.com:指定端口号。

  • User-Agent我们上网登陆论坛的时候,往往会看到一些欢迎信息。当中列出了你的操作系统的名称和版本号。你所使用的浏览器的名称和版本号,这往往让非常多人感到非常奇妙,实际上,server应用程序就是从User-Agent这个请求报头域中获取到这些信息。

    User-Agent请求报头域同意client将它的操作系统、浏览器和其它属性告诉server。

    只是。这个报头域没必要的。假设我们自己编写一个浏览器,不使用User-Agent请求报头域。那么server端就无法得知我们的信息了。

请求报头举例:


响应报头

响应报头同意server传递不能放在状态行中的附加响应信息,以及关于server的信息和对Request-URI所标识的资源进行下一步訪问的信息。

经常使用的响应报头

Location响应报头域用于重定向接受者到一个新的位置。Location响应报头域经常使用在更换域名的时候。

Server响应报头域包括了server用来处理请求的软件信息。与User-Agent请求报头域是相相应的。下面是Server响应报头域的一个样例:Server:nginx

WWW-Authenticate响应报头域必须被包括在401(未授权的)响应消息中,client收到401响应消息时候,并发送Authorization报头域请求server对其进行验证时,服务端响应报头就包括该报头域。

eg:WWW-Authenticate:Basic realm=”Basic Auth Test!” //能够看出server对请求资源採用的是基本验证机制。

实体报头

请求和响应消息都能够传送一个实体。一个实体由实体报头域和实体正文组成。但并非说实体报头域和实体正文要在一起发送。能够仅仅发送实体报头域。实体报头定义了关于实体正文(eg:有无实体正文)和请求所标识的资源的元信息。

经常使用的实体报头:

  • Content-Encoding实体报头域被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,因而要获得Content-Type报头域中所引用的媒体类型,必须採用相应的解码机制。

    ContentEncoding这样用于记录文档的压缩方法,eg:Content-Encoding:gzip

  • Content-Language实体报头域描写叙述了资源所用的自然语言。没有设置该域则觉得实体内容将提供给全部的语言阅读

    者。eg:Content-Language:da

  • Content-Length实体报头域用于指明实体正文的长度,以字节方式存储的十进制数字来表示。
  • Content-Type实体报头域用语指明发送给接收者的实体正文的媒体类型。eg:Content-Type:text/html;charset=ISO-8859-1 Content-Type:text/html;charset=GB2312
  • Last-Modified实体报头域用于指示资源的最后改动日期和时间。
  • Expires实体报头域给出响应过期的日期和时间。为了让代理server或浏览器在一段时间以后更新缓存中(再次訪问曾訪问过的页面时。直接从缓存中载入,缩短响应时间和减少server负载)的页面。我们能够使用Expires实体报头域指定页面过期的时间。eg:Expires:Thu,15 Sep 2006 16:23:12 GMT

    HTTP1.1的client和缓存必须将其它非法的日期格式(包括0)看作已经过期。eg:为了让浏览器不要缓存页面,我们也能够利用Expires实体报头域,设置为0,jsp中程序例如以下:response.setDateHeader(“Expires”,”0”);


工具类HttpUtil.java

import java.io.IOException;
import java.io.UnsupportedEncodingException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.util.EntityUtils;

public class HttpUtil {
    public static String httpGet(String httpUrl) {
        String result = "";
        DefaultHttpClient httpclient = new DefaultHttpClient();// 创建httpclient
        HttpGet httpget = new HttpGet(httpUrl);
        HttpResponse response = null;
        HttpParams params = httpclient.getParams(); // 计算网络超时用
        HttpConnectionParams.setConnectionTimeout(params, 15 * 1000);
        HttpConnectionParams.setSoTimeout(params, 20 * 1000);
        try {
            response = httpclient.execute(httpget);
            HttpEntity entity = response.getEntity();// 得到http的内容
            response.getStatusLine().getStatusCode();// 得到http的状态返回值
            result = EntityUtils.toString(response.getEntity());// 得到具体的返回值。通常是xml文件
            entity.consumeContent();// 假设entity不为空,则释放内存空间
            httpclient.getCookieStore();// 得到cookis
            httpclient.getConnectionManager().shutdown();// 关闭httpclient
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

    public static String httpPost(String httpUrl, String data) {
        String result = "";
        DefaultHttpClient httpclient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(httpUrl);
        // httpclient.setCookieStore(DataDefine.mCookieStore);
        HttpParams params = httpclient.getParams(); // 计算网络超时用
        HttpConnectionParams.setConnectionTimeout(params, 15 * 1000);
        HttpConnectionParams.setSoTimeout(params, 20 * 1000);
        httpPost.setHeader("Content-Type", "text/xml");
        StringEntity httpPostEntity;
        try {
            httpPostEntity = new StringEntity(data, "UTF-8");
            httpPost.setEntity(httpPostEntity);
            HttpResponse response = httpclient.execute(httpPost);
            HttpEntity entity = response.getEntity();// 得到http的内容
            response.getStatusLine().getStatusCode();// 得到http的状态返回值
            result = EntityUtils.toString(response.getEntity());// 得到具体的返回值。通常是xml文件
            entity.consumeContent();// 假设entity不为空,则释放内存空间
            httpclient.getCookieStore();// 得到cookis
            httpclient.getConnectionManager().shutdown();// 关闭httpclient
        } catch (Exception e) {
            e.printStackTrace();
        } // base64是经过编码的字符串,能够理解为字符串 // StringEntity
        try {
            httpPostEntity = new StringEntity("UTF-8");
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return result;
    }
}

HTTPS协议

HTTPS协议概述

HTTPS(Hypertext Transfer Protocol over Secure Socket Layer。基于SSL的HTTP协议)使用了HTTP协议。但HTTPS使用不同于HTTP协议的默认端口及一个加密、身份验证层(HTTP与TCP之间)。这个协议的最初研发由网景公司进行,提供了身份验证与加密通信方法,如今它被广泛用于互联网上安全敏感的通信。HTTPS是一个安全通信通道,用于在客户计算机和server之间交换信息。它使用安全套接字层(SSL)进行信息交换,简单来说它是HTTP的安全版。

它是由Netscape开发并内置于其浏览器中,用于对数据进行压缩和解压操作。并返回网络上传送回的结果。

HTTPS实际上应用了Netscape的安全全套接字层(SSL)作为HTTP应用层的子层。(HTTPS使用端口443。而不是象HTTP那样使用端口80来和TCP/IP进行通信。)SSL使用40 位关键字作为RC4流加密算法,这对于商业信息的加密是合适的。HTTPS和SSL支持使用X。509数字认证。假设须要的话用户能够确认发送者是谁。

使用HTTPS步骤

client在使用HTTPS方式与Webserver通信时有下面几个步骤。

(1)客户使用https的URL訪问Webserver,要求与Webserver建立SSL连接。

(2)Webserver收到client请求后。会将站点的证书信息(证书中包括公钥)传送一份给client。

(3)client的浏览器与Webserver開始协商SSL连接的安全等级,也就是信息加密的等级。

(4)client的浏览器依据两方同意的安全等级,建立会话密钥,然后利用站点的公钥将会话密钥加密,并传送给站点。

(5)Webserver利用自己的私钥解密出会话密钥。

(6)Webserver利用会话密钥加密与client之间的通信。

工具类HttpsUtils.java

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;

public class HttpsUtil {
    static TrustManager[] xtmArray = new MytmArray[] { new MytmArray() };// 创建信任规则列表
    private final static int CONNENT_TIMEOUT = 15000;
    private final static int READ_TIMEOUT = 15000;
    static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    };

    /**
     * * 信任全部主机-对于不论什么证书都不做检查 Create a trust manager that does not validate *
     * certificate chains, Android 採用X509的证书信息机制,Install the all-trusting trust
     * * manager
     */
    private static void trustAllHosts() {
        try {
            SSLContext sc = SSLContext.getInstance("TLS");
            sc.init(null, xtmArray, new java.security.SecureRandom());
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); // 不进行主机名确认,对全部主机
            HttpsURLConnection.setDefaultHostnameVerifier(DO_NOT_VERIFY);
        } catch (Exception e) {
            e.printStackTrace();
        }
    } 

    // https get方法,返回值是https请求。服务端返回的数据string类型,数据进行xml解析
    public static String HttpsGet(String httpsurl) {
        return HttpsPost(httpsurl, null);
    }

    /**
     * https post方法。返回值是https请求,服务端返回的数据string类型,数据进行xml解析
     */
    public static String HttpsPost(String httpsurl, String data) {
        String result = null;
        HttpURLConnection http = null;
        URL url;
        try {
            url = new URL(httpsurl); // 推断是http请求还是https请求
            if (url.getProtocol().toLowerCase().equals("https")) {
                trustAllHosts();
                http = (HttpsURLConnection) url.openConnection();
                ((HttpsURLConnection) http).setHostnameVerifier(DO_NOT_VERIFY);// 不进行主机名确认
            } else {
                http = (HttpURLConnection) url.openConnection();
            }
            http.setConnectTimeout(CONNENT_TIMEOUT);// 设置超时时间
            http.setReadTimeout(READ_TIMEOUT);
            if (data == null) {
                http.setRequestMethod("GET");// 设置请求类型
                http.setDoInput(true);
                // http.setRequestProperty("Content-Type", "text/xml");
                if (AppSession.mCookieStore != null)
                    http.setRequestProperty("Cookie", AppSession.mCookieStore);
            } else {
                http.setRequestMethod("POST");// 设置请求类型为post
                http.setDoInput(true);
                http.setDoOutput(true);
                // http.setRequestProperty("Content-Type", "text/xml");
                if (AppSession.mCookieStore != null && AppSession.mCookieStore.trim().length() > 0)
                    http.setRequestProperty("Cookie", AppSession.mCookieStore);
                DataOutputStream out = new DataOutputStream(http.getOutputStream());
                out.writeBytes(data);
                out.flush();
                out.close();
            } // 设置http返回状态200(ok)还是403
            AppSession.httpsResponseCode = http.getResponseCode();
            BufferedReader in = null;
            if (AppSession.httpsResponseCode == 200) {
                getCookie(http);
                in = new BufferedReader(new InputStreamReader(http.getInputStream()));
            } else
                in = new BufferedReader(new InputStreamReader(http.getErrorStream()));
            String temp = in.readLine();
            while (temp != null) {
                if (result != null)
                    result += temp;
                else
                    result = temp;
                temp = in.readLine();
            }
            in.close();
            http.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /** * 得到cookie * */
    private static void getCookie(HttpURLConnection http) {
        String cookieVal = null;
        String key = null;
        AppSession.mCookieStore = "";
        for (int i = 1; (key = http.getHeaderFieldKey(i)) != null; i++) {
            if (key.equalsIgnoreCase("set-cookie")) {
                cookieVal = http.getHeaderField(i);
                cookieVal = cookieVal.substring(0, cookieVal.indexOf(";"));
                AppSession.mCookieStore = AppSession.mCookieStore + cookieVal + ";";
            }
        }
    }
}

总的来说。http效率更高,https安全性更高。

两者的差别

  • https协议须要到ca申请证书。一般免费证书非常少,须要交费。
  • http是超文本传输协议,信息是明文传输。https 则是具有安全性的ssl加密传输协议
  • http和https使用的是全然不同的连接方式用的端口也不一样:前者是80,后者是443。
  • http的连接非常easy,是无状态的 ,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议 ,要比http协议安全。

HTTPS解决的问题:

1、信任主机的问题

採用https 的server 必须从CA 申请一个用于证明server用途类型的证书。

该证书仅仅实用于相应的server 的时候,客户度才信任此主机。所以眼下全部的银行系统站点。关键部分应用都是https 的。 客户通过信任该证书。从而信任了该主机。事实上这样做效率非常低,可是银行更側重安全。 这一点对我们没有不论什么意义,我们的server,採用的证书无论自己issue 还是从公众的地方issue。 client都是自己人,所以我们也就肯定信任该server。

2、通讯过程中的数据的泄密和被窜改

1)一般意义上的https。 就是 server 有一个证书

主要目的是保证server 就是他声称的server。

这个跟第一点一样。

服务端和client之间的全部通讯。都是加密的。

具体讲。是client产生一个对称的密钥。通过server 的证书来交换密钥。 一般意义上的握手过程。

加下来全部的信息往来就都是加密的。

第三方即使截获,也没有不论什么意义。因为他没有密钥。当然窜改也就没有什么意义了。

2)少许对client有要求的情况下。会要求client也必须有一个证书。

这里client证书,事实上就相似表示个人信息的时候,除了用户名/密码, 还有一个CA 认证过的身份。

应为个人证书一般来说上别人无法模拟的,全部这样能够更深的确认自己的身份。

眼下少数个人银行的专业版是这样的做法。具体证书可能是拿U盘作为一个备份的载体。 HTTPS 一定是繁琐的。

本来简单的http协议。一个get一个response。因为https 要还密钥和确认加密算法的须要。单握手就须要6/7 个往返。不论什么应用中,过多的round trip 肯定影响性能。

接下来才是具体的http协议,每一次响应或者请求。 都要求client和服务端对会话的内容做加密/解密。

虽然对称加密/解密效率比較高,可是仍然要消耗过多的CPU,为此有专门的SSL 芯片。 假设CPU 信能比較低的话。肯定会减少性能。从而不能serve 很多其它的请求。

SSL的简单介绍

SSL是Netscape公司所提出的安全保密协议。在浏览器(如Internet Explorer、Netscape Navigator)和Webserver(如Netscape的Netscape Enterprise Server、ColdFusion Server等等)之间构造安全通道来进行数据传输,SSL运行在TCP/IP层之上、应用层之下,为应用程序提供加密数据通道,它採用了RC4、MD5 以及RSA等加密算法。使用40 位的密钥,适用于商业信息的加密。

同一时候。Netscape公司相应开发了HTTPS协议并内置于其浏览器中,HTTPS实际上就是SSL over HTTP。它使用默认端口443。而不是像HTTP那样使用端口80来和TCP/IP进行通信。HTTPS协议使用SSL在发送方把原始数据进行加密,然 后在接受方进行解密,加密和解密须要发送方和接受方通过交换共知的密钥来实现,因此,所传送的数据不easy被网络黑客截获和解密。

然而。加密和解密过程须要耗费系统大量的开销,严重减少机器的性能,相关測试数据表明使用HTTPS协议数据传输的工作效率仅仅有使用HTTP协议传输的十 分之中的一个。

假如为了安全保密,将一个站点全部的Web应用都启用SSL技术来加密,并使用HTTPS协议进行传输,那么该站点的性能和效率将会大大减少。并且没有这个必要。因为一般来说并非全部数据都要求那么高的安全保密级别。所以,我们仅仅需对那些涉及机密数据的交互处理使用HTTPS协议,这样就做到鱼与熊掌兼得。总之不须要用https 的地方,就尽量不要用。

參考:http://aresxiong.com/2015/11/30/protocol_http_and_https

时间: 2024-12-17 16:39:11

HTTP协议和HTTPS协议初探的相关文章

TCP协议和UDP协议

TCP协议和UDP协议 TCP协议和UDP协议 TCP(Transmission Control Protocol)可靠的.面向连接的协议(eg:打电话).传输效率低全双工通信(发送缓存&接收缓存).面向字节流.使用TCP的应用:Web浏览器:电子邮件.文件传输程序. UDP(User Datagram Protocol)不可靠的.无连接的服务,传输效率高(发送前时延小),一对一.一对多.多对一.多对多.面向报文,尽最大努力服务,无拥塞控制.使用UDP的应用:域名系统 (DNS):视频流:IP语

(1)网络编程的常识 (2)基于tcp协议的编程模型 (3)tcp协议和udp协议的比较 (4)基于udp协议的编程模型

1.网络编程的常识 目前主流的网络通讯软件有:微信.QQ.YY.陌陌.探探.飞信.阿里旺旺.... 在吗? 1.1 七层网络模型(熟悉) 为了保证数据传递的可靠安全等等,ISO(国际标准委员会组织)将数据的传递从逻辑上划分为以下七层: 应用层.表示层.会话层.传输层.网络层.数据链路层.物理层. 在发送数据之前要按照上述七层协议从上到下一层一层进行加包处理,再发送出去; 在接收数据之后要按照上述七层协议从下到上一层一层进行拆包处理,再解析出来: 1.2 常用的协议(熟悉) http协议 - 超文

BLE GAP 协议和 GATT 协议

BLE GAP 协议和 GATT 协议 最近要打算学习 Blufi 协议进行蓝牙配置,其中必然使用 GAP 协议和 GATT 协议,于是进行重新学习一番. BLE 是一个 Bluetooth SIG 组织颁布的协议,对于使用 BLE 我们开发人员,最关注的是 上层的 GAP 协议和 GATT 协议. 1.1 GAP 和 GATT 有什么不同呢? GAP :定义一个 BLE 网络栈的通用拓扑结构. GATT:描述关于如何数据在连接中如何传输的细节. GATT 尤其关注于数据如何被格式化.打包.然后

2.tcp/ip协议分析-IP协议、ARP协议和RARP协议

IP协议是TCP/IP协议族中最核心的协议,它提供不可靠.无连接的数据报传输服务.所以理解IP协议对于我们学习网络至关重要. IP首部 重要字段介绍: 4bit首部长度:以4字节为单位,决定了IP首部长度最大为15*4=60,一般的IP数据报首部长度为20,此时该字段为5. 8bit的服务类型:包括一个3bit的优先权子字段(可以忽略),4bit的tos子字段和1bit的未用位但必须置0.4bit的TOS分别代表:最小延时.最大吞吐量.最高可靠性和最小费用. 比如在telnet交互应用中就要求有

tcp协议和udp协议的差别

tcp协议和udp协议的差别 是否连接          面向连接                 面向非连接 传输可靠性       可靠                       不可靠 应用场合         传输少量数据         大量数据 速度                   慢                            快 TCP要求和服务器保持连接  UDP不需要   TCP数据是有序的(先写的数据对方一低昂先收到)UDP数据是无序的 AsyncSocke

IP协议和TCP协议的分析

一,TCP/IP协议栈的概述 TCP/IP协议栈是由美国国防部(DoD)在20世纪60年代创建的(比OSI模型还早),是一种具体实现标准. 分为4层:网络接入层(链路层),Internet层(网络层),主机到主机层(传输层),应用层 由于TCP/IP协议栈涉及的知识点很多,而其中最主要的协议是IP协议和TCP协议,故本文主要是针对IP和TCP协议来分析,其他的知识点后续补上. 二,IP协议 IP(Internet Protocol,网际协议)是TCP/IP协议栈中最重要的协议(位于网络层),用于

TCP协议和UDP协议的区别

转载:http://www.cnblogs.com/obama/p/3292335.html  作者: 曾见绝美的阳光 第一部分:TCP/IP相关知识点 对TCP/IP的整体认 链路层知识点 IP层知识点 运输层知识点 应用层知识点 (这些知识点都可以参考:http://www.cnblogs.com/newwy/p/3234536.html) 第二部分:常见面试题 TCP协议和UDP协议的区别是什么 TCP协议是有连接的,有连接的意思是开始传输实际数据之前TCP的客户端和服务器端必须通过三次握

RS-232协议和RS-485协议

RS232 RS232是一种异步传输标准接口.通常 RS-232 接口以9个引脚 (DB-9) 或是25个引脚 (DB-25) 的型态出现 .RS232最常用的连接方式是三根线:一条发送线.一条接收线及一条地线. 电平信号:逻辑1(MARK)=-3V--15V,逻辑0(SPACE)=+3-+15V 传输距离:RS-232-C标准规定,驱动器允许有2500pF的电容负载,通信距离将受此电容限制,例如,采用150pF/m的通信电缆时,最大通信距离为15m:若每米电缆的电容量减小,通信距离可以增加.传

对TCP/IP协议的一些看法(3):SLIP协议和PPP协议

今天主要讲一下我对链路层上的SLIP协议和PPP协议的看法.今天应该是写的第三天了,为自己的坚持点个赞. SLIP协议其实用到的并不多,它全名叫serial line imternet protocol,译为中文是串行线路网际协议.它属于低速串行线路,可用于专业线路,也可用于拨号线路,传输速率在1200bps到19200bps之间.对slip帧(因为它是链路层协议)的格式,主要需要记住的是一个END位,位于帧的首部和尾部,用于判断帧的开始与结束.这样就可能存在如果在帧中间有个END的话,数据帧就