Android常用计算机网络知识总结。
-
计算机网络体系结构
计算机网络的各层及其协议的集合就是网络的体系结构。OSI的的七层协议体系结构概念清楚,理论也较完整,但它既复杂又不实用。TCP/IP体系结构则不同,只有四层,但它现在得到广泛的应用。我们一般采用折中的方法,综合OSI和TCP/IP体系的优点,这就是五层协议的体系结构。
计算机网络体系结构.png -
HTTP简介
HTTP协议是Hyper Text Transper Protocol(超文本传输协议)的缩写,使用TCP连接进行可靠的传送,是应用层的协议。 -
HTTP的主要特性
- 无连接:每次处理完一个请求后就断开。
- 无状态:对事务处理没有记忆能力,它意识着如果后续处理需要前面的信息,则必须重传。
- HTTP版本差异
- HTPP/0.9
最早的版本,该版本很简单,只有一个Get请求,并且规定服务器返回的格式必须是HTML的字符串。处理完请求后就断开连接。 - HTPP/1.0
该版本增加了很多功能,任何格式的内容都可以发送,不止字符串,还能传输图像,视频,二进制文件。除此之外,增加了Post和Head请求方法。请求和响应的格式也变了,除了数据部分还要增加头部信息。
1.0版本主要的缺点是:每个TCP连接只能发送一个请求,发送完数据就断开连接。如果还有后续的请求,必须重新建立连接。TCP的连接成本很高,要进行三次握手,并且开始时发送速率较慢,这就导致性能较差。为了解决这个问题,有些客户端在请求时,用了一个非标准的Connectcion字段。
Connection:keep-alive
这个字段就是表示让服务器不要关闭TCP连接。服务器同样回应这个字段。这样一个可以复用的TCP连接就建立了。直到客户端或服务器主动关闭连接。但是,这并不是标准的字段。
- HTPP/1.1
目前最流行的版本。最大的变化就是引用了持久连接,即TCP连接默认不关闭,不用声明Connection:keep-alive。
客户端和服务器发现对方一段时间内没有活动,就可以主动关闭连接。不过规范的做法是,客户端在最后一个请求时,发送Connection:close,表示要求服务器关闭TCP连接。
Connection:close
- HTPP/2
新的二进制格式:HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮,不同于HTTP1.x的解析是基于文本
多路复用:连接共享,即每一个request都是是用作连接共享机制的
服务端推送:服务器主动向客户端推送消息
-
HTTP请求报文
请求报文.png
请求报文分为:请求行、请求头部、空行和请求数据。以下是一个请求报文示例:
POST /xxx/xxx.html HTTP/1.1
Host: www.xxx.com
Content-Length: 155
Connection:Keep-Alive
User=Agent: Mozilla/5.0
Accept-Language: cn
account=prince&password=6666
-
HTTP响应报文
响应报文.png
响应报文分为:响应行、响应头、空行 响应体。以下是一个响应报文示例:
HTTP/1.1 200 OK
Date:Thu, 15 Jul 2019 09:26:55 GMT
Content-Type text/html
Content-Length: 1101
<html>
<body>
....
</body>
</html>
-
HTTP响应码
响应状态码由三位数字组成,第一位数字表示响应类型,常用的状态码有五大类:- 1xx: 通知消息,如请求收到了或正在处理。
- 2xx: 服务器成功收到并进行处理
- 200 OK:表示请求成功
- 3xx: 重定向
- 4xx: 客户端的差错
- 400: 客户端请求有语法错误,不能被服务器识别
- 401: 未经授权
- 403: 收到请求,但拒绝提供服务,一般会在响应消息中给出原因
- 404: 请求的资源不存在
- 5xx: 服务器的差错
-
HTTP请求方法
HTTP的请求方法.png -
Get与Post的区别
1.GET的请求参数会放在URL后,POST把参数放在HTTP包的Body中。
2.GET提交的数据大小有限制(浏览器对URL的长度有限制),POST方法提交的数据没有限制。
3.GET的请求参数放到URL中会带来安全问题。 -
URI、URL和URN的关系
URI:全称为Uniform Resource Identifier,统一资源标识符,用来唯一的标识一个资源。
URL:全称Uniform Resource Locator,是统一资源定位符,它是一种具体的URI,它用来标识一个资源并且指明了这个资源的路径。
URN:Uniform Resource Name,统一资源命名,通过名字来标识资源。
关系:URI是一种抽象的,高层次的概念统一资源标识,而URL和URN是具体的资源标识方式。URL和URN都是一种URI。每一个URL都是URI,反过来不成立,因为URI还有一个子集URN。在JAVA的URI中,可以是代表绝对的,也可以代表相对的,而URL只可以是绝对的,不可以为相对的。在JAVA类库中,URI类不包含任何访问资源的方法。它唯一的作用就是解析。而URL可以打开一个到达资源的流。
关系:URI属于URL更高层次的抽象,一种字符串文本标准。就是说,URI属于父类,而URL属于URI的子类。URL是URI的一个子集。URI还有一个子类URN-统一资源名称。 -
UDP与TCP
用户数据报协议UDP(User Datagram Protocol)
传输控制协议TCP(Transmission Control Protocol)
两个对等运输实体在通信时传送的数据单位叫做运输协议数据单元,根据所使用的协议是TCP或UDP,分别被称为TCP报文段或UDP用户数据报。
UDP在输出数据之前不需要先建立连接。虽然UDP不提供可靠交付,但在某些情况下UDP确实一种最有效的工作方式。
TCP则提供面向连接的服务。在传送数据之前必须先建立连接,传送数据后要释放连接。由于TCP提供可靠的,面向连接的运输服务,因此不可避免的增加了许多开销,如确认、流量控制、连接管理等。 -
TCP三次握手
TCP的三次握手.png
1.客户端请求连接,发送同步位SYN=1,同时选择一个初始序号x。进入SYN-SENT(同步已发送)状态。
2.服务端收到请求后,如同意建立连接,则向客户端发送。把SYN和ACK都置为1,确认号是ack=x+1,同时要选择一个初始序号y。服务器进入SYN-RCVD(同步收到)状态。
3.客户端收到服务端的确认后,还要向服务端确认。ACK置为1,确认号ack=y+1,自己的序号为seq=x+1。这时候TCP连接已经建立,A进入ESTABLISHED(已连接)状态。服务端收到确认后也进入ESTABLISHED状态。 -
为什么要三次而不是两次
考虑一种特殊情况,假如客户端发送了一个连接请求,因为某种原因长时间滞留了,以至于延误到连接释放后的某个时间才到达服务端。本来这是一个失效的请求,如果是没有最后一次确认,此时服务端收到并确认后连接就建立了,白白浪费了许多资源。三次握手的情况下,客户端不会再像服务端确认,所以连接不会建立。 -
TCP四次挥手
TCP的四次挥手.png
1.客户端把连接释放报文终止控制位FIN置为1,序号seq=u。这时客户端进入FIN-WAIT-1(终止等待1)状态,等待服务端确认。
2.服务端收到连接释放报文后即发出确认,ACK置为1,确认号是ack=u+1,自己的序号seq=v。然后服务端进入CLOSE-WAIT(等待关闭)状态。这时,客户端到服务端方向的连接就释放了,这时的TCP连接处于半关闭的状态,即客户端已经没有数据要发送给客户端了,但服务端若发送数据,客户端仍要接收。
3.客户端收到服务端的确认后,进入FIN-WAIT-2(终止等待2)状态,等待服务端发出释放连接报文。
4.若服务端没有要向客户端发送的数据了,就发送释放报文。FIN和ACK置为1,假定服务端的序号为w(在瓣关闭的状态又向客户端发送了一些数据),还要必须重复上次已经发送过的ack=u+1,这时服务端进入LAST-ACK(最后确认)状态。
5.客户端收到服务端的释放连接报文后,必须对此确认。把ACK置为1,确认号ack=w+1,自己的序号为seq=u+1。进入到TIME-WAIT状态。 -
在地址栏输入URL会发生什么
1.浏览器向DNS服务器请求把URL中的域名解析成所对应的IP地址
2.解析出IP地址后,和IP地址所在的服务器建立TCP连接(即三次握手)
3.连接建立后,浏览器就可以向服务器发起HTTP请求了
4.服务器对浏览器请求作出响应,并把对应的HTML 文本发送给浏览器
5.浏览器拿到完整 HTML 页面代码后,内核和 JS 引擎就会解析和渲染这个页面,最终把完整的页面呈现出来。
6.如果浏览器没有后续的请求,那么就会跟服务器端发起 TCP 断开(即四次挥手)。