7.13一次完整的Http请求过程(2)

7.13一次完整的Http请求过程(2)

一次完整请求的图解

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信息都是可选的

  1. User-Agent:产生请求的浏览器类型。

  2. Accet:客户端可识别的内容类型列表。

  3. Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。

可选部分:

  1. Accept:用户的设置信息

  2. Accept-Language:说明用户的默认语言设置。如果网站有不同的语言版本,那么就可以通过这个信息来重定向用户的浏览器。

  3. Accept-Encoding:服务端可接受的消息主体编码格式

  4. Accept-Charset:服务端可接受的字符集编码

  5. if-Modified-Since:如果一个页面已经在你的浏览器中被缓存,那么你下次浏览时浏览器将会检测文档是否被修改过,那么它就会发送这样的头部:

    1. If-Modified-Since: Sat, 28 Nov 2009 06:38:19 GMT

    2. 如果自从这个时间以来未被修改过,那么服务器将会返回“304 Not Modified”,而且不会再返回内容。浏览器将自动去缓存中读取内容

  6. 还有一个叫Etag的HTTP头信息,它被用来确定缓存的信息是否正确

  7. cookie:发送浏览器中存储的Cookie信息给服务器。

  8. referer:头部将会包含referring url信息。--->我访问Nettuts+的主页并点击了一个链接,这个头部信息将会发送到浏览器:Referer: http://www.baidu.com/

  9. 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里,无长度限制;更安全

  •  

It's a lonely road!!!
原文地址:https://www.cnblogs.com/JunkingBoy/p/15008035.html