一次完整请求的图解
Web浏览器之Http协议
Http接口
Http的接口特点:
-
短连接
-
无状态
-
支持客户/服务器模式。
-
简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。
-
灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type标记正在传输的对象类型
-
无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。
-
无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
Http连接的过程:
当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求。Http会通过TCP建立起一个到服务器的连接通道,当本次请求需要的数据完毕后,Http会立即将TCP连接断开
TCP连接是确定了源路径和目标路径(向哪里请求资源),有了Http协议以后是确定了通过什么方式请求资源。
接下来需要的就是请求资源的定位了
URL解析
组成:
URI包括URL和URN两个类别,URL是URI的子集,所以URL一定是URI,而URI不一定是URL
URI=URL+URN
URL一般的语法格式:(带[]的为可选项)
protocol :// hostname[:port] / path / [;parameters][?query]#fragment
//在最前面的是应用层协议资源类型、存放资源的主机域名、资源文件名。
-
协议部分:代表页面使用的是http协议,在Internet中可以使用多种协议,如HTTP,FTP等等。在"HTTP"后面的“//”为分隔符;
-
域名部分:IP地址+端口(注册域名)。如果省略端口部分,将采用默认端口80/tcp;
-
虚拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录不是URL必须的部分
-
文件名部分:域名后的最后一个“/”开始到“?”为止,如果没有?则是到#,如果都没有则是从域名后的最后一个“/”开始到结束,都是文件名部分。
-
锚部分:从“#”开始到最后,都是锚部分。锚部分也不是一个URL必须的部分(可以理解为定位)
-
参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分
Http协议构造
Http请求消息组成部分
-
请求行(Request Line)
-
请求头部(Header)
-
空行
-
请求数据(request body)
请求行
请求方法字段、URL字段和HTTP协议版本字段3个字段组成
HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。
请求头部
由Key-Value键值对组成,有关于客户端请求的信息--->通常来说会包含这三部分其他的Header信息都是可选的
-
User-Agent:产生请求的浏览器类型。
-
Accet:客户端可识别的内容类型列表。
-
Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
可选部分:
-
Accept:用户的设置信息
-
Accept-Language:说明用户的默认语言设置。如果网站有不同的语言版本,那么就可以通过这个信息来重定向用户的浏览器。
-
Accept-Encoding:服务端可接受的消息主体编码格式
-
Accept-Charset:服务端可接受的字符集编码
-
if-Modified-Since:如果一个页面已经在你的浏览器中被缓存,那么你下次浏览时浏览器将会检测文档是否被修改过,那么它就会发送这样的头部:
-
If-Modified-Since: Sat, 28 Nov 2009 06:38:19 GMT
-
如果自从这个时间以来未被修改过,那么服务器将会返回“304 Not Modified”,而且不会再返回内容。浏览器将自动去缓存中读取内容
-
-
还有一个叫Etag的HTTP头信息,它被用来确定缓存的信息是否正确
-
cookie:发送浏览器中存储的Cookie信息给服务器。
-
referer:头部将会包含referring url信息。--->我访问Nettuts+的主页并点击了一个链接,这个头部信息将会发送到浏览器:Referer: http://www.baidu.com/
-
Authorization:当一个页面需要授权,浏览器就会弹出一个登陆窗口,输入正确的帐号后,浏览器会发送一个HTTP请求,但此时会包含这样一个头部:
Authorization: Basic bXl1c2VyOm15cGFzcw==
包含在头部的这部分信息是base64 encoded。例如,base64_decode(‘bXl1c2VyOm15cGFzcw==’) 会被转化为 ‘myuser:mypass’ 。
请求正文
-
请求数据不在GET方法中使用
-
在POST方法中用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。
一次Http请求报文([]表示非必选)
<request-line>
<headers>
<blank line>
[<request-body>]
Http响应消息
在接收和解释请求消息后,服务器返回一个Http响应消息
组成部分:
-
状态行
-
消息报头
-
响应正文
状态行
HTTP-Version Status-Code Reason-Phrase CRLF
-
HTTP-Version表示服务器HTTP协议的版本
-
Status-Code表示服务器发回的响应状态代码
-
1xx:指示信息--表示请求已接收,继续处理
-
2xx:成功--表示请求已被成功接收、理解、接受
-
3xx:重定向--要完成请求必须进行更进一步的操作
-
4xx:客户端错误--请求有语法错误或请求无法实现
-
5xx:服务器端错误--服务器未能实现合法的请求
-
-
Reason-Phrase表示状态代码的文本描述
响应报头
描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述信息,可以通知客户端如何处理等一会儿它回送的数据
响应正文
响应的消息体,如果是纯数据就是返回纯数据,如果请求的是HTML页面,那么返回的就是HTML代码,如果是JS就是JS代码
Get请求与Post请求的区别
-
Get:向服务端获取请求;数据放在URL里,有长度限制
-
Post:向服务端发送请求;数据放在body里,无长度限制;更安全
-