应用层(重点)
HTTP协议
HTTP 是⼀个⽂本格式的协议. 可以通过 Chrome 开发者⼯具或者 Fiddler 抓包, 分析 HTTP 请求/响应的细节.
Fiddler 抓包
左侧窗⼝显⽰了所有的 HTTP请求/响应, 可以选中某个请求查看详情.
•
右侧上⽅显⽰了 HTTP 请求的报⽂内容. (切换到 Raw 标签⻚可以看到详细的数据格式)
•
右侧下⽅显⽰了 HTTP 响应的报⽂内容. (切换到 Raw 标签⻚可以看到详细的数据格式)
•
请求和响应的详细数据, 可以通过右下⻆的
View in Notepad
通过记事本打开
HTTP 请求 (Request)
认识 URL
平时我们俗称的 "⽹址" 其实就是说的 URL
https
: 协议⽅案名. 常⻅的有 http 和 https, 也有其他的类型. (例如访问 mysql 时⽤的
jdbc:mysql
)
•
user:pass
: 登陆信息. 现在的⽹站进⾏⾝份认证⼀般不再通过 URL 进⾏了. ⼀般都会省略
•
v.bitedu.vip
: 服务器地址. 此处是⼀个 "域名", 域名会通过 DNS 系统解析成⼀个具体的 IP 地
址. (通过 ping 命令可以看到,
v.bitedu.vip
的真实 IP 地址为
118.24.113.28
)
•
端⼝号: 上⾯的 URL 中端⼝号被省略了. 当端⼝号省略的时候, 浏览器会根据协议类型⾃动决定使⽤
哪个端⼝. 例如 http 协议默认使⽤ 80 端⼝, https 协议默认使⽤ 443 端⼝.
•
/personInf/student
: 带层次的⽂件路径.
userId=10000&classId=100
: 查询字符串(query string). 本质是⼀个键值对结构. 键值对之
间使⽤ & 分隔. 键和值之间使⽤ = 分隔.
•
⽚段标识: 此 URL 中省略了⽚段标识. ⽚段标识主要⽤于⻚⾯内跳转.
认识 "⽅法" (method)
1. GET ⽅法
GET 是最常⽤的 HTTP ⽅法. 常⽤于
获取服务器
上的某个资源. 在浏览器中直接输⼊ URL, 此时浏览器就会发送出⼀个 GET 请求.
另外, HTML 中的 link, img, script 等标签, 也会触发 GET 请求.
2.GET 请求的特点
•
⾸⾏的第⼀部分为 GET
•
URL 的 query string 可以为空, 也可以不为空.
•
header 部分有若⼲个键值对结构.
•
body 部分为空
POST ⽅法
POST ⽅法也是⼀种常⻅的⽅法. 多⽤于
提交⽤⼾输⼊的数据给服务器
(例如登陆⻚⾯).
通过 HTML 中的 form 标签可以构造 POST 请求, 或者使⽤ JavaScript 的 ajax 也可以构造 POST Z
2.POST 请求的特点
•
⾸⾏的第⼀部分为 POST
•
URL 的 query string ⼀般为空 (也可以不为空)
•
header 部分有若⼲个键值对结构.
。body 部分⼀般不为空. body 内的数据格式通过 header 中的
Content-Type
指定. body 的⻓度
由 header 中的
Content-Length
指定
GET与POST区别(经典面试问题)
其他⽅法
认识请求 "报头" (header)
header 的整体的格式也是 "键值对" 结构.
每个键值对占⼀⾏. 键和值之间使⽤分号分割.
报头的种类有很多, 此处仅介绍⼏个常⻅的:
Host :表⽰服务器主机的地址和端⼝.
Content-Length :表⽰ body 中的数据⻓度.
Content-Type :表⽰请求的 body 中的数据格式
Host
Content-Length
Content-Type
Referer :这个⻚⾯是从哪个⻚⾯跳转过来的
User-Agent:表⽰浏览器/操作系统的属性
Cookie:浏览器在本地实体化的一个机制
Cookie 中存储了⼀个字符串, 这个数据可能是客⼾端(⽹⻚)⾃⾏通过 JS 写⼊的, 也可能来⾃于服务器 (服务器在 HTTP 响应的 header 中通过 Set-Cookie 字段给浏览器返回数据).
cookie登录过程
HTTP/方法/URL/版本号(总结)
请求头(总结)
HTTP 响应
状态码
认识响应 "报头" (header)
响应报头的基本格式和请求报头的格式基本⼀致.
Content-Type
,
Content-Length
等属性的含义也和请求中的含义⼀致.
Content-Type/Content-Length
响应中的 Content-Type 常⻅取值有以下⼏种:
•
text/html
: body 数据格式是 HTML
•
text/css
: body 数据格式是 CSS
•
application/javascript
: body 数据格式是 JavaScript
•
application/json
: body 数据格式是 JSON
认识响应 "正⽂" (body)
正⽂的具体格式取决于 Content-Type.
通过 form 表单构造 HTTP 请求
form (表单) 是 HTML 中的⼀个常⽤标签. 可以⽤于给服务器发送 GET 或者 POST 请求.
不要把 form 拼写成 from!!
form 发送 GET 请求
form 的重要参数:
•
action: 构造的 HTTP 请求的 URL 是什么.
•
method: 构造的 HTTP 请求的 ⽅法 是 GET 还是 POST (form 只⽀持 GET 和 POST).
input 的重要参数:
•
type: 表⽰输⼊框的类型. text 表⽰⽂本, password 表⽰密码, submit 表⽰提交按钮.
•
name: 表⽰构造出的 HTTP 请求的 query string 的 key. query string 的 value 就是输⼊框的⽤⼾输
⼊的内容.
•
value: input 标签的值. 对于 type 为 submit 类型来说, value 就对应了按钮上显⽰的⽂本
通过 Java socket 构造 HTTP 请求
HTTPS
HTTPS 也是⼀个应⽤层协议. 是在 HTTP 协议的基础上引⼊了⼀个加密层.
HTTP 协议内容都是按照⽂本的⽅式明⽂传输的. 这就导致在传输过程中出现⼀些被篡改的情况
"加密"
加密就是把 明⽂ (要传输的信息)进⾏⼀系列变换, ⽣成 密⽂ .
解密就是把 密⽂ 再进⾏⼀系列变换, 还原成 明⽂
HTTPS 的⼯作过程
既然要保证数据安全, 就需要进⾏ "加密".
⽹络传输中不再直接传输明⽂了, ⽽是加密之后的 "密⽂".
加密的⽅式有很多, 但是整体可以分成两⼤类:
对称加密 和 ⾮对称加密
引⼊对称加密
对称加密其实就是通过同⼀个 "密钥" , 把明⽂加密成密⽂, 并且也能把密⽂解密成明⽂.
引⼊⾮对称加密
⾮对称加密要⽤到两个密钥, ⼀个叫做 "公钥", ⼀个叫做 "私钥".
公钥和私钥是配对的. 最⼤的缺点就是运算速度⾮常慢,⽐对称加密要慢很多.
•
通过公钥对明⽂加密, 变成密⽂
•
通过私钥对密⽂解密, 变成明⽂
也可以反着⽤
•
通过私钥对明⽂加密, 变成密⽂
•
通过公钥对密⽂解密, 变成明⽂