blog
blog copied to clipboard
Android 网络编程基础
学习网络编程先要学习相关网络基础协议,而网络协议是一套规定了两个终端之间如何进行连接和数据交互的集合。
1.常见网络分层
不管是OSI七层模型还是TCP/IP的四层、五层模型,每一层中都要自己的专属协议,完成自己相应的工作以及与上下层级之间进行沟通。
1.1 应用层
也包括:表示层和会话层 为操作系统或网络应用程序提供访问网络服务的接口。常用的HTTP协议就是在此层,另外还有FTP、Telnet、DNS、SMTP,POP3等协议。
1.2 传输层
第一个端到端,即主机到主机的层次。传输层负责将上层数据分段并提供端到端的、可靠的或不可靠的传输。此外,传输层还要处理端到端的差错控制和流量控制问题。著名的TCP、UDP协议就位于此。
1.3 网络层
第一个端到端,即主机到主机的层次。传输层负责将上层数据分段并提供端到端的、可靠的或不可靠的传输。此外,传输层还要处理端到端的差错控制和流量控制问题。主要协议有IP协议,ICMP协议,ARP协议,RARP协议。
1.4 网络接口层
数据链路层在物理层提供的服务的基础上向网络层提供服务,其最基本的服务是将源自网络层来的数据可靠地传输到相邻节点的目标机网络层。 物理层具有激活、维持、关闭通信端点之间的机械特性、电气特性、功能特性以及过程特性。主要协议有以太网协议。
2. HTTP与HTTPS协议
先提个醒,Android 9.0默认是不能进行Http网络请求的,所以在适配Android 9.0的时候记得添加配置文件,让其可以进行HTTP网络请求。
2.1 HTTP
HTTP协议是目前互联网上应用最为广泛的网络协议。所有WWW文件都必须遵守这个标准。但HTTP协议是以明文方式发送内容,不提供任何方式的数据加密,因此不适合传输较为敏感的数据。
2.1.1 请求报文
HTTP请求报文分为三部分:请求行,请求头部,请求体。
- 请求行 是由请求方法、URL、HTTP协议版本组成。
- 请求头部是有key:value格式的键值对组成。用于告知服务端,客户端的一些信息。
- 请求数据,当请求行的请求方法是
post
时,才会有请求体,如果是get
数据将携带URL后面。
请求方法
常用的请求方法有POST,GET。GET方法携带数据拼接在URL后面,?连接数据和URL,而数据key和value则用=连接,多对key value 则用&连接。在URL携带数据,有时候会泄漏一些敏感信息。
https://www.google.com/search?name=gitcode8&password=123456
POST方法一般用来提交表单和上传文件数据,数据存放在报文的请求主体中。理论上不存在数据限制。
URL 即要请求的网址
HTTP协议版本 现在基本是 HTTP/1.1
请求头
常见的请求头如下
名称 | 作用 |
---|---|
Content-Type | 请求体的类型,如:text/plain,application/json |
Accept | 说明接收的类型,可以多个值,用","隔开 |
Content-Length | 请求体长度 |
Content-Encoding | 请求体的编码格式,如 gzip、deflate |
Accept-Encoding | 告知对方我方接受的 Content-Encoding |
Catche-Control | 取值一般为 no-catche、max-age=xx(xx 为整数,表示自愿缓存 xx 秒) |
HTTP请求报文长这样子的: |
GET /search?name=gitcode8 HTTP/1.1
Host: www.baidu.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13.6; rv:47.0)
Accept: text/javascript, application/javascript
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
X-Requested-With: XMLHttpRequest
Connection: keep-alive
Referer: https://www.google.com/
Cookie: FFDB24244D22236694CF00C4877ADA56562322
2.1.2 响应报文
HTTP响应报文分为三部分:状态行、响应首部、响应数据。
状态码
状态码 | 描述 |
---|---|
1xx | 信息提示 |
2xx | 成功,常见200 |
3xx | 重定向,常见302 |
4xx | 客户端错误,常见404 |
5xx | 服务端错误,常见500 |
响应头 |
常见响应头
名词 | 作用 |
---|---|
Date | 服务器日期 |
Last-Modified | 最后被修改时间 |
Transfer-Encoding | 取值一般为 chunked,一般出现在响应体长度不能确定的情况下 |
Set-cookie | 设置 Cookie |
Location | 重定向到另一个 URL |
Server | 服务器信息 |
响应报文长这样子的:
HTTP/1.1 200 OK
Server: linux/10.18.14
Date: Sun, 31 Jul 2016 03:41:53 GMT
Content-Type: baiduApp/json; v6.27.2.14; charset=UTF-8
Content-Length: 100
Connection: keep-alive
Cache-Control: private
Expires: Sun, 28 Jul 2019 04:41:53 GMT
Set-Cookie: FFDB24244D22236694CF00C4877ADA56562322
2.2 HTTPS
由于HTTP不是不适合传输敏感数据,因为在应用层和传输层之间增加了TSL/SSL层来加密数据,从而生成加了安全版本的HTTP,即HTTPS。 TSL是SSL的升级版本,TLS/SSL中使用了非对称加密,对称加密以及HASH算法,使用TSL/SSL带来的好处是:
- 数据加密传输,第三方无法窃取
- 校验机制,数据被篡改,会立即通知双方
- 配备身份证书,防止身份被冒充
HTTPS工作原理
- 客户端向服务器发起443端口请求,携带客户端支持的加密算法和哈希算法。
- 服务器收到请求后,选择客户端的加密算法和哈希算法。
- 服务器将自己数字证书发给客户端。证书来源机构或自己制作。
- 客户端认证证书。客户端会先从证书列表查找服务器发过来的证书机构,找不到就要求用户手动授权,然后取出公钥。用公钥解密证书的内容和签名,证书内容包括网站的网址、网站的公钥、证书的有效期等,并验证相关信息。最后用公钥加密一个随机数R。
- 客户端将加密随机数R发给服务器。
- 服务器用私钥解密得到随机数R。
- 服务器以R为秘钥使用对称算法加密内容传给客户端。
- 客户端以 R 为密钥使用之前约定好的解密算法获取内容。
前 5 步其实就是 HTTPS 的握手过程,这个过程主要是认证服务端证书(内置的公钥)的合法性。因为非对称加密计算量较大,整个通信过程只会用到一次非对称加密算法(主要是用来保护传输客户端生成的用于对称加密的随机数私钥)。后续内容的加解密都是通过一开始约定好的对称加密算法进行的。
2.3 HTTP与HTTPS区别
大家都这么写得.....
- HTTPS需要到CA付费申请证书;HTTP不需要。
- HTTPS使用443端口;HTTP使用80端口。
- HTTPS具有安全性的ssl加密传输协议;HTTP是超文本传输协议,信息是明文传输。
- HTTPS使用SSL+HTTP协议构建的可进行加密传输、身份认证的;而HTTP连接简单与无状态。
3. TCP协议
传输控制协议,先了解一下TCP报文首部格式,避免待会下文将三次握手和四次挥手时一头雾水:
自己画的图,再丑也要写完。第四行
ACK
表示确认标识符,SYN
表示同步标识符,FIN
表示结束标识符。
3.1 TCP三次握手建立连接
三次握手图例如下,与文字解释配合使用效果更佳。
第一次:客户端发送连接请求报文给服务端,其中SYN=1,seq=x。发送完毕后进入YSN_END状态。
第二次:服务端接收到报文后,发回确认报文,其中ACK=1,ack=x+1,因为需要客户端确认,所以报文中也有SYN=1,seq=y的信息。发送完后进入SYN_RCVD状态。
第三次:客户端接收到报文后,发送确认报文,其中ACK=1,ack=y+1。发送完客户端进入ESTABLISHED
状态,服务端接收到报文后,进入ESTABLISHED
状态。到此,连接建立完成。
三次握手原因
避免资源被浪费掉。如果在第二步握手时,由于网络延迟导致确认包不能及时到达客户端,那么客户端会认为第一次握手失败,再次发送连接请求,服务端收到后再次发送确认包。在这种情况下,服务端已经创建了两次连接,等待两个客户端发送数据,而实际却只有一个客户端发送数据。
3.2 四次挥手断开连接
四次挥手指客户端和服务端各发送一次请求终止连接的报文,同时双方响应彼此的请求。
四次挥手图例如下,请配置文字解释使用哦。
第一次挥手:客户端发送FIN=1,seq=x的包给服务端,表示自己没有数据要进行传输,单面连接传输要关闭。发送完后,客户端进入
FIN_WAIT_1
状态。
第二次挥手:服务端收到请求包后,发回ACK=1,ack=x+1的确认包,表示确认断开连接。服务端进入CLOSE_WAIT
状态。客户端收到该包后,进入FIN_WAIT_2
状态。此时客户端到服务端的数据连接已断开。
第三次挥手:服务端发送FIN=1,seq=y的包给客户端,表示自己没有数据要给客户端了。发送完后进入LAST_ACK
状态,等待客户端的确认包。
第四次挥手:客户端收到请求包后,发送ACK=1,ack=y+1的确认包给服务端,并进入TIME_WAIT
状态,有可能要重传确认包。服务端收到确认包后,进入CLOSED
状态,服务端到客户端的连接已断开。客户端等到一段时间后也会进入CLOSED
状态。
四次挥手原因 由于TCP的连接是全双工,双方都可以主动传输数据,一方的断开需要告知对方,让对方可以相关操作,负责任的表现。
使用TCP协议有:FTP(文件传输协议)、Telnet(远程登录协议)、SMTP(简单邮件传输协议)、POP3(和SMTP相对,用于接收邮件)、HTTP协议等
4. UDP协议
用户数据报协议,UDP面向无连接的传输,对数据的传输结果不提供保证,支持多播和广播。每个UDP报文分UDP报头和UDP数据区两部分。报头由四个16位长(2字节)字段组成,分别说明该报文的源端口、目的端口、报文长度以及校验值。
使用UDP协议包括:TFTP(简单文件传输协议)、SNMP(简单网络管理协议)、DNS(域名解析协议)、NFS、BOOTP。
TCP与UDP的区别
- TCP面向连接,UDP面向无连接
- TCP提供可靠数据服务,UDP不提供可靠数据服务
4. IP协议
4.1 IP地址
在数据链路层中,每台电脑都有唯一网卡MAC,用于标识电脑的唯一性。在网络层则通过IP地址来定位每一台需要在互联网联网的设备。 IP地址共分A、B、C、D四类。
- A类地址是首位以“0”开头的地址,从第1位到第8位是它的网络标识符,0.0.0.0~127.0.0.0。
- B 类 IP 地址是前两位 “10” 的地址,从第 1 位到第 16 位是它的网络标识,十进制标识B类的网络地址的范围128.0.0.0~191.255.0.0
- C 类 IP 地址是前三位为 “110” 的地址。从第 1 位到第 24 位是它的网络标识。十进制标识C类的网络地址的范围是192.0.0.0~223.255.255.0。我国大多数IP地址在此类别。
- D 类 IP 地址是前四位为 “1110” 的地址。从第 1 位到第 32 位是它的网络标识。十进制标识D类的网络地址的范围是224.0.0.0~239.255.255.255。因此D类地址没有主机标识符,常用于多播。
网络标识必须保证相互连接的每个段的地址不相重复。而相同段内相连的主机必须有相同的网络标识。IP 地址的“主机标识”则不允许在同一个网段内重复出现。由此,可以通过设置网络地址和主机地址,在相互连接的整个网络中保证每台主机的 IP 地址都不会相互重叠。即 IP 地址具有了唯一性。