HTTP协议和HTTPS协议
Socket协议,Socket实现长连接
TCP和UDP协议
HTTP协议中GET和POST的具体实现

HTTP 报文结构

  1. 请求行 GET HTTP 1.1
  2. 请求头部
  3. 请求体

    HTTP 响应报文

  4. 状态行 HTTP/1.1 200 OK

  5. Headers
  6. Body

HTTP请求方法:

  1. GET
    1. 获取资源
    2. 没有 body
  2. POST
    1. 修改,增加资源
    2. 有 body
  3. PUT
    1. 修改资源
    2. 有 body
  4. DELETE
    1. 删除资源
    2. 没有 body
  5. HEAD
    1. 和 GET 相同,但是 response 中没有 body

响应状态码

  1. 1XX: 临时性消息
    1. 100:
    2. 101:协议切换
  2. 2XX: 成功
  3. 3XX: 重定向
  4. 4XX: 客户端错误
  5. 5XX: 服务器错误

头部字段说明

1. content-length

2. content-type

  1. application/json

json格式,用于 web api 的响应或者POST/PUT请求

  1. //需要加 addConverterFactory(GsonConverterFactory.create())
  2. @POST("users/new")
  3. Call<User> createUser(@Body User user);
  1. text/html
  2. application/x-www-form-urlencoded

    即 普通表单(纯文字表单),encoded URL 格式

    1. //对应 Retrofit是:
    2. @FromUrlEncoded
    3. @POST("user/edit")
    4. Call<User> updateUser(@Field("first_name") String firstName);
    5. //实际的请求为
    6. <HEADER 部分>
    7. //Body 部分如下
    8. first_name=XXXX
  3. multipart/form-data; boundary=—XXXXX

上传包括文件等部分(非纯文字),其中 boundary 是分界

  1. @Multipart
  2. @PUT("user/info")]
  3. Call<User> updateUser(@Part("photo") RequestBody photo);
  1. 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 连接具体实现

  1. client —-> server
    1. 发送 client_hello,一字节信息,随机数
  2. server —-> client
    1. 发送 server_hello,一字节信息,随机数
  3. server —-> client
    1. 发送证书(服务器公钥,签名等,以及服务器证书签发者的公钥,签名,根证书公钥,签名)
  4. client —-> server
    1. 发送 pre_master
    2. client 和 server 分别根据 三个随机数算出 客户端加密密钥,服务端加密密钥,客户端和服务端各保留两个,相当于当前有4个钥匙
  5. client —-> server
    1. 将要发送加密信息
  6. server —-> client
    1. finished
  7. server —-> client
    1. 将要发送加密信息
  8. client —-> server
    1. finished

image.png

常见问题

一. tcp 连接是否会关闭?

Http1.0 中,一个 tcp 连接只发送一次,发送完毕就会被关闭
Http1.1 中,默认开启长连接,除非用 Connection:close 字段明确表示关闭长连接
Http2.0 中,存在信道复用,一个 tcp 连接可以发送多个 Http 请求

二. 输入 URL 到显示出页面,经历了什么?

  1. 输入 url 后,首先要解析 url,生成 http 请求报文
  2. 开始进行 ip 寻址
    1. 查找本地 host 是否有对应的地址
    2. 发出 dns 请求给本地 dns 服务器,如果没有,则继续发送到 dns 根服务器
    3. 根据根服务器返回的域服务器地址,继续一层一层的查询
  3. 拿到 ip 地址后,向服务器 80 端口发送 tcp 连接请求,三次握手
  4. 在建立连接的信道上发起 http 请求

三. TCP 三次握手

  1. client 发送 SYN = i
  2. server 发送 ACK = i+ 1;SYN = j
  3. client 发送 ACK = j + 1

四.TCP 四次挥手

  1. client 发送 FIN
  2. server 发送 ACK 表示收到关闭请求
  3. server 发送 FIN 表示自己也要关闭
  4. client 发送 ACK,并等待 2MSL(怕最后一次 ACK server 没收到,所以多等一会看 server 会不会重新发FIN)