依赖注入框架--koin
koin 一个看似官方的注入依赖框架.
资料来源:
https://insert-koin.io/
https://www.jianshu.com/p/bccb93a78cee更新
1
220.03.11 初始化
20.06.05 重新编辑内容,补充新内容
koin 一个看似官方的注入依赖框架.
资料来源:
https://insert-koin.io/
https://www.jianshu.com/p/bccb93a78cee
更新
1 | 20.03.11 初始化 |
计算机网络分层?
什么是互联网?
电话网的电路交换和分组交换?
互联网通信的时延有那些?怎么计算?
简述一下 DNS .
FTP
DHCP
Telnet
电子邮件
Web 页面请求过程(从 0 开始)
主机浏览器起了一个 tcp 的 socket,向服务器发送 http 请求.但启动 socket 还需要服务器 ip ,此时开始 DNS 查询,发送 DNS 查询报文,但是这里主机只知道 DNS 服务器的 ip,但是不知道 MAC 地址,链路层无法通信,所以还需要先通过 ARP 请求 DNS 服务器的 MAC 地址.但开始时候主机时候主机连 ip 地址都没有,需要通过 DHCP 请求分配 ip 地址.
DHCP 请求 ip 地址.
ARP 请求 DNS 服务器 MAC 地址.
DNS 查询
HTTP 请求
什么是传输层?
UDP/TCP 特点/异同?
udp / tcp 报头.
tcp 的 3 次握手?
为什么 tcp 需要 3 次握手?
tcp 4 次挥手?
为什么断开 tcp 连接,要 4 次挥手? 为什么 A 关闭连接还需要等待 2MSL?
tcp 怎么保证传输的可靠性?
tcp 拥塞控制?
所谓拥塞控制,就是控制数据发送的速度,避免网络堵塞.可以将网络类比成高速公路,汽车是数据包,必须合理规划汽车流量高速公路才能正常运行,传输数据,如果不进行流量控制,高速一样寸步难行.
一些概念
慢启动
拥塞避免(加法增大,也说线性增长)
乘法减小
一个典型的调度过程
但是有两个问题
快速重传/快恢复
BBR
BRR 是 google 开发的 tcp 拥塞控制算法,在 linux 4.9 进入内核.
BBR 致力于解决两个问题
解决
但是带宽和延迟并不能同时测到,测试带宽需要把链路占满,此时延迟变大.测量延迟,要求带宽不能太大,此时测不到正确的带宽.BBR 干脆交替测量这两个值,把一段时间内带宽极大值和延迟极小值作为带宽/延迟的估计值.
启动: BBR 开始阶段类似 tcp 的慢启动,指数增加 cwnd.慢启动时链路的缓存几乎没有占用,将此时的延迟极小值作为延迟的估计值.但是之后 BBR 不再以丢包作为拥塞的标志.BBR 根据收到确认包的数量,但有效带宽不再增加时,才进入拥塞控制.实际上进入拥塞时已经是 带宽x3 × 延迟,后面会把 带宽x2 X 延迟释放掉.
排空: 指数级别降低发送速率.释放掉占用的 带宽x2 X 延迟.直到往返的延迟不再降低.
之后 BBR 进入探测阶段,交替探测带宽和延迟,具体就是定期参数增加发包速度,如果收到确认的速度也增加了,就进一步增加发包速度.但是延迟变动怎么办? BBR 会每过 10s 发现延迟没有变化时(即没有更低的延迟时)进入延迟探测阶段,在 200ms 内只发送 4 个包,得到最小的延迟值作为延迟的估计.
协议众多,互相交织,还是换一种风格…
互联网的本质是互联,最简单的大概是几台电脑插上网线一连就完事.那么问题来了,电脑直接怎么区分谁是谁呢?
起到这个作用的网卡的 mac 地址,mac 地址 48 位,6 个子节,每个网卡都不一样.有了地址还不行,还得有个交流的协议吧?总不能你说英语我说土著方言吧.这个协议目前在局域网最多的是以太网协议.
以太网协议有个特点是,网内每个电脑都有个大喇叭,传输数据就喊一声那个谁谁谁(广播)..,其他人都能听到,但是只有被喊道的人才回答.闲的时候还好,忙起来谁都听不见,这里就需要处理这种嘈杂,但是这是另一个话题了.
以太网有个问题,只能适用于同一个广场组网,相聚很远的地方就没办法用了,而且受制于以太网的通信方式,太远的地方效率太低.你能想象纽约时代广场喊话北京天安门,就为了问苹果几毛钱一斤?且不说为了能传到提升功率要覆盖全地球,就是问个价钱让地球人都知道,这一点就不安全.因此在广域网上还需要另外一套协议,这里实际上指的是 ip 协议,常见是ipv4 还有近些年逐渐普及的 ipv6.下文还是 ipv4 为例.
ip 协议的规则很简单,就是给互联网中的每个主机分配一个网络地址,大家按照网络地址互相投递邮件.
先从小的来说,互联网是由众多局域网互联组成的,广域网用的是 ip 协议,局域网用的是以太网,怎么把 ip 协议和以太网统一起来?用到了软件工程最好用的做法–分层.为了统一,我们局域网也用 ip 协议,但是我们把 ip 协议定义在以太网的上一层.具体来说以太网属于互联网分层的链路层,ip 协议是网络层(也称 ip 层).这样 ip 协议统一了,以太网也不需要改动.
ipv4 的地址是 32 个二进制数字,习惯上我们将其分为 4 段,一个典型的 v4 地址: 127.0.0.1
.地址前部分标识网络,后部分标识子网(局域网),但问题就在这个分界点怎么界定?不同规模的局域网需要的分界点也不一样.这里就需要子网掩码,例:如果子网的长度是 8 ,正好是最后一个十进制标识.那其对应的子网掩码是 11111111.11111111.11111111.00000000
十进制 255.225.225.0
.192.168.3.66
和 192.168.3.254
要怎么判断它们是不是一个子网呢?与 子网掩码 255.225.255.0
分别做 AND 运算,结果相同就是同一子网.但是子网掩码有时还是麻烦,就有更加简化的无类别域间路由(CIDR).例子中那段子网就可以表示成: 192.168.3.0/8
.
好,局域网适配 ip 协议改动完了,那还有个问题,局域网通信在链路层(以太网)靠 mac 地址区分计算机.而在网络层(ip 协议)是依靠 ip 地址区分.通常在分层中上层依靠下层实现.那就意味着在局域网中,网络层的 ip 地址应该与链路层的 mac 地址存在关联,这样整个局域网模型才能正常工作.事实也确实如此,起到这个关联的就是 ARP 协议.
想象一个局域网的传输场景,网络层已经知道了目的地的 ip 地址,但是链路层要进行通信,还需要目的地 ip 对应的 mac 地址,这就需要 arp 协议了,主机会向网关发起 arp 请求,包含网关的 ip 地址,广播目的地为 FF:FF:FF:FF,网关会维护一个 ip 地址和 mac 地址的关系表,返回 arp 应答.主机收到了目的地的 mac 地址,正常通信就行了.
来看一下局域网->广域网的过程.一般而言一个局域网里都有一个与广域网连接的入口,称为网关.局域网所有与广域网有关的请求都在网关进出.网关一般有两个 ip 地址,一个广域网的 ip 一个是局域网的 ip ,当局域网的请求发出去比较简单,但是要怎么接收广域网的回复呢?广域网看不到网关背后局域网的成员,这时涉及了 NAT(网址转换协议)
在实际传输中,向外的请求到达网关时,网关会进行源地址转换,将向外请求的 源ip地址替换成网关的广域网ip,使得这些请求可以进入广域网.同时网关会记录并维护一个 NAT 表,标识 内网ip:端口 —外网ip:端口.当收到广域网的回复时,网关又会把这些向内请求的目的地 ip 替换成局域网内的 ip,这样这些请求就能进入局域网内部了.
聊完了局域网,来看一下广域网,首先如果要构建广域网,我们不可能直接将所有不同规模的局域网对等相连.受限于地理和国家因素,首先是较小规模的局域网相连,然后是较大的局域网相连,最后才算这些实体之间互联互通,形成广域网.从上到下一点一点看.
讨论到此需要涉及一个新的概念 AS(自治系统),AS: 维基的定义是一个或多个实体管理下所有 ip 和路由器的组合.在 AS 内执行共同的路由策略.每一个 AS 都有一个唯一编号 ASN,这个编号是在申请建立 AS 时候就确立的,申请 AS 时会分派到对应的 ip地址,不会重复.可以将 AS 理解成广域网上一个大的围城,围城内部执行相同的规则(路由),外界现要访问围城内部,必须经过围城这个边界.
互联网发展早期是一个运行商对应一个 AS,之后随着规模剧增,遍不再有对应的关系,一个 ISP 可能拥有多个 AS,同时不止 ISP 大型的互联网公司为了更快的访问速度也申请了 N 多的 AS 以服务不同地区的客户.广域网就建立在这些 AS 互联互通的基础上.
理想情况下各个 AS 应该对流量一视同仁,拥塞调度路由选择等都交给统一的算法,就像 AS 不存在一样.但是现实并不是美好的,运营商有盈利压力,不同地区网络设施建设费用也千差万别.统一的调度根本是奢望,这也是 AS 存在的意义,AS 之间互联互通遵循 BGP (边界网关协议),AS 可以定义互联的规则,例如可以不让其他 AS 的流量通过等.要注意 BGP 协议仅仅是寻找到比较好的路由而不是最佳的路由.每个 AS 都必须配置 BGP,BGP 使用 tcp 进行通信.
说完了 AS 之间,我们来看看 AS 内部,我们可以把 AS 内部近似看作是平等的,没有流量的歧视.AS 内部最大的问题就是如果在组成 AS 的众多路由中,迅速找到一条最快到目的地的路.AS 内部的路由选择有 RIP(路由信息协议) 和 OSPF(开放式最短路径优先),现在一般都是 OSPF.OSPF 的基本原理是图论中的 Dijkstra 算法.
全/半/单工通信.
带宽调制…略…
Kotlin 下 Parcelable Serializable 使用
资料来源:
<>
更新
1 | 20.05.05 |
旧文填坑 Data Binding
资料来源:
更新
1 | 20.02.19 初始化 |
配合 Databinding Listadapter 实现极简 RecycleView
资料来源:
更新
1 | 20.04.17 初始化 |
java 速描?回忆版.😂.
资料来源:
更新
1 | 20.03.14 大概无聊,速览一遍 java |
SQL 复习
资料来源:
更新
1 | 20.02.26 初始化 |
ViewModel 速描
资料来源:
https://developer.android.com/topic/libraries/architecture/viewmodel#implement
更新
1 | 20.02.24 初始化 |
LiveData 速描
资料来源:
https://developer.android.com/topic/libraries/architecture/livedata
更新
1 | 20.02.24 初始化 |
一篇远古的坑..java 反射.
资料来源:
更新
1 | 20.01.30 远古大坑😥 |