HTTP协议
了解知识
网络划分
一般划分为两类:
(1)局域网(Local Area Network)
:简称LAN
;
注意:如果局域网没有连接到公网,局域网中的主机就无法访问公网的资源(如:HTML网页、css 文件、js 文件、图片、视频等)
(2)广域网( Wide Area Network)
,简称WAN
;开放的网络,连接上的主机都能访问;
IP地址
概念:
IP
地址主要用于标识网络主机、其他网络设备(如路由器)的网络地址,简单来说,IP
地址用于定位主机的网络地址;
(如就像我们发送快递一样,需要知道对方的收货地址,快递员才能将包裹送到目的地
)
格式:
IP
地址是一个32
位的二进制数,通常被分割为4
个8
位二进制数(也就是4个字节
),通常用点分十进制的方式来表示,即 a.b.c.d
的形式(a,b,c,d都是0~255之间的十进制整数);
特殊情况:
本机IP地址:127.0.0.1
- 本机域名:
localhost
端口号
概念:
端口号用于标识主机中发送数据与接收数据的进程;
类似于发快递:不仅需要指定发货地址(IP地址
),还需要指定收货人(端口号
);
端口号一般为 0~65535
范围的数字;
协议
协议,也就是网络协议的简称。
网络协议是网络通信(即网络数据传输
)经过的所有网络设备都必须共同遵从的一组约定、规则(如怎么样建立连接、怎么样互相识别等),只有遵守这个约定,计算机之间才能相互通信交流;
最终体现为数据包的格式
简单认识 HTTP
HTTP概念
HTTP
:全称为 “超文本传输协议” ,是一种应用非常广泛的应用层协议;
所谓 “超文本” 的含义, 就是传输的内容不仅仅是文本(比如html, css
), 还可以是一些其他的资源( 比如图片, 视频, 音频等二进制的数据);
目前常用的是HTTP 1.1
注意:
-
HTTP
属于文本格式,但内部可以包含一些二进制数据; -
文本与二进制数据的区别:
文本就是带编码的二进制数据,因此,文本与二进制数据两个可以互相转换
;
表现为:
(1)Java中,String有 getBytes(“编码”),就可以转换字符串为二进制数据;
(2)new String(字符数组,“编码”),可以转换二进制数据为字符串;
理解 HTTP 协议的工作过程:
当我们在浏览器中输入一个 “网址”, 此时浏览器就会给对应的服务器发送一个
HTTP
请求. 对方服务器收 到这个请求之后, 经过计算处理,就会返回一个HTTP
响应;
为了更好的观察其过程,可以采用两种方式来进行抓包处理:
chrome
开发者工具的网络面板fiddler
抓包
两者优缺点对比:
优缺点 | |
---|---|
chrome 开发者工具 | 没有 HTTP 协议原生格式的内容,还可以直接抓 HTTPS 的包 |
fiddler 抓包 | 可以查看 HTTP 原生格式的数据包,抓 HTTPS 的包时需要配置 |
fiddler 安装与配置见下博文:
配置链接
事实上, 当我们访问一个网站的时候, 可能涉及不止一次的 HTTP
请求/响应 的交互过程;
如下所示:
当我们在浏览器中输入:www.baidu.com
- 输入后,显示如下所示内容:
- 查看某个
HTTP
的数据包如下:
HTTP 请求(Request)
如下是一个 HTTP请求/响应的抓包结果:
其中:
- 首行为:[方法] + [URL] + [版本号];
Header
: 请求的属性, 冒号分割的键值对;每组属性之间使用\n
分隔;遇到空行表示Header
部分结束;Body
: 空行后面的内容都是Body
,Body
允许为空字符串; 如果Body
存在, 则在Header
中会有一个Content-Length
属性来标识Body
的长度;
协议格式总结:
认识 URL
URL基本格式
URL:用来标识网络中某个资源的路径;
格式:
协议名:// 服务器地址:服务器端口号/带层次的资源路径?查询字符串
注:URL中可省略部分:
-
浏览器上也可以不输入协议名,省略后默认为
http://
; -
浏览器不输入端口号,
HTTP
协议默认使用80
端口,https
协议默认使用443
端口; -
带层次的文件路径: 可以省略, 省略后相当于 /(根目录);
-
查询字符串:
queryString
也可以省略;
queryString
:
(1)键值对的格式:键=值
(2)多个键值对之间 & 相隔;
(3)里边的键由程序猿决定;
- 服务器路径可以使用
IP
地址,也可以使用域名(域名更方便记忆);
注意:
URL与HTTP关系:HTTP数据包包含URL
使用 Ping
来查看某个域名对应的IP
地址
Ping 也是用来测试某个主机能否访问到的一种手段;
关于 URL encode
当地址栏输入的内容包含特殊字符、中文、空格等,都会发生转义,只是我们看到的是中文,但真实发送的HTTP数据包是转义后的内容;
将中文、空格转化为16进制的过程(URL编码),反之则为URL解码
当输入汉语时:
编码后:
认识方法
常见的方法有:
方法 | 说明 | 支持的HTTP协议版本 |
---|---|---|
GET | 获取资源 | 1.0、1.1 |
POST | 传输实体主体 | 1.0、1.1 |
PUT | 传输文件 | 1.0、1.1 |
HEAD | 获得报文首部 | 1.0、1.1 |
DELETE | 删除文件 | 1.0、1.1 |
OPTIONS | 询问支持的方法 | 1.1 |
TRACE | 追踪路径 | 1.1 |
LINK | 建立和资源的联系 | 1.0 |
较常用的有以下两种方法:
GET 方法
GET
是最常用的HTTP
方法, 常用于获取服务器上的某个资源;
当在浏览器中直接输入URL
, 此时浏览器就会发送出一个GET
请求;
如下图所示:
GET 请求的特点
- 首行的第一部分为
GET
; - URL 的
queryString
可以为空, 也可以不为空.; header
部分有若干个键值对结构.;body
部分为空;
需要注意的是:
URL
的长度取决于浏览器的实现和HTTP
服务器端的实现;
POST 方法
POST
方法也是一种常见的方法,多用于提交用户输入的数据给服务器(例如:登陆页面);
如下所示:
POST 请求的特点
- 首行的第一部分为 POST;
URL
的queryString
一般为空 (也可以不为空);header
部分有若干个键值对结构;body
部分一般不为空,body
内的数据格式通过header
中的Content-Type
指定,body
的长度由header
中的Content-Length
指定;
如下图所示:
content-Type
中的常见格式:
application/x-www-form-urlencoded
为表单提交的格式:(键=值,多个键之间&间隔
);image/jpeg
为图片格式;text/JavaScript、text/html、text/ss
;application/json
,(键需要加双引号)
格式为:
{
" username":“张三”,
“age”:18
}
经典面试题:GET 与POST区别
:
表现在以下四点:
- 语义上:
GET
是获取资源/数据,POST
是提交资源/数据; - 存放数据的位置:
GET
放在queryString
,POST
一般放在body
; - 幂等性:
GET
一般具有幂等性,POST
一般不具有幂等性(幂等性:多次请求得到的结果一样, 就视为请求是幂等的); - 缓存:
GET
可以缓存,POST
不能;(因为GET
具有幂等性,浏览器为了提高性能,把GET
获取的资源提前保存在本地);
补充:
HTTP
是一种以明文形式进行传输的协议,HTTP
数据包的内容没有进行任何的加密操作,从该角度来讲,只要是HTTP
协议就是不安全的;GET
与POST
都可以传输文本及二进制数据;
认识请求报头(header)
header
的整体的格式也是 “键值对” 结构,标识HTTP数据包属性
,每个键值对占据一行,键和值之间使用冒号分割;
报头的种类有很多,常见的有:
HOST
:标识服务器主机的地址和端口Content-Length
:标识body
的数据长度,依据该长度进行解析数据;Content-Type
:标识请求的body
的数据格式/数据类型;
有以下数据格式:
(1)
multipart/form-data
:简称form-data
格式,一般用于请求,不用于响应,form-data
可以上传任意多的数据(可以是简单的数据类型,也可以是复杂的数据类型),可以是多个文件;
(2)application/x-www-form-urlencoded
:表单格式,发送的字段格式:键=值,每个字段&
间隔,但这里的字段值只能说简单的数据类型;(3)
image/jpeg
:指定具体的一个文件类型,用于客户端发送请求,就只能上传一个文件,用于服务端返回响应,只能返回一个图片;
(4)application/json
: 数据为 json 格式,请求和响应都常用;
User-Agent
(简称 UA):标识浏览器/操作系统的属性,目前常用来判断是哪个浏览器、PC机、手机等;
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Referer
:表示这个页面是从哪个页面跳转过来的;Cookie
:用于请求头,Set-Cookie
用于响应头;
Cookie
中存储了一个字符串, 这个数据可能是客户端(网页)自行通过JS
写入的, 也可能来自于服务器(服务器在HTTP
响应的header
中通过Set-Cookie
字段给浏览器返回数据;
访问过的网页,删除Cookie的方式:
补充:Cookie 与 Session
Cookie :一种客户端保存数据的技术
如何保存数据?
由服务端响应的数据包中,设置一个Set-Cookie
头(可以是一个,也可以多个);不同的网站有不同的Cookie;
如何使用?
浏览器在每次请求时,自动携带在Cookie头中;
保存的数据格式:多组键值对,键=值,多个键值对之间分号相隔;Session
:一种服务端保存数据的技术:由于HTTP协议是一种无状态的协议(
一次请求,一次响应,服务端无法感知之前登陆的用户);
在服务端使用Map<String Session>
的数据结构保存用户信息;
认识请求正文(body)
正文中的内容格式和 header
中的 Content-Type
密切相关;