【计算机网络】HTTP协议浅析

什么是协议协议

现实生活中的协议:相互遵守,单方面违背则协议不成立。(停战协议、全球贸易协议)

互联网中的协议:ftp、http、stmp、TCP/IP、UDP…

HTTP协议简介

HTTP(Hypertext transfer protocol):超文本传输协议,详细的制定了万维网服务器与客户端间的数据传输的通信规则。

HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出。

HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。 下图是HTTP请求-响应模型。

img

HTTP协议特点

  1. 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
  2. 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
  3. 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  4. 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
  5. 支持B/S及C/S模式。

HTTP之URL

HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息 。

URL,全称是UniformResourceLocator, 中文叫统一资源定位符,是互联网上用来标识某一处资源的地址。

以下面这个URL为例,介绍下普通URL的各部分组成:

http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name

一个URL包含以下几部分:

  1. 协议部分:该URL的协议部分为http:,代表网页使用的是HTTP协议。Internet中可以使用多种协议,如HTTP、FTP等等。后面的//为分隔符
  2. 域名部分:该URL的域名部分为www.aspxfans.com。在URL中,也能用IP地址来作为域名使用
  3. 端口部分:该URL的端口部分为:8080。跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,则将采用默认端口
  4. 虚拟目录部分:该URL的虚拟目录部分是/news/。从域名后第一个 / 开始,到最后的 / 为止 ,都是虚拟目录部分,它也并不是一个URL必须的部分。
  5. 文件名部分:该URL的文件名部分是index.asp。从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。。文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名。
  6. 锚部分:该URL的锚部分是name。从“#”开始到最后,都是锚部分。锚部分也不是一个URL必须的部分。
  7. 参数部分:该URL的参数部分是boardID=5&ID=24618&page=1。从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。

URI与URL的区别

URI(uniform resource identifier),意思是统一资源标识符,用于唯一的标识一个资源。

Web上可用的每种资源如HTML文档、图像、视频等都是用URI来定位的。

一个URI由三部分组成:

  1. 访问资源的命名机制
  2. 存放资源的主机名
  3. 资源自身名称,由路径表示

URL(uniform resource locator),意思是统一资源定位器,它是一种具体的URI。可以用来标识一个资源,而且还指明了如何锁定这个资源。

URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上。采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录 。

一个URL由三部分组成:

  1. 协议
  2. 存有资源的主机IP地址(包含端口号)
  3. 主机资源具体地址

HTTP之Request

客户端向服务器发送的HTTP请求由如下的四个部分组成

  • 请求行(request line)
  • 请求头(request head)
  • 空行
  • 请求数据

下图就是Http请求的消息结构

img

请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本。

比如如下就是一个GET请求的示例:

请求行

请求行用于说明请求的类型、要访问的资源及使用的HTTP版本

比如上面的请求类型就是GET类型

访问的资源则是 /562f25980001b1b106000338.jpg

使用的HTTP版本是HTTP 1.1

请求头

请求头紧接在请求行后,用于说明服务器使用的附加信息

Host:指定了请求的目的地 img.mukewang.com

User-Agent:包含了浏览器的类型信息。服务器端和客户端脚本都能访问它,它是浏览器类型检测逻辑的重要基础.该信息由浏览器定义,且在每个请求中自动发送。

空行

请求头后必须有一个空行,即使请求数据为空

请求数据

本GET请求中的请求数据为空。

下面是一个POST请求的例子

  • 请求行:标明了使用POST方式,HTTP1.1协议
  • 请求头:标明了一些附加信息
  • 空行:紧跟在请求头后
  • 请求数据:指定了name数据和publisher数据等

HTTP之Response

一般情况下服务器接收到客户端的请求后会返回一个HTTP响应信息

响应信息也是由四部分组成

  • 状态行
  • 消息报头
  • 空行
  • 响应正文

下面就是一个响应的结构

img

下面给出一个响应的例子

状态行

状态行由HTTP版本号(HTTP/1.1),状态码(200)及状态消息(OK)三部分组成

消息报头

消息报头说明了一些客户端要使用的附加信息

  • Date:生成响应的日期和时间

  • Content-Type:指定了MIME类型的HTML(text/html),编码类型是UTF-8

空行

消息报头后必须有一个空行。

响应正文

响应正文则是服务器返回给客户端的文本信息(如HTML代码等)

HTTP之状态码

状态码由三位数字组成,第一个数字定义了相应的类别

  • 1xx:指示信息–表示请求已接收,继续处理
  • 2xx:成功–表示请求已被成功接收、理解、接受
  • 3xx:重定向–要完成请求必须进行更进一步的操作
  • 4xx:客户端错误–请求有语法错误或请求无法实现
  • 5xx:服务器端错误–服务器未能实现合法的请求

下面是一些常见的状态码

更多的状态码可以参考这篇文章

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协议定义了Web客户端如何从Web服务器请求Web页面 ,以及服务器如何将页面传送给客户端。其采用了 请求/响应 模型。

客户端向服务器发送请求报文,请求报文中包含了请求的方法、URL、协议版本、请求头和请求数据。

服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头和响应数据。

下面是详细步骤

1. 客户端连接Web服务器

一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP Socket连接。例如,

2. 发送HTTP请求

通过TCP Socket,客户端向Web服务器发送一个请求报文。

3. 服务器接收请求并返回响应

Web服务器将会解析请求,定位请求的资源。服务器将资源副本写为TCP Socket,由客户端来读取。

4. 释放TCP连接

如果connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接。

如果connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求。

5. 客户端进行相应处理

客户端收到后,先解析状态行,查看状态码是否表明成功。

然后解析响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。

之后客户端对响应的数据进行一系列处理,将结果显示出来。

GET请求与POST请求的区别

GET请求

POST请求

上面是GET和POST请求的示例

它们的区别如下

  1. 放置请求数据的方式不同,因此,GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变
    • GET请求的数据会附在URL之后,如login.action?username=hahaha&password=idontknow。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密
    • POST请求则是把提交的数据放置在HTTP包的包体中。
  2. 传输数据的大小。虽然HTTP协议没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制。但是实际开发中会有如下的限制
    • GET:特定浏览器和服务器对URL长度有限制,例如 IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。 因此对于GET提交时,传输数据就会受到URL长度的限制。
    • POST:由于不是通过URL传值,理论上数据不受限。但实际各个WEB服务器会规定对POST提交数据大小进行限制,Apache、IIS6都有各自的配置。
  3. 安全性
    • POST的安全性要比GET的安全性高。比如:通过GET提交数据,用户名和密码将明文出现在URL上:登录页面有可能被浏览器缓存;其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了。除此之外,使用GET提交数据还可能会造成Cross-site request forgery攻击

评 论 区

  1. 还没有任何评论,你来说两句吧

发表评论

%d 博主赞过: