浅谈http协议

来源:互联网 发布:什么是奥菲斯软件 编辑:程序博客网 时间:2024/05/21 09:59

定义:HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。

用大白话来讲,我们每天上的网页,都是本来存在别人家的东西,我们每天点击这个那个的连接,HTTP协议就帮我们需要浏览这个网页的请求带到别人家去,然后拿着别人家给的符合我们需要的东西跑回来交给我们,它的存在大概是下图这么一个过程


我们来走一遍完整的网页请求过程,让大家有一个大概的了解

1)我们点击/在地址栏输入地址“www.jianshu.com"回车

2)浏览器解析域名得到对应IP的过程:


①浏览器会首先搜索浏览器自身的DNS缓存,看有没有“www.jianshu.com”对应的条目,如果有并且没有过期则解析到此结束

②如果没有找到对应的条目,浏览器会查找操作系统缓存中是否有这个域名对应的DNS解析结果,如果找到并且没有过期则解析结束

③如果在系统的DNS缓存也没有找到对应的条目,那么它会尝试读取hosts文件(“C:\Windows\System32\drivers\etc”)看里面有没有该域名对应的IP,有则解析成功

hosts中也找不到?那就要请求本地的DNS服务器了,浏览器就会发起一个DNS的系统调用,向本地配置的首选DNS服务器发起域名解析请求,运营商的DNS服务器首先查找自身的缓存,找到对应的条目,且没有过期,则解析成功。如果没有找到对应的条目,则有运营商的DNS代我们的浏览器发起迭代DNS解析请求,它首先会查找根域的DNS的IP地址,找到根域的DNS地址,就会向其发起请求解析域名,根域发现这是一个顶级域com域的一个域名,于是就告诉运营商的DNS我不知道这个域名的IP地址,但是我知道com域的IP地址,你去找它去,于是运营商的DNS就得到了com域的IP地址,又向com域的IP地址发起了请求解析ip,com域这台服务器告诉运营商的DNS我不知道www.jianshu.com这个域名的IP地址,但是我知道jianshu.com这个域的DNS地址,你去找它去,于是运营商的DNS又向jianshu.com这个域名的DNS地址发起请求解析ip,这个时候jianshu.com域的DNS服务器一查,找到了,于是就把找到的结果发送给运营商的DNS服务器,这个时候运营商的DNS服务器就拿到了www.jianshu.com这个域名对应的IP地址,并返回给Windows系统内核,内核又把结果返回给浏览器,于是浏览器终于拿到了www.jianshu.com对应的IP地址。

3)浏览器与服务器建立一个TCP连接

4)浏览器给服务器发送一个HTTP请求

一个http请求报文由请求头<headers>、请求行<request-line>、请求体<request-body>、空行<blank-line>4个部分组成

① 请求行:由请求方法、URL和HTTP协议版本3个字段组成

