1.协议基础
通讯协议规定了网络设备进行网络通讯时必须遵守的一系列规则,以便使用同一规则进行信息传输。
1.1 HTTP协议
HTTP (HyperText Transfer Protocol),超文本传输协议,当前主流协议版本为HTTP/1.1,属于TCP/IP的一个子集。HTTP协议是一种不保存状态(无状态)的协议,协议自身不对请求和响应之间的通信状态进行保存。也就是说在HTTP这个级别,协议对于发送过的请求和响应都不做持久化处理,因此引入了Cookie技术。
1.2 TCP/IP协议
TCP (Transmission Control Protocol),传输控制协议
TCP提供可靠的数据传输服务。为了方便传输,将大块数据分割成以报文段为单位的数据包(字节流服务,Byte Stream Service)进行管理。为了保证可靠性传输,将数据准确无误地送达目标,TCP协议采用三次握手策略,通过SYN (synchronize) 和ACK (acknowledgement)作为标记。首先发送一个带SYN标记的数据包给对方,对方收到后,回传一个带SYN/ACK标记的数据包以示信息传达确认,最后再回传一个带ACK标记的数据包,代表握手结束。
IP (Internet Protocol),网际协议。
TCP/IP协议定义了电子设备如何连接互联网以及数据如果在设备之间进行传输的标准。
TCP/IP协议族按照层次划分从上至下依次为,应用层,传输层,网络层,数据链路层。
1.3 DNS
DNS (Domain Name System,域名解析服务),位于应用层,提供域名到IP地址之间的解析服务。可通过域名查找IP地址,也可逆向反查域名。
1. 应用层
应用层决定了向用户提供应用服务时通信的活动。TCP/IP协议族内预存了各种通用的应用服务,如FTP (File Transfer Protocol),文件传输协议,DNS (Domain Name System),域名系统。HTTP协议也处于该层。
2. 传输层
传输层提供了网络连接中的两台计算机之间的数据传输。有两个性质不同的协议,TCP (Transmission Control Protocol,传输控制协议),UDP (User Data Protocol,用户数据报协议)。
3. 网络层
网络层用来处理在网络上流动的数据包,数据包是网络传输的最小数据单位。该层规定了如何通过传输线路到达指定计算机,并把数据包传送给对方。IP协议位于该层。作用是把各种数据包传送给对方,两个重要条件是IP地址和MAC地址 (Media Access Control Address)。MAC地址是网卡的固定地址,IP地址使用ARP (Address Resolution Protocol,地址解析协议)凭借MAC地址进行通信。
4. 数据链路层
用来处理连接网络的硬件部分。
2.HTTP通信
2.1 HTTP报文
用于HTTP协议交互的信息被称为HTTP报文,分为请求报文(客户端)和响应报文(服务器)。报文本身是由多行(用CR+LF作换行符)数据构成的字符串文本。
HTTP报文可分为报文首部和报文主体两块。两者由最初出现的空行(CR+LF)来划分,报文出体并不一定存在。
请求报文由请求方法、请求URI、协议版本、可选的请求首部字段和内容实体构成。
响应报文由协议版本号、状态码、用以解释状态码的原因的短语、可选的响应首部字段和实体构成。
2.2 HTTP/1.1可使用的请求方法
PS:LINK和UNLINK已经被HTTP/1.1废弃
2.3 持久连接
HTTP初始版本中,每进行一次HTTP通信就要断开一次TCP连接,增加了通信开销。为了解决TCP连接问题,HTTP/1.1和一部分HTTP/1.0想出了持久连接 (HTTP Persistent Connections,也称为HTTP Keep-alive或HTTP connection reuse)的方法。持久连接的特点是只要任意一端没有明确提出断开连接,则保持TCP连接状态。
在HTTP/1.1中,所有的连接默认都是持久连接,但在HTTP/1.0内并未标准化。
2.4 状态管理
HTTP是无状态协议,不对之前发生过的请求和响应状态进行管理,于是引入Cookie技术。Cookie会根据从服务器端发送的响应报文内一个叫Set-Cookie的首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入Cookie值后发送出去。
2.5 传输编码
数据编码可以提升传输速率,但会消耗计算机CPU等资源。
内容编码指明应用在实体内容上的编码格式,并保持实体信息原样压缩。内容编码后的实体由客户端接收并解码。
常用编码:
- gzip (GNU zip)
- compress (UNIX系统的标准压缩)
- deflate (zlib)
- identity (不进行编码)