参考链接:https://kb.cnblogs.com/page/130970/
Http协议简介:
协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。
我们绝大多数的Web应用都是基于HTTP来进行开发的。我们对Web的操作都是通过HTTP协议来进行传输数据的。
Http是无状态协议:
无状态协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息 ,也就是说,当客户端一次HTTP请求完成以后,客户端再发送一次HTTP请求,HTTP并不知道当前客户端是一个”老用户“。
可以使用Cookie来解决无状态的问题,Cookie就相当于一个通行证,第一次访问的时候给客户端发送一个Cookie,当客户端再次来的时候,拿着Cookie,那么服务器就知道这个是”老用户“。
长连接和短连接:
* 在HTTP1.0的时候,每一次进行HTTP通信就会断开一次连接。如果容量很少的文本传输是没有问题的。但是如果我们访问一个网页,该网页有非常多的图片。一个图片就算上一个HTTP请求了。那么在中途中就不断地建立TCP连接、
获取图片、断开TCP连接这样是非常浪费资源的,因此在HTTP1.1版本,HTTP1.1规定了默认保持长连接(HTTP persistent connection ,也有翻译为持久连接);数据传输完成了保持TCP连接不断开(不发RST包、不四次握手),等
待在同域名下继续用这个通道传输数据;相反的就是短连接。
*长连接为“管线化”方式发送成为了可能(管线化可以看这里https://www.cnblogs.com/hyzm/p/9530392.html),在一次HTTP连接里面,不需要等待服务器响应请求,就能够继续发送第二次请求。
URL(uniform resource locator):
统一资源定位器,URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上,特别是著名的Mosaic。
采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。
URL一般由三部组成:①协议(或称为服务方式,例如:http, https, ftp)②存有该资源的主机IP地址(有时也包括端口号)③主机资源的具体地址。如目录和文件名等。
Http请求消息:
请求消息 由 请求行,请求头部,空行和请求数据4部分组成。
借由谷歌浏览器调试工具可以看到:
请求行:请求方法(例如post、get等) 请求资源、和Http版本号。
请求头部:用来说明服务器要使用的附加信息。
空行:请求头部后面的空行是必须的
请求数据:请求数据也叫主体,可以添加任意的其他数据。
HTTP Request Header 请求头部的参数信息:http://tools.jb51.net/table/http_header
Header | 解释 | 示例 |
---|---|---|
Accept | 指定客户端能够接收的内容类型 | Accept: text/plain, text/html |
Accept-Charset | 浏览器可以接受的字符编码集。 | Accept-Charset: iso-8859-5 |
Accept-Encoding | 指定浏览器可以支持的web服务器返回内容压缩编码类型。 | Accept-Encoding: compress, gzip |
Accept-Language | 浏览器可接受的语言 | Accept-Language: en,zh |
Accept-Ranges | 可以请求网页实体的一个或者多个子范围字段 | Accept-Ranges: bytes |
Authorization | HTTP授权的授权证书 | Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
Cache-Control | 指定请求和响应遵循的缓存机制 | Cache-Control: no-cache |
Connection | 表示是否需要持久连接。(HTTP 1.1默认进行持久连接) | Connection: close |
Cookie | HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。 | Cookie: $Version=1; Skin=new; |
Content-Length | 请求的内容长度 | Content-Length: 348 |
Content-Type | 请求的与实体对应的MIME信息 | Content-Type: application/x-www-form-urlencoded |
Date | 请求发送的日期和时间 | Date: Tue, 15 Nov 2010 08:12:31 GMT |
Expect | 请求的特定的服务器行为 | Expect: 100-continue |
From | 发出请求的用户的Email | From: user@email.com |
Host | 指定请求的服务器的域名和端口号 | Host: www.zcmhi.com |
If-Match | 只有请求内容与实体相匹配才有效 | If-Match: “737060cd8c284d8af7ad3082f209582d” |
If-Modified-Since | 如果请求的部分在指定时间之后被修改则请求成功,未被修改则返回304代码 | If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMT |
If-None-Match | 如果内容未改变返回304代码,参数为服务器先前发送的Etag,与服务器回应的Etag比较判断是否改变 | If-None-Match: “737060cd8c284d8af7ad3082f209582d” |
If-Range | 如果实体未改变,服务器发送客户端丢失的部分,否则发送整个实体。参数也为Etag | If-Range: “737060cd8c284d8af7ad3082f209582d” |
If-Unmodified-Since | 只在实体在指定时间之后未被修改才请求成功 | If-Unmodified-Since: Sat, 29 Oct 2010 19:43:31 GMT |
Max-Forwards | 限制信息通过代理和网关传送的时间 | Max-Forwards: 10 |
Pragma | 用来包含实现特定的指令 | Pragma: no-cache |
Proxy-Authorization | 连接到代理的授权证书 | Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
Range | 只请求实体的一部分,指定范围 | Range: bytes=500-999 |
Referer | 先前网页的地址,当前请求网页紧随其后,即来路 | Referer: http://www.zcmhi.com/archives/71.html |
TE | 客户端愿意接受的传输编码,并通知服务器接受接受尾加头信息 | TE: trailers,deflate;q=0.5 |
Upgrade | 向服务器指定某种传输协议以便服务器进行转换(如果支持) | Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11 |
User-Agent | User-Agent的内容包含发出请求的用户信息 | User-Agent: Mozilla/5.0 (Linux; X11) |
Via | 通知中间网关或代理服务器地址,通信协议 | Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1) |
Warning | 关于消息实体的警告信息 | Warn: 199 Miscellaneous warning |
我们也可以在后台使用requse对象获取
Http响应消息:
响应信息由状态行,消息报头,空行和响应正文组成
状态行:由HTTP协议版本号, 状态码, 状态消息 三部分组成。
消息报头:用来说明客户端要使用的一些附加信息(对照参照上表)。
空行:消息报头后面的空行是必须的。
消息正文:服务器返回给客户端的文本信息。
常见的相应的状态码:
-
200:请求被正常处理
-
204:请求被受理但没有资源可以返回
-
206:客户端只是请求资源的一部分,服务器只对请求的部分资源执行GET方法,相应报文中通过Content-Range指定范围的资源。
-
301:永久性重定向
-
302:临时重定向
-
303:与302状态码有相似功能,只是它希望客户端在请求一个URI的时候,能通过GET方法重定向到另一个URI上
-
304:发送附带条件的请求时,条件不满足时返回,与重定向无关
-
307:临时重定向,与302类似,只是强制要求使用POST方法
-
400:请求报文语法有误,服务器无法识别
-
401:请求需要认证
-
403:请求的对应资源禁止被访问
-
404:服务器无法找到对应资源
-
500:服务器内部错误
-
503:服务器正忙
- 更多请见 http://tools.jb51.net/table/http_status_code
一次完整的HTTP请求所经历的7个步骤
HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤:
-
建立TCP连接
在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建 Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议,根据规则, 只有低层协议建立之后才能,才能进 行更层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80。
-
Web浏览器向Web服务器发送请求行
一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令。例如:GET /sample/hello.jsp HTTP/1.1。
-
Web浏览器发送请求头
-
浏览器发送其请求命令之后,还要以头信息的形式向Web服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。
-
Web服务器应答
-
客户机向服务器发出请求后,服务器会客户机回送应答, HTTP/1.1 200 OK ,应答的第一部分是协议的版本号和应答状态码。
-
Web服务器发送应答头
-
正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。
-
Web服务器向浏览器发送数据
-
Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据。
-
Web服务器关闭TCP连接
-
一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码:Connection:keep-aliveTCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。
建立TCP连接->发送请求行->发送请求头->(到达服务器)发送状态行->发送响应头->发送响应数据->断TCP连接
HTTP1.1版本特性:
- 默认持久连接节省通信量,只要客户端服务端任意一端没有明确提出断开TCP连接,就一直保持连接,可以发送多次HTTP请求
- 管线化,客户端可以同时发出多个HTTP请求,而不用一个个等待响应
- 断点续传,实际上就是利用HTTP消息头使用分块传输编码,将实体主体分块传输。
HTTP优化方案:
简要概括一下:
TCP复用,TCP连接复用是将多个客户端的HTTP请求复用到一个服务器端的TCP连接上,HTTP复用是指一个一个客户端的多个HTTP请求通过一个TCP连接进行处理。
内容缓存。将经常用到的内容进行缓存起来,那么客户端就可以直接在内存中获取相应的数据了。
压缩,将文本数据进行压缩,减少宽带
SSL加速。使用SSL协议对HTTP协议进行加密,在通道内加密并加速
TCP缓冲:通过TCP缓冲技术,可以提高服务器端响应事件和处理效率,减少由于通信链路问题给服务器造成连接负担.