阅读 190

iOS开发小记-网络篇(持续更新)

工作需要,网络接触的不算深入,留个坑后续填上~

五层协议体系


其中TCP/IP是一类协议系统,是用于网络通信的协议集合。TCP/IP协议传统认为值四层协议

HTTP和HTTPS


  • 什么是HTTP?

HTTP是客户端浏览器或者其他程序与Web服务器之间的应用层通信协议。在Internet上的Web服务器上存放的内容都是超文本信息,客户端需要通过HTTP协议传输要访问的超文本信息。

  • GET、POST

GET和POST是最常用的请求方式,有以下区别:

  1. GET通常用于查询、获取数据,而POST请求则用于发送数据。
  2. GET请求的参数明文放在URL中,因此不能使用GET请求传输敏感数据,POST请求的参数保存在请求头中(也是明文),相对安全一些。
  3. GET请求参数会被缓存,但是POST不会。
  4. GET请求参数类型只能为ASCII字符,POST没有限制。
  5. GET请求参数有长度限制,POST没有。
  • HTTP的缺点
  1. 通信内容为明文,即未加密,内容可能被窃听。
  2. 通信双方没有验证身份,可能会被冒充。
  3. 接受的报文无法确保完整性,可能中途被篡改。
  • HTTPS

针对上述安全性问题,在HTTP协议基础上,通过在HTTP和TCP中间加了一层SSL加密层,从而诞生了HTTPS。针对上述三个问题,HTTPS增加了通信加密、证书认证和完整性保护。

  • HTTPS的握手过程
  1. 客户端通过HTTPS访问Web服务器,要求建立SSL连接。
  2. Web服务器收到请求后,会将网站的证书信息(包含公钥)发送给客户端。
  3. 客户端收到后判断公钥是否有效,无效则警告,有效则随机生成数串,并且根据此数串生成共享密钥。
  4. 客户端通过公钥对数串加密,然后发送给Web服务器。
  5. Web服务器接收到加密报文后,通过私钥解密报文,并根据此数串生成共享密钥。此时服务器和客户端拥有相同的共享密钥,并以此加密通信。
  • HTTP和HTTPS区别
  1. HTTPS协议需要在CA上申请证书,一般需要收费。
  2. HTTP是明文传输,HTTPS是SSL加密传输。
  3. 连接方式不同,端口号也不同,HTTP是80端口,HTTPS是443。
  4. HTTP是无状态的,HTTPS需要身份验证。
  5. HTTPS握手阶段比较耗时,会延长加载时间。
  • HTTP能实现长连接么?

也能,但是并非真正的全双工通信,它基于客户端的长轮询或者Long poll来实现的,比较消耗资源,也无法让服务器主动通知客户端。

TCP的三次握手和四次挥手


  • TCP连接的建立(三次握手)

最开始的时候客户端和服务器都是处于CLOSED状态。主动打开连接的为客户端,被动打开连接的是服务器。忽略报文内容,大致步骤为:

  1. 客户端告诉服务器需要建立TCP连接。
  2. 服务器收到报文后,如果同意连接,则发出确认报文。
  3. 客户端收到确认后,告诉服务器收到确认,此后双方开始通信。
  • 两次握手为什么不行?

主要是为了防止已经失效的请求报文突然又传送给服务器,从而建立错误连接。 如果是两次握手,假设这样的场景,客户端发送一个请求报文,在某一个网络节点因为网络原因被滞留,客户端迟迟没有收到确认报文,以为服务器没有收到,从而重新发送了一次请求报文,经历两次握手后双方建立连接,传输数据后关闭连接。后来突然此前滞留的请求报文网络通畅又到达了服务器,这个报文本该是失效的,但是服务器经历两次握手后再次建立连接,但实际上客户端并不需要传数据,导致服务器空等,造成资源浪费。而如果是三次握手,即使服务器确认了失效的报文,客户端没有再次确认,也是不会建立连接的。

  • TCP连接的释放(四次挥手)

数据传输完毕后,双方都可释放连接。最开始的时候,客户端和服务器都是处于ESTABLISHED状态,然后客户端主动关闭,服务器被动关闭。忽略报文内容,大致步骤如下:

  1. 客户端发出连接释放报文,并且停止发送数据。
  2. 服务器端接收到报文后,发出确认报文吗,然后将最后的数据发送完毕后。
  3. 服务器发送完数据后发送连接释放报文,等待客户端的确认。
  4. 客户端收到连接释放报文后,必须发出确认报文,此时TCP连接还没释放,需要等2∗ MSL(最长报文段寿命)的时间后,才会进入CLOSE状态。
  5. 服务器端接收到确认报文后,立即进入CLOSE状态。
  • 为什么客户端最后还要等待2MSL?

客户端之所有接收到服务器发送的连接释放报文后必须发出确认报文,是因为服务器在发送连接释放报文后,如果没有得到客户端的确认,会认为报文发送失败,那么它会重新发送连接释放报文,所以客户端不会立即关闭,如果2∗ MSL时间内没有再接收到服务器发送的连接释放报文,那么客户端认为服务器已经接收到了确认报文,则结束TCP连接。2MSL就是一个发送和一个回复所需的最大时间。

  • 三次挥手为什么不行?

由于TCP是全双工通信,任意一方都能发送数据,一方想要关闭连接必须等待数据发送完毕,也就需要另一方同意,如果是三次挥手,服务器端发送了连接释放报文时,此时客户端和服务端均半关闭状态,客户端接收到连接释放报文后如果不发送确认报文,服务器端无法确定客户端收到了关闭的消息,当前仅仅只有客户端知道双方可以关闭了,但是服务器端并不知道,所以需要发一次确认报文,并且客户端通过2MSL时间来判断服务器端也知道了此时双方可以关闭,最终双方断开此次链接。

Socket和WebSocket


  • 什么是Socket?

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口,提供一套调用TCP/IP协议的API。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

  • 什么是WebSocket?

为了解决网络传输中的双向通信问题,来作为HTTP协议的一个替代者,用于支持长连接(HTTP也可以长连接,但并非真正的全双工通信)。 WebSocket通过HTTP请求告诉服务器要建立WebSocket连接,然后进行三次握手,在此期间的数据通信都是HTTP的,连接建立完成后,才使用WebScoket协议进行数据通信。 其连接断开也是通过四次挥手。

关注下面的标签,发现更多相似文章
评论