# HTTP协议和网络

# 一、网络

七层网络参考模型-OSI:

  • ✅应用层(HTTP、FTP、SMTP、TELNET)报文 应用数据

  • ✅表示层(加密,ASCII)报文 应用数据编码解码压缩等

  • ✅会话层(RPC,SQL)报文 应用数据

  • ✅传输层(TCP,UDP) 端口 服务进程到服务进程流量控制等

  • ✅网络差(IP) IP 端到端

  • ✅数据链路层 MAC地址 跳到跳,ARP找到目标地址的MAC 网卡出厂会有全球唯一的MAC地址

  • ✅物理层 比特传输二进制bit 10011000...

应用层[报文]-> 传输层[段=报文+PORT]-> 网络层[包=段+IP]-> 数据链路层[帧=包+MAC]

  1. socket简单来说是对IP地址与端口的结合协议

  2. IP地址

    • 由4组8位(一共32位)的二进制数组成,常以XXX.XXX.XXX.XXX形式表示

    • 每一组XXX表示小于或者等于255的十进制数

    • 网络号+主机号

    • 分类ABC、D、E

      类|范围|网络数|主机数 --|---|------|----- A|0.0.0.0~127.255.255.255|128|16777216 B|128.0.0.0~191.255.255.255| 16384 |65536 C|192.0.0.0~223.255.255.255|2097152|256

  3. 如果把IP比作一间房子,端口就是出入房子的窗户或者门

  4. 端口 20、21-FTP 80-HTTP 443-HTTPS 53-DNS 总数:65536个

# 二、HTTP无状态协议

# 1.HTTP协议是什么?

HTTP:超文本传输协议,是网络传输信息的一种规范。是基于TCP协议的应用层传输协议,无状态的协议,是明文的

# 2.HTTP协议发展历史

  • HTTP/0.9 只接收GET方法,不支持请求头

  • HTTP/1.0 1996年,每个TCP连接只能发送一个请求。发送数据完毕,连接就关闭,如果还有请求别的资源,就得新建连接,继续三次握手,性能较差!

  • HTTP/1.1

    1. 1997年,加入了管道机制,在同一个TCP连接里,允许多个请求同时发送,增加了并发性,进一步改善了HTTP协议的效率。
    2. 最大改变就是引入持久连接,TCP默认不关闭,可以被多个HTTP复用,不用声明Connection: keep-alive
    3. Content-Length字段,告诉浏览器本次响应的数据长度是多少字节,后面的字节就是下一个响应的了;
    4. 新增了请求方式PUT、PATCH、OPTIONS、DELETE等
    5. 报文压缩,但是header不压缩
  • HTTP/2

    1. 2015年,是二进制协议,不再是文本协议...报文变成了二进制帧
    2. 多路复用
    3. header也会压缩,采用HPACK算法
  • HTTP/3

    1. 2019年,采用UDP协议(快),在这一层上新增了个QUIC

# 3.常用的HTTP请求

# 3.1 请求报文

GET /index.html HTTP/1.1
Host:127.0.0.1:8080
Connection: keep-alive

1
2
3
4

# 3.2 响应报文

HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8
Transfer-Encoding: chunked

<html>...</html>
1
2
3
4
5
6
7

# 3.3 请求方式

HTTP Method 安全/幂等性 用途 备注
GET 安全/幂等 从服务器取出资源(一项或多项) 读操作安全,查询一次多次结果一致
POST 非安全/非幂等 在服务器新建一个资源 写操作非安全,每多插入一次都会出现新结果
PUT 安全/幂等 在服务器更新资源(客户端提供完整资源数据) 写操作非安全,一次和多次更新结果一致
DELETE 安全/幂等 从服务器删除资源 写操作非安全,一次和多次删除结果一致
PATCH -- 在服务器更新资源(客户端提供需要修改的资源数据) --
HEAD -- -- --
TRACE -- -- --
OPTION -- -- --

# 3.4 请求头

