加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 创业 > C语言 > 正文

http协议的理解

发布时间:2020-12-15 00:33:46 所属栏目:C语言 来源:网络整理
导读:HTTP 协议 一直以来对http有一个模糊的认识,前几个星期把http权威指南那本书给看了,600多页的书,一个星期给看完了,像是看小说一样,加上计算机网络学过的一些知识,对http协议有一些认识,加上前端和它打交道比较多,就理一下思路,希望自己能有一个清晰

HTTP 协议

一直以来对http有一个模糊的认识,前几个星期把http权威指南那本书给看了,600多页的书,一个星期给看完了,像是看小说一样,加上计算机网络学过的一些知识,对http协议有一些认识,加上前端和它打交道比较多,就理一下思路,希望自己能有一个清晰的认识。http 协议定义了与服务器的几种交互方法,如get(),post(),put(),delete()方法,对应就是对服务器资源的增删查改。一般常用的就是get和post方法。一般输入地址栏回车,发的是get请求,通过点击链接跳转的也是get请求,提交表单的是post请求,感性的认识就是get在地址栏会带一串参数,浏览器地址会跳转,post请求一般地址栏不会跳转。GET一般用于获取/查询 资源信息,而POST一般用于更新资源信息。

HTTP请求,两种请求格式get和post

      //请求行 回车符 换行符  rn
           //请求头 回车符 换行符
        //空行   回车符 换行符
    [] //请求体,只有post有
        //具体格式 get请求
        GET /books/?sex=man&amp;name=Professional HTTP/1.1    <<--------请求行,请求服务器相应的资源,http协议版本
        Host: www.wrox.com  <<----请求头,服务器信息
        User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) <<----请求头,服务器信息
        Gecko/20050225 Firefox/1.0.1   <<----请求头,服务器信息
        Connection: Keep-Alive   <<----请求头,服务器信息

        //实际碰到的get请求
        //具体格式 post请求
        POST / HTTP/1.1    <<--------请求行,http协议版本
        Host: www.wrox.com  <<----请求头,服务器信息
        User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
        Gecko/20050225 Firefox/1.0.1
        Content-Type: application/x-www-form-urlencoded
        Content-Length: 40
        Connection: Keep-Alive
        (----此处空一行---就是空行-)
        数据部分
        //实际碰到的post请求</code></pre>

HTTP响应

         //状态行,比如状态码200
             //响应头
          //空行
    [] //响应主体
            HTTP/1.1 200 OK
            Date: Sat,31 Dec 2005 23:59:59 GMT
            Content-Type: text/html;charset=ISO-8859-1
            Content-Length: 122
            (----此处空一行---就是空行-)
            <html>
            <head>
            <title>Wrox Homepage</title>
            </head>
            <body>
            <!-- body goes here -->
            </body>
            </html>
            //实际碰到的响应头
get和post方式比较
1. post比get方式安全,因为get一般是在url后添加一串字符串,用户很容易看到,也很容易解析
2. get通过字符串传值的长度有限制,不同的浏览器对地址的字符限制也有所不同,一般最多只能识别1024个字符,所以如果需要传送大量数据的时候,也不适合使用GET方式。POST方式请求行中不包含数据字符串,这些数据保存在”请求内容”部分,各数据之间也是使用”&”符号隔开。POST方式大多用于页面的表单中。GET方式也有自己的特点和优势,我们应该根据不同的情况来选择是使用GET还是使用POST。涉及到不是私密的数据也是可以用get请求的。

前端还有一个常用的就是Ajax请求,之前一直是模糊的,由于前后端分离,常常由后端提供接口,我们进行模拟数据的接收和发送,这里都是通过发ajax请求,对于Ajax请求需要认识到几点,这里Ajax的意思是 异步 JavaScript和XML,还有一点可能会困惑的就是认识什么是异步,什么是同步,还有就是了解XMLHttpRequest对象。还有就是跨域的问题

