RunLoop

简述

runloop用来处理输入各种事项,例如鼠标,键盘事件,NSPort对象,NSConnection 对象,NSTimer对象。所有的触发事件,网络请求,异步回调等等

开发者不能主动创建或者管理runloop,每个线程会主动创建一个runloop对象,如果需要调用runloop,需要使用currentRunloop获取即可。

默认是每个线程具有一个runloop,但是不一定会被创建,当调用currentrunloop方法时,如果没有runloop对象,则会自动创建该对象。

线程和 RunLoop 之间是一一对应的,其关系是保存在一个全局的 Dictionary 里。线程刚创建时并没有 RunLoop,如果你不主动获取,那它一直都不会有。RunLoop 的创建是发生在第一次获取时,RunLoop 的销毁是发生在线程结束时。你只能在一个线程的内部获取其 RunLoop(主线程除外)。

NSURLConnectionLoader 这个线程内部会使用 RunLoop 来接收底层 socket 的事件,并通过之前添加的 Source0 通知到上层的 Delegate。

NSRunLoop 线程不安全

由于nstimer对象并不被认为是input Source,在等待方法回调的时候可能会触发多次调用。

NSRunloop并不是线程安全的,并且runloop相关的方法,只能在runloop所在线程调用,永远不要再其他线程调用不属于这个线程的方法。
不过CFRunloop是线程安全的。

performSelector

performSelector 方法包含在Runloop中。

该方法会创建一个timer对象,然后在合适的runloop模式中,执行传入的方法。所以这个方法,会将传入的参数进行一个retain操作。然后在执行之前就return了。

PerformSelecter
当调用 NSObject 的 performSelecter:afterDelay: 后,实际上其内部会创建一个 Timer 并添加到当前线程的 RunLoop 中。所以如果当前线程没有 RunLoop,则这个方法会失效。

当调用 performSelector:onThread: 时,实际上其会创建一个 Timer 加到对应的线程去,同样的,如果对应线程没有 RunLoop 该方法也会失效。
在该线程的下一次runloop循环中调用

CFRunLoop 线程安全

runloop中包含的三个对象。

CFRunloopSource

CFRunloopTimer

CFRunloopObserver

一个 RunLoop 包含若干个 Mode,每个 Mode 又包含若干个 Source/Timer/Observer。每次调用 RunLoop 的主函数时,只能指定其中一个 Mode,这个Mode被称作 CurrentMode。如果需要切换 Mode,只能退出 Loop,再重新指定一个 Mode 进入。这样做主要是为了分隔开不同组的 Source/Timer/Observer,让其互不影响。

如果一个 mode 中一个 item 都没有,则 RunLoop 会直接退出,不进入循环。

能够主动为runloop添加观察者,不过需要使用cfrunloop中的API.需要先得到cfrunloop,属于core foundation框架中。
core foundation 是用c语言写的一套框架,foundation与cf之间能够通过桥接进行类型转换。cf框架对象中的生命周期不受arc管理,需要开发者自己管理,主动进行retain和release操作。
如果你添加了一个port在多种模式下,如果需要移除,则分别从多个模式下独立移除

如果需要实现回调,需要先创建上述的某一个对象置于runloop中,然后由runloop 在合适的时间进行回调。
每个添加到runloop中对象,必须设定好运行的模式。每一个运行中的runloop,都具有特定的模式,同时也只处理对应模式的观察者,定时器和源事件。
不过,由于runloop的模式只是简单的一个string类型,所以你可以直接自己定义runloop类型。也可以将你自定义的类型添加到common类型中。

runloop只有在该模式下,有至少一个源或者定时器去处理,才能运行。
sourcees或者timer 能够阻止runloop的退出。

通过runloop处理事件,循环,维持应用不退出。
cfrunloop中提供了管理timer,observer,source的接口
runloop本身是递归的,可以在一个runloop里面再添加一个runloop。

runloop运行事件处理器来响应输入事件,runloop接受两种不同类型的源。Input source ,传递异步事件,一般是来自其余线程或者不同应用的消息。Timer source 传递同步事件,在预定的时间调用或者重复调用。这两种源都使用特定的应用处理来处理事件。
Input source 传递同步事件后,会调用runUntilDate方法,去跳出。Timer source传递事件后,不会造成runloop的退出。

Input source

