概念

简介

HTTP是一个属于应用层的面向对象的协议,目前使用最为广泛的是HTTP1.1协议。当然,许多网站已经开始支持HTTP2.0,HTTP2复杂度高于HTTP1.1,我们先从HTTP1.1说起。

HTTP于1990 年提出,经过几年的使用与发展,得到不断地完善和扩展。主要有以下特点:

  • 支持客户/服务器模式
  • ASCII码传输,人能直接读懂
  • 参数灵活
  • *无连接/无状态(仅针对HTTP2以前的版本)

两个重要的网站

1.https://www.ietf.org/rfc/

主要存储RFC标准文档

2.https://zh.wikipedia.org/zh-cn/超文本传输协议

这个地址是关于HTTP的详细介绍

关于RFC

RFC:Request For Comments(RFC),是一系列以编号排定的文件。文件收集了有关互联网相关信息,以及UNIX和互联网社区的软件文件。RFC文件是由Internet Society(ISOC)赞助发行。基本的互联网通信协议都有在RFC文件内详细说明。RFC文件还额外加入许多在标准内的论题,例如对于互联网新开发的协议及发展中所有的记录。因此几乎所有的互联网标准都有收录在RFC文件之中。(来自百度百科)

RFC2026将标准定义位4个阶段:因特网草案、建议标准、草案标准、因特网标准。更多的过程可以看看这些文件:

  • RFC 2223 "Instructions to RFC Authors"。
  • RFC 2026 "The Internet Standards Process -- Revision 3"。

浏览器输入某个网站地址并按下回车后发生了什么

假设我们在浏览器钟输入www.abc.com,这个网站的IP地址是11.22.33.44,当回车按下后计算机将做如下工作:

1.首先检查本地的各种缓存,比如DNS缓存、网站内容缓存等,如果有并且规则表明不需在服务器查找则直接展示内容出来

2.检查本地的hosts配置,如果输入的网站域名在本机有配置则加载本机配置的IP地址,比如我们直接配置了一条hosts如下:

11.22.33.44 www.abc.com

那么计算机将会直接向11.22.33.44这个地址发送数据,而不会做DNS查询。

3.如果本机什么都没有则进行DNS查询,DNS和本机的hosts类似,即传入www.abc.com,然后DNS服务器返回给机器11.22.33.44,这个DNS服务器即我们在TCP/IP里面填写的服务器地址,它使用的是UDP传输。

4.使用IP建立连接,需要记住的是在互联网世界里面只有IP地址才是唯一地址,而网站域名只是一种别名,在连接服务器的过程中也是使用IP地址进行连接。

5.发送客户端请求的数据。

6.接收服务端响应的数据。

当然,实际情形下远不止以上几步这么简单,以上的每一步也可以拆分位许多小步,甚至形成一篇新的文章,但是基本流程就是这样。

怎么观察HTTP协议内容

如上文所说,HTTP协议是基于应用层的协议,那么计算机网络抓包过后的应用层数据即包含HTTP协议的内容,在windows里面我们可以采用大名鼎鼎的wireshark进行数据报文的抓取,然后筛选HTTP协议进行观察,也可以使用smartsniff这样小而精的软件专门抓取应用层内容,在Linux里面直接使用tcpdump进行抓取即可,然后将抓取的结果使用相关的软件打开观察,也可以导入到wireshark进行观察。一个实际抓取的较为典型的HTTP内容如下:

客户端请求:
POST /devices HTTP/1.1
Host: www.abc.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9 a=b&c=d 服务器响应:
HTTP/1.1 200 OK
Date: Tue, 27 Oct 2020 02:13:39 GMT
Content-Type: application/json
Content-Length: 5
Connection: keep-alive
Server: nginx
Pragma: no-cache Hello

协议详解

HTTP之URL

HTTP URL格式如下:

http://host[":"port][abs_path]

host 表示合法的 Internet 主机域名或者 IP 地址

port 指定一个端口号,为空则使用缺省端口 80

abs_path 指定请求资源的 URI

举几个例子:

http://www.abc.com
http://www.abc.com:8080
http://www.abc.com/devices
http://www.abc.com:8080/devices/data
http://11.22.33.44/devices/data
http://11.22.33.44:8080/devices/data

以上均符合HTTP URL的定义,我们可以简单地将其理解位我们在浏览器里面输入的网站域名

HTTP之请求

请求组成部分

http请求由三部分组成,分别是:请求行、消息报头、请求正文

关于请求行

请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,即

Method Request-URI HTTP-Version CRLF

针对Method有以下定义,并且必须使用以下定义的内容,如果填入其他的数据那么就不是标准的HTTP协议(虽然一部分服务器能自动纠错)

  • GET 请求获取 Request-URI 所标识的资源
  • POST 在 Request-URI 所标识的资源后附加新的数据
  • HEAD 请求获取由 Request-URI 所标识的资源的响应消息报头
  • PUT 请求服务器存储一个资源,并用 Request-URI 作为其标识
  • DELETE 请求服务器删除 Request-URI 所标识的资源
  • TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断
  • CONNECT 保留将来使用
  • OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求

    常用的Method只有GET以及POST,如果有涉及到协议转换,比如HTTP1转换到HTTP2、HTTP转换到HTTPS或者转换为websocket,可能回使用OPTIONS方法先询问。至于其他的方法通常不怎么用,值得注意的是标准的restful接口业务会在GET和POST基础上还有PUT和DELETE方法。

针对Request-URI则是我们在浏览器输入的域名和端后后面的内容,比如/devices,如果是根目录,比如www.abc.com,实际上Request-URI是“/”,即默认都是“/”开始,这样的目录结构和Linux的目录结构类似,而实际上也是来源于它。

HTTP-Version我们常用的是HTTP/1.1,当然,现在也有部分网站使用HTTP/2

第一节的客户端请求里面第一行则是请求行的内容,具体如下:

POST /devices HTTP/1.1

关于消息报头

在第一节关于HTTP抓包的请求实例中,除了a=b&c=d这一个内容外其余的全是消息报头,即

Host: www.abc.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9

这里面也是HTTP核心东西之一,它以key: value的形式成对出现,除了上述内容外,我们常说的cookie、session等通常情况下也是放在消息报头中进行传输

我们也常说HTTP Header,直接将消息报头理解为HEADER里面的所有东西也是没什么问题的。

关于请求正文

上述例子中,“a=b&c=d”即是请求正文,请求正文通常情况下有按照form形式、按照json形式进行传输,但是也可以自由发挥填充任意东西,只要服务端能去解析即可。

关于form形式除了最简单的a=b&c=d外还有mutiform等形式,也是在请求头中进行定义,然后请求正文使用相应的格式进行数据填充。

具体请求例子

具体的例子里面我们将以最小的报文头进行展示而展示无关的信息

  • 打开www.abc.com网站首页
GET / HTTP/1.1
Host: www.abc.com
  • 以GET形式传入username为haha以及password为hehe到www.abc.com网站的登录接口(假设为/login)
GET /login?username=haha&password=hehe HTTP/1.1
Host: www.abc.com
  • 以POST标准FORM形式传入username为haha以及password为hehe到www.abc.com网站的登录接口(假设为/login)
POST /login HTTP/1.1
Host: www.abc.com username=haha&password=hehe
  • 以POST标准json形式传入username为haha以及password为hehe到www.abc.com网站的登录接口(假设为/login)
POST /login HTTP/1.1
Host: www.abc.com {"username":"haha","password":"hehe"}
  • 查询www.abc.com网站的设备列表,并带上cookie为123456(假设为/devicelist)
GET /devicelist HTTP/1.1
Host: www.abc.com
Cookie: 123456
  • 查询www.abc.com网站的设备列表,并带上cookie为123456,要求服务端保持连接(假设为/devicelist)
GET /devicelist HTTP/1.1
Host: www.abc.com
Cookie: 123456
Connection: keep-alive

总结和后续计划

本文主要讲解了HTTP一些基本概念以及请求相关的报文。

接下来第二篇将讲解HTTP响应、HTTP2简介以及当下主流的HTTPS简单交互过程,最后将模拟请求一次网站并进行抓包演示。

