Android开发需要了解的网络编程基础

code小生,一个专注 Android 领域的技术分享平台

一、概述

网络通信需要通过协议来完成,目前所使用的网络通信协议主要由两种模型体现。

因特网模型【五层】

应用层 → 运输层 → 网络层 → 链路层 → 物理层

OSI/ISO模型【开放式系统互联 七层】

应用层 → 表示层 → 会话层 → 运输层 → 网络层 → 链路层 → 物理层

简化五层 → TCP/IP模型【最常见 四层】

应用层 → 运输层 → 网络层 → 网络接口层

二、五层模型概述(不考虑物理层)

应用层

HTTP协议存在这一层(除此之外还有TELNET、FTP、SNMP、TFTP、NTP几种模型),位于应用层要传递的信息称为报文。

传输层

TCP、UDP协议存在于这一层,这两种协议把应用层的报文封装成一个新的结构,叫做报文段,在两个程序之间传递。

网络层

IP协议存在于这一层,网络层把传输层的报文段封装成一个叫做数据报的数据结构,把这个数据结构从一台主机移动到另一台主机上。

链路层

在一层把网络层的数据报再次封装,叫做帧。这一层把帧从当前节点移动到下一个节点,如从主机传输到路由器。

三、应用层概述(HTTP协议)

应用层目前主要使用两种体系结构,C/S结构(客户端/服务端结构),P2P结构(对等体系结构)。

HTTP协议,存在于应用层,契合C/S结构。用于将数据封装成请求报文发送。

请求报文,主要四部分组成:请求行,请求头,空行,请求体。

响应报文由四个部分组成:状态行,响应头,空行,响应体。

状态行:包含了状态码(状态码自行查询含义)。

响应头:参考资料

响应体:服务器返回的文本信息。

四、传输层概述(UDP/TCP协议)

在网络通信的传输层,存在两种运输协议,UDP(用户数据报协议),TCP(传输控制协议)。两种协议都可以传递应用层中的请求报文。UDP与TCP的数据报结构参考:https://juejin.im/post/5a2614b8f265da432652af7d

UDP(用户数据报协议)特点

无连接的通讯协议

传输数据有大小限制,每个被传输的数据限定在64KB之内

是一个不可靠协议,不能保证数据传输的完整性与次序

传输速度快开销较小

支持一对一、一对多、多对一、多对多通信

TCP(传输控制协议)特点

面向连接的协议

只支持点对点的通信

传输的数据没有大小限制

是一个可靠的协议,可以保证数据传输的完整性与次序

耗时较多开销较大

TCP连接相关的报文相关缩写:SYN(同步标志synchronous)、ACK(确认标志Acknowledgement)、ACK序号(Acknowledgment Number)、SEQ(序列号Sequence Number)、FIN(结束标志final)

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

第一次握手:客户端发送一个请求报文段,将报文段首部的一个标志位SYN设置为1,同时,客户端会把报文段的序列号SEQ设置为一个随机值x。这个时候,客户端进入到SYN_SEND状态,等待服务器确认。

第二次握手:服务器收到报文段,对齐进行确认。把这个收到的报文段的ACK序号设置为x + 1;同时,向客户端发送一个响应请求报文段,讲这个请求的SYN标志位设置为1,序列号SEQ设置为一个随机值y。然后服务器将上述信息整合成一个报文段,一并发送给客户端,此时服务器进入SYN_RECV状态。

第三次握手:客户端收到整合后的报文段,将这个报文段的ACK序号设置为y + 1,并将ACK报文段发送给服务器进行连接确认,服务器接收到这个报文段后,客户端与服务器都进入ESTABLISHED状态。建立连接以后,SYN被置为0,接下来就可以进行数据传输了。

TCP关闭连接的过程(四次挥手)

第一次挥手:客户端向服务器发送一个特殊的报文段,这个报文段的首部标志位FIN设置为1,这个时候客户端进入FIN_WAIT_1状态,表示客户端没有数据要发送给服务器了。

第二次挥手:服务端收到客户端发送的报文段后,向客户端发送了一个ACK报文段,客户端收到后进入FIN_WAIT_2状态,服务器告诉客户端,同意关闭请求。

第三次挥手:服务器再次向客户端发送一个FIN报文段,FIN标志未设置为1,请求关闭连接,同时服务器进入LAST_ACK状态;

第四次挥手:客户端收到这个FIN报文段后,向服务器发送AKC报文段,客户端此时进入TIME_WAIT状态。服务器收到这个ACK报文段后,就关闭连接。此时客户端等待2ms后没有收到回复,说明服务器已经关闭连接,那么客户端也关闭连接。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180626G08HQA00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券