里面也涉及到很多技术和安全问题。(CORS),即Cross-Orgin Resource Sharing 跨域资源共享,JSONP、都是解决跨域的一些方案

同步和异步
  1. 同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。

  2. 异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。

XHR的用法

1. 第一步创建XHR对象

function createXHR(){
if(typeof XMLHttpRequest != "undefined"){
return new XMLHttpRequest(); //现代浏览器一般都会支持
} else if(typeof ActiveXObject != "undefinded"){ //针对IE低版本做兼容
if(typeof arguments.caller.activeXString != "string"){
var versions = ["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"],i,len;
for(i = 0,len = versions.length; i<len; i++){
try {
new ActiveXObject(versions[i]);
arguments.callee.activeXString = versions[i];
break;
} catch(ex){
//跳过
}
}
}
return new ActiveXObject(arguments.callee.activeXString);
} else {
throw new Error("No XHR object available");
}
}

  1. XHR对象的使用方法
    var xhr = new createXHR(); //第一步 创建XHR对象
    //第二步就是调用open方法,调用该方法并不会真正发送请求,只是启动一个请求以备发送
    xhr.open("get","example.txt",true); //get 和 post方法,url,异步的(可选): 默认为true,false为同步,不建议使用

xhr.onreadystatechange = function(){ //第四步 这里对事件进行监听,只要readyState的值发生改变就会触发事件
if(xhr.readyState == 4){
if((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
console.log(xhr.responseText);
} else {
console.log(xhr.status);
}
}
};
xhr.send(null); //第三步 调用send方法,请求就会发到服务器
3. 如何解决CORS问题

HTTPS 加密过程

这里以淘宝为例子。阐述具体的过程,说在前面的话,HTTPS是在http 和传输层之间加的一层 TLS/SSL,以往http传输都是明文,为了确保安全,将传输的数据全部进行加密,SSL/TLS,有三点要明白,证书的验证(RSA)、传输过程数据加密(AES)、防止传输过程数据被篡改(SHA-256) SSL/TLS 未完成之前,HTTP 层不会运行。

浏览器端 Client Hello

  1. 在Client Hello 之前完成的有DNS解析、TCP三次握手

DNS解析、TCP三次握手 默认使用 443端口

  1. 浏览器这边通过TLSv1.2协议发送 Client Hello,这里面包含很多东西

    1. 随机数,由两部分组成(时间戳(4字节)+随机数(28字节))

      随机数

    2. 浏览器可选密码套件(用来与服务器协商到底使用哪种加密算法)

      密码套件

    3. 会话ID(Session ID) 初始值为0(一字节) ,下次进行连接,就不用进行握手。见下图

    4. server_name extension: (通过这,告诉服务器客户端将要连接 )

      server_name

    5. .....

服务器--->浏览器 确认

这里还有一个确认,类似TCP三次握手,服务器给客户端,确认收到 Client Hello

服务器端 Server Hello

Server Hello ,这个记录分成三个子消息

  1. Server Hello 短消息 这里主要进行协商加密算法,服务器从密码套件里面选取一种,之后就用该方法做后面的事情,而且服务端也向客户端这边发送随机数,格式和 Client Hello 一样。

    Server Hello

  2. 证书消息。 从这里面可以看出来,server Hello 下面两个使用TCP的包里面就是 服务器给客户端发的证书内容,就是 X.509 证书里面的内容,比如公钥、颁发者信息

    证书消息

  3. Server Hello Done (Certificate 部分)

    Server key Exchange

  4. 在SSL/TLS握手协议的第三部分

    Server Hello Done

  5. RAS验证过程(基于大数难分解)一般都是2048比特长,转换成10进制,大概就是617位
    总结:客户端这里会生成一个预主密钥,使用服务器的公钥加密, 后面 使用 客户端随机数、服务端随机数、以及预主密钥产生会话秘钥。这样就可以使用这个秘钥进行加密

参考

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读