iOS 基础知识:网络编程


概念理解

说说你对 Socket 的理解?

Socket 是对 TCP/IP 协议的封装,Socket 本身并不是协议,而是一个调用接口(API)。

通过 Socket,我们才能使用 TCP/IP 协议。实际上,Socket 跟 TCP/IP 协议没有必然的联系。Socket 编程接口在设计的时候,就希望也能适应其他的网络协议。所以说,Socket 的出现只是使得程序员更方便地使用 TCP/IP 协议栈而已,是对 TCP/IP 协议的抽象,从而形成了我们知道的一些最基本的函数接口,比如 create、listen、connect、accept、send、read、write 等等。

TCP/IP 只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口。这个就像操作系统会提供标准的编程接口,比如 win32 编程接口一样,TCP/IP 也要提供可供程序员做网络开发所用的接口,这就是 Socket 编程接口。

如何进行 Socket 连接?

建立 Socket 连接至少需要一对套接字,其中一个运行于客户端,称为 ClientSocket,另一个运行于服务器端,称为 ServerSocket。套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

  1. 服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。
  2. 客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。
    为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
  3. 连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。

而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

HTTP 连接的特点?

HTTP 协议即超文本传送协议(Hypertext Transfer Protocol ),是 Web 联网的基础,也是手机联网常用的协议之一,HTTP 协议是建立在 TCP 协议之上的一种应用。
HTTP 连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。

如何自己实现 GET 和 POST 网络请求?

NSURLConnection 和 NSURLSession 的理解和使用

网络协议体系结构(五层或七层)

5. 应用层

应用层是体系结构中的最高。直接为用户的应用进程(例如电子邮件、文件传输和终端仿真)提供服务。
在因特网中的应用层协议很多,如支持万维网应用的 HTTP 协议,支持电子邮件的 SMTP 协议,支持文件传送的 FTP 协议,DNS,POP3,SNMP,Telnet 等等。

4. 运输层

运输层负责向两个主机中进程之间的通信提供服务。由于一个主机可同时运行多个进程,因此运输层有复用和分用的功能:

  • 复用,就是多个应用层进程可同时使用下面运输层的服务。
  • 分用,就是把收到的信息分别交付给上面应用层中相应的进程。

运输层主要使用以下两种协议:

  • 传输控制协议 TCP(Transmission Control Protocol):面向连接的,数据传输的单位是报文段,能够提供可靠的交付。
  • 用户数据包协议 UDP(User Datagram Protocol):无连接的,数据传输的单位是用户数据报,不保证提供可靠的交付,只能提供“尽最大努力交付”。

3. 网络层

网络层主要包括以下两个任务:

  1. 负责为分组交换网上的不同主机提供通信服务。在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组或包进行传送。在 TCP/IP 体系中,由于网络层使用 IP 协议,因此分组也叫做 IP 数据报,或简称为数据报。
  2. 选中合适的路由,使源主机运输层所传下来的分组,能够通过网络中的路由器找到目的主机。

2. 数据链路层

数据链路层常简称为链路层,我们知道,两个主机之间的数据传输,总是在一段一段的链路上传送的,也就是说,在两个相邻结点之间传送数据是直接传送的(点对点),这时就需要使用专门的链路层的协议。

在两个相邻结点之间传送数据时,数据链路层将网络层交下来的 IP 数据报组装成帧(framing),在两个相邻结点之间的链路上“透明”地传送帧中的数据。

每一帧包括数据和必要的控制信息(如同步信息、地址信息、差错控制等)。典型的帧长是几百字节到一千多字节。

1. 物理层

在物理层上所传数据的单位是比特。物理层的任务就是透明地传送比特流。

HTTP 和 HTTPS 的区别? HTTPS 为什么更加安全?

HTTP 协议传输的数据都是未加密的,也就是明文的,因此使用 HTTP 协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了 SSL(Secure Sockets Layer)协议用于对 HTTP 协议传输的数据进行加密,从而就诞生了 HTTPS。简单来说,HTTPS 协议是由 SSL + HTTP 协议构建的可进行加密传输、身份认证的网络协议,要比 HTTPS 协议安全。

HTTPS 和 HTTP 的区别主要如下:

  1. HTTPS 协议需要到 CA 申请证书,一般免费证书较少,因而需要一定费用。
  2. HTTP 是超文本传输协议,信息是明文传输,HTTPS 则是具有安全性的 SSL 加密传输协议。
  3. HTTP 和 HTTPS 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443
  4. HTTP 的连接很简单,是无状态的;HTTPS 协议是由 SSL + HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTPS 协议安全。