包含两种source ,Port-based , Custom input source .
一般这两个source的处理是不需要做区别的,它们之间唯一的区别就是,Port-baced 由内核创建提出,而custom 由其余线程创建提出。
当你创建一个source的时候,你需要将它给与你runloop的某一种模式。模式将决定input source 如何被监视。大多数时候,runloop将处在默认模式下,不过你也可以指定自定义模式。

Timer

timer并不是真正的时间机制。就像input source,timer只与指定的模式关联。如果不在对应的模式中,timer并不会工作,直到你把模式切换回允许工作的模式。
你也可以配置timer只执行一次或者重复地。不过定时器不是真正的定时,如果一个定时器设定在某个时间后,隔5秒执行一次,如果定时器错过了一个或者多次的执行,它会为错过的时间执行一次,然后重新进行隔5秒执行。

Observer

The entrance to the run loop.
When the run loop is about to process a timer.
When the run loop is about to process an input source.
When the run loop is about to go to sleep.
When the run loop has woken up, but before it has processed the event that woke it up.
The exit from the run loop.

Similar to timers, run-loop observers can be used once or repeatedly. A one-shot observer removes itself from the run loop after it fires, while a repeating observer remains attached

观察者只能在core foundation中创建,而不是cocoa 应用

Runloop events

Notify observers that the run loop has been entered.

Notify observers that any ready timers are about to fire.

Notify observers that any input sources that are not port based are about to fire.

Fire any non-port-based input sources that are ready to fire.

If a port-based input source is ready and waiting to fire, process the event immediately. Go to step 9.

Notify observers that the thread is about to sleep.

Put the thread to sleep until one of the following events occurs:

An event arrives for a port-based input source.
A timer fires.

The timeout value set for the run loop expires.

The run loop is explicitly woken up.

Notify observers that the thread just woke up.

Process the pending event.

If a user-defined timer fired, process the timer event and restart the loop. Go to step 2.

If an input source fired, deliver the event.

If the run loop was explicitly woken up but has not yet timed out, restart the loop. Go to step 2.

Notify observers that the run loop has exited.

runloop Event

Runloop的应用

1.使用source来与其他线程进行通信

2.在线程中使用定时器

3.在应用中使用performSelector方法

4.保持线程去执行周期任务

HTTP简述

URI

URI(统一资源标识符) 分为URL(统一资源定位符) 与URN(统一资源名)。

URL一般分为三个部分

  1. 方案,http:// 即访问资源使用的协议
  2. 服务器所在的Internet地址
  3. web服务器所在的某个资源

URN依旧处于实验阶段,现在几乎所有的URI都是URL,所以一般不区分URL与URI

事务

通过请求命令与响应结果,客户端获得想要的结果。

  1. 请求方法 GET,POST,PUT,DELETE,HEAD
  2. 状态码 1XX,2XX,3XX,4XX,5XX

报文

http报文是由一行一行的简单字符串组成的,而不是二进制数据,所以很方便程序员直接进行读写操作,http报文分为三个部分

起始行与首部字段都是纯文本类型,但是主体可以包含任何需要的数据,二进制数据或者文本都可以。HTTP 采用了MIME数据格式标签,使得能够传送多媒体内容。

  1. 起始行 请求报文中说明要做什么,响应报文中说明出现了什么情况
  2. 首部字段 键值对的形式
  3. 主体 包含所有需要的数据

连接

http是应用层协议,不需要考虑网络通信的具体细节。细节都有tcp协议进行处理。使用80端口进行http连接。

可以使用telnet来连接几乎所有的tcp服务器,包括http。只不过发送的数据需要符合http的格式。用来模拟http客户端

版本

  1. HTTP/0.9 只支持GET方法,只用于获取简单的HTML对象
  2. HTTP/1.0 添加了版本号,HTTP首部,多媒体等
  3. HTTP/1.1 重点在于校正HTTP设计中的结构性缺陷,明确语义,添加了基于口令基本认证的方法,得以支持访问控制
  4. HTTP/2.0 重点在于性能的大幅度提升

结构组件

  1. 代理 接收所有的请求或响应并转发
  2. 缓存
  3. 网关 通常用于将http协议与其他协议进行转换
  4. 隧道
  5. Agent代理 用户代理,web浏览器,爬虫等

URL与资源

URI 是统一资源标识符

URL通过描述资源位置来标识资源,而URN通过描述资源名字来标识资源

