HTTP/超文本传输协议
嗷嗷,HTTP协议之前就想好好总结下,额。。。Go Now
WEB服务器 浏览器/客户机 代理服务器
在说HTTP协议前先来了解下,当我们在浏览器地址栏输入URL后,浏览器是怎么获取到资源并以网页的形式显示出来的呢?
在我们输入URL后,浏览器就向WEB服务器发送Request请求;WEB服务器接收到Request后进行相应的处理,并生成Response发送给浏览器;浏览器解析Response中的HTML,这就是我们看到的网页。中间可能存在代理服务器,代理服务器现实翻译转发的功能(代理服务器在WEB服务器与浏览器/客户机之间)。
HTTP版本
HTTP协议有三个主要版本,分别为1990年HTTP0.9、1996年HTTP1.0、2000年HTTP1.1。
HTTP0.9:HTTP协议的第一个版本,相对简单,只实现GET方法;
HTTP1.0:加入POST方法,加入HTTP Header头,默认一次传输后关闭连接(在浏览器解析HTML过程中可能自动完成多次请求通信);
HTTP1.1:默认保持连接。
HTTP协议
HTTP/Hyper Text Transfer Protocol,超文本传输协议是一种无状态的面相连接的协议。
无状态:表示协议对处理的事务没有记忆能力,换句话说就是对于每一次请求,服务器不知是否来自同一个客户端(引入Cookie机制解决这个问题)。
面相连接:表示协议基于TCP,1.0中默认传输一次后关闭连接(浏览器在解析HTML过程中可能自动完成多次请求通信);1.1中默认保持连接,即完成一次传输后不关闭连接,当客户端再次访问服务器上的网页时,使用这条已经建立的TCP连接(与Response中的Connection:keep-alive/close有关,但是keep-alive有一个保持时间)。
URL
URL/Uniform Resource Lacator,统一资源定位符用于描述一个网络上的资源。
组成格式为:
schema://host[:port#]/path/…/[;url-params][?query-string][#ancher]
schema:使用的协议,HTTP/HTTPS/FTP;
host:WEB服务器的IP地址或者域名;
port:WEB服务器使用的端口号,默认80,可以省略;
url-params:特定的参数;
query-string:查询的参数,以名称值对(名称=值)的形式出现,多个名称值对中以‘&’分割;
ancher:锚。
如:http: //www.panghong.com/sj/test;id=8079?name=sviergn&x=true#stuff
HTTP Request请求
HTTP Request是客户端向服务器发送的信息,这个信息有三个组成部分,分别为Request line、HTTP Header、Body,HTTP Header与Body之间有个空行。
第一部分Request line:由Method请求方法、Request-URL请求资源、HTTP/Version-number协议版本组成。
如 GET http: //www.panghong.com/ HTTP/1.1
Method请求方法
Method为客户端和WEB服务器交互的方式,话句话说URL确定一个资源在网络上的位置,而Method就确定对这个资源执行怎样的操作。HTTP中Method有GET(查)、POST(改)、PUT(增)、DELETE(删)、HEAD(查:Response header)、TRACE(诊断:回发请求头)、OPTIONS(查询服务器资源)、CONNECT(保留)。
说说GET与POST的区别
GET提交的数据放在URL之后(看URL组成),数据(query-string)以名称值对形式出现(名称=值),以‘?’开始以‘&’分隔,其实GET提交的数据只是为了查询资源而提供的参数。由于数据放在了这里,所以HTTP Request的第三部分Body为空;还有提交的数据有长度限制并且不安全。
POST通过Body发送数据(form),所以没有长度限制。
第二部分HTTP Header:可以是请求头/Request header、普通头/General header、实体头/Entity header。
第三个部分Body:GET方法没有Body。
下图为登录博客园时使用Fiddler工具捕获的HTTP Request结构信息:
HTTP Response响应
HTTP Response是WEB服务器接收到Request后进行相应的处理并返回的一个响应,和HTTP Request一样HTTP Response也有三部分组成,Response line、HTTP Header、Body。
第一部分Response line:由HTTP/Version-number协议版本、Status-code状态码、Status-message状态信息组成。
如 HTTP/1.1 200 OK
状态码告诉客户端,服务器产生了怎样的Response。
状态码有三位数组成,可以分为5类状态码:
1xx:提示信息类,请求已被接收,正在处理;
2xx:成功类,请求已被接收,处理;
3xx:重定向类,请求已被接收,需要进一步处理;
4xx:客户端错误类,如请求语法错误;
5xx:服务器错误类,合法请求服务器不能处理;
常见的状态码:
200 OK:请求已经完成,请求的资源已返回客户端;
302 Found:重定向,新的RUL在Response的Location中,浏览器将会使用新的URL发出Request;
304 Not Modified:表示该文档已被缓存,可以使用;
400 Bad Request:错误的请求,如语法错误,服务器不可以理解;
401 Unauthorized:请求为经授权,与WWW-authenticate(说明验证方式,如Basic auth)一同使用;
403 Forbidden:服务器收到请求,但是拒绝服务;
404 Not Found:请求资源不存在,或URL错误;
500 Internet Server Error:服务器发生不可预期的错误;
503 Server Unavailable:当前服务器不可用,可一段时间后再试。
第二部分HTTP Header:可以是Response Header/响应头、普通头/General Header,或者实体头/Entity Header。
第三部分Body:即请求的信息,如HTML,图片等。
下图为登录博客园过程中使用Fiddler捕获的Response结构信息:
HTTP Header头
HTTP Header头实际就是一个标签,如果浏览器能理解这个头就会按照某种标准(如W3C标准)去解析,如果不能就会忽略。换句话说,你可以写一个浏览器按照不同的效果解析不同的标签。
HTTP Header头可以分为4类:
普通头/General Header:可以用于请求消息或者响应消息,描述消息本身;
请求头/Request Header:客户端向服务器发送请求的附加头部信息;
响应头/Response Header:服务器发送响应的附加头部信息;
实体头/Entity Header:可以在请求消息或者响应消息中发送一个实体,实体由实体头和实体正文组成,实体头和实体正文不一定要同时发送,可以只发送实体头,实体头描述实体正文(或者请求的资源信息)。
参考的博客文章:
来自博客园的HTTP协议详解
来自博客园的HTTP协议漫谈
来自博客园的HTTP协议详解 这篇文章历史比较长
以上为个人笔记 如有错误还望指出 唯有时间了解爱