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

原文地址:https://www.cnblogs.com/llguanli/p/7397865.html