李洪强经典面试题146-网络
李洪强经典面试题146-网络
网络
http请求方式?
通常,HTTP的请求方式有3种,分别是:POST、GET、HEAD。POST和GET方法是用于数据发送的。
POST:它将要发送的数据单独放在一个流中进行发送,而不是附加在URL地址后面,这样做的好处是这些数据不会出现在URL地址中。
GET:它将要发送的数据直接添加在URL后面,如:www.sina.com.cn?username=""&password="",这样的好处是可以直接将数据加在URL后,而不需在用另外的流来发送这些数据,但是缺点也显而易见,它将用户的信息显示出来了。
HEAD:它是请求资源的元数据方法。在具体的应用中,我暂时还没遇到过,也不去对它进行研究,需要是在学习。
Http定义了与服务器交互的不同方法,最基本的方法有?
-
URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。
-
GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。
socket编程简述
它是基于TCP/IP协议,Socket就是一个可以连通网络上不同计算机程序之间的管道,把一堆数据从管道的A端扔进去,则会从管道的B端(也许同时还可以从C、D、E、F……端冒出来)。管道的端口由两个因素来唯一确认,即机器的IP地址和程序所使用的端口号。
Socket可以支持数据的发送和接收,它会定义一种称为套接字的变量,发送数据时首先创建套接字,然后使用该套接字的sendto等方法对准某个IP/端口进行数据发送;接收端也首先创建套接字,然后将该套接字绑定到一个IP/端口上,所有发向此端口的数据会被该套接字的recv等函数读出。如同读出文件中的数据一样。
TCP/IP的socket提供下列三种类型套接字。 流式套接字、数据报式套接字、原始式套接字。
客户端编程步骤:
1:加载套接字库,创建套接字(WSAStartup()/socket());
2:向服务器发出连接请求(connect());
3:和服务器端进行通信(send()/recv());
4:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。
常用第三方库:1,Asyncsocket库
asihttp代码原理,异步请求的原理,异步请求最大数目,为什么只能这么多?
ASIHTTPRequest是一个简易使用的类库,通过包装CFNetwork API 来简化 和服务器端的通讯. 它编写的语言是Objective-C 能够应用于Mac OS X and iPhone 平台的应用程序.
异步: 请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕这个数量是跟cpu有关的,并发性取决于cpu核数,每个核只能同时处理一个任务.4核cpu理论上可以并发处理4个任务,如果按http来算就是4个请求,但是cpu是抢占式资源,所以一般来说并发量是要根据任务的耗时和cpu的繁忙度来计算4个左右只是个经验值你开10个短耗时的任务和几个长耗时任务的效率是不同的。
JSONKit、SBJson、TouchJSON和原生的区别?
JSONKit、SBJson、TouchJSON(性能从左到右,越右越差,主要就是性能上的差别)
App需要加载超大量的数据,给服务器发送请求,但是服务器卡住了如何解决?
1> 设置请求超时
2> 给用户提示请求超时
3> 根据用户操作再次请求数据
HTTP的通信的 发送请求、接收响应 包含哪些内容?OC中是怎样实现的?
- 请求:一个请求包含以下内容:
- 请求行:包含了请求方法、请求资源路径、HTTP协议版本
GET /XXServer/resources/images/1.jpg HTTP/1.1 -
请求头:包含了对客户端的环境描述、客户端请求的主机地址等信息
- Host: 192.168.1.105:8080 // 客户端想访问的服务器主机地址
- User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9) Firefox/30.0
// 客户端的类型,客户端的软件环境 - Accept: text/html, / // 客户端所能接收的数据类型
- Accept-Language: zh-cn // 客户端的语言环境
- Accept-Encoding: gzip // 客户端支持的数据压缩格式
- 请求体:客户端发给服务器的具体数据,比如文件数据
- OC中请求NSURLRequest
- 发送给服务器的请求包含:
- 请求行: 包含了请求方法、请求资源路径、HTTP协议版本
- 请求头: 对客户端的环境描述、客户端请求的主机地址等信息
- 请求体: 客户端发给服务器的具体数据
- 默认超时时常:60s
- 响应:
- 一个响应包括:
- 状态行:包含了HTTP协议版本、状态码、状态英文名称 HTTP/1.1 200 OK
- 响应头:包含了对服务器的描述、对返回数据的描述
- Server: Apache-Coyote/1.1 // 服务器的类型
- Content-Type: image/jpeg // 返回数据的类型
- Content-Length: 56811 // 返回数据的长度
- Date: Mon, 23 Jun 2014 12:54:52 GMT // 响应的时间
- 实体内容:服务器返回给客户端的具体数据,比如文件数据
-
OC中响应用NSURLRespose:返回给客户端的回应包含:
- 状态行 : 包含了HTTP协议版本、状态码、状态英文名称
- 响应头 : 包含了对服务器的描述、对返回数据的描述
-
实体内容:服务器返回给客户端的具体二进制数据
-
常用属性: expectedContentLength (下载时返回文件的长度)
suggestedFilename(建议保存的文件名)
http 的post与get区别与联系,实践中如何选择它们?
GET | POST | |
---|---|---|
用途 | 从服务器上获取数据 | 向服务器传送数据提交方式 |
服务器解析 | Request.QueryString获取变量的值 | Request.Form获取提交的数据 |
数据大小 | 最大1024字节 | 无限制 |
安全性 | URL中能看到提交的数据 | 隐藏在请求头中 |
知道TCP/UDP吗?说说关于UDP/TCP的区别?
- UDP: 是用户数据报协议: 主要用在实时性要求高以及对质量相对较弱的地方,但面对现在高质量的线路不是容易丢包除非是一些拥塞条件下, 如流媒体
- TCP: 是传输控制协议:是面连接的,那么运行环境必然要求其可靠性不可丢包有良好的拥塞控制机制如http ftp telnet 等
TCP | UDP | |
---|---|---|
发送与接收 | 安全送达 | 只管发送 |
建立连接 | 是(三次握手) | 否(有数据包,无需连接) |
数据大小 | 无限制 | 每个数据报64k |
可靠性 | 可靠 | 不可靠 |
速度 | 慢(三次握手才能完成连接 | 快(无需连接) |
应用 | 流媒体 |
什么是三次握手与四次挥手?
-
三次握手实现的过程:
- 第一次握手:建立连接时,客户端发送同步序列编号到服务器,并进入发送状态,等待服务器确认
- 第二次:服务器收到同步序列编号,确认并同时自己也发送一个同步序列编号+确认标志,此时服务器进入接收状态
- 第三次:客户端收到服务器发送的包,并向服务器发送确认标志,随后链接成功。
- 注意:是在链接成功后在进行数据传输。
-
四次挥手:
- 第一次: 客户端向服务器发送一个带有结束标记的报文。
- 第二次:服务器收到报文后,向客户端发送一个确认序号,同时通知自己相应的应用程序:对方要求关闭连接
- 第三次: 服务器向客户端发送一个带有结束标记的报文。
- 第四次: 客户端收到报文后,向服务器发送一个确认序号。链接关闭。
分析json、xml的区别?json、xml解析方式的底层是如何处理的?
-
Json与xml的区别:
- 可读性方面:基本相同,xml的可读性比较好
- 可扩展性方面:都具有很好的扩展性
- 编码难度方面:相对而言:JSON的编码比较容易
- 解码难度:json的解码难度基本为零,xml需要考虑子节点和父节点
- 数据体积方面:json相对于xml来讲,数据体积小,传递的速度跟快些
- 数据交互方面:json与JavaScript的交互更加方面,更容易解析处理,更好的数据交互
- 数据描述方面:xml对数据描述性比较好
- 传输速度方面:json的速度远远快于xml
-
JSON底层原理:
- 遍历字符串中的字符,最终根据格式规定的特殊字符,比如{}号,[]号, : 号 等进行区分,{}号是一个字典 的开始,[]号是一个数组的开始, : 号是字典的键和值的分水岭,最终乃是将json数据转化为字典,字典中值可能是字典,数组,或字符串而已。
-
XML底层原理:
- XML解析常用的解析方法有两种:DOM解析和SAX解析。
- DOM 采用建立树形结构的方式访问 XML 文档,而 SAX 采用的事件模型。
- DOM 解析把 XML 文档转化为一个包含其内容的树,并可以对树进行遍历。
- 使用 DOM 解析器的时候需 要处理整个 XML 文档,所以对性能和内存的要求比较高。
- SAX在解析 XML 文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。
- SAX 对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag。特别是当开发人员只需要处理文档中所包含的部分数据时,SAX 这种扩展能力得到了更好的体现。
- (补充)其他解析方式有自定义二进制解析,就是按字节去解析,电话会谈就是如此,还可以是字符串之间用特殊符号连接的数据,将此数据用特殊符号可以分割成所用数据。
http和scoket通信的区别?socket连接相关库,TCP,UDP的连接方法,HTTP的几种常用方式?
- http和scoket通信的区别:
- http是客户端用http协议进行请求,发送请求时候需要封装http请求头,并绑定请求的数据,服务器一般有web服务器配合(当然也非绝对)。 http请求方式为客户端主动发起请求,服务器才能给响应,一次请求完毕后则断开连接,以节省资源。服务器不能主动给客户端响应(除非采取http长连接技术)。iphone主要使用类是NSUrlConnection。
- scoket是客户端跟服务器直接使用socket“套接字”进行连接,并没有规定连接后断开,所以客户端和服务器可以保持连接通道,双方都可以主动发送数据。一般在游戏开发或股票开发这种要求即时性很强并且保持发送数据量比较大的场合使用。主要使用类是CFSocketRef。
通信底层原理(OSI七层模型)
-
OSI简介:OSI采用了分层的结构化技术,共分七层,物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
-
物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后在转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。
-
数据链路层:定义了如何让格式化数据以进行传输,以及如何让控制对物理介质的访问。这一层通常还提供错误检测和纠正,以确保数据的可靠传输。
-
网络层::在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择。Internet的发展使得从世界各站点访问信息的用户数大大增加,而网络层正是管理这种连接的层。
-
传输层:定义了一些传输数据的协议和端口号(WWW端口80等),如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的)。 主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组。常常把这一层数据叫做段。
-
-
会话层:通过传输层(端口号:传输端口与接收端口)建立数据传输的通路。主要在你的系统之间发起会话或者接受会话请求(设备之间需要互相认识可以是IP也可以是MAC或者是主机名)
-
表示层::可确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。例如,PC程序与另一台计算机进行通信,其中一台计算机使用扩展二一十进制交换码(EBCDIC),而另一台则使用美国信息交换标准码(ASCII)来表示相同的字符。如有必要,表示层会通过使用一种通格式来实现多种数据格式之间的转换。
-
应用层:是最靠近用户的OSI层。这一层为用户的应用程序(例如电子邮件、文件传输和终端仿真)提供网络服务。
all people seem to need date processing这一句话的意思是所有的人似乎都需要处理数据
Application | all |
Presentation | people |
Session | seem |
Transport | to |
Network | need |
Data | date |
Physical | processing |
设计一套大文件(如上百M的视频)下载方案
-
NSURLSession
-
支持断点下载,自动记录停止下载时断点的位置
- 遵守NSURLSessionDownloadDelegate协议
- 使用NSURLSession下载大文件,被下载文件会被自动写入沙盒的临时文件夹tmp中
- 下载完毕,通常需要将已下载文件移动其他位置(tmp文件夹中的数据被定时删除),通常是cache文件夹中
-
下载步骤:
-
设置下载任务task的为成员变量
@property (nonatomic, strong) NSURLSessionDownloadTask *task;
-
获取NSURLSession对象
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOperationQueue alloc] init]];
-
初始化下载任务任务
self.task = [session downloadTaskWithURL:(此处为下载文件路径URL)];
-
实现代理方法
/*每当写入数据到临时文件的时候,就会调用一次该方法,通常在该方法中获取下载进度/
-(void)URLSession:(NSURLSession )session downloadTask: (NSURLSessionDownloadTask )downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{// 计算下载进度 CGFloat progress = 1.0 * totalBytesWritten / totalBytesExpectedToWrite;
}
/*任务终止时调用的方法,通常用于断点下载/
-(void)URLSession:(NSURLSession )session downloadTask:(NSURLSessionDownloadTask )downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes
{//fileOffset:下载任务中止时的偏移量
}
/*遇到错误的时候调用,error参数只能传递客户端的错误/
-(void)URLSession:(NSURLSession )session task:(NSURLSessionTask )task didCompleteWithError:(NSError *)error
{ }/*下载完成的时候调用,需要将文件剪切到可以长期保存的文件夹中/
-(void)URLSession:(NSURLSession )session downloadTask:(NSURLSessionDownloadTask )downloadTask didFinishDownloadingToURL:(NSURL *)location
{//生成文件长期保存的路径 NSString *file = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:downloadTask.response.suggestedFilename]; //获取文件句柄 NSFileManager *fileManager = [NSFileManager defaultManager]; //通过文件句柄,将文件剪切到文件长期保存的路径 [fileManager moveItemAtURL:location toURL:[NSURL fileURLWithPath:file] error:nil];
}
-
操作任务状态
/*开始/继续下载任务/
[self.task resume];/*暂停下载任务/
[self.task suspend];
-
-
HTTP协议的特点,关于HTTP请求GET和POST的区别?
HTTP协议的特点:
- HTTP超文本传输协议,是短连接,是客户端主动发送请求,服务器做出响应,服务器响应之后,链接断开。HTTP是一个属于应用层面向对象的协议,HTTP有两类报文:请求报文和响应报文。
- HTTP请求报文:一个HTTP请求报文由请求行、请求头部、空行和请求数据4部分组成。
- HTTP响应报文:由三部分组成:状态行、消息报头、响应正文。
即时聊天App不会采用的网络传输方式
A UDP
B TCP
C HTTP
D FTP
参考答案:D
理由:FTP是文件传输协议,是File Transfer Protocol的简称,它的作用是用于控制互联网上文件的双向传输,因此一定不会是即时聊天使用的;UDP是面向无连接的传输层协议,数据传输是不可靠的,它只管发,不管收不收得到;TCP是面向连接的,可靠的传输层协议;HTTP是超文本传输协议,对应于应用层,而HTTP是基于TCP的。
在App中混合HTML5开发App如何实现的。在App中使用HTML5的优缺点是什么?
在iOS中,通常是用UIWebView来实现,当然在iOS8以后可以使用WKWebView来实现.有以下几种实现方法:
通过实现UIWebView的代理方法来拦截,判断scheme是否是约定好的,然后iOS调用本地相关API来实现:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
在iOS7以后,可以直接通过JavaScripteCore这个库来实现,通过往JS DOM注入对象,而这个对象对应于我们iOS的某个类的实例。更详细请阅读:
OC JavaScriptCore与js交互
WKWebView新特性及JS交互
Swift JavaScriptCore与JS交互
可以通过WebViewJavascriptBridge来实现。具体如何使用,请大家去其它博客搜索吧!
优缺点:
iOS加入H5响应比原生要慢很多,体验不太好,这是缺点。
iOS加入H5可以实现嵌入别的功能入口,可随时更改,不用更新版本就可以上线,这是最大的优点。
介绍一下XMPP?有什么优缺点吗?
XMPP(Extensible Messaging and Presence Protocol,前称)是一种以XML为基础的开放式实时通信协议,是 经由互联网工程工作小组(IETF)通过的互联网标准。简单的说,XMPP就是一种协议,一种规定。就是说,在网络上传 东西,要建立连接,TCP/IP连接,建立后再传东西,而XMPP就是规定你传的东西的格式。XMPP是基于XML的协议。 优点
开放:
XMPP协议是自由、开放、公开的,并且易于了解。 而且在客户端 、 服务器 、 组件 、 源码库等方面,都已经各自有多种实现。 标准:
互联网工程工作小组( IETF )已经将Jabber的核心XML流协议以XMPP之名,正式列为认可的实时通信及Presence技术。 而XMPP的技术规格已被定义在RFC 3920及RFC 3921 。 任何IM供应商在遵循XMPP协议下,都可与Google Talk实现连接。 证实可用:
第一个Jabber(现在XMPP)技术是Jeremie Miller在1998年开发的,现在已经相当稳定;数以百计的开发者为XMPP技术而努 力。 今日的互联网上有数以万计的XMPP服务器运作着,并有数以百万计的人们使用XMPP实时传讯软件。
分散式:
XMPP网络的架构和电子邮件十分相像;XMPP核心协议通信方式是先创建一个stream,XMPP以TCP传递XML数据流,没有 中央主服务器。 任何人都可以运行自己的XMPP服务器,使个人及组织能够掌控他们的实时传讯体验。
安全:
任何XMPP协议的服务器可以独立于公众XMPP网络(例如在企业内部网络中),而使用SASL及TLS等技术的可靠安全性,已自 带于核心XMPP技术规格中。
可扩展:
XML 命名空间的威力可使任何人在核心协议的基础上建造定制化的功能;为了维持通透性,常见的扩展由XMPP标准基金会 。 弹性佳:
XMPP除了可用在实时通信的应用程序,还能用在网络管理、内容供稿、协同工具、文件共享、游戏、远程系统监控等。 多样性:
用XMPP协议来建造及布署实时应用程序及服务的公司及开放源代码计划分布在各种领域;用XMPP技术开发软件,资源及支持的 来源是多样的,使得使你不会陷于被“绑架”的困境。
缺点
数据负载太重:
随着通常超过70%的XMPP协议的服务器的数据流量的存在和近60%的被重复转发,XMPP协议目前拥有一个大型架空中存在的 数据提供给多个收件人。 新的议定书正在研究,以减轻这一问题。
没有二进制数据:
XMPP协议的方式被编码为一个单一的长的XML文件,因此无法提供修改二进制数据。 因此, 文件传输协议一样使用外部的 HTTP。 如果不可避免,XMPP协议还提供了带编码的文件传输的所有数据使用的Base64 。 至于其他二进制数据加密会话 (encrypted conversations)或图形图标(graphic icons)以嵌入式使用相同的方法。
NSURLConnection的几个常用的代理?
- NSURLConnectionDownloadDelegate :能够实现监听下载进度!但是下载之后,找不到下载好的文件!
- NSURLConnectionDataDelegate 是针对数据下载提供的方法!需要注意的是,需要自己实现监听进度的业务逻辑!
- 利用 NSURLConnection 的异步回调进行文件下载:
- 如果是小文件下载,问题不大! 可以直接使用异步回调进行下载
- 如果使用异步回调的方法进行大文件下载,则会出现内存暴涨的情况!
- 内存暴涨的原因: 大文件下载之后,默认是放在内存中的,所以下载的文件越大,越耗费内存.
- 存在的缺点: 使用异步回调实现文件,无法监听下载进度!并且对于大文件下载,会造成内存暴涨!
- 基于以上两点,一般,在进行文件下载的时候,使用代理回调监听下载进度!并且在下载文件的时候,手动管理内存!
NSURLConnection&NSURLSession的区别?
- 虽然 NSURLConnection 在 iOS 9.0 中已经被废弃,但是作为资深的 iOS 程序员,必须要了解 NSURLConnection 的细节,
- NSURLSession: 用于替代 NSURLConnection
- 支持后台运行的网络任务
- 暂停、停止、重启网络任务,不再需要 NSOperation 封装
- 请求可以使用同样的配置容器
- 不同的 session 可以使用不同的私有存储
- block 和代理可以同时起作用
- 直接从文件系统上传、下载
XML是什么? XML与HTML的区别?
- XML的简单使其易于在任何应用程序中读写数据,这使XML很快成为数据交换的唯一公共语言,虽然不同的应用软件也支持其它的数据交换格式,但不久之后他们都将支持XML,那就意味着程序可以更容易的与Windows,Mac OS,Linux以及其他平台下产生的信息结合,然后可以很容易加载XML数据到程序中并分析他,并以XML格式输出结果。
- XML去掉了之前令许多开发人员头疼的SGML(标准通用标记语言)的随意语法。在XML中,采用了如下的语法:
- 任何的起始标签都必须有一个结束标签。
- 可以采用另一种简化语法,可以在一个标签中同时表示起始和结束标签。这种语法是在大于符号之前紧跟一个斜线(/),例如<tag/ >。XML解析器会将其翻译成<tag></tag>。
- 标签必须按合适的顺序进行嵌套,所以结束标签必须按镜像顺序匹配起始标签,例如this is asamplestring。这好比是将起始和结束标签看作是数学中的左右括号:在没有关闭所有的内部括号之前,是不能关闭外面的括号的。
- 所有的特性都必须有值。
- 所有的特性都必须在值的周围加上双引号。
- XML与HTML的设计区别是:XML的核心是数据,其重点是数据的内容。而HTML 被设计用来显示数据,其重点是数据的显示。
- XML和HTML语法区别:HTML的标记不是所有的都需要成对出现,XML则要求所有的标记必须成对出现;HTML标记不区分大小写,XML则 大小敏感,即区分大小写。
网络图片处理问题中怎么解决一个相同的网络地址重复请求的问题?
利用字典(图片地址为key,下载操作为value)
sip是什么?
1> SIP(Session Initiation Protocol),会话发起协议
2> SIP是建立VOIP连接的 IETF 标准,IETF是全球互联网最具权威的技术标准化组织
3> 所谓VOIP,就是网络电话,直接用互联网打电话,不用耗手机话费
TCP/IP四层模型
-
TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇。TCP/IP协议簇分为四层,IP位于协议簇的第二层(对应OSI的第三层),TCP位于协议簇的第三层(对应OSI的第四层)。
-
应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。
-
传输层:在此层中,它提供了节点间的数据传送服务,如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。
-
互连网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)。
-
网络接口层:对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、Serial Line等)来传送数据。
文章如有问题,请留言,我将及时更正。