② 请求头:由关键字/值对组成,每行一对,关键字和值用英文冒号”:“分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:

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

     Accept:客户端可识别的内容类型列表。星号 “ * ” 用于按范围将类型分组,用 “ */* ” 指示可接受全部类型,用“ type/* ”指示可接受 type 类型的所有子类型。

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

     Accept-Language:客户端可接受的自然语言。

     Accept-Encoding:客户端可接受的编码压缩格式。

     Accept-Charset:可接受的应答的字符集。

     connection:连接方式(close 或 keepalive)。

     Cookie:存储于客户端扩展字段,向同一域名的服务端发送属于该域的cookie。

③空行:最后一个请求头部之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头部。

④请求体:请求体是客户端发给服务端的请求数据,这部分数据并不是每个请求必须的。

5)服务器永久重定向响应

页面永久性移走(301重定向)是一种非常重要的“自动转向”技术。网址重定向最为可行的一种办法。当用户或搜索引擎向网站服务器发出浏览请求时,服务器返回的HTTP数据流中头信息(header)中的状态码的一种,表示本网页永久性转移到另一个地址。为什么要永久重定向呢?当一个网页有多个名字的时候,如果不使用永久重定向那么就相当于同一个网页有多个访问地址,致使这个网页的SEO排名下降,并且可能会产生多次缓存,使用永久重定向就能够保证一个网页的多个地址永远归于一个

一个http响应报文由状态行<status-line>、响应头<headers>、响应体<response-body>、空行<blank-line>4个部分组成

① 状态行: 由HTTP协议版本、服务器返回的响应状态码和响应状态码的文本描述组成。

            1xx:信息性状态码,表示服务器已接收了客户端请求,客户端可继续发送请求。

                 100 Continue

                 101 Switching Protocols

           2xx:成功状态码,表示服务器已成功接收到请求并进行处理。

                  200 OK 表示客户端请求成功

                 204 No Content 成功,但不返回任何实体的主体部分

                 206 Partial Content 成功执行了一个范围(Range)请求

            3xx:重定向状态码,表示服务器要求客户端重定向。

                 301 Moved Permanently 永久性重定向,响应报文的Location首部应该有该资源的新URL,请求的网页已经永久移动到新的位置,服务器返回此响应时会自动转到新位置

                 302 Found 临时性重定向,响应报文的Location首部给出的URL用来临时定位资源,服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来响应以后的请求

                 303 See Other 请求的资源存在着另一个URI,客户端应使用GET方法定向获取请求的资源

                 304 Not Modified 客户端发送附带条件的请求(请求首部中包含如If-Modified-Since等指定首部)时,当经过判断发现所请求的资源存在缓存里,并且没有过期,没有过期则直接获取缓存不和服务器交互,如果过期了,就去请求服务器,如果服务器收到请求后经过判断发现资源没有被修改过,则服务端返回304,让浏览器直接去缓存里拿资源,浏览器就不再从服务器里拿数据,此时响应报文中不包含任何报文主体

                 307 Temporary Redirect 临时重定向。与302 Found含义一样。302禁止POST变换为GET,但实际使用时并不一定,307则更多浏览器可能会遵循这一标准,但也   依赖于浏览器具体实现

             4xx:客户端错误状态码,表示客户端的请求有非法内容。

                 400 Bad Request 表示客户端请求有语法错误,不能被服务器所理解

                 401 Unauthonzed 表示请求未经授权,该状态代码必须与 WWW-Authenticate 报头域一起使用

                 403 Forbidden 表示服务器收到请求,但是拒绝提供服务,通常会在响应正文中给出不提供服务的原因

                 404 Not Found 请求的资源不存在,例如,输入了错误的URL

             5xx:服务器错误状态码,表示服务器未能正常处理客户端的请求而出现意外错误。

                 500 Internel Server Error 表示服务器发生不可预期的错误,导致无法完成客户端的请求

                 503 Service Unavailable 表示服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常

② 响应头:由关键字/值对组成,每行一对,关键字和值用英文冒号”:“分隔,典型的响应头有:

Location:用于重定向接受者到一个新的位置。例如:客户端所请求的页面已不存在原先的位置,为了让客户端重定向到这个页面新的位置,服务器端可以发回Location响应报头后使用重定向语句,让客户端去访问新的域名所对应的服务器上的资源

Server:包含了服务器用来处理请求的软件信息及其版本。它和 User-Agent 请求报头域是相对应的,前者发送服务器端软件的信息,后者发送客户端软件(浏览器)和操作系统的信息

Vary:指示不可缓存的请求头列表

Connection:连接方式

③ 响应体:服务器返回给客户端的文本信息。

④ 空行:最后一个响应头部之后是一个空行,发送回车符和换行符,通知浏览器以下不再有响应头部。


6)浏览器跟踪重定向地址

浏览器得到真正要访问的地址,并会发送另一个http请求。

7)服务器处理请求:

服务器接收到请求,把请求的信息解析出来,访问资源,再用服务端脚本处理

8)服务器返回一个HTML响应

9)释放 TCP 连接

根据connection 若为close,则服务器主动关闭TCP 连接,释放TCP 连接;若为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;

10)客户端浏览器解析HTML内容

客户端将服务器响应的 html 文本解析并显示

11)浏览器获取嵌入在HTML中的对象

就成为了我们看到的网页



原创粉丝点击