浏览器进行一次简单的请求过程介绍
摘自极客时间陶辉老师课件
1.先服务器通过调用系统调用监听固定端口
2.浏览器输入URL,到达DNS,通过DNS将域名解析为目标主机IP
3.用户主机与目标主机建立TCP连接(Http建立在TCP基础之上),若为HTTPS协议则还需要进行一次SSL协议的交互
4.构造HTTP请求,并填充响应的HTTP头部,之后发送HTTP请求
5.服务端发送响应的请求结果
那什么是HTTP协议?
协议,故名思意是双向的,两方都要遵循
HTTP在C/S模型中位于应用层
HTTP协议又名超文本传输协议,所谓的超文本指除了文本文件外,还包括视频,音频和图像等资源(能用二进制表示),并且我们可以通过规定的规则链接并访问到该文件。
所谓“超文本”,就是“超越了普通文本的文本”,它是文字、图片、音频和视频等的混合体,最关键的是含有“超链接”,能够从一个“超文本”跳跃到另一个“超文本”,形成复杂的非线性、网状的结构关系。
所谓“文本”(Text),就表示 HTTP 传输的不是 TCP/UDP 这些底层协议里被切分的杂乱无章的二进制包(datagram),而是完整的、有意义的数据,可以被浏览器、服务器这样的上层应用程序处理。
HTTP是无状态的,一段代码可能依赖另一段代码来执行,但一次HTTP请求的结果并不依赖上一次HTTP请求
是需要客户端请求,服务端响应的协议,即以请求/应答的方式运行
HTTP协议还具有可扩展性,即使协议版本过低,仍可以进行通信
第四步的填充HTTP协议头,那么协议格式长什么样?
HTTP协议报文与TCP报文不同的地方是它是一个“纯文本”的协议,所以头数据都是 ASCII 码的文本,可以很容易地用肉眼阅读,不用借助程序解析也能够看懂。
通常由三部分组成
1.起始行star-tline,start-line又可以根据是请求操作还是响应操作划分为请求行(request-line)或响应行(staus-line)
2.多个协议头部header-field
3.消息主体message-body
如何解读协议的格式?
就需要引入ABNF即扩展的巴科斯范式
巴科斯范式分为操作符和核心规则
操作符(常用)
1.空白字符
规则1 规则2
用来分隔定义中的各个元素,并不是实际有空白字符
空格通过SP来表达
GET(请求方法) /(路径) HTTP/1.1(协议版本) 可看成
method SP request-target SP HTTP-version CRLF
2.选择/:
可以通过反斜杠(/)分隔的多选一的规则
规则1 / 规则2
如起始行只能为请求头或响应头可表示为
start-line = request-line/status-line
3.值范围 %c##-##:
数值范围可以通过使用连字符(“-”)来指定。
比如 语句0-7中选其一,我们可以用反斜杠(多选一)语句表示为
OCTAL= "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7"
我们可以借助值范围进行更方便的规则定义
OCTAL = %x30-37
补充:b = 二进制, d = 十进制, x = 十六进制
4.序列分组
单括号() 将多个规则组合起来视为单个元素
(%x30-37 %x30-37 )/ "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7"
5.不定量重复 m*n
在正则中*表示零个或多个,在abnf中也是如此通过m和n指定
m为至少,n为至多
如可以有0个或多个http头部表述为
*(header-field CRLF)
1*(header-field CRLF) 一个以上
2*4(header-field CRLF) 2-4个
6.可选序列 []
经常使用man或--help在linux中查找帮助的应该不陌生,表示这个选项为可选
如消息体为可选可表述为
[message-body]
7.递增选择
=/ 可以使用在规则名和定义之间,来向一个规则增加补充选择
ruleset = alt1 / alt2 / alt3 / alt4 / alt5
等价于
ruleset = alt1 / alt2
ruleset =/ alt3 后续对定义的补充
ruleset =/ alt4 / alt5
操作符优先级
上述操作符有从最紧绑定(binding)到最松绑定的给定优先级:
1.字符串,名字形成(formation)
2.值范围
3.重复
4.分组,可选
5.串联
6.选择
与串联一起使用选择操作符可以造成混淆,建议使用分组来做明确串联分组。
作者:科研者 链接:https://www.jianshu.com/p/15efcb0c06c8 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
核心规则
核心规则其中CR是MAC系统的操作换行,LF是LINUX的换行,win为CRLF
已经学习了ABNF,不妨来用该范式来描述HTTP协议的规则?
源自https://www.cnblogs.com/rdchenxi/p/10953151.html对应着核心规则进行解读
HTTP消息为 一个起始行 零个或多个消息头 消息主体可选
HTTP-message = (start-line) *(header-filed CRLF) CRLF [message-body]
其中 起始行为请求行或响应行
start-line = request-line/status-line
请求行格式为:请求方式 请求路径 协议版本
request-line = method SP request-target SP HTTP-version CRLF
响应行为: 协议版本 状态码 详细描述
status-line = HTTP-version SP status-code SP reason-phrase CRLF
请求头结构:头部名字 “ :” 类型 值
header-field = field-name ":" OWS field-value OWS
OWS等为自定义的可进一步解读
.......大概知道意思懒得解读了,反正遇到不认识的大写查核心规则就行了
其他的英语语义可以解释
利用xshell 观察http请求
telnet 域名 端口 (尽量是选择http协议的)
结果可以看这个博客:https://www.cnblogs.com/rdchenxi/p/10953151.html
结果pre为消息体,在消息头部的选项有对消息体进行描述
为content-lentth:108字节长度为108字节
响应类型为css文件 content-type = text / css
利用wireshark进行抓包
打开抓包工具
我们关注有波段起浮的网卡(不知道是不是这样子描述)
如果你电脑是wifi连接一般是WLAN起伏,我这里是网线连接所有是以太网波段起伏,对这个网卡进行抓包,点击捕获,选择以太网,下方设置选项
浏览器为80端口点击开始,之后打开xshell利用telnet发送http协议,之后再回来看
我们寻找info选项为刚才我们输入的路径
目标结果点击,选择展开
我们可以看到每一段都对应着数字矩阵的一部分,/r/n即CRLF被解码为0d 0a
补充:已经了解了请求和响应的报文形式,再来了解下URI的组成
URI由 scheme、host:port、path 和 query 四个部分组成,但有的部分可以视情况省略
以一下URI为例
https://github.com/chronolaw/http_study?a=2
scheme称为协议名如HTTP,FTPS
如:https
://用以分隔
host:port即主机名加端口号也被称为authority,表示资源所在的主机名
主机名可以是IP或域名的形式,端口不填默认80(浏览器为80端口)
如github.com
path:表示要访问资源存放的路径
如:/chronolaw/http_study
query:要访问时携带的额外参数
如a=2
网友评论