目录
1. HTTP概述
HTTP 协议(Hypertext Transfer Protocol,超文本传输协议),是一个客户端请求和响应的标准协议,这个协议详细规定了浏览器和万维网服务器之间互相通信的规则。用户输入地址和端口号之后就可以从服务器上取得所需要的网页信息。
HTML是分布式,协作式,超媒体系统应用之间的通信协议。是万维网(world wide web)交换信息的基础。
超文本传输协议中的超文本指的是HTTP除了能传输普通的文本内容之外,还可以传输图片、页面等信息。(实际上传输的还是不同格式的字符串)。
它允许将 超文本标记语言 (HTML) 文档从 Web 服务器传送到 Web 浏览器。HTML 是一种用于创建文档的标记语言,这些文档包含到相关信息的链接。您可以单击一个链接来访问其它文档、图像或多媒体对象,并获得关于链接项的附加信息。
HTTP工作在 TCP/IP协议体系中的TCP协议上。
客户机和服务器必须都支持 HTTP,才能在 万维网上发送和接收 HTML 文档并进行交互。
现在WWW中使用的是HTTP/1.1,它是由RFCs(Requests for comments)在1990年6月制定。目前交由IETF(Internet Engineering Task Force) 和W3C(World Wide Web)负责修改。但最终还是由RFCs对外发布。
客户机和服务器必须都支持 HTTP,才能在 万维网上发送和接收 HTML 文档并进行交互。
默认HTTP的端口号为80,HTTPS的端口号为443。
HTTP工作在 TCP/IP协议体系中的TCP协议上。
HTTP中最重要的就是HTTP协议格式,分为请求协议和响应协议。
通信规则规定了客户端发送给服务器的内容格式,也规定了服务器发送给客户端的内容格式。客户端发送给服务器的格式叫“请求协议(request)
”;服务器发送给客户端的格式叫“响应协议(response)
”。
2. HTTP特点
HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。
-
支持客户/服务器模式。
-
简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
-
灵活:HTTP允许传输任意类型的数据对象。传输的类型由Content-Type加以标记。
-
无连接:无连接是表示每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
注意:
HTTP1.1版本后支持可持续连接。(我们当前就是HTTP/1.1)通过这种连接,就有可能在建立一个TCP连接后,发送请求并得到回应,然后发送更多的请求并得到更多的回应。通过把建立和释放TCP连接的开销分摊到多个请求上,则对于每个请求而言,由于TCP而造成的相对开销被大大地降低了。而且,还可以发送流水线请求,也就是说在发送请求1之后的回应到来之前就可以发送请求2.也可以认为,一次连接发送多个请求,由客户机确认是否关闭连接,而服务器会认为这些请求分别来自不同的客户端。 -
无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
3. HTTP之URL
URL作用:HTTP协议工作于客户端-服务端架构上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。
URL就是浏览器的书写格式。
基本URL包含模式(或称协议)、服务器名称(或IP地址)、路径和文件名,如“协议://授权/路径?查询”。
URL由三部分组成:资源类型、存放资源的主机域名、资源文件名。
也可认为由4部分组成:协议、主机、端口、路径。
由于篇幅原因,关于HTTP中比较重要的URL详细解释放在了我的上一篇博文中:HTTP之URL详解,一起食用效果更佳。
4. HTTP协议格式
4.1 HTTP请求
HTTP请求由三部分组成,分别是:请求行、请求头(请求报头)、请求正文(请求体)。
格式:
请求行
请求头1
请求头2
……
请求空行
请求体
4.1.1 请求行
请求行由三部分组成:请求方式(请求方法),请求路径,请求协议版本。
格式如下:Method空格Request-URI空格HTTP-Version CRLF
Method 表示请求方法;
Request-URl是一个统一资源标识符;
HTTP-Version.表示请求的 HTTP 协议版本;
CRLF表示回车和换行;
例如:GET /images/logo.gif HTTP/1.1
HTTP协议中共定义了十种方法(有时也叫“动作”)来表明Request-URI指定的资源的不同操作方式:
HTTP请求方法中需要说明的是GET
和POST
方法(最常用的就是GET方法和POST方法)。
-
如果请求行中是
GET
方法,则没有请求体。 -
用户在浏览器的地址栏中输入URL,回车发出的请求都是
GET
请求。 -
方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Method Not Allowed);当服务器不认识或者不支持对应的请求方法的时候,应当返回状态码501(Not Implemented)。
-
HTTP服务器至少应该实现GET和HEAD方法,其他方法都是可选的。当然,所有的方法支持的实现都应当符合下述的方法各自的语义定义。此外,除了上述方法,特定的HTTP服务器还能够扩展自定义的方法。
-
请求版本信息一般是
HTTP/1.1
或者HTTP/1.0
。 -
请求行以换行(回车)作为请求行的结束。
请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本。
4.1.2 请求头(Header)
-
在HTTP/1.1协议中,所有的请求头,除
post
外,都是可选的。 -
请求头是以
key: value
的形式现示的。每一个报头域(报头域包括请求头和响应头)都是由名字+”:”+空格+值组成,消息报头域的名字是大小写无关的。 -
请求头里保存的是请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示请求头部分结束。
-
HTTP常见的请求头(Header)
Content-Type: 数据类型(text/html等)
Content-Length: Body的长度
Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
User-Agent: 声明用户的操作系统和浏览器版本信息;
referer: 当前页面是从哪个页面跳转过来的;
location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问;
Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能.
浏览器不是根据资源的后缀判断资源的类型,而是通过Content-Type
来判断资源的类型。(这是因为WEB服务器中有MIME配置)
4.1.3 空行
空行标志着请求头的结束,也标志着请求体的开始。
空行可以用\r\n
书写。
4.1.4 请求体(Body)
GET
方法没有请求体,因为GET
方法的请求参数都已经跟在了URL(地址栏)的后面。
空行后面的内容都是请求体 ,请求体允许为空字符串. 如果请求体存在, 则在请求头中会有一个Content-Length属性来标识Body的长度。
4.2 HTTP响应
在接收和解释请求消息后,服务器返回一个HTTP响应消息。
HTTP响应也是由三个部分组成,分别是:状态行、消息报头、响应正文。
格式
状态行
响应头1
响应头2
……
响应空行
响应体
4.2.1 状态行
状态行包括:协议版本,状态码,[状态码说明]。
格式:如下:HTTP-Version空格Status-Code空格Reason-Phrase CRLF
-
HTTP- Version表示HTTP版本,例如为HTTP/1.1。
-
Status- Code是结果代码,用三个数字表示。
-
Reason-Phrase是个简单的文本描述,解释Status-Code的具体原因。
Status-Code用于机器自动识别,Reason-Phrase用于人工理解。Status-Code可以省略。
Status-Code的第一个数字代表响应类别,可能取5个不同的值。
后两个数字没有分类作用。
Status-Code的第一个数字代表响应的类别,后续两位描述在该类响应下发生的具体状况。
例如:HTTP/1.1 200 OK
状态码概括以及状态码描述:
最常见的状态码, 比如 200(OK), 404(Not Found), 403(Forbidden), 302(Redirect, 重定向), 504(BadGateway)。
由于篇幅原因,关于HTTP中的状态码详细信息放在了我的下一篇博文中:HTTP状态码,一起食用效果更佳。
4.2.2 响应头(Header)
服务器需要传递许多附加信息,这些信息不能全放在状态行里。因此,需要另行定义响应头域,用来描述这些附加信息。响应头域主要描述服务器的信息和Request-URI的信息。
-
响应头是以
key: value
的形式现示的。每一个报头域(报头域包括请求头和响应头)都是由名字+”:”+空格+值组成,消息报头域的名字是大小写无关的。 -
响应头里保存的是响应的附加信息, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束。
-
响应头里重要的Content-x是关于正文/资源内容部分的说明。
Content-Type说明了正文/资源内容的格式。
Content-Length说明了正文/资源内容的长度。(以字节为单位)
4.2.3 空行
空行标志着响应头的结束,也标志着响应体的开始。
空行可以用\r\n
书写。
4.2.4响应体(Body)
空行后面的内容都是Body。 Body允许为空字符串。 如果Body存在, 则在Header中会有一个Content-Length属性来标识Body的长度; 如果服务器返回了一个html页面, 那么html页面内容就是在body中。
4.3 消息头(补充)
补充说明HTTP协议中重要的消息头内容。
HTTP消息由客户端到服务器的请求和服务器到客户端的响应组成。请求消息和响应消息都是由开始行(对于请求消息,开始行就是请求行,对于响应消息,开始行就是状态行),消息报头(可选),空行(只有CRLF的行),消息正文(可选)组成。
每一个报头域都是由名字+”:”+空格+值组成,消息报头域的名字是大小写无关的。(报头域包括请求头和响应头)
4.3.1 请求头
请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。
例如,请求头中的Referer
说明:
Referer
:该请求头指明请求从哪里来。
如果是地址栏中输入地址访问的都没有该请求头(因为这就是你的初始访问页面)。如果从初始访问页面点击进入下一个页面(不建立新的标签页的情况下),通过请求可以看到,此时多了一个Referer的请求头,并且后面的值为该请求从哪里(初始访问页面)发出。比如百度竞价,只能从百度来的才有效果,否则不算;通常用来做统计工作、防盗链。
4.3.2 响应头
响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对Request-URl所标识的资源进行下一步访问的信息。
例如,请求头中的Location
说明:
-
Location
:Location响应报头域用于重定向接受者到一个新的位置。
Location响应报头域,常用在更换域名的时候。
如:response.sendRedirect("http://www.baidu.com");
-
Refresh
:自动跳转(单位是秒),可以在页面通过html中在标签里的meta标签实现,也可在后台实现。
如:<meta http-equiv="refresh"content="3;url="http://www.baidu.com">
//不写后面的url说明每三秒刷新自己的页面,加上,说明三秒后跳转到指定的url页面位置.
5. HTTP工作流程
一次HTTP操作称为一个事务,其工作过程可分为四步:
1)首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作开始。
2)建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。
3)服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
4)客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。
如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,有显示屏输出。对于用户来说,这些过程是由HTTP自己完成的,用户只要用鼠标点击,等待信息显示就可以了。