HTTP协议系列(3)---包括WebSocket简单介绍

简介: HTTP是超文本传输协议,那HTTPS是什么尼?要明白HTTPS是什么先要明白HTTP的缺点,想一下我们在使用HTTP的时候会有那些缺点尼? 1.通信使用的明文(不加密),内容可能会被窃听; 2.不验证客户端或者服务器的身份,有可能被伪装; 3.无法确定报文的完整性,可能已经被串改;

一、HTTPS


   HTTP是超文本传输协议,那HTTPS是什么尼?要明白HTTPS是什么先要明白HTTP的缺点,想一下我们在使用HTTP的时候会有那些缺点尼?

   1.通信使用的明文(不加密),内容可能会被窃听;

   2.不验证客户端或者服务器的身份,有可能被伪装;

   3.无法确定报文的完整性,可能已经被串改;

   假如当我们遇到这些情况的时候怎么处理尼?这时候我们就应该这样处理HTTP+加密明文+认证身份+报文完整性;这样就确保了我们访问的安全性和完整性,就是我们所要说的HTTPS,HTTPS就是超文本传输安全协议,通常情况下我们是HTTP+TCP进行客户端和服务器的通信,这是普通的HTTP协议,HTTPS则是先和SSL通信,然后SSL在和TCP通信,所以说不难想象HTTPS就是HTTP+SSL。那接下来我们介绍一下HTTPS是怎么进行安全通信的;

  1005447-20170114161134885-1280095971.jpg

   使用对称加密确保了客户端与服务器数据的安全性,这样又来一个问题什么是对称加密,对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key)。对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中。对称加密的一大缺点是密钥的管理与分配,换句话说,如何把密钥发送到需要解密你的消息的人的手里是一个问题。在发送密钥的过程中,密钥有很大的风险会被黑客们拦截。现实中通常的做法是将对称加密的密钥进行非对称加密,然后传送给需要它的人。那问题又来了非对称加密是什么?非对称加密为数据的加密与解密提供了一个非常安全的方法,它使用了一对密钥,公钥(public key)和私钥(private key)。私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。非对称加密使用这对密钥中的一个进行加密,而解密则需要另一个密钥。比如,你向银行请求公钥,银行将公钥发给你,你使用公钥对消息加密,那么只有私钥的持有人--银行才能对你的消息解密。与对称加密不同的是,银行不需要将私钥通过网络发送出去,因此安全性大大提高。这样我们好像将问题全部解决了,数据就可以安全的传递了,其实不然这里还有一个问题如何服务器的公钥准确无误的传递给客户端?这样是不是诞生了无穷尽的循环,好在给我们提供了一个决解方案,那就是CA证书,通过它建立我们的信任基点,就可以保证服务器公钥被正确的传递给客户端,然后浏览器可以使用它安全的把对称加密的密钥传递给服务器,之后以此密钥加密需要传递的信息,保证了数据的安全性。可能这里你还有问题,为什么不直接都是非对称加密?原因是非对称加密的计算效率远远不如对称加密,会造成服务器压力过大;这样我们基本就了解清楚HTTPS怎么嘛保证数据安全性的;


