APP开发网络基础知识

APP开发中最经常涉及网络交互,可以说网络交互是APP应用开发最基础最核心的模块, 稳定高效的网络处理是良好用户体验的基本保障。虽然现在各平台都有封装API供应用直接调用,但还是有必要了解网络数据交互的流程。

一、OSI七层模型

OSI的七层模型自下往上分别为:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。这些层级之间的关系是下层服务上层,上层利用下层提供的服务,各层之间互不影响,就是说上层只利用下层处理好的结果,至于是如何处理的各自管各自。

OSI(Open System Interconnection 开放系统互联)

总得来说就是将你需要发送的数据通过一层层的封装最后一比特流的形式发送到目的进程。

七层的功能:

  • 应用层:与其他计算机进行通讯的一个应用,它是对应应用程序的通信服务的。例如,一个没有通信功能的字处理程序就不能执行通信的代码,从事字处理工作的程序员也不关心OSI的第7层。但是,如果添加了一个传输文件的选项,那么字处理器的程序员就需要实现OSI的第7层。示例:telnet,HTTP,FTP,WWW,NFS,SMTP等
  • 表示层:这一层的主要功能是定义数据格式及加密。例如,FTP允许你选择以二进制或ASCII格式传输。如果选择二进制,那么发送方和接收方不改变文件的内容。如果选择ASCII格式,发送方将把文本从发送方的字符集转换成标准的ASCII后发送数据。在接收方将标准的ASCII转换成接收方计算机的字符集。示例:加密,ASCII等
  • 会话层:他定义了如何开始、控制和结束一个会话,包括对多个双向小时的控制和管理,以便在只完成连续消息的一部分时可以通知应用,从而使表示层看到的数据是连续的,在某些情况下,如果表示层收到了所有的数据,则用数据代表表示层。示例:RPC,SQL等
  • 传输层:这层的功能包括是否选择差错恢复协议还是无差错恢复协议,及在同一主机上对不同应用的数据流的输入进行复用,还包括对收到的顺序不对的数据包的重新排序功能。示例:TCP,UDP,SPX
  • 网络层:这层对端到端的包传输进行定义,他定义了能够标识所有结点的逻辑地址,还定义了路由实现的方式和学习的方式。为了适应最大传输单元长度小于包长度的传输介质,网络层还定义了如何将一个包分解成更小的包的分段方法。示例:IP,IPX等
  • 数据链路层:他定义了在单个链路上如何传输数据。这些协议与被讨论的各种介质有关。示例:ATM,FDDI等
  • 物理层:OSI的物理层规范是有关传输介质的特性标准,这些规范通常也参考了其他组织制定的标准。连接头、针、针的使用、电流、电流、编码及光调制等都属于各种物理层规范中的内容。物理层常用多个规范完成对所有细节的定义。示例:Rj45,802.3等

二、TCP/IP协议 四层模型

TCP/IP分层模型(TCP/IP Layening Model)被称作因特网分层模型(Internet Layering Model)、因特网参考模型(Internet Reference Model)。



这里的TCP/IP指的可不是tcp/ip两种协议,而是一种网络模型

各层级对应的常用的协议,可以看出Http协议和ftp协议都是属于应用层的。而我们常用的socket是在应用层和传输层之间的。

三、TCP/IP模型

3.1 网络接口层

  • 封装数据/解封数据
  • 控制帧传输
  • 流量控制

3.2 网络层

我们熟知的主要是IP协议,网络层之上的协议包括TCP、UDP等协议数据都是以IP数据报格式传输的。

IP协议主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机,IP协议只管将数据从源IP传输到目标IP,其他的诸如数据安全都不关注。

3.3 传输层

主要协议有 TCP/UDP协议

不同的应用进程使用不同的协议。

3.3.1 UDP协议

用户数据报协议

传输速度快,开销小,无连接,无阻塞,不可靠,不稳定。
支持一对一,一对多,多对一,多对多通信。

3.3.2 CP协议

传输控制协议

点对点连接,可靠有序,全双工通信(双方可以互发数据),面向字节流。

3.3.3 TCP协议建立连接的三次握手
  • 客户端发送连接请求报文段
  • 服务端收到连接请求,并返回确认
  • 客户端再次发送确认报文段(指自己已经收到服务端的确认报文),这个时候发送的报文段已经可以携带数据
3.3.4 TCP协议断开连接的四次挥手
  • 客户端发送断开请求
  • 服务器收到断开请求,并返回确认
  • 服务器发送断开连接的请求
  • 客户端返回确认

四、Socket

socket又称套接字,底层建立连接通道,通过套接字建立连接。位于传输层之上,应用层之下,是对传输层的封装。

