HTTP协议和HTTPS协议
Socket协议,Socket实现长连接
TCP和UDP协议
HTTP协议中GET和POST的具体实现
HTTP 报文结构
HTTP请求方法:
- GET
- 获取资源
- 没有 body
- POST
- 修改,增加资源
- 有 body
- PUT
- 修改资源
- 有 body
- DELETE
- 删除资源
- 没有 body
- HEAD
- 和 GET 相同,但是 response 中没有 body
响应状态码
- 1XX: 临时性消息
- 100:
- 101:协议切换
- 2XX: 成功
- 3XX: 重定向
- 4XX: 客户端错误
- 5XX: 服务器错误
头部字段说明
1. content-length
2. content-type
- application/json
json格式,用于 web api 的响应或者POST/PUT请求
//需要加 addConverterFactory(GsonConverterFactory.create())
@POST("users/new")
Call<User> createUser(@Body User user);
- text/html
application/x-www-form-urlencoded
即 普通表单(纯文字表单),encoded URL 格式
//对应 Retrofit是:
@FromUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String firstName);
//实际的请求为
<HEADER 部分>
//Body 部分如下
first_name=XXXX
multipart/form-data; boundary=—XXXXX
上传包括文件等部分(非纯文字),其中 boundary 是分界
@Multipart
@PUT("user/info")]
Call<User> updateUser(@Part("photo") RequestBody photo);
- image/jpeg
```java
@POST(“users/avatar”)
Call
updateAvatar(@Body RequestBody avatar); RequestBody avatarBody = RequestBody.create(MediaType.parse(“image/jpeg”), avatarFile);
3. Chunked Transfer Encoding — 分块传输
Transfer-Encoding:chunked
4 Chun 9 ked Trans 0
4. Location
重定向时(301),浏览器会根据 location 的值重新访问
5. User-Agent: 用户代理
告知客户端到底是谁
6. Range / Accept-Ranges
分断,比如断点续传,多线程下载
RESTful HTTP
正确使用 HTTP
它是 HTTP 最佳实践的风格
HTTPS 原理
HTTPS 的定义
在 HTTP 下增加的一个安全层,用于保障 HTTP 的加密传输(HTTPS 并不算协议,属于一整个套件)
HTTPS 本质
在客户端和服务器之间用非对称加密协商出一套对称加密密钥,每次发送信息之前将内容加密,收到之后解密,达到内容的加密传输
为什么不直接用非对称加密?
HTTPS 连接具体实现
- client —-> server
- 发送 client_hello,一字节信息,随机数
- server —-> client
- 发送 server_hello,一字节信息,随机数
- server —-> client
- 发送证书(服务器公钥,签名等,以及服务器证书签发者的公钥,签名,根证书公钥,签名)
- client —-> server
- 发送 pre_master
- client 和 server 分别根据 三个随机数算出 客户端加密密钥,服务端加密密钥,客户端和服务端各保留两个,相当于当前有4个钥匙
- client —-> server
- 将要发送加密信息
- server —-> client
- finished
- server —-> client
- 将要发送加密信息
- client —-> server
- finished
常见问题
一. tcp 连接是否会关闭?
Http1.0 中,一个 tcp 连接只发送一次,发送完毕就会被关闭
Http1.1 中,默认开启长连接,除非用 Connection:close 字段明确表示关闭长连接
Http2.0 中,存在信道复用,一个 tcp 连接可以发送多个 Http 请求
二. 输入 URL 到显示出页面,经历了什么?
- 输入 url 后,首先要解析 url,生成 http 请求报文
- 开始进行 ip 寻址
- 查找本地 host 是否有对应的地址
- 发出 dns 请求给本地 dns 服务器,如果没有,则继续发送到 dns 根服务器
- 根据根服务器返回的域服务器地址,继续一层一层的查询
- 拿到 ip 地址后,向服务器 80 端口发送 tcp 连接请求,三次握手
- 在建立连接的信道上发起 http 请求
三. TCP 三次握手
- client 发送 SYN = i
- server 发送 ACK = i+ 1;SYN = j
- client 发送 ACK = j + 1
四.TCP 四次挥手
- client 发送 FIN
- server 发送 ACK 表示收到关闭请求
- server 发送 FIN 表示自己也要关闭
- client 发送 ACK,并等待 2MSL(怕最后一次 ACK server 没收到,所以多等一会看 server 会不会重新发FIN)