二、HTTP认证方式


    1.BASIC认证(基本认证)

    1). 客户端访问一个受http基本认证保护的资源。

    2). 服务器返回401状态,要求客户端提供用户名和密码进行认证。

          401 Unauthorized

          WWW-Authenticate: Basic realm="WallyWorld"

    3). 客户端将输入的用户名密码用Base64进行编码后,采用非加密的明文方式传送给服务器。

          Authorization: Basic xxxxxxxxxx.

    4). 如果认证成功,则返回相应的资源。如果认证失败,则仍返回401状态,要求重新进行认证。

   

     2.DIGEST认证(基本认证)

     

     1). 客户端访问一个受http摘要认证保护的资源。

     2). 服务器返回401状态以及nonce等信息,要求客户端进行认证。

        HTTP/1.1 401 Unauthorized

        WWW-Authenticate: Digest

        realm="testrealm@host.com",

        qop="auth,auth-int",

        nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",

        opaque="5ccc069c403ebaf9f0171e9517f40e41"

     3). 客户端将以用户名,密码,nonce值,HTTP方法, 和被请求的URI为校验值基础而加密(默认为MD5算法)的摘要信息返回给服务器。

          认证必须的五个情报:

     ・ realm : 响应中包含信息

     ・ nonce : 响应中包含信息

     ・ username : 用户名

     ・ digest-uri : 请求的URI

     ・ response : 以上面四个信息加上密码信息,使用MD5算法得出的字符串。

 

            Authorization: Digest

            username="Mufasa",  ← 客户端已知信息

            realm="testrealm@host.com",   ← 服务器端质询响应信息

            nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",  ← 服务器端质询响应信息

            uri="/dir/index.html", ← 客户端已知信息

            qop=auth,   ← 服务器端质询响应信息

             nc=00000001, ← 客户端计算出的信息

             cnonce="0a4f113b", ← 客户端计算出的客户端nonce

             response="6629fae49393a05397450978507c4ef1", ← 最终的摘要信息 ha3

             opaque="5ccc069c403ebaf9f0171e9517f40e41"  ← 服务器端质询响应信息

     4). 如果认证成功,则返回相应的资源。如果认证失败,则仍返回401状态,要求重新进行认证。

   

    3.SSL客户端认证

    4.表单认证

 

三、WebSocket简单介绍

     

    WebSocket协议也是建立在HTTP协议上的,因此发起的者仍然是客户端,但是一但建立WebSocket通信连接以后,不论服务器和客户端都可以进行发送报文,因此具有已下特点:1.推送功能,支持服务端向客户端推送数据;2.减少通信量,只要建立起WebSocket连接,就能一直保持连接状态;

         实现WebSocket通信的步骤:

    1005447-20170114175238213-207989078.png

   

   我写了一个简单为例子实现了已下WebSocket下载地址是:

 

public class FirstWebSocketController : ApiController
    {
        public HttpResponseMessage Get()
        {
            if (HttpContext.Current.IsWebSocketRequest)
            {
                HttpContext.Current.AcceptWebSocketRequest(ProcessWSChat);
            }
            return new HttpResponseMessage(HttpStatusCode.SwitchingProtocols);
        }
        private async Task ProcessWSChat(AspNetWebSocketContext arg)
        {
            WebSocket socket = arg.WebSocket;
            while (true)
            {
                ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[1024]);
                WebSocketReceiveResult result = await socket.ReceiveAsync(buffer, CancellationToken.None);
                if (socket.State == WebSocketState.Open)
                {
                    string message = Encoding.UTF8.GetString(buffer.Array, 0, result.Count);
                    string returnMessage = "You send: " + message + ".at" + DateTime.Now.ToLongTimeString();
                    buffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(returnMessage));
                    await socket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);
                }
                else
                {
                    break;
                }
            }
        }
    }


<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
    <script src="~/js/jquery-1.8.3.min.js"></script>
    <script type="text/javascript">
        $(function () {
            var ws;
            $("#btnConnect").click(function () {
                $("#messageSpan").text("Connection...");
                ws = new WebSocket("ws://" + window.location.hostname + ":" + window.location.port + "/api/FirstWebSocket");
                ws.onopen = function () {
                    $("#messageSpan").text("Connected!");
                };
                ws.onmessage = function (result) {
                    $("#messageSpan").text(result.data);
                };
                ws.onerror = function (error) {
                    $("#messageSpan").text(error.data);
                };
                ws.onclose = function () {
                    $("#messageSpan").text("Disconnected!");
                };
            });
            $("#btnSend").click(function () {
                if (ws.readyState == WebSocket.OPEN) {
                    ws.send($("#txtInput").val());
                }
                else {
                    $("messageSpan").text("Connection is Closed!");
                }
            });
            $("#btnDisconnect").click(function () {
                ws.close();
            });
        }
      )
    </script>
</head>
<body>
    <div> 
        <input type="button" value="Connect" id="btnConnect" />
        <input type="button" value="DisConnect" id="btnDisConnect" />
        <hr />
        <input type="text" id="txtInput" />
        <input type="button" value="Send" id="btnSend" />
        <br />
        <span id="messageSpan" style="color:red;"></span>
    </div>
</body>
</html>

   https://github.com/wangtongzhou520/WebSocket

 

