HTTP文件协议介绍

写在前面:本文只是http文件协议的介绍,不是http协议介绍,故不包括dns解析等其他内容,旨在从应用层面介绍http文件。

1.HTTP简介

1.1 HTTP协议的简介与作用

http协议是建立在tcp协议80(默认)端口上的一个通讯协议,有了这个通讯协议,在两台机器中就可以通过URL接收与发送内容。



程序员们站在http层上进行开发,不必关心该层以下的内容,甚至无需了解tcp协议,这也是计算机中“抽象”思想的体现。web界就是在http协议的基础上诞生的,当然现在也有很多其应用在使用http协议,例如移动端app、嵌入式智能硬件等。





图1-1 HTTP协议在TCP/IP四层结构中的位置




1.2 web工作流程

我们在浏览器访问一个站点,在输入URL以后,浏览器与服务器的工作流程是这样的,如图1-2。





图1-2 web请求与响应过程





浏览器向URL所指的服务器发送了一个http request文件,服务器接收到这个文件后,返回一个http response文件。浏览器从response文件解析出html文件,并显示在屏幕上。(获取css、js等静态文件也是这个流程,同样放在http response文件中。)

2.HTTP文件介绍

2.1 HTTP文件分类

HTTP文件分为两种,request文件和response文件,request文件又分为GET、POST、HEAD等多种,在web领域最常用的就是GET和POST。




图2-1 http文件分类




2.2 request 文件

request文件一般用来客户端向服务器发请求,由head和body(可选)组成。

  1. GET文件:
    只有head,没有body,每个Header一行一个,换行符是\r\n,格式如下:
GET /path HTTP/1.1  
Header1: Value1
Header2: Value2
Header3: Value3

实例:访问www.baidu.com的request文件就是GET。

GET / HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.107 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6
Cookie: ********
  1. POST文件
    每个Header一行一个,换行符是\r\n,当遇到连续两个\r\n时,Header部分结束,后面的数据全部是Body,格式如下:
POST /path HTTP/1.1
Header1: Value1
Header2: Value2
Header3: Value3

body data goes here...

POST 文件实例,以提交form表单为例。该表单的html代码如下,name输入liuweijie,password输入123456;

<form action="/userData" method="post">
    name:<input type = "text" name = "name"><br/>
    password:<input type = "password" name = "password"><br>
    <input type = "submit" name="submit">
</form>

提交出去的POST文件如下:

POST /userData HTTP/1.1
Host: localhost:63342
Connection: keep-alive
Content-Length: 56
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Origin: http://localhost:63342
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.107 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: http://localhost:63342/htmlLearning/index.html
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6
Cookie: *******

name=liuweijie&password=123456&submit=%E6%8F%90%E4%BA%A4

可以看到POST文件把form的参数放到了body处,例子中是以明文的形式,这样很不安全,一般body中的内容我们都要进行加密。

  1. GET与POST的区别

    引用百度知道里的一个回答,从应用角度上来讲,我觉得回答的非常好。至于本质的区别,没有必要去深究,当然如果有兴趣,可以看这篇文章GET和POST的真正区别


    图2-2 GET与POST的区别

    GET主要用来发送请求,POST用来提交数据。当然GET也可以通过URL传参的方法提交少量数据。

2.3 response文件

response文件一般用来客服务器向客户端回复信息,由head和body组成。

一个response文件的格式如下:

HTTP/1.1 Status-Code Reason-Phrase
Header1: Value1
Header2: Value2
Header3: Value3

body data goes here...

Status-Code是状态吗,200表示正常,404表示没有找到页面。 Reason-Phrase是状态的语言描述。例如200 OK就表示一切正常且成功。状态码有很多种,这里不一一列举,可自行百度谷歌。



下面response文件实例,是上文中请求www.baidu.com发出的request的回应。

HTTP/1.1 200 OK
Server: bfe/1.0.8.5
Date: Sat, 01 Aug 2015 13:59:05 GMT
Content-Type: text/html;charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Cache-Control: private
Expires: Sat, 01 Aug 2015 13:59:05 GMT
Content-Encoding: gzip
X-UA-Compatible: IE=Edge,chrome=1
BDPAGETYPE: 2
BDQID: 0x990999ea000175ad
BDUSERID: 1073794219
Set-Cookie: ****
Set-Cookie: ****
Set-Cookie: ****
Set-Cookie: ****

body including html is too long to paste here,