尽管 HTTPS 并非绝对安全,掌握根证书的机构、掌握加密算法的组织同样可以进行中间人形式的攻击,但 HTTPS 仍是现行架构下最安全的解决方案,主要有以下几个好处:

  1. 使用 HTTPS 协议可认证用户和服务器,确保数据发送到正确的客户机和服务器;
  2. HTTPS 协议是由 SSL + HTTP 协议构建的可进行加密传输、身份认证的网络协议,要比 HTTPS 协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性。
  3. HTTPS 是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本。
  4. 谷歌曾在2014年8月份调整搜索引擎算法,并称“比起同等 HTTP 网站,采用 HTTPS 加密的网站在搜索结果中的排名将会更高”。

HTTPS 的连接建立流程?

HTTPS 能够加密信息,以免敏感信息被第三方获取,所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用 HTTPS 协议。客户端在使用 HTTPS 方式与 Web 服务器通信时有以下几个步骤:

  1. 客户使用 HTTPS 的 URL 访问 Web 服务器,要求与 Web 服务器建立 SSL 连接。
  2. Web 服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。
  3. 客户端的浏览器与 Web 服务器开始协商 SSL 连接的安全等级,也就是信息加密的等级。
  4. 客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。
  5. Web 服务器利用自己的私钥解密出会话密钥。
  6. Web 服务器利用会话密钥加密与客户端之间的通信。

TCP 的三次握手和四次挥手

建立连接:三次握手

  1. 由客户端向服务端发送 SYN 同步报文。

  2. 当服务端收到 SYN 同步报文之后,会返回给客户端 SYN 同步报文和 ACK 确认报文。

  3. 客户端会向服务端发送 ACK 确认报文,此时客户端和服务端的连接正式建立。

断开连接:四次挥手

  1. 先由客户端向服务端发送 FIN 结束报文。

  2. 服务端会返回给客户端 ACK 确认报文 。此时,由客户端发起的断开连接已经完成。

  3. 服务端会发送给客户端 FIN 结束报文 和 ACK 确认报文。

  4. 客户端会返回 ACK 确认报文到服务端,至此,由服务端方向的断开连接已经完成。

TCP 和 UDP 的区别

TCP:面向连接、传输可靠(保证数据正确性,保证数据顺序)、用于传输大量数据(流模式)、速度慢,建立连接需要开销较多(时间,系统资源)。

UDP:面向非连接、传输不可靠、用于传输少量数据(数据包模式)、速度快。

Cookie 和 Session

  1. cookie 数据存放在客户的浏览器上,session 数据放在服务器上。

  2. cookie 相比 session 不是很安全,别人可以分析存放在本地的 cookie 并进行 cookie 欺骗,考虑到安全应当使用 session。

  3. session 会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用 cookie。

  4. 单个 cookie 保存的数据不能超过4K,很多浏览器都限制一个站点最多保存 20 个 cookie。而 session 存储在服务端,可以无限量存储。

  5. 所以:将登录信息等重要信息存放为 session,其他信息如果需要保留,可以放在 cookie 中。

DNS 解析过程

  1. 客户端打开浏览器,输入一个域名。比如输入 www.163.com,这时,客户端会发出一个 DNS 请求到本地 DNS 服务器。本地 DNS 服务器一般都是你的网络接入服务器商提供,比如中国电信,中国移动。

  2. 查询 www.163.com 的 DNS 请求到达本地 DNS 服务器之后,本地 DNS 服务器会首先查询它的缓存记录,如果缓存中有此条记录,就可以直接返回结果。如果没有,本地 DNS 服务器还要向 DNS 根服务器进行查询。

  3. 根 DNS 服务器没有记录具体的域名和 IP 地址的对应关系,而是告诉本地 DNS 服务器,你可以到域服务器上去继续查询,并给出域服务器的地址。

  4. 本地 DNS 服务器继续向域服务器发出请求,在这个例子中,请求的对象是 .com 域服务器。.com 域服务器收到请求之后,也不会直接返回域名和 IP 地址的对应关系,而是告诉本地 DNS 服务器,你的域名的解析服务器的地址。

  5. 最后,本地 DNS 服务器向域名的解析服务器发出请求,这时就能收到一个域名和 IP 地址对应关系,本地 DNS 服务器不仅要把 IP 地址返回给用户电脑,还要把这个对应关系保存在缓存中,以备下次别的用户查询时,可以直接返回结果,加快网络访问。