HTTP简介
HTTP(Hyper Text Transfer Protocol)是应用层上的协议,我们称之为超文本传输协议,是用于从Web服务器传输超文本到本地浏览器的传送协议。 HTTP是基于TCP/IP协议来传输数据。(HTTP使用TCP而不是UDP的原因在于(打开)一个网页必须传送很多数据,而TCP协议提供传输控制,按顺序组织数据,和错误纠正。) 浏览器作为客户端向web服务器通过url发送请求,web接收请求后处理向客户端发送响应信息。
HTTP所在位置
HTTP主要特点
1.支持B/S模式、C/S模式
2.简单快速:基于请求和响应,请求只用发送请求方法和路径
3.灵活:可以传输任意类型数据对象
4.无连接:无连接是说应用层是无连接的,下层使用TCP仍然是面向连接的,无连接的含义是指限制每一次建立连接只处理一次请求,服务器处理完客户请求,收到客户应答就断开连接。
5.无状态:HTTP是无状态协议。无状态是指协议对于事物处理没有记忆能力,这次请求与上次请求时无关系的。缺少状态意味着如果后续处理需要之前的信息,需要重传,这会导致每次连接传送数据量增大。另一方面,在服务器不需要先前信息时,应答就较快。
HTTP之URL
HTTP使用统一的资源标识符URI来传输数据和建立连接,URL是一种特殊的URI,包含了用于查找某个资源足够的信息,称之为统一资源定位符。是互联网上用于标识某一资源的地址。
详解URL的组成
HTTP方法
根据HTTP标准,HTTP可以使用多种方法。
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
GET 请求指定的页面信息,并返回实体主体。
HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。
数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT 从客户端向服务器传送的数据取代指定的文档的内容。
DELETE 请求服务器删除指定的页面。
CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS 允许客户端查看服务器的性能。
TRACE 回显服务器收到的请求,主要用于测试或诊断。
HTTP请求和响应格式
客户端发送一个HTTP请求的请求消息包括:
请求行+请求报头(header)+空行+请求正文(Body)
一般情况下,服务器接收并处理客户端发来的请求之后,会返回一个响应消息,其包括:
响应行+响应报头(header)+空行+响应正文(Body)
说明:
header:是请求的属性,是以冒号分隔的键值对形式,每组键值对之间用\n分隔,header遇到空行结束
body:空行后面都是body,body允许空字符串,如果body存在,则在header中会有一个Content-Length标识body长度,如果服务器返回了⼀个html⻚⾯, 那么html⻚⾯内容就是在body中
常见header:
Content-Type: 数据类型(text/html等)
Content-Length: Body的⻓度
Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端⼝上;
User-Agent: 声明⽤户的操作系统和浏览器版本信息;
referer: 当前⻚⾯是从哪个⻚⾯跳转过来的;
location: 搭配3xx状态码使⽤, 告诉客户端接下来要去哪⾥访问;
Cookie: ⽤于在客户端存储少量信息. 通常⽤于实现会话(session)的功能
HTTP状态码
状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
1xx:指示信息–表示请求已接收,继续处理
2xx:成功–表示请求已被成功接收、理解、接受
3xx:重定向–要完成请求必须进行更进一步的操作
4xx:客户端错误–请求有语法错误或请求无法实现
5xx:服务器端错误–服务器未能实现合法的请求
常用状态码:
200 OK //客户端请求成功
302 Redirect //重定向
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
HTTP工作流程
一个HTTP操作叫做一个事务
1)客户端与服务器建立连接。一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口建立一个TCP套接字连接。
2)建立连接之后,客户端向服务器发送请求报文,请求方式的格式为:请求方法| 统一资源标识符(URL) |协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。
3)服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号 |一个成功或错误的代码 |后边是MIME信息包括服务器信息、实体信息和可能的内容。
4)客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。
如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,有显示屏输出。对于用户来说,这些过程是由HTTP自己完成的,用户只要用鼠标点击,等待信息显示就可以了。
长连接与短连接
长连接:
建立连接——数据传输。。。(保持连接)。。。数据传输——关闭连接
短连接:
建立连接——数据传输——关闭连接。。。建立连接——数据传输。。。
在HTTP1.1版本加入了长连接,接下来我们来说一说。
HTTP长连接和短连接实质上是TCP的长连接和短连接。
HTTP协议是无状态的,指的是协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。简单的说,你打开的服务器上的网页之间是没有任何的联系的。
长连接:HTTP/1.1开始使用长连接,用来保持连接的特性。使用长连接的HTTP协议,会在响应头加入一行代码:Connection:keep-Alive,在使用长连接的情况下,当网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端去再次进行访问,这个时候再次去访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它会有一个保持时间,可以在不同的服务器软件上去设定这个时间。实现长连接需要客户端和服务器都来支持长连接。
短连接:HTTP/1.0默认使用短连接,浏览器和服务器每次进行一次HTTP操作,就建立一次连接,任务结束以后中断连接。当客户端浏览器去访问资源的时候,这个时候就需要建立一次HTTP会话。
HTTP的长连接和短连接是对应TCP的长连接和短连接
TCP的短连接,client/server之间传递一次读写操作,然后由client断开连接,特点是管理起来比较简单,存在的链接都是有用的连接(主要此时的连接都会进行数据传输),不需要额外的控制手段。
TCP的长连接,C/S进行一次读写操作以后不进行关闭连接,后续读写操作还回去使用这个连接。
此时使用的是TCP的保活功能,保活功能主要是为服务器应用提供的,服务器应用希望知道客户主机是否崩溃。
长短连接优缺点
长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。对于频繁请求资源的客户来说,适用长连接。长连接需要进行TCP的保活探测,还有就是它只是探测TCP的存活,如果遇到恶意的链接,保活功能就不应该使用。
在长连接下,client不会主动去关闭连接,这样随着客户端连接越来越多,server就会出现问题,太多连接要去分配数据结构来操作。
这个时候就需要采取一些措施,例如关闭一部分长时间没有使用的连接,防止出现服务器崩溃,如果条件允许,就可以限制客户端的最大长连接数目,防止一台客户端机器去占有太多对服务器产生损害。
短连接的管理就是存在的连接都是有用的连接,不需要额外的控制手段。唯一的缺陷就是如果有频繁的请求,这个时候将会在TCP的建立和关闭上浪费时间和带宽。
长连接的应用:数据库的连接使用长连接,因为数据库是经常要进行写入写出的操作的。
短连接的应用:WEB网站的HTTP服务一般来说都会使用短连接,长连接会耗费一定的资源,造成高并发的问题。