作者:郭孝星
微博:郭孝星的新浪微博
邮箱:guoxiaoxingv@163.com
博客:http://blog.csdn.net/allenwells
Github:https://github.com/guoxiaoxing
Android 网络应用程序最基本的形式是作为应用客户端。Android 客户端获取服务器的数据并显示。比较复杂的 Android 网络应用还会对获取的数据进行处理,不断更新数据,向他人和计算机发送数据以实现实时交互。较少的 Android 网络程序将 Android 作为服务器来使用,这是 Android 网络应用程序的另外一种形式,比如作为家庭多媒体中心,为其他设备提供信息服务。
在正式开始介绍Android网络通信编程之前,我们先来了解一下基本的计算机网络知识。
一 计算机网络功能
计算机网络就是用物理链路将各个孤立的工作站或主机连接在一起,组成数据链路,
从而达到资源共享和通信的目的。凡将地理位置不同且具有独立功能的多个计算机系统通过通信设备和线路连接起来,并以功能完善的网络软件(网络协议、信息交换方式及网络操作系统等)实现网络资源共享的系统,均可称为计算机网络。
计算机网络的主要功能有:
- 硬件资源共享
- 软件资源共享
- 用户信息交换
- 分布式处理
- 提高计算机的可靠性和可用性
二 计算机网络协议
计算机网络协议是分层实现的,具体结构如下所示:
- 结构中的每一层都规定有明确的任务及接口标准
- 把用户的应用程序作为最高层
- 除了最高层外,中间的每一层都向上一层提供服务,同时又是下一层的用户
- 把物理通信线路作为最低层,它使用从最高层传送来的参数,是提供服务的基础
国际标准化组织(ISO)在 1978 年提出了“开放系统互连参考模型”,即著名的 OSI/RM 模型(Open System Interconnection/Reference Model)。它将计算机网络体系结构的通信协议划分为七层,具体如下所示:
- 应用层 :是开放系统互连环境的最高层。应用层为操作系统或网络应用程序提供访
问网络服务的接口。 - 表示层 :为上层用户提供共同的数据或信息的语法表示变换。为了让采用不同编码
方法的计算机在通信中能相互理解数据的内容,可以采用抽象的标准方法来定义数
据结构,并采用标准的编码表示形式。表示层管理这些抽象的数据结构,并将计算
机内部的表示形式转换成网络通信中采用的标准表示形式。数据压缩和加密也是表
示层可提供的表示变换功能。 - 会话层 :也称会晤层,主要功能是组织和同步不同的主机上各种进程间的通信(称
为对话),负责在两个会话层实体之间进行对话连接的建立和拆除。会话层还提供在
数据流中插入同步点的机制,使得数据传输因网络故障而中断后,可以不必从头开
始而是仅重传最近一个同步点以后的数据。 - 传输层 :负责数据传送的最高层次。传输层完成同处于资源子网中的两个主机(即
源主机和目的主机)间的连接和数据传输,也称为端到端的数据传输。 - 网络层 :主要任务就是要选择合适的路由,使网络层的数据传输单元——分组能够
正确无误地按照地址找到目的站。 - 数据链路层 :负责在两个相邻的节点间的线路上无差错地传送以帧为单位的数据,
每一帧包括一定的数据和必要的控制信息,在接收点接收到数据出错时要通知发送
方重发,直到这一帧无误地到达接收节点。
物理层 :定义了为建立、维护和拆除物理链路所需的机械的、电气的、功能的和规
程的特性,其作用是使原始的数据比特流能在物理介质上传输。具体涉及接插件的
规格、“0”或“1”信号的电平表示、收发双方的协调等内容。物理层为上一层的数
据链路层提供一个物理连接,通过物理连接透明地传输比特流。所谓透明传输是指
经实际电路传送后的比特流没有变化,任意组合的比特流都可以在这个电路上传输,
物理层并不知道比特的含义。
由于 OSI/RM 模型过于复杂也难以实现,现实中广泛应用的是 TCP/IP 模型。TCP/IP 是一个协议集,是由 ARPA 于 1977 年到 1979 年推出的一种网络体系结构和协议规范。随着Internet 的发展,TCP/IP 也得到进一步的研究开发和推广应用,成为 Internet 上的通用语言,两者的对比关系如下图所示:
2.1 IP协议
互联网协议(Internet Protocol,IP)是用于报文交换网络的一种面向数据的协议。IP
是在 TCP/IP 协议中网络层的主要协议,任务是根据源主机和目的主机的地址传送数据。
IP 定义了寻址方法和数据报的封装结构,如下所示:
上图中的标识的具体含义如下所示:
- 4位版本 :表示目前的协议版本号,数值是 4 表示版本为 4,因现在主要使用的还是
版本为 4 的 IP 协议,所以 IP 有时也称为 IPv4。 - 4位首部长度 :头部的长度,它的单位是 32 位(4 字节),数值为 5 表示 IP 头部长
度为 20 字节。 - 8位服务类型(TOS):这个 8 位字段由 3 位的优先权子字段(现在已经被忽略)、4
位的 TOS 子字段以及 1 位的未用字段(现在为 0)构成。4 位的 TOS 子字段包含最
小延时、最大吞吐量、最高可靠性以及最小费用构成,对应位为 1 时指出上层协议
对处理当前数据报所期望的服务质量。如果都为 0,则表示是一般服务。 - 16 位总长度(字节数):总长度字段是指整个 IP 数据报的长度,以字节为单位。如
数值为 00 30,换算成十进制为 48 字节,48 字节 =20 字节的 IP 头 +28 字节的 TCP
头。这个数据报只是传送的控制信息,还没有传送真正的数据,所以目前看到的总
长度就是报头的长度。 - 16 位标识:标识字段唯一标识主机发送的每一份数据报。
- 3 位标志:该字段用于标记该报文是否分片,后面是否还有分片。
- 13 位片偏移 :指当前分片在原数据报中相对于用户数据字段的偏移量,即在原数据
报中的相对位置。 - 8 位生存时间(TTL):TTL(Time-To-Live)生存时间字段设置了数据报可以经过
的最多路由器数目。它指定了数据报的生存时间。TTL 的初始值由源主机设置,一
旦经过一个处理它的路由器,它的值就减去 1。可根据 TTL 值判断服务器是什么
系统和经过的路由器。举个例子,TTL 的十六进制初始值为 80H,换算成十进制为
128,Windows 操作系统的 TTL 初始值一般为 80H,UNIX 操作系统初始值为 FFH。 - 8 位协议:表示协议类型,6 表示传输层是 TCP 协议。
- 16 位首部检验和 :当收到一份 IP 数据报后,同样对首部中的每个 16 位进行二进制
反码的求和。由于接收方在计算过程中包含了发送方存在首部中的检验和,因此,
如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该为全 1。如
果结果不是全 1,即检验和错误,那么 IP 就丢弃收到的数据报,但是不生成差错报
文,而是由上层发现丢失的数据报并进行重传。 - 32 位源 IP 地址和 32 位目的 IP 地址 :实际这是 IPv4 协议中核心的部分。32 位的 IP
地址由一个网络 ID 和一个主机 ID 组成。源地址是指发送数据的源主机的 IP 地址,
目的地址是指接收数据的目的主机的 IP 地址。 - 选项:长度不定,如果没有选项就表示这个字节的域等于 0。
- 数据:该 IPv4 协议包负载的数据。
2.2 TCP协议
传输控制协议(Transmission Control Protocol,TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
在 Internet 协议族中,传输层是位于网络层之上、应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是网络层不提供这样的流机制,其只能提供不可靠的包交换,所以传输层就自然出现了。
应用层向传输层发送用于网间传输的、用 8 位字节表示的数据流,然后 TCP 协议把数据流分成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传送单元 MTU 的限制)。之后 TCP 协议把结果包传给网络层,由它来通过网络将包传送给接收端实体的传输层。TCP 为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包能按序接收。然后接收端实体为已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包(假设丢失了)将会被重传。TCP 协议用一个校验和(Checksum)函数来检验数据是否有错误,在发送和接收时都要计算校验和。
TCP协议包结构如下所示:
各字段的具体含义如下所示:
- 16 位源端口号 :源端口号是指发送数据的源主机的端口号,16 位的源端口中包含初
‰始化通信的端口。源端口和源 IP 地址的作用是标识报文的返回地址。 - 16 位目的端口号 :目的端口号是指接收数据的目的主机的端口号,16 位的目的端口
‰域定义传输的目的地。这个端口指明报文接收计算机上的应用程序地址端口。 - 32 位序号 :TCP 是面向字节流的,在一个 TCP 连接中传送的字节流中的每一个字‰30 节都按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置。首部中的序号字段值则指的是本报文段所发送的数据的第一个字节的序号。
- 32 位确认序号 :是期望收到对方下一个报文段的第一个数据字节的序号,若确认号
为 N,则表明到序号 N-1 为止的所有数据都已正确收到。 - 4 位数据偏移 :指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远,整
个字段实际上指明了 TCP 报文段的首部长度。 - 保留(6 位):为了将来定义新的用途而保留的位,但目前应置为 0。‰ URG、ACK、PSH、RST、SYN、FIN: 6 位标志域,依次对应为紧急标志、确认标志、推送标志、复位标志、同步标志、终止标志。
- 16 位窗口大小 :指的是发送本报文段的一方的接收窗口,以便告诉对方,从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量。因为接收方的数据缓存空间有限,该窗口值可作为接收方让发送方设置其发送窗口的依据。
- 16 位校验和 :源机器基于数据内容计算一个数值,目的机器根据所接收到的数据内
容也要计算出一个数值,这个数值要与源机器数值完全一样,从而证明数据的有效性。检验和字段检验的范围包括首部和数据两部分。这是一个强制性的字段,一定是由发送端计算和存储,并由接收端进行验证的。 - 16 位紧急指针: 在 URG 标志为 1 时其才有效,指出了本报文段中的紧急数据的字节数。
- 选项:长度可变,最长可达 40 字节。当没有使用选项时,TCP 首部长度是 20 字节。
- 数据:该 TCP 协议包负载的数据。
在上述字段中,6 位标志域中各标志的功能如下所示:
- URG:紧急标志。该位为 1 表示该位有效。
- ACK :确认标志。该位被置位时表示确认序号栏有效。大多数情况下该标志位是置 ‰位的。
- PSH :推送标志。该标志位置位时,接收端不将该数据进行队列处理,而是尽可能
快地将数据转由应用处理。在处理 Telnet 或 rlogin 等交互模式的连接时,该标志位
总是置位的。 - RST:复位标志。该位被置位时表示复位相应的 TCP 连接。
- SYN :同步标志。在连接建立时用来同步序号。当 SYN=1 时而 ACK=0 时,表明这 ‰是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中是 SYN=1 和
ACK=1。即 SYN 置位时表示这是一个连接请求或者连接接受报文。 - FIN:结束标志,用来释放一个连接。
2.3 UDP 协议
用户数据报协议(UDP)是 TCP/IP 模型中一种面向无连接的传输层协议,提供面向事
务的简单不可靠信息传送服务。
与 TCP 不同,UDP 并不提供对 IP 协议的可靠机制、流控制以及错误恢复功能等,在数据传输之前不需要建立连接。由于 UDP 比较简单,UDP 头包含很少的字节,所以比 TCP负载消耗少。UDP 适用于不需要 TCP 可靠机制的情形,比如,当高层协议或应用程序提供错误和流控制功能的时候。UDP 服务于很多知名应用层协议,包括网络文件系统(Network File System, NFS)、简单网络管理协议(Simple Network Management Protocol, SNMP)、域名系统(Domain Name System,DNS)以及简单文件传输系统(Trivial File Transfer Protocol,TFTP)。
UDP的数据报结构如下图所示:
各结构具体含义如下所示:
- 源端口 :16 位。源端口是可选程序的端口,同时它还被认为
是没有其他信息的情况下需要 字段。当使用时,它表示发送
被寻址的答复端口。如果不使用,设置其值为 0。 - 目的端口 :16 位。目标端口在特殊互联网目标地址的情况下具有意义。
- 长度:16 位。UDP 用户数据报的总长度。
- 校验和:16 位。用于校验 UDP 数据报的 UDP 首部和 UDP 数据。
- 数据:包含上层数据信息。