语法

URL语法:

<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>

最重要的三个部分,scheme方案 host主机 path路径

需要说明的是,frag是在客户端部分进行处理的,服务器负责处理全局的对象

快捷方式

URL可以分为相对URL和绝对URL。

使用相对URL需要先设置一个baseURL,使得获取相对定位。在解析时还需要将相对URL解析成为绝对URL。

浏览器会将浏览过的历史记录下来,在需要的时候进行自动的url扩展,得以自动补全。

编码机制

通过编码,进行转义,使得在URL中表示各种不安全的字符。
通常使用的转义符号有

  • %
  • /
  • #
  • :
  • ;

常用方案

  • HTTP
  • HTTPS
  • FTP
  • mailto
  • file
  • news
  • telnet

缺点

URL是通过资源路径来定位资源的,如果服务器将该资源的路径进行了修改,会导致之前的URL失效,无法继续定位

HTTP报文

HTTP报文流动方向

报文流入源端服务器,工作完成后,流回Agent代理中
所有的报文都是下游流动

组成部分

HTTP报文由三个部分组成

  1. 对报文进行描述的起始行
  2. 包含属性的首部块
  3. 可选,包含数据的主体
起始行 HTTP/1.1 200 OK
首部 Content-type: text/plain
Content-length: 19
主体 Hi!

分类

所有的http报文可以分为两类,一是请求报文,二是响应报文。二者结构相同。

请求头

方法

客户端希望服务器执行的操作,GET,PUT,DELETE,POST,HEAD

请求URL

版本

状态码

原因短语

状态码

范围 已定义范围 分类
100-199 100-101 信息提示
200-299 200-206 成功
300-399 300-305 重定向
400-499 400-415 客户端错误
500-599 500-505 服务器错误

首部

一些键值对的列表,添加附加信息。

分类

通用首部

可以出现在请求报文和响应报文首部中的。例如Date

请求首部

提供更多请求信息

响应首部

提供更多响应内容

实体首部

描述主体长度内容,或者资源自身

扩展首部

规范中没有定义的部分

方法详解

安全方法

HTTP中定义了一系列安全方法。GET和HEAD被认为是一种安全方法,这意味着使用GET或者HEAD的请求不会产生什么动作。HTTP/1.1 要求服务器必须实现GET与HEAD方法。

常用方法,GET,POST,HEAD,
了解GET与POST之间的区别。

连接管理

HTTP协议是基于TCP连接的。确保连接中数据不会丢失损坏,失序

HTTPS是在HTTP的基础上添加了一层SSL/TSL封装

TCP是分组连接,一个发送的数据可能会被分成多个TCP数据包进行分组传送。

TCP通过4个参数建立唯一通道

<源地址,源端口,目的地址,目的端口>

TCP连接

TCP三次握手
socket连接编程

HTTP基于TCP连接,所以事务上的性能很大一部分取决于底层TCP通道的性能。往往HTTP时延是由tcp网络延时造成的。
首先是通过DNS解析网络IP地址,然后建立TCP连接。

HTTP性能聚焦

  • TCP连接建立握手
  • TCP慢启动拥塞控制
  • 数据聚焦Nagle算法
  • 捎带确认的TCP延迟确认算法
  • TIME_WAIT时延和端口耗尽

TCP连接建立握手

进行HTTP连接时需要先建立连接,这之间就存在握手时延。如果HTTP本身只传递少量数据的话,建立握手的时延就比较可观了。

延迟确认

TCP本身具有丢失重传机制来确保数据能够正确获得。如果发送者没有在指定时间内收到来自接收方的确认帧,则会认为该数据已经丢失,即开始重传。

大多数TCP采用延迟确认算法,在一定时间内的确认帧会放在缓冲区中,寻找能够携带的输出分组,如果一定时间内没有输出分组,则确认信息放在单独分组中传送。而由于HTTP本身的双峰特征,输出分组并没有很多,所以延迟算法一定程度上造成了时延。

TCP慢启动

TCP具有拥塞控制的功能,在一开始建立连接发送数据的时候,会限制本身的最大传送数据量,如果传输成功,则会逐渐提高传输速度。用于方式因特网的突然过载和拥塞。
例如先发送一个数据,然后两个,四个,逐步增加。
基于这种特性,已经进行过数据交换的连接传输速度比新连接要快一些。

Nagle算法和TCP_NODELAY

TCP本身有一个数据流接口,可以传送任意长度的数据。但是每个TCP的首部都有至少40字节的数据,所以如果大量发送少量数据,网络性能会严重下降。

所以Nagle算法会尽量将多个数据拼接在一起然后一起发送。这就造成了之前的数据会被延迟发送。特别是当剩余数据不足以达到算法的发送低值时,需要等到算法的设定时间后才会被发送。

可以配置禁用Nagle算法,但是同时应该确保发送的TCP分组中有大量数据。

TIME_WAIT累积与端口耗尽

当某个TCP端口关闭TCP连接的时候,会在内存中维护一个小的控制块,确保在一定时间内不会创建相同地址,端口的连接。在性能基准环境下,可能就会成为性能的限制。

每当客户端连接到80端口后,会获得一个新的端口,以实现连接的唯一性。但是由于可用源端口数量有限,在一定时间内可能会被限制不能再使用,就有可能遇到端口耗尽的问题。

即使没有端口耗尽的问题,也要考虑,大量连接处在打开状态,或处于等待状态,内存中分配了大量的控制块。会影响系统速度。

HTTP连接处理

Connection首部

###串行事务延时处理
如果只对连接进行简单管理,假设一个Web网页嵌入3个图片,则浏览器需要发起多个HTTP请求来显示页面。如果每个请求都串行建立新连接,则连接延时和慢启动就会叠加。

对此,可以采用并行连接,持久连接,管道化连接的方式处理

并行连接

浏览器开启多个TCP连接请求数据,但实际速度不一定更快。打开大量连接会消耗内存资源从而引发自身的性能问题。

持久连接

对于连到同一个站点的连接,浏览器可以通过一个TCP连接获取多个数据,这个方法在HTTP2.0中有所体现。

但是使用持久连接,需要注意,有可能出现大量空闲连接,消耗性能

持久连接有两种方案

HTTP/1.0 keep-alive

HTTP/1.1 persistent

Keep-Alive

Keep-Alive并不是默认开启的,需要有请求首部来显式要求

在代理中可能出现问题

persident

HTTP/1.1中默认开启

管道化连接

在响应到达前,可以先将多个请求放入队列中。可以减少网络环回时间。但是客户端需要做好随时断开连接,处理已发送尚未响应的请求。

关闭连接

Web服务器

Web服务器实现了HTTP和相关的TCP连接处理。负责管理Web服务器提供的资源,以及对Web服务器的配置、控制及扩展管理。

建立连接

处理新的连接,解析出IP地址,将连接加入Web服务器列表中。

接收请求报文

解析报文,读取内部控制字段和主体内容。

处理请求

对资源的映射和访问

构建响应

发送响应

记录日志

Web代理

Web代理服务器是网络的中间实体。位于客户端和服务器之间,在各端点间来回传送报文。

HTTP代理既是客户端又是服务器,需要同时处理请求和响应。

代理可以看到并接触所有流经的HTTP流量,所以代理可以监视和修改所有流量。

可以通过代理实现很多功能。

私有代理和公有代理

众多客户端共享的代理是公有代理,而私有代理仅被一个客户端使用。

代理与网关的区别

代理连接的是两个或者多个使用相同协议的应用程序,而网关连接的则是两个或者多个使用不同协议的端点。网关负责进行协议的转换。

原理

  • 在客户端中设置代理。
  • 修改网络
  • 修改DNS
  • 修改Web服务器,使用重定向命令。

URI 代理需要对URI进行处理

在设置代理的情况下,客户端会发送完整URI。
在没有设置的情况下,客户端只会发送部分URI,因为默认接收方已经知晓地址和端口。

在虚拟主机的配置中,也会出现类似的问题。即缺少方案,缺少主机,缺少端口。

不过代理是通过显式要求报文中使用完整URI来解决这个问题,而虚拟主机是通过HOST字段来承载主机和端口信息。

在有不可见拦截代理的时,对主机的解析会有所不同。因为对于客户端而言,是没有代理的,代理需要有很强的健壮性,能够处理各种各样的情况

报文追踪

via首部字段可以用来列出报文途中路过的中间节点。请求VIA与对应的响应VIA基本上是相反的,因为二者共用一个TCP连接。

TRACE 用户可以用来追踪代理链传输的请求报文,观察代理是如何处理报文的

缓存

对于同一份文档,多次传输占用了网络带宽,降低传输速度,加重服务器负荷。

将物理位置上远距离的文件保存在附近的网络服务器中,可以显著降低传输时延。

命中与未命中

时间

需要通过HTTP再验证,来保证缓存的新鲜度,即确保缓存的数据与网络上的数据依旧是一致的。可以通过条件首部字段,IF-MODIFIED-SINCE ,来询问服务器该资源在是否在某时间后发生了改变。

如果发生改变,则服务器就将新的数据传送回来。

如果未改变,服务器返回304状态码,表示NOT Modified

如果资源已被删除,返回404 NOT FOUND,缓存也将其副本删除。

文件本身 ETag

通过IF-NONE-MATCH

发送文件的标志ETAG给服务器,来确认是否发生变化

服务器处理缓存步骤

  1. 接收
  2. 解析
  3. 查询
  4. 新鲜度检测
  5. 创建响应
  6. 发送
  7. 日志

控制缓存

通过首部字段Cache-Control可以来控制缓存相关设置。

no-store
在使用完数据后,马上将数据从客户端中删除

no-cache
在获取使用数据后,可以将其缓存,但是每次使用前必须先向服务器验证该缓存的新鲜度。

关于广告

广告的点击一般是靠点击量的,缓存的存在,使得点击量会减少。

此时可能需要由客户端记录点击次数,然后发送给服务端

网关

协议网关

转换来自双方的不同协议,进行不同协议之间的通信。

常见的如:

  • HTTP/FTP
  • HTTP/HTTPS

资源网关

API就是所谓的通用网关接口。

隧道

可以通过HTTP应用程序访问使用非HTTP协议的应用程序。

Web隧道允许用户通过HTTP连接发送非HTTP流量,在HTTP上捎带其他协议数据。这类流量可以穿过只允许Web流量通过的防火墙。

使用connect建立HTTP隧道

CONNECT方法请求隧道网关创建一条到达任意目的的服务器和端口的TCP连接,并对客户端和服务器之间的后继数据进行盲转发。

中继

简单HTTP代理

Web机器人

在无需人类干预的情况下,自动进行一系列的web事务处理软件。
从一个站点进入另一个站点,获取内容,跟踪链接,并对数据进行处理。

爬虫

从根集出发,开始爬取数据。

链接提取

对爬到的HTML进行解析,得到其中的URL,并将链接添加待爬队列中。

还需要将相对URL转为绝对URL

避免环路

避免循环爬取页面的情况出现。

对已经提取过的网页,爬虫需要记录,来进行查找以避免重复请求。

需要实现快速搜索。搜索树或者哈希表。

URL别名

默认端口,默认页面,IP地址等的存在,使得可能出现多个不同的URL指向同一个页面资源,此时爬虫需要进行区别。

URL规范化可以在一定程度下解决这个问题

文件系统环路

需要爬虫本身实现循环检测机制

可采取的方案

规范化URL

广度优先遍历

节流,限制一段时间内机器人可以从一个站点获取的页面数量

限制URL大小

URL站点黑名单 对已知的某些会产生环路,存在陷阱的站点加入黑名单,避开请求

模式检测 对环路请求的模式特征进行监控

内容指纹 类似消息摘要

人工

拒绝机器人访问

拒绝机器人访问标准,自愿遵守的一个守则,如果存在该守则,则爬虫默认不去爬取页面。进行自我约束。

搜索引擎

HTTP-NG

HTTP/1.1 提供了很多强大的功能,但目前也出现了局限性,复杂,性能,传输依赖。

Http2协议是一个二进制协议,二进制更易于frame(帧 数据包)的实现,Http2有十个不同frame定义,其中两个最基础的对应于HTTP 1.1的是Data数据和HEADE头部,其后将描述。

frame是包含几个部分:类型Type, 长度Length, 标记Flags, 流标识Stream和frame payload有效载荷。

流标识是描述二进制frame的格式,使得每个frame能够基于http2发送,与流标识联系的是一个流,每个流是一个逻辑联系,一个独立的双向的frame存在于客户端和服务器端之间的http2连接中。一个http2连接上可包含多个并发打开的流,这个并发流的数量能够由客户端设置,这些流可能是打散了通过物理连接传输。

关键之一就是在 应用层(HTTP/2)和传输层(TCP or UDP)之间增加一个二进制分帧层。

