网络
三次握手
其实三次握手的流程,主要为了解决初始序列号的问题
tcp 每次数据发送都需要有应答
第一次
客户端发起连接请求,sync = 1,seq =随机数A
第二次
服务器端回复应答 sync =1 ,ack = A+1 ,并发送自己的序列号,ACK = 1,seq = 随机数B
第三次
客户端应答服务器,ACK = 1,ack = B+1
总结
ack就是用来应答把seq+1的,不止三次握手,后面每次tcp传输,也会这么干
双工,半双工,单工
双工
可以同时c -> s 或者 s -> c
半双工
不可以同时 但也支持 c -> s 或者 s -> c
单工
只可以单向交流
http
header
分为公用header,客户端独有header,服务器端独有header,body的header
cache-control
no-cache
其实也会保存cache到本地,进行对比缓存
no-store
这个是真的不缓存
为什么比 Expires 好
http1.1使用no-cache 代替 Expires,因为Expires使用的是过期时间,是服务器的时间,和本地时间不一样
而cache-control,max-age,表示资源能存活的时长(单位秒),即一个和你说2022.9.9过期。一个和你说还差200天过期
对比缓存
先会拿着ETag 对应资源在服务器的 唯一uuid进行比对,如果不正确则进行新的资源获取,如果正确则
比对下Last-Modified,如果小于Last-Modified,也会更新,否则读取本地
https
对比http多了ssl 层,tsl 是ssl 的升级版,tsl1.0与ssl3.0基本没差别,现在主要是用tsl,但我们习惯称呼ssl
流程
1,客户端先告诉服务器端,自己支持的ssl 版本,压缩方式
2,服务器端下发证书
3,客户端对证书验证,证书里包含摘要,各个层级机构pin信息等,验证方式这边暂略,
验证通过以后,客户端生成一个随机数,并用公钥加密,发送给服务器端,服务器端私钥解密获取这个随机数,后面两端交互,就使用这个随机数进行对称加密
七层 ,四层结构
七层是理想模型,我们主要理解四层
七层
应用层:应用层 (http,ftp) ,表示层(格式化,加密),会话层(建立,维护会话连接)
传输层: tcp,udp
网络层:ip,icmp
链路层:链路层(网络层,物理层通信),硬件层(以太网流传输)
传输过程
应用层 -> 给数据
传输层 -> 加上 tcp/udp 头
网络层 -> 加上ip头
binder
机制
跨进程通信
应用层
一个能发起通信的java类
驱动
一个虚拟的物理驱动设备,/dev/binder,通过mmap指向他
为什么要多进程
1,突破内存限制 如 图库
2,隔离风险,crash不影响
3,长链接稳定性(推送),内存泄漏 如 webview
查看手机给一个进程 虚拟机 分配的内存大小
adb shell getprop dalvik.vm.heapsize
多进程需要注意
application调用多次
你通过ibinder . asInterface获取对象的时候,他会判断,如果是同进程,就直接把你在service里new那个服务器对象给你,不是同进程,
特点
c/s架构,易用性高
一次拷贝,性能仅弱于内存共享
通过app uid控制开放,支持实名,匿名,实名需要在sevicemanager 注册,匿名仅app内部使用,安全性高
大小
传输数据,同步最大,1m-8k,异步 = 同步/2
binder线程池大小最大15
android启动过程
bootloader -> idle (pid = 0,进程管理,一些内存,驱动的初始化)
-> init(pid = 1) 第一个用户进程 ,kthread (pid = 2) 管理内核,创建
-> zygote java进程鼻祖
-> systemserver
init进程
main方法会走很多次
first_stage_init -> 1,挂载,创建文件之类的,2,重定向输入输出,3,启动seLinux_setup
seLinux -> android的安全策略,最小原则
second_stage_init -> 初始化属性域,监听进程结束处理僵尸进程,解析init.rc,在执行init.rc里的命令时就会启动zygote
zygote 总结
native
1,初始化安卓运行环境,启动jvm
2,进行jni 注册
3,调用zygoteInit.main方法,进入java
java
1,因为app 是fork zygote,所以先进行预加载
2,开启socket等待fork进程
3,启动 system Server进程
4,循环等待
显示拷贝
zygote fork进程的时候,用的显示拷贝,意思就是开始默认用同一份内存,哪里被修改了,就吧那部分单独拿出开复制一份
zygote 如何fork 其他进程
ams 通过socket连接上zygoteServer