iOS面试题-网络协议

语言: CN / TW / HK

TCP与UDP区别

TCP是请求与响应两者之间建立链接进行传输, UDP是两者之间通过数据包进行传输,两者的区别也是基于此。

TCP:有连接的、稳定的、有序的、占用资源大的

UDP:无连接的、可能丢包的、乱序的、占用资源小的

注:Socket是TCP协议,Http也是TCP协议,只是Socket是建立并保持长连接,Http是短连接

三次握手是什么

三次握手是服务器建立连接的方式。

第一次握手:A通知B,A准备好了

建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。

第二次握手:B告诉A,他知道A准备好了,B自己也准备好了

服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:A告诉B,A知道了B也准备好了。

客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

四次挥手是什么

四次挥手是服务器关闭连接的方式。

第一次挥手:A通知B,我要断开连接了。

客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。

第二次挥手:B通知A我知道你要断开连接了。

服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文,在这之前还需要接受服务器发送的最后的数据)。

第三次挥手:B通知A,所有的收尾工作都做完了,可以断开连接了

服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。

第四次挥手:A通知B,我知道你收尾完事儿了。没有意外发生的话,我要2MSL之后要开始断开连接了。

客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

关于三次握手四次挥手的其他面试题,见下面的参考连接

参考连接: TCP的三次握手与四次挥手理解及面试题

socket 和 websocket 的区别

WebSocket是Http协议的升级版,Http只能支持客户端主动发起请求,是单向通信协议

WebSocket是双向通信协议,可以双向发起请求,替代轮询,但是WebSocket本质上还是一个类Http协议,是短连接。

而Socket本质上是长链接,他们的区别也就是短连接和长连接的区别了

HTTP 与 HTTPS 的区别

HTTP:超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。

HTTPS:是以安全为目标的 HTTP 通道,是 HTTP 的安全版。HTTPS 的安全基础是 SSL。SSL 协议位于传输层的TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。

HTTP 与 HTTPS 的区别

1、HTTPS 协议需要到 CA (Certificate Authority,证书颁发机构)申请证书,一般免费证书较少,因而需要一定费用。(以前的网易官网是http,而网易邮箱是 https 。)

2、HTTP 是超文本传输协议,信息是明文传输,HTTPS 则是具有安全性的 SSL 加密传输协议。

3、HTTP 和 HTTPS 使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

4、HTTP 的连接很简单,是无状态的。HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全。(无状态的意思是其数据包的发送、传输和接收都是相互独立的。无连接的意思是指通信双方都不长久的维持对方的任何信息。)

参考资料: HTTP和HTTPS的区别

HTTPS的通讯原理

HTTPS是以安全为目标的 HTTP 通道,是 HTTP 的安全版。HTTPS 的安全基础是 SSL。通过SSL 握手协议通讯双方进行身份认证、协商加密算法、交换加密密钥,通过SSL 记录协议为高层协议提供数据封装、压缩、加密等基本功能的支持。通过这样的方式,来实现身份校验的安全性、数据保密性、数据完整性。

Http的get、post的区别

Get方式是将参数拼接在URL上进行提交,Post是将参数转换成二进制然后放在HttpBody中进行提交,这是他们两个差异的根本,由此可以引出以下几点不同:

1 Get请求可以被缓存,但是Post不可以

2 Get的参数可以保留在历史中,Post的参数不会

3 因为Get是将参数放在URL中,而URL长度限制为最大2048个字符,这一限制Post方式是不存在的

4 安全性方面Get方式是URL明文参数的形式,所以是所有人都可见的,而Post方式是不会显示在URL中的

5 数据类型限制,因为Get方式是URL传递,参数只允许是ASCII字符,而Post对参数类型没有限制

参考链接: Post和Get的区别

怎么看post比get更安全的说法

这个安全分两个概念去理解:

1 信息安全。

那肯定是Post比Get相对更安全一些。因为Get参数是URL明文,可以直接查看参数;而且Get是可以被浏览器缓存,服务器也可以把其保存在日志中。

注:这个信息安全其实也分协议的,HTTP协议中,即使是Post方式也可以通过抓包分析数据拿到参数,在HTTPS协议中,Post请求会经过SSL加密,会更安全,但是Get方式因为URL明文,依旧存在遍历注入的危险。

2 业务安全。

在业务安全方面,两者刚好相反,Get比Post安全在HTTP协议的设计上,GET方式是幂等性的,用户对于同一操作发起的一次请求或者多次请求的结果是一致的,所以被HTTP定义为安全的,但是Post是非幂等性的。这里其实更倾向于不同的场景应用不同的方式。

Http常见的返回的状态码

HTTP的状态码有其自己的分类:

1XX:

通知,不常见。一般用在与HTTP服务器沟通的时候用的。

2XX:

操作成功,常见。经常用的是200(操作成功)

3XX:

操作被重定向,不常见。300(服务器存在多个目标资源)

4XX:

客户端错误,常见。经常用到有403(权限拒绝)、404(URL找不到)、405(请求方式不支持)。

5XX:

服务端错误,常见。经常用到有500(服务器抛出异常)、502(服务器的HTTP出现错误)、504(服务器代理无法访问)

加密算法简单介绍

对称式加密技术

对称式加密就是加密和解密使用同一个密钥,通常称之为“Session Key ”这种加密技术在当今被广泛采用,如美国政府所采用的DES加密标准就是一种典型的“对称式”加密法,它的Session Key长度为56bits。

非对称式加密技术

非对称式加密就是加密和解密所使用的不是同一个密钥,通常有两个密钥,称为“公钥”和“私钥”,它们两个必需配对使用,否则不能打开加密文件。这里的“公钥”是指可以对外公布的,“私钥”则不能,只能由持有人一个人知道。它的优越性就在这里,因为对称式的加密方法如果是在网络上传输加密文件就很难不把密钥告诉对方,不管用什么方法都有可能被别人窃听到。而非对称式的加密方法有两个密钥,且其中的“公钥”是可以公开的,也就不怕别人知道,收件人解密时只要用自己的私钥即可以,这样就很好地避免了密钥的传输安全性问题。

常见的加密算法

1 DES算法对称算法

数据加密标准,速度较快,适用于加密大量数据的场合;

2 RSA算法非对称加密算法

首先, 找出三个数, p, q, r,

其中 p, q 是两个不相同的质数, r 是与 (p-1)(q-1) 互为质数的数。

p, q, r 这三个数便是 private key。

接着, 找出 m, 使得 rm == 1 mod (p-1)(q-1)…..

这个 m 一定存在, 因为 r 与 (p-1)(q-1) 互质, 用辗转相除法就可以得到了。

再来, 计算 n = pq…….

m, n 这两个数便是 public key

3 AES算法对称算法

是下一代的加密算法标准,速度快,安全级别高,在21世纪AES 标准的一个实现是 Rijndael 算法。依靠大算力超长时间才能破解