Android开发需要了解的网络编程基础
作者:HelloLollipop
地址:https://blog.csdn.net/HelloLollipop/article/details/80745726
声明:本文来自 HelloLollipop 投稿,转发等请联系原作者授权
一、概述
网络通信需要通过协议来完成,目前所使用的网络通信协议主要由两种模型体现。
因特网模型【五层】
应用层 → 运输层 → 网络层 → 链路层 → 物理层OSI/ISO模型【开放式系统互联 七层】
应用层 → 表示层 → 会话层 → 运输层 → 网络层 → 链路层 → 物理层简化五层 → TCP/IP模型【最常见 四层】
应用层 → 运输层 → 网络层 → 网络接口层
二、五层模型概述(不考虑物理层)
应用层
HTTP协议存在这一层(除此之外还有TELNET、FTP、SNMP、TFTP、NTP几种模型),位于应用层要传递的信息称为报文。传输层
TCP、UDP协议存在于这一层,这两种协议把应用层的报文封装成一个新的结构,叫做报文段,在两个程序之间传递。网络层
IP协议存在于这一层,网络层把传输层的报文段封装成一个叫做数据报的数据结构,把这个数据结构从一台主机移动到另一台主机上。链路层
在一层把网络层的数据报再次封装,叫做帧。这一层把帧从当前节点移动到下一个节点,如从主机传输到路由器。
三、应用层概述(HTTP协议)
应用层目前主要使用两种体系结构,C/S结构(客户端/服务端结构),P2P结构(对等体系结构)。
HTTP协议,存在于应用层,契合C/S结构。用于将数据封装成请求报文发送。
请求报文,主要四部分组成:请求行,请求头,空行,请求体。
请求行:由三个部分组成,请求方法+URL+协议版本,请求方法:GET、POST、PUT等共八种;URL是一个统一资源标识符(如www.baidu.com等);协议版本(如HTTP/1.1)。
请求头:键值对的形式,每行一对,关键字和值用英文冒号分隔,请求头通知服务器有关于客户端请求的信息。参考资料
空行符:分割请求头和请求体的作用。
请求体:以GET方法和POST方法来解释:当请求方法为POST时,客户端需要填写相关的表单,与请求包体相关的最常使用的是包体类型 Content-Type 和包体长度 Content-Length。GET通常不需要请求体。
响应报文,与请求报文对应,是服务端返回给客户端的请求结果。
响应报文由四个部分组成:状态行,响应头,空行,响应体。
状态行:包含了状态码(状态码自行查询含义)。
响应头:参考资料
响应体:服务器返回的文本信息。
四、传输层概述(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后没有收到回复,说明服务器已经关闭连接,那么客户端也关闭连接。