概念

简介

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. HAProxy安装配置

    概念 HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案. HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要 ...

  2. Pots(POJ - 3414)【BFS 寻找最短路+路径输出】

    Pots(POJ - 3414) 题目链接 算法 BFS 1.这道题问的是给你两个体积分别为A和B的容器,你对它们有三种操作,一种是装满其中一个瓶子,另一种是把其中一个瓶子的水都倒掉,还有一种就是把其 ...

  3. 「DevOps 转型与实践」沙龙回顾第二讲

    背景介绍 本期分享内容为<平台化 DevOps-云计算与云原生模式下 DevOps 的建设实践>.目前,DevOps 越来越成为大家当前建设的热点,伴随着基础设施的转型和应用框架的转型,更 ...

  4. Winsock 编程详解

    转载请注明出处!本文地址:https://www.cnblogs.com/teternity/p/WinSock.html Winsock 编程 目录 通用函数讲解 WSAStartup WSACle ...

  5. 达梦产品技术支持培训-day7-DM8数据库备份与还原-原理

    (本文部分内容摘自DM产品技术支持培训文档,如需要更详细的文档,请查询官方操作手册,谢谢) 1.DM8备份还原简介 1.1.基本概念 (1)表空间与数据文件 ▷ DM8表空间类型: ▷ SYSTEM ...

  6. SpringBoot 优化

  7. VMware ESXi 客户端连接控制台时,提示“VMRC 控制台连接已断开...正在尝试重新连接”的解决方法

    故障描述: 通过 VMware vSphere Client 连接到安装 VMware ESXi 虚拟环境的主机时,当启动其中的虚拟机后,无法连接到控制台. 选择"控制台"时,控制 ...

  8. JavaScript常用对象介绍

    目录 对象(object) 对象的创建方式 点语法 括号表示法 内置对象 Array 数组创建方式 检测数组 转换方法 分割字符串 栈方法 队列方法 重排序方法 操作方法 位置方法 迭代方法 Stri ...

  9. k8s集群添加新得node节点

    服务端操作: 方法一: 获取master的join token kubeadm token create --print-join-command 重新加入节点 kubeadm join 192.16 ...

  10. day30 Pyhton 面向对象 反射

    @property # 例1 - 1 (某一个属性如果是通过计算得来的,那么计算的过程写在方法里,把这个方法伪装成属性) from math import pi # class Circle: # d ...