socket是TCP/IP的抽象和封装,简化TCP/IP的操作难度,socket主要用来进行进程间的通信。实际上网络间的通信还是基于TCP/IP的协议。它是网络通信过程中断点的抽象标示,包含进行网络通信的必须得五种信息:

  • 连接协议(tcp/ip)
  • 源ip
  • 源端口
  • 目标ip
  • 目标端口

socket的通信流程图



4.1 socket解读

Socket非常类似于电话插座。以一个国家级电话网为例,电话的通话双方相当于相互通信的2个进程,区号是它的网络地址;区内一个单位的交换机相当于一台主机,主机分配给每个用户的局内号码相当于Socket号。任何用户在通话之前,首先要占有一部电话机,相当于申请一个Socket;同时要知道对方的号码,相当于对方有一个固定的Socket。然后向对方拨号呼叫,相当于发出连接请求(假如对方不在同一区内,还要拨对方区号,相当于给出网络地址)。假如对方在场并空闲(相当于通信的另一主机开机且可以接受连接请求),拿起电话话筒,双方就可以正式通话,相当于连接成功。双方通话的过程,是一方向电话机发出信号和对方从电话机接收信号的过程,相当于向Socket发送数据和从socket接收数据。通话结束后,一方挂起电话机相当于关闭Socket,撤消连接。

五、HTTP协议

http协议属于应用层协议,也是离数据最近的一层。

http发送是以报文的形式发送,报文的每一个地段都是ASCII码串。



5.1 请求报文

Http请求报文,由4部分组成,请求行,请求头部,空行,请求体。

5.1.1 请求行
  • 请求方法:GET,POST,HEAD(只返回响应头),PUT等
  • URL:www.baidu.com
  • 版本协议:HTTP/1.1
5.1.2 请求头

键值对的形式

  • User-Agent:产生请求的浏览器类型
  • Accept:客户端可识别的内容类型列表
  • Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机
  • Accept-Language:客户端可接受的自然语言
  • Accept-Encoding:客户端可接受的编码压缩格式
  • Accept-Charset:可接受的应答的字符集
  • connection:连接方式(close 或 keepalive)
  • Cookie:存储于客户端扩展字段,向同一域名的服务端发送属于该域的cookie
5.1.3 空行

分割请求头和请求体的作用,表示接下来的内容为请求体。

5.1.4 请求体

主要是http请求的参数,GET请求中不需要这部分内容。

实例:username=11111&password=00000

这部分内容在GET请求中是加在URL后的。

5.2 响应报文

响应报文跟请求报文差不多,状态行,响应头,空行,响应体。



5.2.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)
5.2.2 响应头
  • Location:Location响应报头域用于重定向接受者到一个新的位置。例如:客户端所请求的页面已不存在原先的位置,为了让客户端重定向到这个页面新的位置,服务器端可以发回Location响应报头后使用重定向语句,让客户端去访问新的域名所对应的服务器上的资源
  • Server:Server 响应报头域包含了服务器用来处理请求的软件信息及其版本。它和 User-Agent 请求报头域是相对应的,前者发送服务器端软件的信息,后者发送客户端软件(浏览器)和操作系统的信息
  • Vary:指示不可缓存的请求头列表
  • Connection:连接方式;对于请求来说:close(告诉 WEB 服务器或者代理服务器,在完成本次请求的响应后,断开连接,不等待本次连接的后续请求了)。keepalive(告诉WEB服务器或者代理服务器,在完成本次请求的响应后,保持连接,等待本次连接的后续请求)
  • WWW-Authenticate:WWW-Authenticate响应报头域必须被包含在401 (未授权的)响应消息中,这个报头域和前面讲到的Authorization 请求报头域是相关的,当客户端收到 401 响应消息,就要决定是否请求服务器对其进行验证。如果要求服务器对其进行验证,就可以发送一个包含了Authorization 报头域的请求
5.2.3 响应体

服务器返回的文本信息。

六、HTTP与HTTPS的区别

HTTPS是一种通过计算机网络进行安全通信的传输协议。HTTPS经由HTTP进行通信,但利用SSL/TLS来加密数据包。HTTPS开发的主要目的,是提供对网站服务器的身份 认证,保护交换数据的隐私与完整性。

HTTPS与HTTP相比,文字上只多了一个S,实际上在应用层之下多了一层安全层



从上图所示,HTTPS比HTPP就多了一个安全层,而这个安全层具体都做了些什么呢?

  • 交换协议版本号
  • 选择一个两端都了解的密码
  • 对两端的身份进行认证
  • 生成临时的会话密钥,以便加密信道。

七、WebSocket

WebSocket是一种在单个TCP连接上进行全双工通讯的协议,它使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

为什么需要WebSocket,因为 HTTP 协议有一个缺陷:通信只能由客户端发起。而WebSocket可以实现双向通信。一般来说WebSocket是用来实现双工通信的长连接的。HTTP想要达到这种效果,一般会通过轮询或者long poll来实现,这样比较占用资源且非常被动。




参考: