OSI 七层模型
OSI模型指的是Open System Interconnection Reference Model,即开放式系统互联模型。它是世界上第一个试图在世界范围内规范网络标准的框架。
物理层 ,数据链路层 ,网络层 ,传输层 ,会话层 ,表现层 ,应用层
应用层
位于OSI模型最上方
只关心业务逻辑
,不关心数据的传输
表现层
负责协商用户传输的数据格式
,并转换数据格式
会话层
负责管理两个连网实体间的连接
功能及特点:建立连接
,维持通信
,释放连接
传输层
负责将数据从一个实体(一个服务或应用)传输到另一个实体,但不负责数据传输的方式
传输层的能力:
- 数据分隔重组:将数据拆分后按顺序重组
- 纠错:在数据传输过程中出现问题后采取方式进行纠正
- 管理连接:数据处理的频繁交换
- 流量控制:控制传输数据的速率
- 端口寻址:标明参与传输的实体端口号
例如上海搬去广州
网络层
负责把一个封包从一个ip地址传输到另一个ip地址
数据链路层
确保两个临近设备间数据的传输,并隐藏底层实现
帧同步:两个设备直接传输时的协商速率问题
数据纠错
物理层
封装和隐藏具体的传输手段,并且提供稳定的传输接口
比如:电缆、光纤、蓝牙等
TCP/IP(互联网)协议群的5层模型
应用层,传输层,网络层,数据链路层,物理层
应用层:数据从一个应用发往另一个应用的过程
传输层:主机到主机之间的传输
网络层:提供路由和寻址
数据链路层:两个节点之间的物理连接
物理层:负责0-1信号的传输
解决的5大问题
报文拆分、增加协议头、数据在相邻设备间数据传输、路由和寻址、数据重组
- 报文拆分
数据量大,网络底层设备不支持
复用路径
- 增加协议头
数据方块后再接受端需要重组,所以需要使用头部来添加描述字段
- 数据再相邻设备间数据传输
- 路由和寻址
路由算法:通过算法寻找下一个要到达的节点
- 数据重组
可选协议
- 传输层:TCP协议、UDP协议、TLS/SSL、SCTP协议等
- 网络层:IP协议(ipv4和ipv6)、ICMP协议、IPSec协议
TCP协议
TCP全名是(Transport Control Protocol),是一个可以提供可靠的、支持全双工、连接导向的协议,因此在客户端和服务端之间传输数据的时候,必须先建立一个连接
。
三次握手过程
客户端发送SYN
服务端针对客户端的SYN给出ACK
服务端发送SYN
客户端发送ACK
四次分手的过程
客户端发送断开请求FIN
服务器收到请求,发送ACK
服务端经过一个等待(结束业务),确定关闭连接,发送FIN
客户端收到FIN,处理完自身的业务后发送ACK
TCP主要功能
报文拆分
添加TCP请求头
数据重组
报文拆分
应用层数据无法一次性传输完成
可以拆分后并行传输
如何保证顺序?
**TCP发送序号(Seq)就是接受序号(Ack)**
(seq等于ack)
一个端发送的序号是另一个端的接受序号
增加TCP请求头
源端口:描述发送方机器上的应用
目标端口:描述接收方服务器上的应用
发送序号(seq)/接受序号(Ack)
标志位
TCP扩展协议:NS、CWR、ECE
ECN:显示拥塞控制协议,有助于帮助解决延迟和丢包问题
URG:紧急标志位
SYN(Synchronize Sequence Numbers):同步序号,就是建立连接
FIN:终止连接
ACK(Achnowledgment):响应
PSH(push):传送数据
RST(Reset Connection):重置连接
TCP协议周边配置
纠错能力:保证数据可靠性;
流控能力:协同两边速率,保证可靠性;
拥塞控制能力:确定网络的拥堵情况和传输速度
纠错和Checksum
TCP拥有一个16bit的Checksum字段
Checksum是一个函数
,把原文映射到一个不可逆的16bit的编码中
这样就可以知道原文传输过程中有没有发送变化
流控能力
主要目标:让发送方和接收方协商一个合理的收发速率
,让两边都可以稳定
工作
利用滑动窗口
IP协议
Internet Protocol
:网络层协议
网络层需要降级的三个问题
延迟
吞吐量
丢包率
IP协议目前主要有两种,IPv4和IPv6,IPv4目前是应用最广泛的
互联网协议
IP协议的工作原理
分片,增加协议头,延迟、吞吐量、丢包率,寻址,路由
分片
把数据切分成片
适配底层传输网络
增加协议头
协议头
- Type Of Service:服务的类型,是为了响应不同的用户诉求,用来选择延迟、吞吐量和丢包率之间的关系。
- IHL(Internet Header Length):IP协议头的大小。
- Total Length:报文(封包datagram)的长度
- Identification:报文的ID,发送方分配,代表顺序
- Fragment offset:描述是否要分包(拆分),和如何拆分。
- Time To Live:封包存活的时间。
- Protocol:描述上层的协议,比如TCP=6,UDP=17
- Options:可选项
- Checksum:检验封包的正确性
延迟、吞吐量、丢包率
延迟:1bit的数据从网络的1个终端传输到另一个终端需要的时间。
吞吐量:单位时间内可用传输的平均数据量。
丢包率:发送出去的封包没有到达目的地的比例。
三者无法同时满足
寻址
给一个地址,然后寻找这个位置
IPv4地址(32位):逐级寻址
例如:103.16.3.17
寻址过程:逐级找到网络,最后定义设备
寻址步骤
-
找到顶层网络:
103.16.3.1 最顶层的网络号和 255.0.0.0 (子网掩码)做位
与运算
得到:103.16.3.1 & 255.0.0.0 = 103.0.0.0
(ip地址与子网掩码进行
与运算
得到顶层网络)
-
找到下一层网络
用ip地址和下一级的子网掩码做位
与运算
103.16.3.1 & 255.255.0.0 = 103.16.0.0
- 依次找到下级网络
使用 255.255.255.0 子网掩码找到下一级网络:
103.16.3.1 & 255.255.255.0 = 103.16.3.0
路由
若寻找的IP地址不在局域网中,需要路由
找到去往对应网络的路径
IP地址和子网掩码位与的过程是由路由算法
实现的
IPv6协议
背景
IPv4只能支持43亿设备,不够用。
IPv6的工作原理
IPv6和IPv4两者工作原理相似,为切片
、增加封包头
、路由(寻址)
几个阶段。
IPv6和IPv4的主要区别
- 地址
地址数量:IPv4有4个8位,共16位
,IPv6有8个16位,共128位
分隔符号:
IPv4的地址用.
分割,如103.28.7.35 。每一个是8位,用0-255的数字表示。
IPv6的地址用:
分割,如0123:4567:89ab:cdef:0123:4567:89ab:cdef 。每个是一个16位的16进制数字,就是4个符。
书写方式:IPv6地址可简写
- 寻址
全局单播
站点前缀(Site Prefix):48bit,一般是由ISP(Internet Service Provider运营商)或RIR(Regional Internet Registry,地区性互联网注册机构)。RIR将IP地址分配给运营商。
子网号(subnet ID):16bit,用于站点内部区分子网。
接口号(Interface ID):64bit,用于站点内部区分设备。
本地单播
给定地址,本地网
定位设备
例子:fe80::123e:456d
分组多播
- 需要以8个1,也就是 ff00 开头,后面跟上一个分组的编号。
- 所在的网络中已经定义了该分组编号,而且有设备可以识别这个编号。
- 拥有分组下设备的完整清单,并把数据发送给对应的设备们。
- IPv4也支持分组多播,但需要网络配置整体配合。
UDP协议
User Datagram Protocol 用户数据报文协议,允许丢包
协议简单,搭建在IP协议之上
尽可能减少通信机制,速度非常快
该协议的RFC只有两页
在传输层提供直接发送报文(datagram)的能力
发送报文,无法拆分数据
UDP的封包格式
Source Port :源端口号
Destination Port:目标端口号
Length:消息体长度
Checksum:检查封包是否出错
Data octets:一个字节一个字节的数据。Octet是8位。
UDP和TCP
本质:
- TCP:提供可靠的网络传输
- 提供报文交换,简化协议
可靠性: - TCP:可靠
- UDP:不可靠
顺序: - TCP:有序
- UDP:无序
负载: - TCP:负载大
- UDP:负载小
UDP适合场景
影视音乐传输可以使用UDP,允许丢包
广播
语音视频通话,会议
TCP适合场景
聊天室
Http适合UDP吗?
合适,Http3.0就是建立在UDP上的
HTTP协议
Http协议(Hyper Text Transfer Protocol):应用层协议
目标是处理客户端
和服务端
之间的通信
http将web应用抽象成一个请求返回的模型
请求
一次请求,分成头(Header)和体(Body)
URL
返回
一次返回,也分为头(header)和体(Body)
状态码
网址(URL)
DNS
(Domain Name System)域名解析器
工作原理
1.先查询浏览器的本地缓存
(通常在内存中)
2.本地没缓存,查找到操作系统的hosts文件,该文件在linux的/etc/hosts
中
3.上述步骤没有找到,dns会查询本地服务提供商(ISP)
CDN
将请求分散到全世界各地,分发流量,加快访问速度
CDN上无法部署业务逻辑,更新慢,无法保证一致性,比较适合 静态资源
,比如图片、视频、脚本文件、样式文件等。(Nginx)
常见请求头参数
Content-Type
- text/html:HTML格式
- text/css:css文本
- application/json: JSON数据格式
- image/jpeg:jpg图片格式
- text/plain:纯文本格式
Origin:描述请求来源地址
Accept
HTTP协议协商能力的体现,用于建议服务端返回何种媒体类型(MIME Type)
- */*代表所有类型(默认)
- 多个类型用逗号隔开例如:text/html, application/json
- Accept-Encoding:建议服务端发送哪种编码(压缩算法)
- deflate, gzip;q=1.0, *;q=0.5
- Accept-Language:建议服务端传递哪种语言
- Accept-Language:fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5
Connection
决定HTTP连接(不是TCP连接)是否在当前事务完成后关闭。
Http1.0 默认是 close
Http1.1 后默认是 keep-alive
HTTP的方法
- GET:从服务器获取资源
- POST:在服务器创建资源(幂等性)
- PUT:在服务器修改资源
- DELETE:在服务器删除资源
状态码
1xx:提供信息
100 continue 101 切换协议(switch protocol)
2xx:成功
3xx:重定向
4xx:客户端错误
5xx:服务端错误
2xx状态码
200 -- OK
201 -- Created 已创建
202 -- Accepted 已接收
203 -- Non-Authoritative Information 非权威内容
204 -- No Content 没有内容
205 -- Reset Content 重置内容
206 -- Partial Content 服务器下发了部分内容(range header)
3xx状态码
300 -- Multiple Choices 用户请求了多个选项的资源(返回选项列表)
301 -- Moved Permanently 永久转移
302 -- Found 资源被找到(以前是临时转移)
303 -- See Other 可以使用GET方法在另一个URL找到资源
304 -- Not Modified 没有修改(缓存部分特别说明)
305 -- Use Proxy 需要代理
307 -- Temporary Redirect 临时重定向
308 -- Permanent Redirect 永久重定向
4xx状态码
400 -- Bad Request 请求格式错误
401 -- Unauthorized 没有授权
402 -- Payment Required 请先付费
403 -- Forbidden 禁止访问
404 -- Not Found 没有找到
405 -- Method Not Allowed 方法不被允许
406 -- Not Acceptable 服务端可以提供的内容和客户端期待的不一样
5xx状态码
500 -- Internal Server Error(内部服务器错误)
501 -- Not Implemented(没有实现)
502 -- Bad Gateway(网关错误)
503 -- Service Unavailable(服务不可用)
504 -- Gateway Timeout(网关超时)
505 -- HTTP Version Not Supported(版本不支持)
HTTP缓存
传统的HTTP协议层网络结构的三种实体:Web服务器,浏览器,代理
Http缓存最重要的配置项为Cache-Control
http返回头。不仅浏览器可以缓存,浏览器和服务器之间的HTTP代理服务器也可以缓存。
HTTP连接
keep-alive
多次请求复用一个TCP连接
keep-alive的断开
- 单个请求:请求完成后,在timeout时间内没第二个请求进来则会关闭。
- 多个请求:在一个请求响应之后,在 timeout 时间内有另一个请求进来,就会利用相同的 TCP 连接继续响应这个请求,直到没有更多请求进来,可以通过 max 字段设定最多响应的请求数。
keep-alive是否是长连接
keep-alive并不是长连接
WebSocket:长连接,提供在HTTP协议退化成TCP协议的方式。让客户端和服务器之间保持很长时间的连接且不中断
加密、解密和证书
加密
将明文消息变成不可读的密文内容,只有拥有解密方法的对象才能够将密文还原成加密前的内容。
对称加密
加密/解密用一个秘钥,且加密方和解密方都知道秘钥,如DES,3DES等
非对称加密
加密用一个秘钥,解密用另一个秘钥且加密方一般有2个秘钥,解密方有一个秘钥。非对称加密安全性高,但速度慢,如RSA算法。
摘要算法
将原文和摘要同时传输给接收方
特点:公开
,一致
,难碰撞
场景举例:密码保存
场景举例:数据传输
HTTPS和HTTP2.0
HTTPS
应用层协议(有(SSL)加密后的证书)
Https采用对称加密
的方式加密传输数据,使用对称加密的秘钥,采用非对称加密的方式进行协商。
过程
1.TCP协议三次握手
2.服务器利用TCP将证书发送给浏览器
3.浏览器通过本地Root CA验证网站证书
4.浏览器用证书的公钥加密:协商对称加密的算法和密码、
5.服务器响应,确定对称加密算法和密码
6.会话建立(来往数据使用对称加密)
常用的Linux网络指令
ssh/scp 远程操作相关的
ifconfig/netstat 查看本地网络状态
ping/telnet 测试网络情况
host/dig/nslookup dns查询
curl/wget 模拟发送请求
reboot 重启linux
scp 文件名 用户名@机器名 :路径 远程复制文件指令
scp file.txt user@remotehost:/home/user/
netstat 查看本机网络使用状态
netstat -ntlp | grep 9092 查看9092端口
ping ip地址 可以查看丢包率
telnet
telnet www.baidu.com 80 连接主机
TCP和UDP区别
面向流(面向连接)vs面向报文
TCP保证可靠性,UDP不保证可靠性
BIOvsNIO,AIO
TCP有延迟问题vsUDP有丢包问题
UDP实现广播成本低
TCP有三次握手四次分手的过程
都是传输层协议
TCP如何保证数据的顺序
利用(seq,ack)编号确定封包的唯一性
NIO优势
reactive模型+非阻塞(减少线程切换)
内核级别拷贝内存到JVM(减少系统调用)
缓冲区增加数据处理的灵活性(clear/flip等操作)
处理IO场景有着明显的性能优势(例如日志请求)