常用物联网应用层协议(1)——先说HTTP协议的更多相关文章

  1. 物联网应用层协议选择和分析--MQTT、CoAP 、HTTP、XMPP、SoAP

    MQTT协议 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)最早是IBM开发的一个即时通讯协议,MQTT协议是为大量计算能力有限且工作在低带宽.不 ...

  2. RTSP RTSP(Real Time Streaming Protocol),RFC2326,实时流传输协议,是TCP/IP协议体系中的一个应用层协议

    RTSP 编辑 RTSP(Real Time Streaming Protocol),RFC2326,实时流传输协议,是TCP/IP协议体系中的一个应用层协议,由哥伦比亚大学.网景和RealNetwo ...

  3. 网络中常用的各种协议(针对TCP/IP协议组)

    网络层: ip协议->网络互连协议 用途:将多个包在网络中联系起来,传输数据包(不可靠传输),最基本功能就是寻址和分段功能,不提供端到端,路由到路由的确认,不提供重发和流量控制.是计算机网络能狗 ...

  4. 转战物联网·基础篇05-通俗理解MQTT协议的实现原理和异步方式

      网络上搜索MQTT协议,会出现太多的解释,这里就不做官方标准释义的复制了.这一节我们从实战理解角度,通俗的将MQTT协议的作用及实现原理说一下,旨在可以快速理解MQTT协议.所以可能会出现很多看似 ...

  5. 物联网防火墙himqtt源码之MQTT协议分析

    物联网防火墙himqtt源码之MQTT协议分析 himqtt是首款完整源码的高性能MQTT物联网防火墙 - MQTT Application FireWall,C语言编写,采用epoll模式支持数十万 ...

  6. 前端必须会的!!!关于对HTTP协议的理解、HTTP协议原理分析

    http协议学习系列 1. 基础概念篇 1.1 介绍 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(World Wide Web C ...

  7. 【Linux网络基础】TCP/IP 协议簇(各个常见协议介绍)

    一.应用层协议 1. FTP   协议所在层次:应用层协议 名称:FTP协议 协议端口:20,21 协议说明: FTP(File Transfer Protocol,文件传输协议)是TCP/IP协议组 ...

  8. 网络协议之:sctp流控制传输协议

    目录 简介 TCP有什么不好 sctp的特点 总结 简介 要讲网络协议,肯定离不开OSI(Open System Interconnection)的七层模型. 我们一般关注的是网络层之上的几层,比如I ...

  9. HTTP协议—— 简单认识TCP/IP协议

    大学没读计算机专业,所以很多的专业知识都不知道.既然已经从事了IT这个行业,就势必要去了解下网络底层,虽然实际工作中这些东西用不到.高楼大厦,起于平川.不积跬步,无以至千里,不积小流,无以成江海.我现 ...

随机推荐

  1. leetcode1552题解【二分+贪心】

    leetcode1552.两球之间的磁力 题目链接 算法 二分+贪心 时间复杂度O(nlogn + nlogm) 1.根据题意描述,我们需要将m个球放入到n个篮子中,根据题目中数据范围描述发现m &l ...

  2. spring cloud微服务快速教程之(十四)spring cloud feign使用okhttp3--以及feign调用参数丢失的说明

    0-前言 spring cloud feign 默认使用httpclient,需要okhttp3的可以进行切换 当然,其实两者性能目前差别不大,差别较大的是很早之前的版本,所以,喜欢哪个自己选择: 1 ...

  3. PHP:文件包含漏洞

    简单记录一些文件包含漏洞的常用方法 产生原因: 文件包含漏洞的产生原因是在通过引入文件时,由于传入的文件名没有经过合理的校验,或者校检被绕过,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意 ...

  4. mysql-python for mac安装过程

    转载:https://yiweifen.com/v-1-338191.html

  5. burp suite 之 proxy(代理)

    proxy 代理 通过 Options(选项)的edit(编辑) 更改代理的端口号.我的是10086 (不许更改与本机使用端口冲突的端口号) 使用火狐浏览器将代理更改为10086. 抓取火狐浏览器的包 ...

  6. React学习小记--setState的同步与异步

    react中,state不能直接修改,而是需要使用setState()来对state进行修改,那什么时候是同步而什么时候是异步呢? 基础代码: setCounter = (v) => { thi ...

  7. 服务器备用远程-----Radmin客户端的操作指南(如何远程与传送文件)

    一台服务器的寿命一般比较长可能会从几年到几十年,就会经历各个版本的更新与升级.再经过时间的历练后,可能windwos自带的远程连接有时候会拉胯,经常报错. 这时候就需要备选方案,有钱的单位会自己搭建堡 ...

  8. 编辑 编译 乱码 透彻 讲解 keil vscode notepad++

    1. 2.此时VSCODE内的改文件是乱码现象,进行如下操作,选择 通过编码重新打开, 选择GB 2312即可.(GB2312是兼容ANSI编码的) 详细解释一下: KEIL内是ANSI编码,VSCO ...

  9. What number should I guess next ?——由《鹰蛋》一题引发的思考

    What number should I guess next ? 这篇文章的灵感来源于最近技术部的团建与著名的DP优化<鹰蛋>.记得在一个月前,查到鹰蛋的题解前,我在与同学讨论时,一直试 ...

  10. Win32控制台、Win32项目、MFC项目、CLR控制台、CLR空项目、空项目区别

    转载:https://blog.csdn.net/zfmss/article/details/79244696 1.Win32控制台 初始代码模版以main为程序入口,默认情况下,只链接C++运行时库 ...