网络通信需要通过协议来完成,目前所使用的网络通信协议主要由两种模型体现。
因特网模型【五层】
应用层 → 运输层 → 网络层 → 链路层 → 物理层
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(用户数据报协议)特点
无连接的通讯协议
传输数据有大小限制,每个被传输的数据限定在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后没有收到回复,说明服务器已经关闭连接,那么客户端也关闭连接。
Socket
Socket是处于应用层与运输层【TCP/IP模型】中间一组接口(API),TCP/IP协议只是理论,需要通过Socket来实际编码使用。Android与IOS都提供了相关的Socket类,这些类提供了一系列的方法,来实现网络连接的各种操作。
Socket封装了网络通信的五个部分:
连接使用的协议(TCP或者UDP)
本机主机的IP地址
本地主机进程的协议端口
远程主机的IP地址
远程主机进程的协议端口
简单来说,Socket确定协议,确定客户端与服务端的IP地址与端口后,可以使用其提供的方法来进行网络的相关操作。
HTTP与HTTPS
HTTP协议模型
HTTP → TCP → IP
HTTPS协议模型:
HTTP → SSL/TLS → TCP → IP
HTTP与HTTPS的区别:
使用HTTP协议的客户端,会打开一条服务端端口为80的连接,并发送老的HTTP请求。使用HTTPS协议的客户端,会打开一条服务端端口为443连接,然后与服务器进行SSL握手。以二进制格式与服务器交互一些SSL的安全参数,附上加密的HTTP请求。
HTTPS协议需要用到CA申请证书。
HTTP是明文传输,HTTPS是SSL加密传输。
HTTPS协议的工作流程:
. 客户端发起HTTPS的请求,携带了客户端支持的加密算法和SSL协议版本号,连接到服务器的443端口。如果是HTTP连接到80端口。
配置服务器,采用HTTPS的服务器需要申请一套数字证书(数字证书的本身其实是一对公钥和私钥)。服务器收到请求之后,从加密算法中挑选一种,同时将自己的数字证书以及公钥发送给客户端(私钥自己保留)。
客户端验证数字证书,生产一个用于加密传输握手消息的密钥,并使用服务器端传来的公钥对此密钥进行加密。 SSL握手的大致内容【具体细节】
交换协议版本号
选择一个客户端与服务端都了解的密码
对两端的身份进行验证
生产临时的会话密钥以便加密信道
服务器使用保留的私钥对加密的密钥进行解密,得到密钥信息(完成非对称交换密钥)。
使用刚才得到的密钥信息,加密握手信息,发送给客户端,客户端使用相同密钥进行解密验证,完成握手(完成对称加密信息)。
进行加密信息传输。
GET/POST
GET与POST请求方式的区别:
1.GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),POST把提交的数据则放置在是HTTP包的包体中。
2.GET的URL会有长度上的限制,则POST的数据则可以非常大。
3.POST比GET安全,因为数据在URL上不可见,非明文传输。
4.GET传输的数据量非常小,一般限制在 2 KB 左右,但是执行效率却比POST好;而POST方式传递的数据量相对较大,它是等待服务器来读取数据。