1. 进程和线程的区别
根本区别:进程
是操作系统资源分配的基本单位,而线程
是任务调度和执行的基本单位
参考文章
2. HTTPS的握手过程
HTTPS
基于SSL
的HTTP协议
HTTPS = HTTP + SSL\TLS
TLS/SSL中使用了非对称加密,对称加密以及HASH算法。握手过程的具体描述如下:
- 浏览器将自己支持的一套加密规则发送给网站。
- 网站从中选出一组
加密
算法与HASH
算法,并将自己的身份信息以证书
的形式发回给浏览器。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。 - 浏览器获得网站证书之后浏览器要做以下工作:
- 验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示。
- b) 如果证书受信任,或者是用户接受了不受信的证书,浏览器会生成一串
随机数
的密码,并用证书中提供的公钥
加密。 - c) 使用约定好的
HASH
算法计算握手消息
,并使用生成的随机数
对消息进行加密
,最后将之前生成的所有信息发送给网站。
- 网站接收浏览器发来的数据之后要做以下的操作:
- a) 使用自己的
私钥
将信息解密取出密码,使用密码解密浏览器发来的握手消息,并验证HASH
是否与浏览器发来的一致。 - b) 使用
密码
加密一段握手消息
,发送给浏览器。
- 浏览器解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束,之后所有的通信数据将由之前浏览器生成的
随机密码
并利用对称加密
算法进行加密。
HTTPS协议和HTTP协议的区别:
- HTTPS 协议需要到CA申请证书,一般免费证书很少,需要交费。
- HTTP 是超文本传输协议,信息是
明文
传输,https 则是具有安全性的ssl加密
传输协议。 - HTTP 和 HTTPS 使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。
- HTTP 的连接很简单,是无状态的 。
- HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议, 要比http协议安全。
参考文章
如何理解HTTP协议是无状态的
HTTP协议是无状态的,指的是协议对于
事务处理没有记忆能力
,服务器不知道客户端是什么状态。也就是说,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系。HTTP是一个无状态的面向连接
的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)。
cookie和session的区别
在这种客户端与服务器进行动态交互的Web应用程序出现之后,HTTP无状态的特性严重阻碍了这些交互式应用程序的实现,毕竟交互是需要承前启后的,简单的购物车程序也要知道用户到底在之前选择了什么商品。于是,两种用于保持HTTP状态的技术就应运而生了,一个是Cookie,而另一个则是Session。
Cookie是客户端的存储空间,由浏览器来维持。具体来说
cookie
机制采用的是在客户端保持状态的方案
,而session
机制采用的是在服务器端保持状态
的方案。同时我们也看到,由于才服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上还有其他选择,比如说重写URL和隐藏表单域。
简单的说就是cookie和session起到保存客户端状态的作用,但是它们并没有改变http协议本身这种无状态的性质,可以理解为在应用上做了状态保留。
什么是长连接、短连接?
短连接的操作步骤是:
建立连接——数据传输——关闭连接...建立连接——数据传输——关闭连接
长连接的操作步骤是:
建立连接——数据传输...(保持连接)...数据传输——关闭连接
在
HTTP/1.0
中,默认使用的是短连接
。也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。如果客户端浏览器访问的某个HTML或其他类型的 Web页中包含有其他的Web资源,如JavaScript文件、图像文件、CSS文件等;当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话。
但从
HTTP/1.1
起,默认使用长连接
,用以保持连接特性。使用长连接的HTTP协议,会在响应头有加入这行代码:
Connection:keep-alive
`Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。`
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的 TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接要客户端和服务端都支持长连接。
HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。
3. 什么是中间人攻击?怎么预防
4. TCP、UDP的区别,为什么TCP是安全的
TCP与UDP区别总结:
- TCP
面向连接
(如打电话要先拨号建立连接);UDP是无连接
的,即发送数据之前不需要建立连接 - TCP提供
可靠
的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠
交付 - TCP面向
字节流
,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文
的
UDP没有拥塞控制
,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等) - 每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
- TCP首部开销20字节;UDP的首部开销小,只有8个字节
- TCP的逻辑通信信道是
全双工
的可靠信道,UDP则是不可靠信道
- TCP传输速度
慢
,适合少量数据;UDP传输速度快
,适合传输大量数据
TCP的安全可靠体现在:
TCP在传递数据之前,会有三次握手
来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制
机制,在数据传完后,还会四次挥手
断开连接用来节约系统资源。
参考文章
5. TCP的握手过程?为什么进行三次握手,四次挥手
TCP消息头
序列号seq
字段:占32比特。用来标识从TCP源端向TCP目标端发送的数据字节流,它表示在这个报文段中的第一个数据字节。
确认号ack
字段:占32比特。只有ACK标志为1时,确认号字段才有效。它包含目标端所期望收到源端的下一个数据字节。
标志位
字段(U、A、P、R、S、F):占6比特。各比特的含义如下:
URG:紧急指针(urgent pointer)有效。
ACK:为1时,确认序号有效。
PSH:为1时,接收方应该尽快将这个报文段交给应用层。
RST:为1时,重建连接。
SYN:为1时,同步程序,发起一个连接。
FIN:为1时,发送端完成任务,释放一个连接。
TCP提供一种面向连接的可靠的字节流服务,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接,建立一条连接有以下过程。
- 请求端(客户端)发送一个
SYN
段指明客户打算连接的服务器的端口,以及初始序列号
(ISN),这个SYN为报文段1. - 服务器发回包含服务器的初始序列号的SYN报文段(报文段2)作为应答。同时,将确认序号设置为客户的ISN加1以对客户的SYN报文段进行确认。一个SYN将占用一个字符。
- 客户必须将明确序号设置为服务器的ISN加1以对服务器的SYN报文段进行确认(报文段3)
- 这三个报文段完成连接的建立,这个过程成为三次握手。
为什么需要“三次握手”
在谢希仁著
《计算机网络》
第四版中讲“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”
。在另一部经典的《计算机网络》一书中讲“三次握手”的目的是为了解决“网络中存在延迟的重复分组”
的问题。这两种不用的表述其实阐明的是同一个问题。
谢希仁版《计算机网络》中的例子是这样的,“已失效的连接请求报文段”
的产生在这样一种情况下:client发出的第一个连接请求报文段
并没有丢失,而是在某个网络结点长时间的滞留
了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。”。 主要目的防止server端一直等待,浪费资源。
连接终止协议(四次挥手)
由于TCP连接是全双工
的,因此每个方向
都必须单独进行关闭
。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
(1) TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送(报文段4)。
(2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。
(3) 服务器关闭客户端的连接,发送一个FIN给客户端(报文段6)。
(4) 客户段发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)。
6. 堆和栈区的区别?谁的占用内存空间大
1.内存分区
(1)常量区
:存放常量字符串,程序结束后由系统释放
(2)代码区
:存放函数的二进制代码
(3)全局区\静态区
:包括两个部分:
初始化过的:初始化的全局变量和静态变量在一块区域
未初始化过的:未初始化的全局变量和静态变量在相邻的另一块区域;
(4)堆空间
:动态malloc申请的空间,引用的变量实例化存储的空间
(5)栈空间
:用来存放局部变量,形参之类,未进行实例化的引用申请的变量
2.堆区和栈区区别:
(1)管理方式不同:栈直接由编译器
管理(产生和消除),堆由程序员
管理,程序员管理其的产生和消除
(2)空间大小不同:栈占用的空间较小
,而堆占用的空间较大
(3)能否产生碎片不同:栈不会产生碎片(连续的
),但是堆会产生(不连续
),会有内存泄露的问题
(4)生长方向不同:栈地址从高到
分配,堆区的地址是从低到高
分配
(5)分配方式不同:
- 堆是动态分配和回收内存的,没有静态分配的堆
- 栈有两种分配方式:静态分配和动态分配
- 静态分配是系统编译器完成的,比如局部变量的分配
- 动态分配是有alloc函数进行分配的,但是栈的动态分配和堆是不同的,它的动态分配也由系统编译器进行释放,不需要程序员手动管理
(6)分配效率不同:栈是由内存分配的,系统专门为其准备寄存器
,同时有专门的出栈和入栈指令,因而效率比较高
。而堆空间则是C库分配的,可能会存在碎片的原因导致内存不连续,因而效率比较低
;
7. 加密算法:对称加密算法和非对称加密算法区别
8. 常见的对称加密和非对称加密算法有哪些
加密与HASH算法如下:
- 非对称加密算法:RSA,DSA/DSS,用于在握手过程中加密生成的密码。
- 对称加密算法:AES,RC4,DES,3DES,用于对真正传输的数据进行加密。
- HASH算法:MD5,SHA1,SHA256,验证数据的完整性。
9. MD5、SHA1、SHA256区别
产生的哈希值
不一样
MD5输出128位、SHA1输出160位、SHA256输出256位
10. charles抓包过程?不使用charles,4G网络如何抓包
Charles
抓包原理,就是Charles作为“中间人代理”
,拿到了 服务器证书公钥 和 HTTPS连接的对称密钥,前提是客户端选择信任并安装
Charles的CA证书,否则客户端就会“报警”并中止连接
11. HTTP的请求
HTTP请求报文解剖
HTTP 请求报文由四部分组成,分别是请求行、请求头、空行和请求体,其中空行也是组成部分之一,作用是进行分隔,必不可少。:
image.png1 请求行
第一行为请求行,由请求方法、URL和HTTP协议版本3个字段组成
这一行比较好理解,只有请求方法的类型比较多,有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT,其中GET、POST最为常用,这里详细介绍下
GET和POST的区别:
1.GET将请求信息放在URL,POST放在报文体中。
2.GET参数有长度限制(受限于url长度,具体的数值取决于浏览器和服务器的限制),而POST无限制
3.GET是明文传输直接可以看到,POST是放在请求体中,但是开发者可以通过抓包工具看到,也相当于是明文的。
4.GET请求会缓存在浏览器历史记录中,POST请求不会
2 请求头
请求头部由 键/值对 组成,每行一对,键和值用冒号“:”(英文)分隔。请求头部告知服务器所有有关于客户端请求的信息,典型的请求头有:
User-Agent:产生请求的用户代理信息(浏览器信息): Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36等;
Accept:客户端可识别的内容类型列 :text/html, application/xhtml+xml, application/xml;
Accept-Language:客户端可接受的自然语言 - zh-CN,zh;q=0.8,en;q=0.6,id;q=0.4;
Accept-Encoding:客户端可接受的编码压缩格式 - gzip, deflate, sdch, br
Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机
connection:连接方式,有close和keep-alive两种。
close:告诉WEB服务器或代理服务器,在完成本次请求的响应后,断开连接
keep-alive:告诉WEB服务器或代理服务器。在完成本次请求的响应后,保持连接,以等待后续请求
Cookie:存储于客户端扩展字段,向同一域名的服务端发送属于该域的cookie - PSTM=1490844191; BIDUPSID=2145FF54639208435F60E1E165379255;
3 空行
用户进行内容分割,表示请求头到此为止,下一行的内容不再是请求头。
4 请求体
请求体包含的就是请求数据,它将一个页面表单中的组件值通过param1=value1¶m2=value2
的键值对形式编码成一个格式化串,它承载多个请求参数的数据。不但报文体可以传递请求参数,请求URL也可以通过类似于“? param1=value1¶m2=value2”
的方式传递请求参数。
HTTP 响应报文
HTTP响应也由四个部分组成,分别是:状态行、响应头、空行和响应体。形式上除了状态行之外,其他三个部分与请求报文类似。
1. 状态行(响应行)
①报文协议及版本;
②状态码及状态描述;
状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。
1xx:指示信息--表示请求已接收,继续处理。
2xx:成功--表示请求已被成功接收、理解、接受。
3xx:重定向--要完成请求必须进行更进一步的操作。
4xx:客户端错误--请求有语法错误或请求无法实现。
5xx:服务器端错误--服务器未能实现合法的请求。
各类型常见状态代码、状态描述的说明如下:
200 OK:客户端请求成功。
400 Bad Request:客户端请求有语法错误,不能被服务器所理解。
401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。
403 Forbidden:服务器收到请求,但是拒绝提供服务。
404 Not Found:请求资源不存在,举个例子:输入了错误的URL。
500 Internal Server Error:服务器发生不可预期的错误。
503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常,举个例子:HTTP/1.1 200 OK(CRLF)。
2. 响应头
和请求报文的请求头类似,响应头也由键值对组成,每行一对,键和值用英文冒号 : 分隔。响应头域允许服务器传递不能放在状态行的附加信息,这些域主要描述服务器的信息和Request-URI进一步的信息,典型的响应头有:
Server:包含处理请求的原始服务器的软件信息;
Date:服务器日期;
Content-Type:返回的资源类型 (MIME);
Connection:连接方式;
close:连接已经关闭;
keep-alive:连接已保持,在等待本次连接的后续请求;
Cache-Control:缓存控制;
Expires:设置过期时间;
Set-Cookie:设置 Cookie 信息。
4. 响应体
服务器返回的数据,就是我们通常的 json 数据
12. 说一下NSURLSession具体的实现原理
NSURLSession 是 iOS7.0 后推出的,用于代替 NSURLConnection.
NSURLSession提供了四大任务:
image.pngDataTask 数据请求,网络请求中最常用的请求之一
DownloadTask 文件下载,获取进度、断点续传
UploadTask 文件上传
StreamTask TCP链接(iOS 9+)
网友评论