浏览器输入某URL后,HTTP开启了一段奇妙之旅!
当用户在浏览器输入网址回车之后,网络协议都做了哪些工作呢?
1. 首先干活的是 浏览器应用程序,他要解析出 URL中的域名
2. 根据域名获取对应的ip地址,首先从浏览器缓存中查看,如下可以查看浏览器中域名对应ip的解析
chrome://net‐internals/#events
如果没有则从本机域名解析文件hosts(/etc/hosts)中查看,还没有则从LDNS(Localdnsserver)、Rootserver域名服务器、国际顶级域名服务商的DNS 的层层解析
3. 拿到IP地址后,浏览器就可以发起 与服务器的三次握手
4. 握手建立之后,就开始组装http请求报文,发送报文
5. 服务器收到请求报文之后开始,请求报文解析,生成响应数据,发送响应数据
6. 浏览器收到响应之后,开始渲染页面
让我们聊一聊HTTP协议
超文本传输协议(HyperText Transfer Protocol,HTTP):一种无状态的,以请求/应答方式运行的协议,它使用可扩展的语义和自描述消息格式,与 基于网络的超文本信息系统灵活的互动
1.HTTP报文格式
HTTP 协议的请求报文和响应报文的结构基本相同,由三大部分组成:
- 起始行(start line):描述请求或响应的基本信息
- 头部字段集合(header):使用 key-value 形式更详细地说明报文
- 消息正文(entity):实际传输的数据,它不一定是纯文本,可以是图片、视频等二进制数据
2.请求行报文格式
以下是wireshark抓出来的一段HTTP请求报文:
GET /admin_ui/rdx/core/images/close.png HTTP/1.1
Accept: */*
Referer: http://xxx.xxx.xxx.xxx/menu/neo
Accept-Language: en-US
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E)
Accept-Encoding: gzip, deflate
Host: xxx.xxx.xxx.xxx
Connection: Keep-Alive
Cookie: startupapp=neo; is_cisco_platform=0; rdx_pagination_size=250%20Per%20Page; SESSID=deb31b8eb9ca68a514cf55777744e339
- 请求方法:如 GET/HEAD/PUT/POST,表示对资源的操作;
- 请求目标:通常是一个 URI,标记了请求方法要操作的资源;
- 版本号:表示报文使用的 HTTP 协议版本。
3.响应行报文格式
下面是wireshark抓出来的一段响应报文:
HTTP/1.1 200 OK
Bdpagetype: 1
Bdqid: 0xacbbb9d800005133
Cache-Control: private
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html
Cxy_all: baidu+f8b5e5b521b3644ef7f3455ea441c5d0
Date: Fri, 12 Oct 2018 06:36:28 GMT
Expires: Fri, 12 Oct 2018 06:36:26 GMT
Server: BWS/1.1
Set-Cookie: delPer=0; path=/; domain=.baidu.com
Set-Cookie: BDSVRTM=0; path=/
Set-Cookie: BD_HOME=0; path=/
Set-Cookie: H_PS_PSSID=1433_21112_18560_26350_27245_22158; path=/; domain=.baidu.com
Vary: Accept-Encoding
X-Ua-Compatible: IE=Edge,chrome=1
Transfer-Encoding: chunked
<!DOCTYPE html>
<!--STATUS OK-->
- 版本号:表示报文使用的 HTTP 协议版本;
- 状态码:一个三位数,用代码的形式表示处理的结果,比如 200 是成功,500是服务器错误;
- 原因:作为数字状态码补充,是更详细的解释文字,帮助人理解原因
4.HTTP 头字段
头部字段是 key-value
的形式,key 和 value 之间用“:”分隔,最后用 CRLF 换行表示字段结束。
比如前后分离时经常遇到的要与后端协商传输数据的类型“Content-type:application/json”,这里 key 就是“Content-type”,value 就是“application/json”。HTTP 头字段非常灵活,不仅可以使用标准里的 Host
、Connection
等已有头,也可以任意添加自定义头,这给 HTTP 协议带来了无限的扩展可能。
头字段注意事项
- 字段名不区分大小写,字段名里不允许出现空格,可以使用连字符“-”,但不能使用下划线“”(有的服务器不会解析带“”的头字段)。字段名后面必须紧接着“:”,不能有空格,而“:”后的字段值前可以有多个空格;
- 字段的顺序是没有意义的,可以任意排列不影响语义;
- 字段原则上不能重复,除非这个字段本身的语义允许,例如
Set-Cookie
。
5.常用头字段
HTTP 协议中有非常多的头字段,但基本上可以分为三大类:
-
请求字段:请求头中的头字段;如
Host
,Referer
。 -
响应字段:响应头中的头字段,如:
Server
; -
通用字段:在请求头和响应头里都可以出现,如
Content-type
,Connection
;
- UrlReferrer为空的问题?
- DeepMind发文回顾2017:AlphaGo团队已迎战下一个重大挑战
- [你必须知道的.Net]读书笔记--浅clone与深clone
- Python基础语法学习整理
- 通过部分感知深度卷积网络进行人脸特征点定位
- [你必须知道的.Net]读书笔记--override与new在继承中的区别
- gitlab配置邮件通知功能操作记录
- 微信小程序价值思考:手机端的CS-BS迁移
- Linq2Sql数据实体外部更新时“不能添加其键已在使用中的实体”的解决办法
- 微信小程序:字体保持大小
- 在为知笔记中使用JQuery
- 在为知笔记中使用JQuery
- Python学习笔记(1):列表元组结构
- 6步创建一个通用机器学习模板
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- jvm源码解析(五)synchronized和ReentrantLock
- 手把手教你构建自定义的Mimikatz二进制文件
- APACHE OFBIZ XMLRPC远程代码执行漏洞分析
- Intelspy:一款功能强大的自动化网络侦察扫描工具
- Prometheus入门教程(二):Prometheus + Grafana实现可视化、告警
- WAF代码剖析之初识openresty
- 树义带你学 Prometheus(四):PromQL 快速入门
- 树义带你学 Prometheus(五):Prometheus 的关键概念
- 树义带你学 Prometheus(六):Spring Boot Actuator 实现应用监控
- 树义带你学 Prometheus(七):SpringBoot 实现自定义指标监控
- 布尔型盲注的PY交易
- 一文详解「队列」,手撸队列的3种方法!
- 代理模式
- Swift:Lable 高度计算误差
- 基于python检查SSL证书到期情况代码实例