• HTTP、HTTPS协议以及抓包工具



    前言

    HTTP协议是HTTP客户端与HTTP服务器之间交互传输的数据格式,为了更好的构造HTTP协议,这篇文章总结了HTTP请求/响应协议的格式,比较了get和post方法的区别;同时,通过ajax/Java socket构造HTTP客户端,Tomcat是HTTP的一个服务器,后面会讲述;最后引入HTTPS,由于HTTP协议是按照文本内容名文传输的,会导致一些问题,通过在HTTP上引入一个加密层,即HTTPS。


    一、HTTP

    1.HTTP是什么?

    HTTP(超文本传输协议),是应用层的协议之一,是应用非常广泛、目前最主流的应用层协议,它通常是基于传输层的TCP协议实现的,目前主要使用的有1.1和1.2版本;“超文本”的含义就是传输的内容不仅仅是文本(html、css等)还可以是一些其他资源,例如音频、图片等二进制数据。

    2.HTTP工作过程

    平时我们在浏览器中输入一个搜索网址(URL),其浏览器会给对应的服务器发送一个HTTP请求,对应的服务器会返回一个HTTP响应。
    在这里插入图片描述

    3.HTTP协议格式

    HTTP协议是一个文本格式的协议,可以通过Fiddler进行抓包获取HTTP请求/响应的细节。抓包工具就是浏览器在发送请求HTTP时,就会先发给Fiddler,然后Fiddler再把请求发给服务器,服务器返回数据时,Fiddler先拿到数据再交给浏览器。
    Fiddler下载地址:https://www.telerik.com/fiddler
    在这里插图片如上图所示,右边是通过Fiddler抓到的HTTP,左边是通过点击右边抓到的HTTP显示的详细信息,通过raw可以查看HTTP请求/响应。

    (1)HTTP请求(request)

    URL

    URL(统一资源定位符):互联网上的每个文件都有唯一的URL,它包含的信息指出了文件的位置以及浏览器应该怎么处理它。如下图所示,就是URL的基本格式。
    URI(统一资源标识符):URL是URI的子集,是URI概念的一种实现方式。
    在这里插入图片描述
    (1)协议方案名:常见的有http、https等。
    (2)登录信息:user为用户名,pass为用户密码,现在一般都会省略。
    (3)服务器地址:此处是一个域名的话,会通过DNS解析为IP地址。
    (4)服务器端口号:可以省略不写,http默认端口号为80,https默认端口号为443。
    (5)带层次的文件路径:指定访问路径。
    (6)查询字符串(query string):是一个键值对的形式,键与值使用=分隔,键值对之间用&分隔。
    (7)片段标识符:主要用于页面内跳转,可以没有。

    方法(method):最主要的有get/post
    方法说明支持的HTTP协议版本
    GET获取资源1.0,1.1
    POST传输实体主体1.0,1.1

    (1)GET方法
    常用语获取服务器上的某个资源,在浏览器上输入某个url浏览器会发送一个get请求,html中的link、img、script等标签也会触发get请求。
    如下图,是一个get请求。
    在这里插入图片描述
    GET请求的特点:
    首行有get url(其中URL的queryString可以为空) ;
    header部分有若干键值对;
    body部分为空。

    (2)POST方法
    在这里插入图片描述
    首行为POST url(queryString一般为空,也可以不为空);
    header部分有若干键值对;
    body部分一般不为空。(其中header中的Content-Length、Content-type用来指定body的长度和数据格式)
    header与body空一行是为了防止在传输层产生黏包问题。

    报头(header)

    Host:表示服务器主机的地址和端口。
    Content-Length:body中的数据长度。
    Cotent-Type:body中的数据格式(常见格式有form表单、json)。
    User-Agent:表示浏览器/操作系统的属性。
    Referer:表示这个页面是从哪个页面跳转过来的。
    Cookie:Cookie里保留的数据可以让用户在有效期间免验证直接拿到请求的数据。(例如你访问一个网站,第一次访问你需要先登录,登录后服务器会给你一个‘令牌’,你在访问这个网站其他页面的时候就不需要再登陆了,但是对于一些特定的页面还是会受限制)

    面试题:get和post的区别

    get和post本质上是相同的,但是:
    (1)在语义方面,一般要求GET用于获取数据,POST用于提交数据。
    (2)GET的body部分一般为空,需要传输的数据通过query string传输;POST的query string一般为空,需要传递的数据通过body传递。
    (3)GET请求一般是幂等的,POST请求一般不是幂等的。(幂等是多次请求得到的结果都一样)
    (4)在幂等的基础下,GET请求是可以被缓存的,POST不能被缓存。

    (2)HTTP响应(response)

    如图是抓包抓到的HTTP响应。
    在这里插入图片描述

    状态码

    (1)200 ok:表示访问成功。
    (2)404 Not Found:没有找到资源。
    (3)403 Forbidden:表示访问被拒绝。
    (4)405 Method Not Found:服务器不支持的方法。
    (5)500 Internal Server Error:服务器内部出错。
    (6)504 Gateway TimeOut:当服务器负载较大的时候,请求时间过长就会出现这种情况。
    (7)302 Move temporarily:临时重定向。(例如:换新手机号之后希望别人打你旧电话号的时候转移到你新手机号上)
    (8)301 Moved Permantly:永久重定向,当浏览器收到这种响应的时候,后续的请求都会自动被改为新地址。

    报头(header)

    其中由Content-Type、Content-Length等属性。
    Content-Type的常见取值为:text/html、text/css、application/javascript、application/json。

    正文(body)

    Content-Type所对应的取值就是body的格式。
    在这里插入图片描述
    如上图所示,总结了HTTP请求/响应的格式。空行是作为报头的结束标志,防止TCP传输时产生黏包问题。

    4.构造HTTP请求

    (1)通过form表单构造HTTP请求

    get方法:

    a.输入内容,点击提交
    在这里插入图片描述
    b.提交后跳转,红色框里面是queryString部分,一般get有,post没有。
    在这里插入图片描述

    代码如下(示例):

        <form action="https://www.bilibili.com/" method="get">
            <input type="text" name="text">
            <input type="text" name="text">
            <input type="submit" value="提交">
        </form>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    post方法

    代码如下(示例):

        <form action="https://www.bilibili.com" method="post">
            <input type="text" name="user">
            <input type="password" name="password">
            <input type="submit" value="提交">
        </form>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    (2)通过ajax构造HTTP请求

    ajax构造的请求会出现跨域访问错误,可以用在自己写的服务器上。
    ajax(Asynchronous Javascript And XML)异步JavaScript和XML,需要注意的是这里的异步和多线程里的不是同一个意思。
    多线程中的synchronized为同步,其实是‘异步’的意思。
    网络通信里的同步相当于我去餐厅点餐我自己把饭端走,而异步是不负责接收结果,等别人主动推送过来(我去点餐之后就不管了,等服务员给我端过来)。
    get方法(示例):

        <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
        <script>
            $.ajax({
                type: 'get',
                url: 'https://www.sogou.com',
                success: function(body) {
                    // 服务器返回一个正确的响应(200)
                    console.log('ok');
                },
                error: function(body) {
                    console.log('error');
                }
            })
        </script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    post方法(示例):

        <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
        <script>
            // $是jquery中特殊的变量名,是jquery里的全局对象
            $.ajax({
                type: 'get',
                url: 'https://www.sogou.com',
                data: 'http 请求的 body',
                contentType: 'x-www-form-urlencode',
                success: function(body) {
                    // 服务器返回一个正确的响应(200)
                    console.log('ok');
                },
                error: function(body) {
                    console.log('error');
                }
            })
        </script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    注意:form构造的HTTP请求的页面会立即跳转到另一个页面,而ajax构造的页面是静态的,这样就可以让页面局部跳转。

    二、HTTPS

    1.HTTPS是什么?

    名文传输是一件很危险的事情,HTTPS就是在HTTP的基础上进行了加密,进一步保证用户信息的安全。而加密就是经过一些列操作将明文转为密文,解密则是将密文转为明文。

    2.HTTPS的工作过程

    加密的方式有很多种,主要分为对称加密和非对称加密。

    (1)引入对称加密

    对称加密:客户端使用密钥将名文加密为密文请求发给服务器,服务器通过密钥解密得到名文。
    虽然黑客不知道密钥是什么,无法进行解密,但是如果为保证密钥不容易扩散,每个客户端需要不同的密钥,服务器对客户端需要维护每个客户端和密钥之间的联系,比较麻烦。

    (2)引入非对称加密

    为了保证密钥的安全,如果进行对称加密,就需要先确定一个密钥的密钥,而密钥的密钥就产生了应该先有哪个密钥这样的问题,所以此时就引入了非对称加密。
    非对称加密有两个密钥,一个公钥一个私钥。但是公钥和私钥的配对过程非常慢,比对称加密要慢的多,其中配对可以通过公钥对名文加密,变为密文;也可以通过私钥对密文加密,变成明文;同时也可以反着用。

    (3)引入证书

    由于客户端无法确定获得的公钥是不是黑客伪造的,更安全便捷的方法则是在客户端和服务器刚建立连接的时候,服务器给客户端返回一个证书。
    这个证书包含网站的身份信息和公钥。这个证书就像我们的身份证,每个人都需要去公安局办一个身份证,在我们使用身份证的时候,例如去酒店、网吧,刷身份证的时候就会检测你的身份证的真伪,我们的浏览器中就缓存有一个类似于公安局一样的地方检测证书的信息。
    在这里插入图片描述

    下一篇文章将引入Tomcat的安装教程以及部署静态页面流程。

  • 相关阅读:
    java 加密结果不一致的各个坑
    ipv6笔记及总结
    R语言R包详解——stringr包:字符处理
    Python函数
    计算机毕业设计(附源码)python元江特色农产品售卖平台
    leetcode2022年度刷题分类型总结(十二)并查集
    Oracle数据库经纬度坐标查询优化与结果错误原因分析、SQL中WKT超长文本字符串处理
    强大的JTAG边界扫描(2):BSDL文件介绍
    智能门锁:电容式触控屏的工作原理
    springboot操作nosql的mongodb,或者是如何在mongodb官网创建服务器并进行操作
  • 原文地址:https://blog.csdn.net/qq_45283185/article/details/127759878