相关文章
|
1月前
|
缓存 负载均衡 网络协议
HTTP 与 SOCKS5 代理协议:企业级选型指南与工程化实践
面向企业网络与数据团队的代理协议选型与治理指南,基于流量特征选择HTTP或SOCKS5协议,通过多协议网关统一出站,结合托管网络降低复杂度,实现稳定吞吐、可预测时延与合规落地。
|
1月前
|
监控 负载均衡 安全
WebSocket网络编程深度实践:从协议原理到生产级应用
蒋星熠Jaxonic,技术宇宙中的星际旅人,以代码为舟、算法为帆,探索实时通信的无限可能。本文深入解析WebSocket协议原理、工程实践与架构设计,涵盖握手机制、心跳保活、集群部署、安全防护等核心内容,结合代码示例与架构图,助你构建稳定高效的实时应用,在二进制星河中谱写极客诗篇。
WebSocket网络编程深度实践:从协议原理到生产级应用
|
3月前
HTTP协议中请求方式GET 与 POST 什么区别 ?
GET和POST的主要区别在于参数传递方式、安全性和应用场景。GET通过URL传递参数,长度受限且安全性较低,适合获取数据;而POST通过请求体传递参数,安全性更高,适合提交数据。
513 2
|
3月前
|
应用服务中间件
HTTP协议中常见的状态码
HTTP协议状态码分为1xx、2xx、3xx、4xx、5xx五类,常见状态码包括:101(请求已接受)、200(请求成功)、302(重定向)、400(请求错误)、401(未认证)、403(无权限)、404(资源不存在),以及500(服务器错误)、502(网关错误)、503(服务不可用)、504(网关超时)等。
135 0
|
3月前
|
网络协议 安全 网络安全
什么是HTTP协议
HTTP协议是超文本传输协议,基于TCP,规定了客户端与服务器端通信规则,但数据以明文传输,安全性低。HTTPS则通过SSL加密保障数据安全。两者默认端口不同,HTTP为80,HTTPS为443。HTTPS安全性更高,但消耗更多服务器资源。
175 0
|
3月前
|
数据采集 Web App开发 JSON
Python爬虫基本原理与HTTP协议详解:从入门到实践
本文介绍了Python爬虫的核心知识,涵盖HTTP协议基础、请求与响应流程、常用库(如requests、BeautifulSoup)、反爬应对策略及实战案例(如爬取豆瓣电影Top250),帮助读者系统掌握数据采集技能。
273 0
|
4月前
|
存储 网络协议 安全
HTTP 协议及会话跟踪机制详解
本文详解了 HTTP 协议的核心知识,包括其定义(超文本传输协议,基于 TCP,规定客户端与服务器通信规则)及与 HTTPS 的区别(安全性、端口、资源消耗)。 介绍了 GET 与 POST 请求的差异(参数限制、安全性、应用场景),以及 Restful 风格(通过 URL 定位资源,请求方式决定操作)。列举了常见 HTTP 状态码(如 200 成功、404 资源未找到),对比了转发与重定向的区别(服务器端一次请求 vs 客户端两次请求)。 还阐述了会话跟踪机制:Cookie 基于客户端存储,通过Set-Cookie和Cookie头实现,安全性较低;Session 基于服务端存储,依赖 C
532 1
|
3月前
|
缓存 网络协议 UED
深度解析HTTP协议从版本0.9至3.0的演进和特性。
总的来说,HTTP的演进是互联网技术不断发展和需求日益增长的结果。每一次重要更新都旨在优化性能,增进用户体验,适应新的应用场景,而且保证了向后兼容,让互联网的基础架构得以稳定发展。随着网络技术继续进步,我们可以预期HTTP协议在未来还会继续演化。
433 0
|
4月前
|
XML 安全 网络架构
深度对比SOAP与HTTP协议:详细理解它们的工作原理和差异
在设计服务和系统交云策略时,考虑到上述差异是至关重要的。SOAP适合需要高安全性、可靠性和事务支持的企业级应用。而HTTP适合Web界面浏览、RESTful服务和需要快速响应的轻量级通信。根据具体需求和上下文,开发者可以选择合适的协议以实现最优的系统性能和用户体验。
478 0