# HTTP协议和网络
# 一、网络
七层网络参考模型-OSI:
✅应用层(HTTP、FTP、SMTP、TELNET)
报文
应用数据
✅表示层(加密,ASCII)
报文
应用数据
编码解码压缩等✅会话层(RPC,SQL)
报文
应用数据
✅传输层(TCP,UDP)
段
端口
服务进程到服务进程
流量控制等✅网络差(IP)
包
IP
端到端
✅数据链路层
帧
MAC地址
跳到跳
,ARP找到目标地址的MAC 网卡出厂会有全球唯一的MAC地址✅物理层
比特
传输二进制bit 10011000...
应用层[报文]-> 传输层[段=报文+PORT]-> 网络层[包=段+IP]-> 数据链路层[帧=包+MAC]
socket简单来说是对IP地址与端口的结合协议
IP地址
由4组8位(一共32位)的二进制数组成,常以XXX.XXX.XXX.XXX形式表示
每一组XXX表示小于或者等于255的十进制数
网络号+主机号
分类
A
、B
、C
、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
如果把IP比作一间房子,端口就是出入房子的窗户或者门
端口
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
- 1997年,加入了管道机制,在同一个TCP连接里,允许多个请求同时发送,增加了并发性,进一步改善了HTTP协议的效率。
- 最大改变就是引入持久连接,TCP默认不关闭,可以被多个HTTP复用,不用声明Connection:
keep-alive
; - Content-Length字段,告诉浏览器本次响应的数据长度是多少字节,后面的字节就是下一个响应的了;
- 新增了请求方式PUT、PATCH、OPTIONS、DELETE等
- 报文压缩,但是header不压缩
HTTP/2
- 2015年,是二进制协议,不再是文本协议...报文变成了二进制帧
- 多路复用
- header也会压缩,采用HPACK算法
HTTP/3
- 2019年,采用
UDP
协议(快),在这一层上新增了个QUIC
- 2019年,采用
# 3.常用的HTTP请求
# 3.1 请求报文
GET /index.html HTTP/1.1
Host:127.0.0.1:8080
Connection: keep-alive
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>
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
6http请求内容。通过
生成了一个 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 | |
---|---|---|
可靠性 | 可靠的 | 不可靠 |
连接性 | 面向连接,需要三次握手,四次挥手等 | 无连接 |
报文 | 基于字节流 | 面向报文 |
传输速度 | 慢 | 快 |
应用场景 | 对效率要求低,对准确性要求高,有连接的场景 | 对效率要求高,对准确性要求低 |