HTTP是一个无状态请求

但是有时候需要根据用户提供个性化网页,因此需要进行用户识别

  • 承载用户身份信息的HTTP首部
  • 客户端IP地址跟踪,通过IP地址识别用户
  • 用户登录,使用认证的方式
  • 胖URL,在URL中嵌入识别信息
  • cookie

HTTP首部

From 用户E-mail地址
User-Agent 用户的浏览器软件
Referer 用户通过这个页面跳转而来
Authorization 用户名和密码
Client-IP 客户端IP地址
X-Forwarded-For IP地址
Cookie 服务器产生的ID标签

From,User-Agent,Referer都不足以实现可靠的识别。

客户端IP地址

利用IP地址来区别用户

限制:

  1. IP地址描述的是客户端机器,而不是用户。如果多个用户共用一个机器,此时无法区分
  2. DHCP动态IP配置,使得每个客户端有可能出现不同的IP地址
  3. NAT网络地址转换,使得IP地址难以识别
  4. 代理和网关的存在,服务器会看见代理的IP,而不是用户的IP

用户登录

用户主动登录,来判断用户是谁

胖URL

利用URL中记录的信息,来区别用户,对URL进行一些扩展,添加一些状态信息。

由服务器为了跟踪,而产生的一段字符串

会话cookie

临时使用的,在浏览器退出后就会被删除

持久cookie

存储在硬盘上,过期时间比会话cookie长很多。

会话cookie和持久cookie的唯一区别就是二者的过期时间

如果设置了Discard,或者没有设置过期时间,则这个就是会话cookie

cookie设置

使用set-cookie 首部。

不同的站点使用不同的cookie,可以通过设置cookie的域属性和路径属性,来使同一站点的访问使用同一cookie
domain=”xxx.com”; path=/path1/

secure 是否只有在SSL连接时才发送这个cookie

expiration 过期时间

allh 域内所有主机都获取cookie,还是只有指定了名字的主机获取

当进行重定向转移的时候,之前cookie依旧会被添加进后续的请求中。

cookie与缓存

在使用cookie的时候,需要注意这些内容可能是用户个人定制的,在某些时候,应该禁止浏览器缓存相关的数据。

HTTP基本认证

HTTP原生提供了一种认证机制。

服务器返回401状态码,表示该需要通过认证才能访问

通过AUTHENTICATE 首部字段,来进行验证

使用时,可以通过BASE4编码,来混淆账号密码。

WWW-AUTHENTICATE中包含了realm域信息,来明确需要访问的是哪个安全域。

这种验证,因为并不是加密验证,其实也是一种明文的信息进行了数据传输,容易被中间人获取。并不安全

摘要认证

摘要认证避免明文在网络上传输

可以有选择的防止对报文内容的篡改

防止恶意用户捕获并重放认证的握手过程

MD5对密码进行摘要,然后传输

服务器可以添加一个随机数给客户端,将随机数附在密码后面进行加密。可以有效防止将摘要记录后作为重放进行验证。

安全HTTP

HTTPS

使用SSL或者TLS, 传输层级别的密码安全层

HTTPS先将未加密的报文发给安全层,由其进行数据加密,然后再发送。

一般来说,加密过程对于HTTPS的应用层是隐藏的,应用只需处理自己业务逻辑即可。

HTTPS使用443端口

https 三次握手。SSL交换密钥
端口443 。https就是在http的基础上添加了ssl加密协议,利用密钥交换协议进行了密钥交换
验证CA证书。
具体分析。。。

1
http://www.freebuf.com/articles/system/37900.html

HTTPS代理

对于代理而言,一旦HTTP数据加密,代理就看不到相关的HTTP头信息,无法进行数据的转发。

一般此时,需要客户端提前将端口与地址等告知代理。以明文的形式

之后建立隧道,直接以隧道的模式进行交流

2016.4.17 Tecent iOS面试

网络

  1. TCP与UDP的区别
    TCP是有效
  2. TCP握手
  3. HTTP首部

IOS相关

  1. GCD介绍,多线程解决方案与进程通信相关
  2. ARC解释

数据库

  1. 数据库范式
  2. 手写数据库注入范例
  3. 数据库防止注入方案

安全

  1. DES加密

C++

  1. C++变量声明周期

数据结构

  1. 手写链表结构与增删改查操作

http缓存

304状态码 Not Modify

