作为Java后台开发人员,如果不对现今主流的通信协议有所了解的话是很难对自己产品进行优化的,这是一篇开坑文,会记录我学习HTTP的一个思路和过程。文章内容尽量精确,如有纰漏,还望指出,感激不尽。
何为HTTP
HTTP(Hyper Text Transfer Protocol),超文本传输协议,是一种建立在TCP上的无状态连接。用于从万维网上传输数据到个人PC,准确的说是个人浏览器客户端。这里要介绍一下网络模型的分层,目前的网络模型分为两种,OSI模型和TCP/IP模型,OSI模型。
-
HTTP的主要特点
简单:客户向服务器传输数据时,只需传输传输方法和路径,传输方法分为POST、GET、DELETE、HEAD等,每种方法规定服务器与客户端联系的类型不同。多亏HTTP协议的简单性,使得HTTP应用程序规模小,保证了传输速度;
灵活:http允许传输所有类型的数据对象,使用Content-Type进行标注;
无连接:http这种传输特性规定了服务器每次只处理一条请求,在接收到客户端请求后,将处理结果返回给客户端,并受到客户端的应答后就会关闭与客户端的连接。采用这种方法可以节省的服务器的资源浪费,节省了其他客户端的服务处理时间。
无状态:意为服务器没有事务处理的记忆功能,请求与请求是独立、没有任何关联的。在开发Web应用时我们加入了Cookie和Session(以下称C和S)实现有状态的Web开发,但这种有状态牺牲的是本机的内存。
那么问题来了,如果没有C和S,当第二次请求需要先前的数据时,无状态特性使得会导致先前的数据全部丢失,为什么HTTP不能是有状态的呢?
答案是:NG。最初的http协议是用来浏览静态文件的,一张表,一篇论文,无状态协议已经足够,通过C和S实现的有状态负担和代价也很低,反过来说,HTTP有状态的代价很高。服务器相比客户端数量十分有限,与其将这种状态记录交由服务器,占用其宝贵的时间和资源,远不如交由自身的C和S造成的时间成本和资源成本低。
时代不同,技术不同,我们伟大的前辈们为了处理现今对“有状态”的需求,开发出了session、cookies和application这样的非官方协议,大大便利了对Web应用的开发。
-
OSI模型与TCP/IP模型
OSI模型分为7层,英语速记口诀:All People Seem To Need Data Processing
其中TCP/IP协议是一个协议簇,HTTP协议包含其中。所以这里我们主要研究和讨论四层的网络模型。
- 应用层
应用层协议是通过应用进程间交互来完成特定的网络应用,定义的是应用进程间的通信和交互的规则。则可以这样理解,每个应用层协议都是为了解决一项应用请求问题,而要处理这样的问题需要多个服务器、多个应用进程的通信和协同工作进行处理。应用层协议就是这些协同工作的规则。
所以应用层进程应当定义:
1、应用进程交换的报文类型;
2、报文类型的语法;
3、字段的语义;
4、进程何时、如何发送报文,以及对报文进行响应的规则;
- 传输层(TCP、UDP)
传输层为相互通信的应用进程提供逻辑通信;
规定了端口和套接字的意义;
无连接UDP的特点;
面向连接TCP的特点;
在不可靠的网络上实现可靠传输的工作原理、停止等待协议和ARQ协议;
TCP的滑动窗口、流量控制、拥塞控制和连接管理;
UDP:用户数据报协议,不提供可靠的交付。因为UDP在传输前不需要确认连接的健康,也不需要建立连接。远端运输层接收到UDP的数据报文时,明白了客户端的意图:别说话,传就完事了!
TCP:传输控制协议,传输数据前需要先建立连接,传输结束后不提供广播或多播的服务。是一个可靠的、面向连接的数据服务。
- 网际层
网络层只提供无连接、灵活、简单的,尽最大努力交付的网络数据报连接。网络层不保证服务质量,也就是说不保证分组传输的时限、包可能错误、丢失和失序。
- 网络接口层