学习日记-2022-02-21

网络

三次握手

  • 其实三次握手的流程,主要为了解决初始序列号的问题

  • 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
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、计算机网络概述 1)基本概念 基本概念 ① 计算机网络就是一种通信网络② 计算机网络 = 通信技术 + 计算机...
    Du1in9阅读 3,739评论 0 18
  • 计算机网络体系结构 OSI七层模型 TCP/IP四层模型 五层模型 七层模型:物理层、数据链路层、网络层、传输层、...
    iKangaroo阅读 587评论 0 0
  • 开启本讲之前,我想先问一句:「网络基础对于前端程序员重不重要」?其实答案是毫无疑问的,如果读者仍然对此有怀疑,那可...
    ikonan阅读 606评论 0 0
  • Catalog HTTP 协议1.1 特性1.2 HTTP 报文1.3 会话1.4 缓存1.5 缺点1.6 HTT...
    是ADI呀阅读 690评论 0 1
  • 网络基础术语 HTTP:超文本传输协议,信息是明文传输的。 HTTPS:添加了加密及认证机制的HTTP,具有安全性...
    Dezi阅读 2,140评论 2 16

友情链接更多精彩内容