通过http协议头进行缓存控制,cache-control。

服务器会返回设置相关的缓存控制信息,例如缓存时间max-age,缓存内容标记tag,控制是否缓存等信息。

if-None-Match 中有ETag令牌,由服务器检查是否资源被修改。如果未改变,由服务器返回304 Not Modify 状态码。目标是尽可能减少向服务器的数据请求,减少带宽压力。

使用一致的网址:如果您在不同的网址上提供相同的内容,将会多次获取和存储该内容。提示:注意,网址区分大小写!

确保服务器提供验证令牌 (ETag):通过验证令牌,如果服务器上的资源未被更改,就不必传输相同的字节。

确定中继缓存可以缓存哪些资源:对所有用户的响应完全相同的资源很适合由 CDN 或其他中继缓存进行缓存。

确定每个资源的最优缓存周期:不同的资源可能有不同的更新要求。审查并确定每个资源适合的 max-age。

确定网站的最佳缓存层级:对 HTML 文档组合使用包含内容指纹码的资源网址以及短时间或 no-cache 的生命周期,可以控制客户端获取更新的速度。

搅动最小化:有些资源的更新比其他资源频繁。如果资源的特定部分(例如 JavaScript 函数或一组 CSS 样式)会经常更新,应考虑将其代码作为单独的文件提供。这样,每次获取更新时,剩余内容(例如不会频繁更新的库代码)可以从缓存中获取,确保下载的内容量最少。

https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching?hl=zh-cn
http://www.cnblogs.com/TankXiao/archive/2012/11/28/2793365.html#noverify

http Cookie http://www.cnblogs.com/fish-li/archive/2011/07/03/2096903.html

https 三次握手。SSL交换密钥

端口443 。https就是在http的基础上添加了ssl加密协议,利用密钥交换协议进行了密钥交换
具体分析。。。
验证CA证书。
http://www.freebuf.com/articles/system/37900.html

http2.0

http代理

HTTP的代理服务器即是Web服务器又是Web客户端。
http://www.cnblogs.com/TankXiao/archive/2012/12/12/2794160.html

HTTP协议是无状态的,对于一个浏览器发出的多次请求,WEB服务器无法区分 是不是来源于同一个浏览器。 因此需要cookie的实现。
cookie与session的区别。
http Cookie的实现,字符串保存于浏览器中
可以利用cookie保存少量数据,使用数据序列化分方式。
session是基于cookie实现的。
cookie安全。

libcap抓包原理

libpcap的包捕获机制就是在数据链路层加一个旁路处理。当一个数据包到达网络接口时,libpcap首先利用已经创建的Socket从链路层驱动程序中获得该数据包的拷贝,再通过Tap函数将数据包发给BPF过滤器。BPF过滤器根据用户已经定义好的过滤规则对数据包进行逐一匹配,匹配成功则放入内核缓冲区,并传递给用户缓冲区,匹配失败则直接丢弃。如果没有设置过滤规则,所有数据包都将放入内核缓冲区,并传递给用户层缓冲区。
其实pcap的应用程序格式很简单,总的来说可以可以分为以下5部分:
1.我们从决定用哪一个接口进行嗅探开始。在Linux中,这可能是eth0,而在BSD系统中则可能是xl1等等。我们也可以用一个字符串来定义这个设备,或者采用pcap提供的接口名来工作。
2.初始化pcap。在这里我们要告诉pcap对什么设备进行嗅探。假如愿意的话,我们还可以嗅探多个设备。怎样区分它们呢?使用 文件句柄。就像打开一个文件进行读写一样,必须命名我们的嗅探“会话”,以此使它们各自区别开来。
3.假如我们只想嗅探特定的传输(如TCP/IP包,发往端口23的包等等),我们必须创建一个规则集合,编译并且使用它。这个过程分为三个相互紧密关联的阶段。规则集合被置于一个字符串内,并且被转换成能被pcap读的格式(因此编译它)。编译实际上就是在我们的程序里调用一个不被外部程序使用的函数。接下来我们要告诉 pcap使用它来过滤出我们想要的那一个会话。
4.最后,我们告诉pcap进入它的主体执行循环。在这个阶段内pcap一直工作到它接收了所有我们想要的包为止。每当它收到一个包就调用另一个已经定义好的函数,这个函数可以做我们想要的任何工作,它可以剖析所部获的包并给用户打印出结果,它可以将结果保存为一个文件,或者什么也不作。
5.在嗅探到所需的数据后,我们要关闭会话并结束。
http://blog.csdn.net/stoneliul/article/details/8615105

