1. 计算机网络体系结构
2. http
3. HTTP的缓存机制
4. Https
5. TCP
1. 计算机网络体系结构
计算机网络体系是指计算机网络的各个层级+协议的组合,定义了计算机网络所能完成的功能。主要分为三种:
- OSI体系结构
- TCP/IP体系结构
- 五层体系结构
其中五层体系结构融合了TCP/IP和OST体系,更好理解。下面说的就是五层体系结构。
1.1 分层
五层体系从上往下分为以下几个层,最终实现端对端的数据传输与通信
-
应用层(Http,FTP,DNS,SMTP等)
应用层包含很多协议,定义了如何包装和解析数据,其中最常用的就是Http
-
运输层(TCP,UDP等)
运输层有TCP和UDP两种协议,分别对应可靠和不可靠的运输,如TCP要提供可靠的传输,所以内部要解决如何连接、保证传输可靠不丢失数据,调节流量和拥塞控制等。这一层我们一般是和Socket打交道。Socket是一组封装好的编程调用接口,通过它,能够直接操作TCP、UDP进行连接的建立等,建立连接时需要指定端口号,这一层指定了数据发送到哪个端口。
-
网络层(IP等)
这一层主要是ip协议以及一些路由选择协议等等,这一层指定了数据传输到哪个IP地址,中间涉及到一些最优线路、路由选择算法等等。
-
数据链路层(ARP等)
这一层主要了解的就是ARP,它负责把IP地址解析成MAC地址即硬件地址,这样就找到了对应的唯一的机器。
-
物理层
这一层就是最底层了,提供二进制流传输服务,也就是真正通过传输介质(有线、无线)传输数据
2. HTTP
默认使用80端口
2.1 无连接无状态
-
无连接
无连接并不是说不需要连接,而是指每次连接只处理一个请求,一次请求处理完成后断开连接,这个设计主要是为了减缓服务器压力,减少连接对服务器资源的占用。
-
无状态
每个请求之间是独立的,也就是说对于之前的请求是没有记忆的,因此就出现了Cookie,用来保存请求状态。
2.2 请求报文和响应报文
主要总结一下报文格式
-
请求报文包含几个部分
- 请求行:请求方法(POST/GET),请求路径Url,协议版本等信息
- 请求头:就是header,里面都是key-value的组合
- 请求体(GET无请求体)
-
响应报文包含:
- 状态行:状态码、协议版本等
- 响应头即返回的header
- 响应体:返回的数据
其中GET和POST的区别是,GET没有请求体,会把请求参数拼接在url后面,而POST则是把请求参数放到body中
3. HTTP的缓存机制
请求静态资源和H5页面交互时用的比较多,HTTP的缓存主要由header中的两个字段来控制的
3.1 Cache-control
- private:只有客户端可以缓存
- public:客户端和代理服务器都可以缓存
- max-age:缓存过期时间
- no-cache:需要使用对比缓存来验证缓存数据
- no-store:不缓存
其中需要着重说一下的:
max-age:只要没有超过缓存失效的时间则直接使用缓存
no-cache:表示需要使用对比缓存来验证缓存数据,如果该字段打开,那么就算缓存没有失效,也需要发起请求向服务器确认缓存是否更新,是否需要重新请求数据。这里需要和ETag配合使用,如果服务器资源没有更新返回304.直接使用本地缓存,如果有更新直接返回结果。
3.2 ETag
用来对比缓存的header字段
当客户端发送第一次请求时,服务端会下发当前请求资源的识别码ETag,下次再请求时,客户端会通过header里的If-None-Match将这个标识ETag带上,服务端将客户端传来的ETag与最新的ETag进行对比,如果一样则表示资源没有更新,直接返回304.
4. Https
众所周知,Http是明文传输,而Https则是加密传输的,Https可以简单的理解为Http + ssl,默认使用443端口
-
非对称加密
Https使用了ssl证书进行数据的非对称加密,客户端的请求使用ssl公钥加密,只有服务器端的私钥才能解开;而服务器使用私钥加密的数据只有客户端的公钥才能解开。 -
客户端校验服务器端证书的合法性
-
普通的http请求
这里需要手动实现X509TrustManager,客户端进行强校验,避免中间人攻击(伪造服务器证书的中间人充当了客户端的服务器,在中间抓取数据)
-
webview中的http请求
webview中提供了一个回调处理ssl证书,由于一个app加载的内容可能来自很多厂商服务器,所以看情况处理最好,但不应该直接忽略证书校验。
-
5. TCP
TCP面向连接,提供可靠的数据传输,主要通过Socket的api来操作。
5.1 三次握手建立连接
图后补
-
第一次
客户端向服务器发送报文,发出请求SYN包(SYN=j),这时客户端状态改为SYN_SEND,等待服务器确认
-
第二次
服务器收到SYN包,服务器端状态从LISTEN变为SYNC_SEVD,必须确认客户端的SYN(ACK=j+1),同时自己也发送一个SYN给客户端SYN=k
-
第三次
在客户端收到服务端发送的SYN和ACK包后,客户端向服务器发送确认包ACK=k+1,该ACK包发送完毕后,,客户端和服务器都进入ESTABLISHED状态,完成三次握手
疑问:为什么要三次握手,两次不就好了么?
- 首先,两个握手是最基本的,C端发起建立连接请求,S端收到后给C端反馈,这样C端和S端是可以互相连接成功的。
- 第三次握手主要是为了防止已经失效的连接请求报文段突然发送到服务器,导致处理失败。
5.2 四次握手断开连接
图后补,四次挥手和三次握手其实流程上是一样的,只不过,第二步分成了两步来完成。
由于TCP连接是全双工的,因此每个方向必须进行单独关闭:当一方完成它的数据发送任务后就发送一个FIN来终止这个方向的连接,当收到一个FIN就意味着上游不会再有数据发送,一个TCP连接在收到FIN后仍能发送数据,首先关闭的一方执行主动关闭,而另一方执行被动关闭。
- 客户端发送一个FIN,用来关闭客户端到服务器的数据传送
- 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号+1,和SYN一样,一个FIN占一个序号
- 服务器关闭和客户端的连接,发送一个FIN给客户端
- 客户端发回ACK报文确认,并将确认序号+1