Content-Type: 请求参数文本类型

  • application/x-www-form-urlencoded - 表单

  • multipart/form-data - 文件上传

    表单内容

    <form action="/upload" enctype="multipart/form-data" method="post">
        Username: <input type="text" name="username">
        Password: <input type="password" name="password">
        File: <input type="file" name="file">
        <input type="submit">
    </form>
    
    1
    2
    3
    4
    5
    6

    http请求内容。通过生成了一个 boundary 用于分割不同的字段按照字段个数又分为多个结构类似的部分,每部分都是以 --boundary 开始,最后以最后以 --boundary-- 标示结束

    POST http://localhost:9999/upload HTTP/1.1
    Content-Type: multipart/form-data; boundary=----WebKitFormBoundary5Eb5irKhvoYrlVjW
    
    ------WebKitFormBoundary5Eb5irKhvoYrlVjW
    Content-Disposition: form-data; name="username"
    
    admin
    ------WebKitFormBoundary5Eb5irKhvoYrlVjW
    Content-Disposition: form-data; name="password"
    
    123456
    ------WebKitFormBoundary5Eb5irKhvoYrlVjW
    Content-Disposition: form-data; name="file"; filename="新建 文本文档.txt"
    Content-Type: text/plain
    
    aaa
    ------WebKitFormBoundary5Eb5irKhvoYrlVjW--
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17

缓存相关请求头

  • Cache-Control: 缓存

  • max-age=31536000 一年

  • no-cache 可以缓存,但每次要和服务器信息确认

  • no-store 不缓存

  • private 资源只给当前浏览器缓存,代理不得缓存

  • public 代理也能缓存

  • expires: 过期时间

  • last-modifield:最后修改时间,判断资源是否被修改

# 4.HTTP状态码

  • ✅200 OK - 客户端请求成功 [GET]
  • ✅201 Created 用户新建或修改数据成功 [POST/PUT/PATCH]
  • ✅202 Accepted 表示一个请求已经进入后台排队(异步任务) [*]
  • ✅204 Not Content 无内容
  • ✅301 Move Permanently - 资源(网页等)被永久转移到其它URL
  • ✅302 Found - 临时跳转,下次还是旧地址
  • ✅304 Not Modified - 可以使用缓存的内容
  • ✅400 Bad Request - 语法错误,不能被服务器所理解 [POST/PUT/PATCH]
  • ✅401 Unauthorized - 请求未经认证,这个状态代码必须和WWW-Authenticate报头域一起使用 表示用户没有权限(令牌、用户名、密码错误)
  • ✅403 Forbidden 表示用户未得到授权
  • ✅404 Not Found - 请求资源不存在,可能是输入了错误的URL
  • ✅500 Internal Server Error - 服务器内部错误
  • ✅502 Bad Gateway - 网关错误,拿不到东西返回给C端
  • ✅503 Server Unavailable - 服务器当前不能处理客户端的请求,一段时间后可能恢复正常。

# 5.RPC

远程过程调用,常见的有gRPC,Dubbo

服务发现:向某个服务器发送请求,得先建立连接,前提是得知道ip地址和端口,这个找ip和端口得过程就是服务发现

HTTP RPC
向服务器发送请求 使用DNS域名解析就可以发现获取地址 会有专门中间键去解决,比如Consul,Nacos,Zookeeper,Redis,DNS
底层连接形式 HTTP/1.1默认是TCP连接之后,会Keep Alive TCP长连接数据交互
数据内容 二进制字节流,一般是以字符串内容为主,一般使用JSON序列化数据 序列化协议多种多样,比如protobuf

# 三、TCP-可靠的传输协议

# 1.TCP三次握手

1 C send SYN to S

2 S reply SYN+ACK to C

3 C send ACK to S

# 2.四次挥手

1 C send FIN+ACK to S

2 S reply ACK to C

3 S reply FIN + ACK to C

4 C send ACK to S

TCP UDP
可靠性 可靠的 不可靠
连接性 面向连接,需要三次握手,四次挥手等 无连接
报文 基于字节流 面向报文
传输速度
应用场景 对效率要求低,对准确性要求高,有连接的场景 对效率要求高,对准确性要求低