iOS | 面试知识整理 - 网络相关 (七)
1.如何理解HTTP?
HTTP本质上是一种协议,全称是Hypertext Transfer Protocol,即超文本传输协议。HTTP是一个基于TCP/IP通信协议来传递数据, 该协议用于规定客户端与服务端之间的传输规则,所传输的内容不局限于文本(其实可以传输任意类型的数据)。
一次HTTP可以看做是一个事务,其工作过程分为4步:
客户端与服务器建立连接
建立连接后,客户端给服务端发送请求
服务器收到消息后,给与响应操作
客户端收到消息后,展示到屏幕上,断开连接.
2.说一下 http中的 get 和 post 区别?
get 一般用于从服务端获取数据,post 用于向服务端发送数据
get 参数拼接在 url 地址里面, post 参数则放在其包体里,post 比 get 稍安全,隐秘
get 可以被缓存,可以存储在浏览器浏览历史中
3. 一次完整的HTTP请求过程?当我们在浏览器的地址栏输入 'http://www.baidu.com,然后回车,回车这一瞬间到看到页面到底发生了什么呢?
域名解析 --> 发起TCP的3次握手 --> 建立TCP连接后发起http请求 --> 服务器响应http请求,浏览器得到html代码 --> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等) --> 浏览器对页面进行渲染呈现给用户
4.请求报文简要说明?
请求报文主要包括: 请求行,请求头,请求体
请求行: 请求行包含请求方法(Method)、请求统一资源标识符(URI)、HTTP版本号
请求头:请求头主要存放对客户端想给服务端的附加信息下Host: 目标服务器的网络地址 Accept: 让服务端知道客户端所能接收的数据类型,如text/html /Content-Length: body的长度 等等
请求体: 真正需要发给服务端的数据
5.响应报文简要说明?
响应报文也包括三部分: 响应行,响应头和响应实体
1.状态行 :是服务端返回给客户端的状态信息,包含HTTP版本号、状态码、状态码对应的英文名称。
2.响应头: 附加信息和请求头类似
3.响应体: 服务器返回的真正数据
6.HTTP的特点有什么?
HTTP 是一个属于应用层的面向对象的协议,HTTP 协议一共有五大特点:
支持客户/服务器模式。
简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type(Content-Type是HTTP包中用来表示内容类型的标识)加以标记。
无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
7.常用的HTTP方法有哪些?
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法: OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
GET 请求指定的页面信息,并返回实体主体。
HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT 从客户端向服务器传送的数据取代指定的文档的内容。
DELETE 请求服务器删除指定的页面。
CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS 允许客户端查看服务器的性能。
TRACE 回显服务器收到的请求,主要用于测试或诊断。
8.TCP是什么?
tcp(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。是专门为了在不可靠的互联网络上提供一个可靠的端到端字节流而设计的,面向字节流。会有三次握手来建立连接,而且在数据传递时,有确认. 窗口. 重传. 拥塞控制机制,在数据传完之后,还会断开来连接用来节约系统资源。
9.UDP是什么?
UDP(用户数据报协议)是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去!UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境可以使用UDP
10.TCP和UDP区别
TCP面向连接(三次握手);UDP是无连接的,即发送数据之前不需要建立连接
TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付, Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。
UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。
每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
TCP对系统资源要求较多,UDP对系统资源要求较少。
11.什么是三次握手?
所谓三次握手(Three-Way Handshake)即建立TCP连接,是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。
第一次握手:客户端发送 syn 包(syn=j)到服务器,并进入 SYN_SEND 状态,等待服 务器确认;
第二次握手:服务器收到 syn 包,必须确认客户的 SYN(ack=j+1),同时自己也发 送一个 SYN 包(syn=k),即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态;
第三次握手:客户端收到服务器的 SYN+ACK 包,向服务器发送确认包 ACK(ack=k+1), 此包发送完毕,客户端和服务器进入 ESTABLISHED 状态,完成三次握手。 握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始 传送数据。
参考:http://www.cocoachina.com/programmer/20180314/22588.html
12.什么是四次挥手?
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送。
服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
服务器关闭客户端的连接,发送一个FIN给客户端。
客户端发回ACK报文确认,并将确认序号设置为收到序号加1。
13.什么是HTTTS?
HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer 或 Hypertext Transfer Protocol Secure,超文本传输安全协议),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
14.HTTPS连接过程简述
客户端向服务端发起 https 请求
服务器(需要申请 ca 证书),返回证书(包含公钥)给客户端
客户端使用根证书验证 服务器证书的有效性,进行身份确认
客户端生成对称密钥,通过公钥进行密码,发送给服务器
服务器使用私钥进行 解密,获取对称密钥
双发使用对称加密的数据进行通信
15.什么是对称加密
对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key)。对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中。
常见的有AES,DES,3DES等
16.非对称加密
非对称加密为数据的加密与解密提供了一个非常安全的方法,它使用了一对密钥,公钥(public key)和私钥(private key)。私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。非对称加密使用这对密钥中的一个进行加密,而解密则需要另一个密钥。
常见的: RSA算法
17. http 与https区别
HTTPS和HTTP的区别主要为以下四点:
https协议需要到ca申请证书,一般免费证书很少,需要交费。
http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全
18.说一下Session 和 Cookie 的概念?
Session 是服务器用来认证,追踪用户的数据结构,通过判断客户端传来的信息确定用户,确定用户唯一标志是客户端传来的 SessionId
Cookie 是客户端用来保存用户信息的机制, 初次会话时, http 协议会在 Cookie 里记录一个SessionID,之后每次会话时把 SessionID发给服务器
Session 一般用于用户验证, 他默认存储在服务器的一个文件里, 当然也可以存储在内存,数据库里
若是客户端禁用了Cookie, 则客户端会用URL重写技术,即会话时在URL的末尾加上 SessionID,发给服务器
19.什么Socket?
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。
20.什么是DNS?
域名系统(DomainNameSystem,缩写:DNS)是[互联网]的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问[互联网]
21.DNS劫持问题?
DNS劫持又称(域名劫持), 是指在劫持的网络范围内拦截域名解析的请求,分析请求的域名,把审查范围以外的请求放行,否则返回假的IP地址或者什么都不做使请求失去响应,其效果就是对特定的网络不能访问或访问的是假网址。
解决办法: 使用HTTPDNS
22.网络七层是什么?
OSI模型有7层结构,每层都可以有几个子层。 OSI的7层从上到下分别是 7 应用层 6 表示层 5 会话层 4 传输层 3 网络层 2 数据链路层 1 物理层 ;其中高层(即7、6、5、4层)定义了应用程序的功能,下面3层(即3、2、1层)主要面向通过网络的端到端的数据流。
应用层
网络服务与最终用户的一个接口。
协议有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP
表示层
数据的表示、安全、压缩。(在五层模型里面已经合并到了应用层)
格式有,JPEG、ASCll、DECOIC、加密格式等
3 .会话层
建立、管理、终止会话。(在五层模型里面已经合并到了应用层)
对应主机进程,指本地主机与远程主机正在进行的会话
传输层
定义传输数据的协议端口号,以及流控和差错校验。
协议有:TCP UDP,数据包一旦离开网卡即进入网络传输层
网络层
进行逻辑地址寻址,实现不同网络之间的路径选择。
协议有:ICMP IGMP IP(IPV4 IPV6) ARP RARP
数据链路层
建立逻辑连接、进行硬件地址寻址、差错校验 [2] 等功能。(由底层网络定义协议)
将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正。
物理层
建立、维护、断开物理连接。(由底层网络定义协议)
23.项目中网络层如何做安全处理?
尽量使用https
不要传输明文密码
Post并不比Get安全
不要使用301跳转
http请求都带上MAC
http请求使用临时密钥
AES使用CBC模式
24.断点续传如何实现?
通过HTTP,可以非常方便的实现断点续传。
断点续传主要依赖于HTTP头部定义的Range,应用可以通过HTTP请求曾经获取失败的资源的某一个返回或者部分来恢复下载该资源。当然并不是所有风服务器都支持Range,所以不支持Range的不在我们考虑之内。Range是以字节计算的,请求的时候不比给我结尾字节数,因为请求方并不一定知道资源的大小。
通过这个关键字可以告诉服务器返回哪些数据给我。
比如:
bytes=500-999 表示第500-第999字节
bytes=500- 表示从第500字节往后的所有字节
然后我们再根据服务器返回的数据,将得到的data数据拼接到文件后面,就可以实现断点续传了。
25.什么是WebSocket,解决了什么问题?
WebSocket是应用层第七层上的一个应用层协议,它必须依赖 HTTP 协议进行一次握手 ,握手成功后,数据就直接从 TCP 通道传输,与 HTTP 无关了
Websocket的数据传输是frame形式传输的,比如会将一条消息分为几个frame,按照先后顺序传输出去。这样做会有几个好处:
大数据的传输可以分片传输,不用考虑到数据大小导致的长度标志位不足够的情况。
和http的chunk一样,可以边生成数据边传递消息,即提高传输效率。
总之:WebSocket 的实现分为握手,数据发送/读取,关闭连接。
26.什么是心跳?
心跳就是用来检测TCP连接的双方是否可用
客户端发起心跳Ping(一般都是客户端),假如设置在10秒后如果没有收到回调,那么说明服务器或者客户端某一方出现问题,这时候我们需要主动断开连接。
27.如何保证公钥不被篡改?
解决方法:将公钥放在数字证书中。只要证书是可信的,公钥就是可信的。
28. 公钥加密计算量太大,如何减少耗用的时间?
解决方法:每一次对话(session),客户端和服务器端都生成一个"对话密钥"(session key),用它来加密信息。由于"对话密钥"是对称加密,所以运算速度非常快,而服务器公钥(非对称加密)只用于加密"对话密钥"本身,这样就减少了加密运算的消耗时间。
29.AF中常驻线程的实现
使用单例创建线程 添加到runloop中,且加了一个NSMachPort,来防止这个新建的线程由于没有活动直接退出。【 使用MachPort配合RunLoop进行线程保活】
AF3.x为什么不再需要常驻线程?
NSURLConnection的一大痛点就是:发起请求后,这条线程并不能随风而去,而需要一直处于等待回调的状态。
NSURLSession发起的请求,不再需要在当前线程进行代理方法的回调!可以指定回调的delegateQueue,这样我们就不用为了等待代理回调方法而苦苦保活线程了。
同时还要注意一下,指定的用于接收回调的Queue的maxConcurrentOperationCount设为了1,这里目的是想要让并发的请求串行的进行回调。
为什么要串行回调?
- (AFURLSessionManagerTaskDelegate *)delegateForTask:(NSURLSessionTask*)task {NSParameterAssert(task); AFURLSessionManagerTaskDelegate *delegate =nil; [self.lock lock];//给所要访问的资源加锁,防止造成数据混乱delegate =self.mutableTaskDelegatesKeyedByTaskIdentifier[@(task.taskIdentifier)]; [self.lock unlock];returndelegate;}
这边对 self.mutableTaskDelegatesKeyedByTaskIdentifier 的访问进行了加锁,目的是保证多线程环境下的数据安全
面试官可能会问你:为什么AF3.0中需要设置self.operationQueue.maxConcurrentOperationCount = 1;而AF2.0却不需要?
--->>>
AF3.0的operationQueue是用来接收NSURLSessionDelegate回调的,鉴于一些多线程数据访问的安全性考虑,设置了maxConcurrentOperationCount = 1来达到串行回调的效果
--->>>
AF2.0的operationQueue是用来添加operation并进行并发请求的,所以不要设置为1。
30. XMPP是什么?
XMPP 是一种基于XML的协议,XMPP是一个分散型通信网络
XMPP是一种基于标准通用标记语言的子集XML的协议,它继承了在XML环境中灵活的发展性,XMPP有超强的扩展性。XMPP中定义了三个角色,客户端,服务端,网关。通信能够在这个三者的任意两个之间双向发生,而他们的传输是XML流
XMPP工作原理:所有从一个客户端到另一个客户端的消息和数据都要通过服务端
XMPP允许建立并行的TCP套接字链接对所有连接上的客户端和服务器端。持久的套接字的连接使得XMPP能够更有效的支持高级的具有存在能力的应用在带宽和处理资源的使用中。
小结:
而XMPP的核心部分就是一个在网络上分片断发送XML的流协议。这个流协议是XMPP的即时通讯指令的传递基础,也是一个非常重要的可以被进一步利用的网络基础协议。所以可以说,XMPP用TCP传的是XML流。
31.MAC地址和ip地址的区别?
MAC地址就是在媒体接入层上使用的地址,也叫物理地址、硬件地址或链路地址,由网络设备制造商生产时写在硬件内部。
IP即指使用TCP/IP协议指定给主机的32位地址。IP地址由用点分隔开的4个8八位组构成,如192.168.0.1就是一个IP地址,这种写法叫点分十进制格式。
IP地址相当于你现在所处的地址,会随着你的移动发生改变,而mac地址相当于你的身份证号这些个人信息,是独一无二的,不会改变的。
32 .抓包工具抓取HTTPS的原理
需要做的事情是对客户端伪装服务端,对服务端伪装客户端,具体
截获真实客户端的HTTPS请求,伪装客户端向真实服务端发送HTTPS请求
接受真实服务器响应,用Charles自己的证书伪装服务端向真实客户端发送数据内容
没有配置HTTPS 证书时,虽然是HTTPS请求确是能抓到数据,如果APP内配置了https证书,就抓不到数据了,
33.Ping是什么协议
ping也属于一个通信协议,是TCP/IP协议的一部分。利用“ping”命令可以检查网络是否连通,
PING (Packet Internet Groper),因特网包探索器,用于测试网络连接量的程序。Ping发送一个ICMP(Internet Control Messages Protocol)即因特网信报控制协议;回声请求消息给目的地并报告是否收到所希望的ICMPecho (ICMP回声应答)。它是用来检查网络是否通畅或者网络连接速度的命令。作为一个生活在网络上的管理员或者黑客来说,ping命令是第一个必须掌握的DOS命令,它所利用的原理是这样的:利用网络上机器IP地址的唯一性,给目标IP地址发送一个数据包,再要求对方返回一个同样大小的数据包来确定两台网络机器是否连接相通,时延是多少。