iOS网络相关
网络基础术语
-
HTTP
:超文本传输协议,信息是明文传输的。 -
HTTPS
:添加了加密及认证机制的HTTP,具有安全性的ssl加密传输协议。 -
DNS
:域名系统。 -
FTP
:文件传输协议。 -
TCP
:传输控制协议 -
UDP
:用户数据报协议。 -
TCP/IP协议簇
:TCP/IP
不是一个协议,而是一个协议簇的统称。通常使用的网络是在TCP/IP协议簇的基础上运行的。应用层的HTTP
、DNS
、FTP
,传输层的TCP
、UDP
,网络层的IP
等等都属于它内部的一个子集。 -
URI
:全称统一资源标识符。 -
URL
:全称统一资源定位符。
里面包括了IP协议,IMCP协议,TCP协议,以及http、ftp、pop3协议等等。
一、HTTP协议
1. HTTP协议简介
HTTP是基于TCP的应用层协议
。不管是移动客户端还是PC端,访问远程的网络资源经常使用 HTTP协议。
OSI网络七层协议从上到下分别是 :
应用层
、表示层
、会话层
、传输层
、网络层
、数据链路层
、物理层
。
TCP/IP协议分层从上到下分别是 :
应用层
、传输层
、网络层
、数据链路层
、物理层
。
2. HTTP协议的作用
HTTP的全称是Hypertext Transfer Protocol,超文本传输协议。
- 规定客户端和服务器之间的数据传输格式
- 让客户端和服务器能有效的进行数据沟通
3. HTTP的特点
无连接、 无状态,HTTP的持久连接、Cookie/Session
- HTTP的无状态:HTTP协议对于事务处理没有记忆能力。
- 每次的请求都是独立的,它的执行情况和结果与前面请求、后面请求无直接关系的。即它不会受前面请求应答情况直接影响,也不会直接影响后面的请求应答情况。
- 服务器中没有保存客户端的状态,客户端必须每次带上自己的状态去请求服务器。
- 标准的HTTP协议指的是不包括cookies,session,application的HTTP协议
HTTP是一种无状态的协议,为了保存状态引入了 Cookie 技术:
- Cookie通过在请求和响应报文中写入Cookie信息来控制客户端的状态。
- 根据服务器发送响应报文内
Set-Cookie
的首部字段信息,通知客户端保存Cookie
。- 客户端在下次发送请求时带上
Cookie
值,这样服务器通过Cookie
值就能知道是谁发送的请求。
-
HTTP的持久连接
- 非持久连接:每个连接处理一个请求-响应事务。
- 持久连接:每个连接可以处理多个请求-响应事务(服务器发出响应后让TCP连接继续打开着,同一对客户/服务器之间的后续请求和响应可以通过这个连接发送)。
-
HTTP/1.0
使用非持久连接。HTTP/1.1
默认使用持久连接Connection: keep-alive
。
- HTTP持久连接是怎么判断一个请求是否结束的?
-
Content-length
:根据所接收字节数是否达到Content-length
值。 -
chunked(分块传输):Transfer-Encoding
。当选择分块传输时,响应头中可以不包含Content-Length,服务器会先回复一个不带数据的报文(只有响应行和响应头和\r\n),然后开始传输若干个数据块。当传输完若干个数据块后,需要再传输一个空的数据块,当客户端收到空的数据块时,则客户端知道数据接收完毕。
4. 为什么选择使用HTTP?
- 简单快速:因为HTTP协议简单,所以HTTP服务器的程序规模小,因而通信速度很快
- 灵活:HTTP允许传输任意类型的数据
- 使用非 常持续链接:限制每次链接只处理一个请求,服务器对客户端的请求作出响应之后,马上端口链接,节省传输时间
二、HTTP的通信过程
想要使用HTTP协议想服务器索取数据,首先要了解HTTP通信的完整过程,主要分为两大步骤:
- 请求:客户端向服务器索要数据
- 响应:服务器返回给客户端响应的数据
1. HTTP通信过程 之 请求
HTTP协议规定,一个完整的有客户端给服务器的HTTP请求中包含请求行、请求头、请求体三个部分:
- 请求行:包含了请求方法,请求URL,HTTP协议版本
'Method: POST' // 请求方法
'URL: http://sy.aerozhonghuan.com:81/test/qingqi/visitreport-agent-qk/getDropDownList' // 请求URL
'Protocol: HTTP/1.1' // HTTP协议版本
- 请求头:包含了客户端请求的主机地址,对客户端的环境描述等信息
'Host: sy.aerozhonghuan.com:81' // 客户端想访问的服务器主机地址
'User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 13_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148' // 用户代理:即客户端的类型,客户端的软件环境
'Accept: application/json, text/javascript, */*;' // 客户端所能接收的数据类型
'Accept-Language: zh-cn' // 客户端的语言环境
'Accept-Encoding: gzip, deflate' // 客户端支持的数据压缩格式
'cookie' // HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给服务器。
'Connection: keep-alive' // (HTTP/1.1协议开始默认进行持久连接)
'Referer: url' // 包含一个URL,用户从该URL代表的页面出发访问当前请求的页面
- 请求体:客户端发给服务器的具体数据
{token: "xxx", startDate: "2020-06-01", endDate: "2020-06-30"}
2. HTTP通信过程 之 响应
客户端向服务器发送请求,服务器应当做出响应,即返回数据给客户端 。HTTP协议规定一个完整的HTTP响应中包含以下内容:
- 状态行:包含了HTTP协议版本,状态码,短语(状态描述)
'Protocol: HTTP/1.1' // HTTP协议版本
'Status Code: 200'
'OK'
- 响应头:包含了对服务器的描述,对返回数据的描述
'Server: nginx/1.10.1' // 服务器的类型
'Content-Type: application/json;charset=UTF-8' // 返回数据的类型
'Date: Sun, 28 Jun 2020 11:09:06 GMT' // 响应的时间
- 实体内容:服务器返回给客户端的具体数据
{"resultCode":200,"message":"OK","data":{"list":[{"value":1,"name":"大客户拜访"},{"value":2,"name":"代理商检核"}]}}
- 常见响应状态码
状态码 | 短语(状态描述) | 中文描述 |
---|---|---|
200 | OK | 请求成功 |
400 | Bad Request | 客户端请求语法错误,服务器无法解析 |
404 | Not Found | 服务端无法根据客户端的请求URL找到资源 |
500 | Internal Server Error | 服务器内部错误,无法完成请求 |
三、发送HTTP请求的方法
1. 在HTTP/1.1协议中,定义了8种发送http请求的方法:
HTTP请求方法 | 作用 |
---|---|
GET | 查:向服务器请求一个文件 |
POST | 改:向服务器发送数据,让服务器进行修改更新 |
PUT | 增:向服务器发送数据并存储在服务器内部 |
DELETE | 删:从服务器删除数据 |
HEAD | 检查一个对象是否存在 |
CONNECT | 对通道提供支持 |
TRACE | 跟踪到服务器的路径 |
OPTIONS | 查询服务器的性能 |
2. GET和POST请求
- GET和POST请求介绍
- GET:在请求URL后面以?的形式拼接发给服务器的参数,多个参数之间用&隔开,参数长度有限。
- POST:发给服务器的参数全部放在请求体中 ,理论上传递的数据量没有限制(具体还得看服务器的处理能力)。
- GET和POST请求响应的不同
- GET和POST本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。
- 在响应时,GET产生一个TCP数据包;POST产生两个TCP数据包:
- 对于GET方式的请求,浏览器会把Header和实体主体一并发送出去,服务器响应200(返回数据);
- 而对于POST,浏览器先发送Header,服务器响应100 Continue,浏览器再发送实体主体,服务器响应200 OK(返回数据)。
- GET和POST优缺点
- GET优点:
- 请求方便:直接用一个完整的路径去请求获取数据。
- 对服务器来说比较安全:发送求请求过程中不会发送请求体,不会破坏服务器的封装性。从这个角度来讲,GET相对于POST安全。
- GET缺点:
- 数据不安全:GET请求数据会暴露参数信息,任何人都可见。
- 参数长度受限:GET方式通过直接拼接参数向服务器请求数据,网址输入的长度有上限,参数特别多的时候,会被截断。(注意:GET参数长度限制为2048个字符)
- POST优点:
- 数据安全:发送请求时,参数封装在请求体中发送,不会直接暴露参数信息。从这个角度讲,POST相对GET安全一些。(注意:如果被抓包,明文参数一样不安全。)
- 参数大小不受限:使用POST请求数据时,通过请求体来传递参数,参数的大小远远要大于通过GET方式传递的参数大小,比较灵活。
- POST缺点:
- 请求不方便:请求时要通过请求体发送参数,不如GET请求便捷。
- 对服务器来说不安全:POST请求时,会向服务器发送请求体,破坏了服务器的封装性。从这个角度讲,相对于GET不安全。
四、HTTPS
1. HTTP的主要缺点
- 通信使用明文,内容可能被窃听。
- 不验证通信方的身份,因此可能遭遇伪装。
- 无法保证报文的完整性,所以可能遭到篡改。
2. 什么是HTTPS?
-
HTTPS = HTTP + 加密 + 认证 + 完整性保护
,所以把添加了加密及认证机制的HTTP称为HTTPS。 -
HTTPS
并不是应用层的新协议,只是身披SSL外壳的HTTP协议。 - 通常情况下,
HTTP
直接和TCP
通信。当使用SSL
时,则先和SSL
通信再由它同TCP
通信。 -
SSL
是独立于HTTP
的协议,在很多方面都有使用。它采用一种叫做公开秘钥加密的加密处理方法。
3. HTTPS加密方式
- 共享密钥加密(对称密钥加密):加密和解密同用一个密钥的方式。
- 公开密钥加密(非对称加密):这种方式存在两把密钥,私有密钥和公开密钥。
HTTPS
采用公开密钥加密
和共享密钥
混合的加密机制。由于公开密钥加密机制比较复杂,在通信时使用处理效率较低。因此HTTPS先采用公开密钥加密将共享密钥发送给对方,然后使用共享加密方式通信。
公开密钥存在一个问题:无法证明密钥本身是否是真实的。为了解决这个问题,使用数字证书认证(CA)和相关机关颁发的公开密钥证书。
3. HTTPS安全通信流程
- 客户端向服务器发起
https请求
开始SSL通信
。- 服务器用自己的公钥登录数字证书认证机构,获取公钥证书(服务器公钥+数字证书认证机构的数字签名)。
- 服务器把公钥证书发送给客户端。
- 客户端获取公钥证书后:
1). 通过数字证书认证机构验证公钥证书是否有效受信。
2). 客户端验证公钥证书有效受信后,生成一段随机数密码并用公钥证书中的公钥加密(也就是服务器公钥)。
3). 将带有加密随机数的信息发送给服务器。- 服务器接收到客户端的消息后:
1). 用私钥将信息解密取出随机数密码。
2). 把内容通过随机数进行对称加密后,发送给客户端。- 客户端通过随机数解密服务器传过来的加密信息。
- 之后所有的通信数据将由之前客户端生成的随机数密码利用对称加密算法进行加密解密。
HTTPS一般使用的加密算法和HASH算法如下:
非对称加密算法:RSA,DSA/DSS
对称加密算法:AES,RC4,3DES
HASH算法:MD5,SHA1,SHA256
4. SSL的位置
SSL介于HTTP应用层和TCP传输层之间。应用层数据不再直接传递给传输层,而是传递给SSL层,SSL层对从应用层收到的数据进行加密,然后传递给传输层。
五、TCP和UDP
1. 传输层中的协议
- 传输层为应用层提供会话和数据报通信服务。
- 传输层承担
OSI传输层
的职责。 - 传输层的核心协议是
TCP
和UDP
。
2. TCP与UDP区别
TCP
面向连接(如打电话要先拨号建立连接),UDP
是无连接的,即发送数据之前不需要建立连接。TCP
提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错、不丢失、不重复、且按序到达。UDP
则尽最大努力交付,但不保证可靠交付。TCP
面向字节流。UDP
是面向报文的。UDP
没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)。TCP连接
只能是点到点的。UDP连接
支持一对一、一对多、多对一和多对多的交互通信。TCP
的逻辑通信信道是全双工的可靠信道。UDP
则是不可靠信道。
3. TCP与UDP优缺点
TCP的优点:数据传输可靠、稳定、保证数据顺序正确。
TCP的缺点:数据传输慢、效率低、占用系统资源高、易被攻击。
UDP的优点:数据传输快、比TCP相对安全。
UDP的缺点:数据传输不可靠、不稳定、不保证顺序。
什么时候应该使用UDP:
当对网络通讯质量要求不高的时候,要求网络通讯速度尽量的快,这时就可以使用UDP。 比如:语音、视频等。
六、TCP
1. TCP特点
TCP全称是Transmission Control Protocol,中文名为传输控制协议,它可以提供可靠的、面向连接、面向字节流的网络数据传递服务。
2. TCP面向连接
TCP是面向连接的协议,建立和断开连接共需要经过7步,三次握手建立连接,四次挥手断开连接。
3. 三次握手 建立连接
- 客户端首先向服务器申请打开某一个端口(用SYN段等于1的TCP报文)
- 然后服务器端发回一个ACK报文通知客户端请求报文收到
- 客户端收到确认报文后,再次发出确认报文确认刚才服务器发出的确认报文
至此建立了连接,这个过程也叫TCP的三次握手。如果想让双方都做好准备的话,一定要发送三次报文,而且只需要三次报文就可以了。
面试题:为什么是三次握手不是两次?
为了解决超时导致重复建立的问题。
原因:如果是两次握手会出现问题。客户端发送SYN请求建立连接时,如果网络发生延迟超时后客户端会重复发送SYN消息,服务器接收到第二次发送的建立连接请求,返回确认信息,连接建立完成。第一次发送SYN建立连接请求经过一段时间后到达服务器,服务器会认为客户端要建立新的连接,会重新发送应答响应。这就导致了重复建立连接的情况。
4. 四次挥手 断开连接
TCP的连接是全双工(可以同时发送和接收)连接,因此在关闭连接的时候,必须关闭传和送两个方向上的连接。
- 客户端发送一个FIN为1的TCP报文,用来关闭客户端到服务器的数据传送
- 服务器收到这个FIN,返回给客户端一个确认ACK报文。
- 服务器关闭客户端的连接,并且发送一个FIN给客户端。
- 客户端发回ACK报文确认。
至此断开了连接。这个过程也叫TCP的四次挥手。
面试题:为什么是四次挥手?
TCP的连接是全双工连接,因此关闭连接,需要双向关闭才算真正的关闭。
客户端发送FIN请求切断连接,服务器端发送ACK应答切断,当前连接处于半关闭状态。服务器端向客户端发送FIN请求切断连接,客户端返回ACK应答请求,此时连接才真正的关闭。
七、UDP
UDP是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI参考模型
中的一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。
八、Socket(此处只做简单记录,没有实操经验)
-
Socket
是应用层和TCP/IP协议簇通信的中间抽象层,是一组接口API。
-
Socket连接过程
Socket连接过程
-
建立连接步骤:
服务器端的步骤
- 用函数
socket()
,创建一个socket;- 用函数
setsockopt()
,设置socket属性;- 用函数
bind()
,绑定IP地址、端口等信息到socket;- 用函数
listen()
,开启监听;- 用函数
accept()
,接收客户端上来的连接;- 用函数
send()
、recv()
或者read()
、write()
,收发数据;- 关闭网络连接;
- 关闭监听。
客户端的步骤
- 用函数
socket()
,创建一个socket;- 用函数
setsockopt()
,设置socket属性;- 用函数
bind()
,绑定IP地址、端口等信息到socket;- 设置要连接的对方的IP地址和端口等属性;
- 用函数
connect()
,连接服务器;- 用函数
send()
、recv()
或者read()
、write()
,收发数据;- 关闭网络连接。
九、补充
网络请求过程
- 全双工(Full Duplex):是指在发送数据的同时也能够接收数据,两者同步进行,这好像我们平时打电话一样,说话的同时也能够听到对方的声音。目前的网卡一般都支持全双工。
- 半双工(Half Duplex):,所谓半双工就是指一个时间段内只有一个动作发生,举个简单例子,一条窄窄的马路,同时只能有一辆车通过,当目前有两量车对开,这种情况下就只能一辆先过,等到头儿后另一辆再开,这个例子就形象的说明了半双工的原理。早期的对讲机、以及早期集线器等设备都是基于半双工的产品。
- 单工通信是指通信线路上的数据按单一方向传送.