git分支操作

$ git branch xxx
$ git checkout xxx

runtime底层实现。

runtime相关,运行时的所有类,对象。
关于变量,属性,协议,方法,消息转发等
消息的返回类型,参量类型
运行时,工程加载的所有二进制库或者framework等等
能够动态修改指针的强弱
可以通过runtime创建不是继承于NSObject 的OC 根对象

手机端网络分层对应情况

arc底层机制,即C实现原理。c的内存管理实现。

OSI参考模型

OSI参考模型网络层、子层和层分组

第一层是最具体的,处理了实际的网络硬件和从一台设备到另一台设备发送比特的特定方法。第二层处理的依旧是信令和硬件。随着到了第3,4层,变得越来越抽象,等到了应用层,就不再处理硬件或者操作系统的概念了。

PDU和SDU

PDU,协议数据单元

SDU,服务数据单元

每个协议会生成一个供传输的PDU,该数据就是下一层的SDU。

PDU就是上层协议内容,加上本层的协议头。

中间设备

中间设备在物理层接受报文,然后报文被上传到数据链路层,在这里被处理,检错等,且数据链路层的首部被剥去,处理后的分组被向上传递到网络层。在那里,网络层判断目的机器是不是在本地网络上,或分组是否需要被转发到另一个中间设备。然后被重新打包成报文,向下返回到数据链路层,等待继续发送

报文沿着OSI模型向上只到网络层,然后重新被打包,沿着线路在物理层发送。

OSI层次作用

应用层

表示层

会话层

运输层

网络层

数据链路层

物理层

物理层

唯一的数据通过网络接口物理移动的层次。所以其他层执行生成报文的功能,这些报文实现各种协议。但是最终,报文必须沿着协议栈向下运输到物理层,并最终通过网络发送出去。

数据链路层

数据链路层在概念上分为两个子层,逻辑链路层LLC和媒体访问层MAC。

LLC

网络上本地设备之间逻辑链路的建立和控制所需要的功能。

MAC

控制对网络媒体访问的程序。

数据成帧

将较高层次的报文最终封装成可以在网络物理层发送的帧。

寻址

实现对MAC地址的寻址。

差错检测与处理

网络层

网络层参与从一台计算机到另一台计算机实际获取数据的最底层。一般而言,数据链路层只处理彼此相邻的本地设备。

逻辑寻址

IP协议,尽可能为每一个设备分配一个唯一的逻辑地址。在逻辑层次的寻址;数据链路层是针对物理层的寻址。

数据报封装

分片与重组

如果需要发送的数据太大超过了数据链路层的最大限制,网络层需要将数据划分成片,并把每片交给数据链路层。

差错处理和诊断

针对网络层的差错处理和检错

运输层

运输层担当较高层的应用的抽象领域和1-3层具体功能的联络者。

主要负责端对端的运输。

进程级寻址

对端口级别的寻址,寻址需要发送到对方的某个应用程序。

多路复用和分解

分片,打包和重组

对较大报文的分片

连接建立,管理和终止

确认和重传

运输层是实现可靠数据交付协议的地方。最通常的做法就是通过结合确认和重传定时器来实现。

流量控制

TCP/IP各层次常用协议

网络接口层 点到点协议 PPP 提供第二层连接。提供鉴别,数据封装,加密和聚合等功能
地址解析协议 ARP 将IP地址转换为MAC地址
网际层 网际协议 IP,IPV6 提供对运输层报文的封装,无连接交付,寻址和选路功能
IP网络地址转换 IP NAT 将专用网络中的地址自动转换成公用网络中的不同地址
互联网控制报文 ICMP IP和IPV6协议的支持协议。一般用于ping命令
运输层 传输控制协议 TCP 提供可靠连接的协议,具有流量控制功能
用户数据报协议 UDP 提供无连接协议,效率较高
应用层 域名系统 DNS 将域名转换为IP地址
动态主机配置协议 DHCP 用来配置TCP/IP设备并管理IP地址的协议
文件传输协议 FTP 文件传输,明文形式传送用户名和密码
超文本传输协议 HTTP
TELNET协议 Telnet 建立远程机器的终端会话