Android网络编程分为两种:基于Socket和基于Http协议。
基于Socket:
(1)针对TCP/IP的Socket、ServerSocket
(2)针对UDP/IP的DatagramSocket、DatagramPacket
(3)Apache Mina框架
基于Http协议:
(1)HttpClient
(2)HttpURLConnection
(3)OkHttp框架等
TCP/IP协议
资料来源于:https://blog.csdn.net/zixiaomuwu/article/details/60965466
TCP/IP协议是一个协议簇,里面包括很多协议,UDP只是其中的一个。TCP是一种可靠的传输层协议,通过三次握手和四次挥手来确保连接的可靠性,三次握手与四次挥手分别对应TCP连接建立过程与断开过程。
(1)为什么要三次握手?
答:三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收机能正常。
第一次握手:Client什么都不能确认;Server确认了对方发送正常。
第二次握手:Client确认了:自己发送、接收正常,对方发送、接收正常;Server确认了:自己接收正常,对方发送正常。
第三次握手:Client确认了:自己发送、接收正常,对方发送、接收正常;Server确认了:自己发送、接收正常,对方发送接收正常。
所以三次握手就能确认双发收发功能都正常,缺一不可。
(2)为什么要发送特定的数据包,随便发不行吗?
答:三次握手的另外一个目的就是确认双方都支持TCP,告知对方用TCP传输。
第一次握手:Server 猜测Client可能要建立TCP请求,但不确定,因为也可能是Client乱发了一个数据包给自己。
第二次握手:通过ack=J+1,Client知道Server是支持TCP的,且理解了自己要建立TCP连接的意图。
第三次握手:通过ack=K+1,Server知道Client是支持TCP的,且确实是要建立TCP连接。
(3)上图中的SYN、ACK和FIN是什么?
答:SYN:同步位,同步序列编号(Synchronize Sequence Numbers),
ACK:确认位,只有ACK=1的时候ack才起作用。正常通信时ACK为1,第一次发起请求时因为没有需要确认接收的数据所以ACK为0。
FIN:终止位,用来在数据传输完毕后释放连接。
ACK、SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack、seq小写的单词表示序号。
(4)为什么连接的时候要三次握手,关闭的时候要四次挥手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
(5)什么是TCP粘包和拆包,如何解决?
答:客户端发服务端发送了两个数据包a和b
粘包:服务端一次性接收到了a和b
拆包:服务端第一次接收了a和b的一部分,第二次接收到了b的剩余部分
解决思路:
a)、消息定长;不够补空格等
b)、增加结尾分隔符
c)、消息头+消息体
(6)TCP如何维护一个长连接?
答:维护任何一个长连接都需要心跳机制,客户端发送一个心跳给服务器,服务器给客户端一个心跳应答,确保双发都知道他们之间的连接是没有断开的。如果超过一个时间阈值,客户端没有收到服务器的应答,或者服务器没有收到客户端的心跳,那么客户端则断开与服务器的连接,并重新建立连接。
(7)智能手机上的长连接心跳和在Internet上的长连接心跳有什么不同?
答:当一台智能手机连上移动网络时,其实并没有真正连接上Internet,运营商分配给手机的IP其实是运营商的内网IP,手机终端要连接上Internet还必须通过运营商的网关进行IP地址的转换,这个网关简称为NAT(NetWork Address Translation)。由于大部分的移动无线网络运营商为了减少网关NAT映射表的负荷,如果一个链路有一段时间没有通信时就会删除其对应表,造成链路中断,正是这种刻意缩短空闲连接的释放超时,原本是想节省信道资源的作用,没想到让互联网的应用不得以远高于正常频率发送心跳来维护推送的长连接。
手机应用发送心跳的频率很短,既造成了信道资源的浪费,也造成了手机电量的快速消耗。
(8)如何确定心跳的间隔时间?
答:参考微信智能心跳方案
a)延迟心跳测试法:这是测试结果准确的前提保障,我们认为长连接建立后连续三次成功的短心跳就可以很大程度的保证下一次心跳环境是正常的。
b)成功一次认定,失败连续累积认定:成功是绝对的,连续失败多次才可能是失败。
c)临界值避免:我们使用比计算出的心跳稍微小一点的值做为稳定心跳避免临界值。
d)动态调整:即使在一次完整的智能心跳计算过程中,我们没有找到最好的值,我们还有机会来进行校正。
UDP协议(User Data Protocol,用户数据报协议)
资料来源:https://blog.csdn.net/qq_39539470/article/details/80617112
TCP/IP协议是一个协议簇,里面包括很多协议的,UDP只是其中的一个。
(1) UDP是一个非连接的协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。
(2) 由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。
(3) UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小。
(4) 吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制。
(5)UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态表(这里面有许多参数)。
(6)UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。
我们经常使用“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。
TCP与UDP的区别:
(1)TCP基于连接,UDP无连接;
(2)对系统资源的要求(TCP较多,UDP少);
(3)UDP程序结构较简单;
(4)流模式与数据报模式 ;
(5)TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。
Http协议
Http协议是器客户端和服务器端之间数据传输的格式规范,格式简称为“超文本传输协议”。HTTP(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式。
HTTP中报文分为请求报文(request messaget)和响应报文(response message)两种类型,这两种类型都包括三部分:首行、头部和主体。请求报文的首行是请求行,包括方法(请求类型)、URL和HTTP版本三项内容,响应请求的首行是状态行,包括HTTP版本、状态码和简短原因三项内容,其中原因可有可无。
(1)什么是无状态协议,怎么解决Http协议无状态问题?
无状态协议对于事务处理没有记忆能力。缺少状态意味着后续处理无法获取前面的信息。
无状态协议解决办法:
a)、通过Cookie缓存状态 。
b)、通过Session保持会话。
(2)Http协议中有哪些请求方式?
GET: 用于请求访问已经被URI(统一资源标识符)识别的资源,可以通过URL传参给服务器。
POST:用于传输信息给服务器,主要功能与GET方法类似,但一般推荐使用POST方式。
PUT: 传输文件,报文主体中包含文件内容,保存到对应URI位置。
HEAD: 获得报文首部,与GET方法类似,只是不返回报文主体,一般用于验证URI是否有效。
DELETE:删除文件,与PUT方法相反,删除对应URI位置的文件。
OPTIONS:查询相应URI支持的HTTP方法。
(3)GET方法与POST方法的区别?
a)、get重点在从服务器上获取资源,post重点在向服务器发送数据;
b)、get传输数据是通过URL请求,以field(字段)= value的形式,置于URL后,并用"?"连接,多个请求数据间用"&"连接,这个过程用户是可见的;post传输数据通过Http的post机制,将字段与对应值封存在请求实体中发送给服务器,这个过程对用户是不可见的;
c)、Get传输的数据量小,因为受URL长度限制,但效率较高;Post可以传输大量数据,所以上传文件时只能用Post方式
d)、get是不安全的,因为URL是可见的,可能会泄露私密信息,如密码等;post较get安全性较高
e)、get方式只能支持ASCII字符,向服务器传的中文字符可能会乱码;post支持标准字符集,可以正确传递中文字符。
(4)常见的HTTP响应状态码有哪些
200:请求被正常处理
204:请求被受理但没有资源可以返回
206:客户端只是请求资源的一部分,服务器只对请求的部分资源执行GET方法,相应报文中通过Content-Range指定范围的资源。
301:永久性重定向
302:临时重定向 返回的头部信息中会包含一个 Location 字段,内容是重定向的url
303:与302状态码有相似功能,只是它希望客户端在请求一个URI的时候,能通过GET方法重定向到另一个URI上
304:发送附带条件的请求时,条件不满足时返回,与重定向无关
307:临时重定向,与302类似,只是强制要求使用POST方法
400:请求报文语法有误,服务器无法识别
401:请求需要认证
403:请求的对应资源禁止被访问
404:服务器无法找到对应资源
500:服务器内部错误
503:服务器正忙
(5)Http协议和Https协议区别?
a)、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
b)、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
c)、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
d)、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。