• 【计算机网络】HTTP协议


    • 🎥 个人主页:Dikz12
    • 🔥个人专栏:网络原理
    • 📕格言:那些在暗处执拗生长的花,终有一日会馥郁传香
    • 欢迎大家👍点赞✍评论⭐收藏

    目录

    Http协议介绍 

    HTTP协议工作流程

    Fiddler抓包工具介绍 

    Fiddler 使用

    HTTP请求(request) 

    首行 

    请求方法

    GET方法  

    POST方法 

    其它方法 

     GET 和 POST的区别

    URL 

    版本号 

     请求头(header)

    Host 

    Content-Length

    Content-Type

    User-Agent (简称 UA)

     Referer

     Cookie

     HTTP响应

     认识“状态码”

     响应报头(header)

    客户端如何构造一个请求? 

     HTTP协议格式总结


    Http协议介绍 

     HTTP(全称为“超文本传输协议”)是一种应用很广泛的 应用层协议.

    http往往是基于传输层的TCP协议实现的.

     HTTP 是一个文本格式的协议. 学习HTTP协议,重点学习HTTP的报文格式,分为两部分看待,请求 和 响应. 可以通过 Chrome 开发者工具或者 Fiddler 抓包, 分析 HTTP 请求/响应的细节.

     

    http使用场景:1.浏览器访问网站  2.手机App访问对应的服务器 (通过http协议传输数据)

    HTTP协议工作流程

    • 请求: 客户端给服务器发送的数据.
    • 回应: 服务器给客户端返回的数据.

    当我们在Bing浏览器中输入一个 "搜狗网址", 此时浏览器就会给对应的服务器发送一个 HTTP 请求. 对方服务器收到这个请求之后, 经过计算处理, 就会返回一个 HTTP 响应.

    .

     

     

    事实上, 当我们访问一个网站的时候, 可能涉及不止一次的 HTTP 请求/响应 的交互过程.

    http协议,是一种“一问一答” 结构模型的协议。请求和响应的协议和格式。

    一问一答:访问网站

    多问多答:上传文件

    一问多答:下载文件

    多问多答:串流/ 远程桌面

    Fiddler抓包工具介绍 

     Fidder官方下载地址:https://www.telerik.com/fiddler/

    安装可以自定义路径一路next,就可以非常简答 !

    Fiddler 使用

     新安装的fidder 还需要我们手动开启 HTTPS 功能,并且安装证书的. (否则只能抓htttp)

    1.打开fidder, 找到Tools,点击Options.

    2. 选HTTPS,把对号都选上,会弹出一个框,意思就是是否要安装证书,选Yes就完了.

    上诉操作完成之后就可以使用了. 

     3.fidder打开之后,是一个左右结构的程序,左边有一个列表,列出抓到的包有哪些

    4.fiddler 右边就是包的详情.(点击左边某个包) 

    • 左侧窗口显示了所有的 HTTP请求/响应, 可以选中某个请求查看详情.
    • 右侧上方显示了 HTTP 请求的报文内容. (切换到 Raw 标签页可以看到详细的数据格式)
    • 右侧下方显示了 HTTP 响应的报文内容. (切换到 Raw 标签页可以看到详细的数据格式)
    • 请求和响应的详细数据, 可以通过右下角的 View in Notepad 通过记事本打开.

    可以使用 ctrl + a 全选左侧的抓包结果, delete 键清除所有被选中的结果.

    HTTP请求(request) 

    首行 

     首行由http请求的“方法”(methon)、url 、版本号三部分组成.

    请求方法

     

    这两个方法是较为重要的方法!! 

    GET方法  

    GET 是最常用的 HTTP 方法. 常用于获取服务器上的某个资源.

     打开 Fiddler, 访问 百度主页, 观察抓包结果.

     

     图中标记的就是通过浏览器地址栏发送的 GET 请求.

    GET 请求的特点

    • 首行的第一部分为 GET
    • URL 的 query string 可以为空, 也可以不为空.
    • header 部分有若干个键值对结构.
    • body 部分为空.
       
    POST方法 

     POST 方法也是一种常见的方法. 多用于提交用户输入的数据给服务器(例如登陆页面).

     

    POST 请求的特点

    • 首行的第一部分为 POST
    • URL 的 query string 一般为空 (也可以不为空)
    • header 部分有若干个键值对结构.
    • body 部分一般不为空. body 内的数据格式通过 header 中的 Content-Type 指定. body 的长度由
    • header 中的 Content-Length 指定.
    其它方法 
    •  PUT 与 POST 相似,只是具有幂等特性,一般用于更新
    • DELETE 删除服务器指定资源
    • OPTIONS 返回服务器所支持的请求方法
    • HEAD 类似于GET,只不过响应体不返回,只返回响应头
    • TRACE 回显服务器端收到的请求,测试的时候会用到这个
    • CONNECT 预留,暂无使用

    这些方法不需要记,也就是说不需要去遵守场景要求,没有所谓的约束, 它们能做的get 和 post 也能做到.

     GET 和 POST的区别

     首先,GET  和 POST 没有本质区别!!!(双方可以替换对方的场景)

    虽没有本质区别,但是在使用习惯上,还是存在差异的.

    1.GET 习惯把传递的数据放到query string 中,POST则是习惯把传递的数据放到body中.

    (情况并非绝对!!!,当然还是建议大家这样操作.)

    2.语义上的差异.

        GET 大多数还是用来获取数据.

        POST 大多数还是用来提交数据.(登录+上传)

    网上一些错误说法: 

     1.GET请求传递数据数据不安全. POST请求传递数据更安全.

    依据就是:如果使用GET请求来实现登录,点击登录的时候,会把用户名和密码放到 url 中,进一步显示到浏览器地址栏里.(就被别人看见了). 相对于POST,则是放在body中,不会在界面上显示,所以更安全.

    这种说法,也就能忽悠下小白了,对于黑客来说成本并不高,就如下图:用fiddler抓包得到的,用户名和密码,安不安全的关键是加密!!!

    2. GET 请求能传递的数据量有上限,POST传递的数据量没有上限.

    这个说法是上古时期的一个遗留问题,早起版本的浏览器硬件资源非常匮乏,针对GET请求的url 做出了限制.实际上,RFC标准文档中并没有明确规定url 能有多长. 目前,浏览器和服务器的实现过程中,url可以非常长.

    URL 

    URL,描述了某个资源在网络上所属的位置. 就可以理解成jdbc 里的url. 数据库也算是一种“资源”.

    版本号 

    这就很简单,首行的最后就是http 的版本.

     请求头(header)

    header 的整体的格式也是 "键值对" 结构.
    每个键值对占一行. 键和值之间使用分号分割

    Host 

    表示服务器主机的地址和端口.

    Content-Length

    表示 body 中的数据长度.

    Content-Type

    表示请求的 body 中的数据格式.

    User-Agent (简称 UA)

    表示浏览器/操作系统的属性. 形如

     Referer

     表示这个页面是从哪个页面跳转过来的. 形如:

     Cookie

    可以认为是浏览器在本地存储的一种机制.

     

     浏览器的数据来自于服务器. 而且浏览器的后续操作也是要提交给服务器的. 

    服务器就相当于一个网站的各种核心数据.

    程序在运行过程中,也会有一些数据,需要在浏览器这边存储,并且在后续请求的时候数据可能需要再发给服务器. (上次登录时间、上次访问时间、用户的身份信息、累计访问次数.....)

     

     空行 和 正文 boby 就不在演示了!!! 用fiddler抓包工具观察一下就可以!!非常简单

     HTTP响应

     认识“状态码”

     

    •  2xx:都表示成功.
    • 3xx: 表示重定向. 重定向:请求中访问的是A 这样的地址,响应返回了一个重定向报文,告诉你应该要访问B的地址.
    • 5xx: 表示服务器出错了. 也就是服务器挂了.

     响应报头(header)

    响应报头的格式跟请求报文格式基本一致,也就是 Content-Type 中的body数据格式不一样.

    客户端如何构造一个请求? 

     1.直接在浏览器地址栏输入URL 

    2.通过form表单来触发GET / POST 请求

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    6. <title>hello</title>
    7. </head>
    8. <body>
    9. <form action="http://www.sogou.com/abc.html" method="get">
    10. <input type="text" name="key1">
    11. <input type="text" name="key2">
    12. <input type="text" name="key3">
    13. <input type="submit" value="提交">
    14. </form>
    15. </body>
    16. </html>

     

    3.这种也是最简单的借助第三方工具 --> postman 

     

     

     HTTP协议格式总结

     

    思考问题: 为什么 HTTP 报文中要存在 "空行"?
    因为 HTTP 协议并没有规定报头部分的键值对有多少个. 空行就相当于是 "报头的结束标记", 或者是 "报头和正文之间的分隔符".
    HTTP 在传输层依赖 TCP 协议, TCP 是面向字节流的. 如果没有这个空行, 就会出现 "粘包问题".

  • 相关阅读:
    核方法总结(三)———核主成分(kernel PCA)学习笔记
    计算机毕设 大数据上海租房数据爬取与分析可视化 -python 数据分析 可视化
    Spring源码:ApplicationContextAware和BeanFactoryAware理解BeanFactory和Aware
    基于侏儒猫鼬优化的BP神经网络(分类应用) - 附代码
    8类放球问题
    ADC、DMA以及串口之间的联系和区别?
    网络安全(黑客)自学
    手把手教你实现buffer(四)——webrtc中的CopyOnWriteBuffer
    网页构造与源代码
    信我,ThreadPoolExecutor经典面试问题就在这~
  • 原文地址:https://blog.csdn.net/m0_65465009/article/details/136542853