思想杂记之小总结
Posted FarmGuo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了思想杂记之小总结相关的知识,希望对你有一定的参考价值。
1 App的编译过程
现在工程基本都是Pod进行管理的,就以Pod工程举例。
1,因为主工程依赖了Pod工程,所以先编译Pod工程,生成framewrok
2,生产hmap文件来搜索头文件,创建.app目录
3,处理entitlements.plist文件
4,执行主工程的脚本,运行校验Pod脚本
5,按照Compile Sources里面的顺序编译主工程代码,并链接
6,运行复制脚本,复制framework或者bundle的资源到App目录里面
7,编译storyboard、xib
8,编译asset文件
9,复制并压缩png图片文件
10,复制swift标准库文件
11,对包进行签名
2 浏览器敲下回车后发生了什么
1、解析URI,区分出host、path、query。
2,检查缓冲,如果存在且在有效期直接展示。
3、查询host文件获取IP,如果查询不到,则由DNS进行解析获取IP地址。
4、根据ip和端口(80/443)进行三次握手,建立TCP连接。
5、发送请求报文,由请求行(GET/POST,path,HTTP/1.1)、首部行(见3常用字段)构成。
6,传输层增加TCP首部,网络层增加IP首部
7,判断是否同一个网络,是则根据MAC地址发送给,否则使用路由表查找下一跳地址,以及使用 ARP 协议查询它的 MAC 地址。
8,接受响应报文,由状态行,(HTTP/1.1 200 OK),首部行我(见3常用字段)构成
9,浏览器通过解析html,生成DOM树,解析CSS,生成CSS规则树,然后通过DOM树和CSS规则树生成渲染树。绘制各个节点并展示。
10,断开链接。
3 HTTP常用字段
request:
host:域名
accept:具体类型如applicaiton/json,text/html
accept-encoding:压缩算法,如gzip
accept-language:语言,如en-US,zh-CN
cache-control:缓存控制
cookie:
user-agent:请求标识
Connection:长链接,如keep-alive
If-Modified-Since:之前response返回的last-modified
If-None-Match:之前response返回的Etag,优先于If-Modified-Since。
//以下仅POST使用
Content-length:文件长度
response:
date:时间
server:
etag:文件校验码
content-type:文件类型,如text/html
content-length:文件长度
content-encoding:压缩算法,如gzip
last-modified:最后修改时间
Connection:长链接,如keep-alive
Expires:过期时间,和last-modified配合
cache-control:缓存时间,优先于Expires。
请求时,判断本地是否有缓存,是否在有效期。如果在有效期则直接使用,否则发起请求时,带上If-Modified-Since、If-None-Match由服务端判断缓存是否过期,来是否返回304(未修改)。
4 Notificaiton/Block/Delegate/Target-Action/KVO
Delegate比较严谨、规范,较强的代码可读性。要先声明、再实现,比较繁琐,适合调用方法比较多的情况。但需要注意循环引用。跨层使用比较困难。容易调试。
Block 简单易用,代码都统一在一个地方,容易理解。适合调用方法比较少的情况。比如简单的完成回调、按钮的点击等。需要注意强引用的情况。
Notification 一个对象发出的通知,多个对象能进行反应,适合一对多的场景,特别是当业务层级比较深的时候。编译期无法验证正确性,因此注意字符串的正确性。不方便调试、代码的可读性差
KVO 多用于1对1的场景,可以完成其他几个实现不了的事情,比如scrollView的contentOffset。但使用起来比较麻烦,需要注册,不用时需要移除,且编译时无法验证注册的正确性。不方便调试、代码的可读性差
5 HTTPS
TCP三次握手结束后,开始HTTPS握手,端口是443。
客户端向服务端端发送Client Hello数据包(包含支持的TLS版本、支持的加密套件、支持的压缩算法、SessionID、扩展信息(如SNI Server Name Indication)等基础信息,以及一个随机数 random_num_client)。因为此时还没有开始HTTP请求,故服务端不知道要请求的域名,在多域名的情况下,无法处理证书,SNI用来指明此次请求的域名,类似于请求头的Host。可以让服务端返回具体对应的证书。
服务端在收到Client Hello后会向客户端发送Server Hello数据包(包含最终协议版本、使用的加密套件,以及一个随机数 random_num_server(如果设置了双向校验相关选项,这里server还会向client发送ClientCertificateRequest,后续会校验)。
server_certificates 发送服务端的证书,用于身份验证和密钥交换。
server_hello_done,通知客户端 server_hello 信息发送结束。
客户端收到证书后,进行验证,通过后会使用RSA或DH算法生成第三个随机数(称之为Premaster)然后使用证书公钥加密后发送给服务端。
client和server都知道这三个随机数,且Premaster 在传输过程中是加密的。利用这三个随机数生成MasterSecret进而后续数据传输中使用的,我们用下面这张图来表示
hello阶段,加密使用的是RSA(非对称,安全性高),确定密钥后,传输数据时加密用的是对称密钥(速度快)。
6 dyld
以上是关于思想杂记之小总结的主要内容,如果未能解决你的问题,请参考以下文章