1、计算机网络(应用层,传输层,网络层,数据链路层,物理层)
物理层:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。
调制解调器、光导纤维、 同轴电缆、双绞线 数据单元:比特 Bit
数据链路层:在物理层提供的服务的基础上向网络层提供服务,其最基本的服务是将源自网络层来的数据可靠地传输到相邻节点的目标机网络层。
典型设备: 网卡,网桥,交换机 数据单元:帧 Frame
PPP(Point-to-Ponit Protocol)点对点协议
CSMA/CD载波监听多点接入/碰撞检测协议。
网络层:网络层需要执行4个基本任务——用IP地址编址、封装、解封装、路由。
典型设备: 路由器,防火墙、多层交换机 ** 数据单元:数据包**
传输层: 传输层实现端到端的连接,传输层实现进程到进程的连接。
典型设备: 进程和端口 ** 数据单元:数据段**
TCP 传输控制协议提供可靠的面向连接的服务,传输数据前须先建立连接,结束后释放。可靠的全双工信道。可靠、有序、无丢失、不重复。
UDP 用户数据报协议发送数据前无需建立连接,不使用拥塞控制,不保证可靠交付,最大努力交付。
应用层:
典型设备:应用程序,如FTP,SMTP ,HTTP
2、define,const,static ,extern定义的变量,有什么区别
const:被const修饰的变量是只读的,不可修改。
宏是预编译(在编译前处理),const 是编译阶段。
define是宏定义,程序在预处理阶段将用define定义的内容进行了替换。因此程序运行时,常量表中并没有用define定义的常量,系统不为它分配内存。
static 作用
修饰局部变量:
- 1.延长局部变量的生命周期,程序结束时才会销毁。
- 2.局部变量只会生成一份内存,只会初始化一次。
- 3.改变局部变量的作用域。
修饰全局变量:
- 1.只能在本文件中访问,修改全局变量的作用域,生命周期不会改。
- 2.避免重复定义全局变量。
extern:引用其他类的全局变量
现在当前文件中查找有木有该全局变量,如果没有找到,才会去其他文件中查找。
// 全局变量:只有一份内存,所有文件共享,与extern联合使用。
int a = 20;
// static修饰全局变量
static int age = 20;
- (void)test
{
// static修饰局部变量
static int age = 0;
age++;
NSLog(@"%d",age);
}
- (void)viewDidLoad {
[super viewDidLoad];
[self test];
[self test];
extern int age;
NSLog(@"%d",age);
}
打印结果是:1,2,20。
3、http协议
是用于从万维网服务器传输超文本到本地浏览器的传送协议。
那么什么是超文本呢?说白了就是使用HTML编写的页面。
无状态:
一般而言,一个URL对应着唯一的超文本,而HTTP服务器也绝对公平公正,不管是谁,它都会根据接收到的URL请求返回相同的超文本。正是因为这样的唯一性,使得记录用户的行为状态变得毫无意义,所以,HTTP协议被设计为无状态的连接协议符合它本身的需求。
HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力
无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。
在这种客户端与服务器进行动态交互的Web应用程序出现之后,HTTP无状态的特性严重阻碍了这些应用程序的实现,简单的购物车程序也要知道用户到底在之前选择了什么商品。于是,两种用于保持HTTP连接状态的技术就应运而生了,一个是Cookie,而另一个则是Session。
HTTP是一个基于TCP/IP通信协议来传递数据
客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。
URL统一资源标识符,
such as http://mail.163.com/index.htm
GET 请求指定的页面信息,并返回实体主体。
POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)
4、数据库的索引
如果没有索引:必须一行一行的查找直到最后一行,这就意味数据库不得不检查上千行数据
使用索引的全部意义就是通过缩小一张表中需要查询的记录/行的数目来加快搜索的速度。
据库索引的数据结构基础:B+tree
B+tree 是一个n叉树,每个节点有多个叶子节点,一颗B+树包含根节点,内部节点,叶子节点。
CREATE INDEX name_index
ON Employee (Employee_Name)
索引已经按照按字母顺序排序。索引已经排序意味着查询一个名字会快很多,因为名字首字母为‘J’的员工都是排列在一起的。另外重要的一点是,索引同时存储了表中相应行的指针以获取其他列的数据。
当这个SQL (SELECT * FROM Employee WHERE Employee_Name = ‘Jesus’ )运行时,数据库会检查在查询的列上是否有索引。
一个非常好的类比是把数据库索引看作是书的索引。如果你有一本关于狗的书,你想要找关于‘黄金猎犬’的那部分。当你可以通过在书背的索引找到哪几页有关于‘黄金猎犬’信息的时候,你为什么要翻完正本书 - 这相当于数据库中的全表扫描。
5、TCP与UDP
IP协议:
所有的TCP,UDP,ICMP数据都以IP数据报格式传输。
IP提供不可靠的,无连接的数据传送服务。
IP协议只是将数据发送到了目标主机,但是应该由哪个应用程序来接受这个数据包呢?IP协议没有办法告诉我们。
端口号:
作用:用于区分同一台主机中正在通信的不同应用程序,因此也被称为程序地址。不同的端口用于区分同一台主机上不同的应用程序。
TCP与UDP区别:
TCP基于有连接,UDP基于无连接。
TCP能保证可靠传输,UDP不能保证可靠传输TCP。TCP采用有连接的,超时重传,应答机制等。
TCP结构复杂,消耗资源多,建立过程较慢较复杂。UDP结构简单,消耗资源少,建立过程较快;
TCP基于流模式,UDP是数据报模式。TCP把数据看成一连串无结构的字节流,没有边界,一段段传输构成了整个数据块。通过发送缓冲区和接受缓冲区来存储数据流。而UDP数据报模式,每一个数据报都是一个独立的对象,有着指定的大小。
TCP连接只能是点到点,而UDP可以一对一,一对多或者多对多。因此,广播和多播只能采用UDP数据报的方式。
TCP有确认,重传,拥赛控制机制,UDP在没有建立连接或者对方已经退出的情况下任然会继续发送数据,导致通信流量的浪费。
用途
TCP:用于实现可靠传输的情况,文件非常重要,对网络拥堵有较高要求的情况。
UDP:
1. 用于高速传输和实时性较高的场合(即时通信)。对于采用UDP的实事视频通信,如果出现丢包也只会出现短暂卡顿,但是如果采用TCP丢包后需要重发,会导致很长时间的卡顿。
- 包总量较少的通信(DNS),客户端较多
- 广播通信
6、嵌套字-通信端点
网络化的应用程序在开始任何通讯之前都必须要创建嵌套字。就像电话的插口一样,没有他就完全没办法通信。
面向连接的套接字,实现这种连接的主要协议就是传输控制协议(TCP)。
无连接套接字:UDP
7、内存与缓存
CPU存取数据的速度非常的快,一秒钟能够存取、处理十亿条指令和数据,而内存就慢很多。
缓存是为了解决CPU速度和内存速度的速度差异问题:
内存中被CPU访问最频繁的数据和指令被复制入CPU中的缓存,这样CPU就可以不经常到象“蜗牛”一样慢的内存中去取数据了,CPU只要到缓存中去取就行了,而缓存的速度要比内存快很多。
内存就是插上去的内存条,高速缓存目前都是集成在处理器中,作为内存和处理器之间的缓冲区域,存放常用数据和从内存中读到的即将发送给处理器运算的数据,加快处理速度。
8、虚拟内存
传统存储管理方式:
作业必须一次性全部装入内存后,方能开始运行。这会导致两种情况发生:
1、当作业很大,不能全部被装入内存时,将使该作业无法运行;
2、当大量作业要求运行时,由于内存不足以容纳所有作业,只能使少数作业先运行,导致多道程序度的下降。
3、作业被装入内存后,就一直驻留在内存中,其任何部分都不会被换出,直至作业运行结束。运行中的进程,会因等待I/O而被阻塞,可能处于长期等待状态。
局部性原理:
时间局部性:如果程序中的某条指令一旦执行,不久以后该指令可能再次执行;如果某数据被访问过,不久以后该数据可能再次被访问。产生时间局部性的典型原因,是由于在程序中存在着大量的循环操作。
空间局部性:一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也将被访问,即程序在一段时间内所访问的地址,可能集中在一定的范围之内,这是因为指令通常是顺序存放、顺序执行的,数据也一般是以向量、数组、表等形式簇聚存储的。
时间局部性是通过将近来使用的指令和数据保存到高速缓存存储器中。空间局部性将预取机制集成到高速缓存控制逻辑中实现。虚拟内存技术实际上就是建立了 “内存一外存”的两级存储器的结构,利用局部性原理实现髙速缓存。
虚拟内存:
在程序执行过程中,当所访问的信息不在内存时,由操作系统将所需要的部分调入内存,然后继续执行程序。另一方面,操作系统将内存中暂时不使用的内容换出到外存上,从而腾出空间存放将要调入内存的信息。这样,系统好像为用户提供了一个比实际内存大得多的存储器,称为虚拟存储器。
虚拟内存的实现有以下三种方式:
请求分页存储管理。
请求分段存储管理。
请求段页式存储管理。
9、进程与线程的补充
进程和线程区别:
1、进程是资源分配的基本单位,线程是cpu调度,或者说是程序执行的最小单位。
2、进程有独立的地址空间,而同一进程中的线程共享该进程的地址空间。
3、线程之间的通信比较方便。统一进程下的线程共享数据,通过这些数据来通信不仅快捷而且方便。而进程之间的通信只能通过进程通信的方式进行。
多进程程序与多线程程序区别:
多进程程序,一个进程崩溃不会影响其他进程,但是进程之间的切换和通信代价较大;
多线程程序,一个线程崩溃会导致整个进程死掉,其他线程也不能正常工作,但是线程之前数据共享和通信更加方便。
多进程对资源的消耗很大,而线程则是“轻量级进程”,对资源的消耗更小,对于大并发的情况,只有线程加上IO复用技术才能适应。
因此:对于需要频繁交互数据的,频繁的对同一个对象进行不同的处理,选择多线程合适,对于一些并发编程,不需要很多数据交互的采用多进程。
有了进程为什么还要线程
- 一个任务可以分成多个子任务并行执行,他们是对一个对象在操作。
- 线程不需要像进程一样维护那么多信息,因此创建和销毁速度更快,拥有同一个地址空间,访问很容易
- 任务有CPU密集和IO等待,的过程,最大化利用CPU
10、IO模型
同步:多个任务情况下,一个任务A执行结束,才可以执行另一个任务B。只存在一个线程也就是主线程。
异步:多个任务情况下,一个任务A正在执行,同时可以执行另一个任务B。任务B不用等待任务A结束才执行。存在多条线程。
阻塞:请求不能立刻得到应答,需要等待,就是阻塞
阻塞就是说在煮水的过程中,你不可以去干其他的事情,非阻塞就是在同样的情况下,可以同时去干其他的事情。阻塞和非阻塞是相对于线程是否被阻塞。
11、Tcp的流量控制
TCP作为面向连接的提供全双工可靠服务协议
TCP的流量控制是利用滑动窗口机制实现的,接收方在返回的ACK中会包含自己的接收窗口的大小,以控制发送方的数据发送。
但是当某个ACK报文丢失了,就会出现A等待B确认,并且B等待A发送数据的死锁状态。为了解决这种问题,TCP引入了持续计时器,当A收到rwnd=0时,就启用该计时器,时间到了则发送一个1字节的探测报文,询问B是很忙还是上个ACK丢失了,然后B回应自身的接收窗口大小,返回仍为0(A重设持续计时器继续等待)或者会重发rwnd=x。(receiver window)
慢开始和拥塞避免结合:
慢开始的“慢”并不是指拥塞窗口的增长速率慢,而是指在TCP开始发送报文时先设置拥塞窗口=1。 指数增长
拥塞避免算法是让拥塞窗口缓慢地增大,即cwnd加1,而不是如慢开始算法一样加倍。
快重传是指,如果发送端接收到3个以上的重复ACK,不需要等到重传定时器溢出就重新传递,所以叫做快速重传。
网友评论