HTTP协议-pzyyll

HTTP协议


Web浏览器和Web服务器程序进行数据交换,发送请求和应答时,要遵循一定的协议(不然也无法解析数据),这个协议就是超文本传输协议(Hyper Text Transfer Protocol, HTTP).
HTTP协议使用TCP协议作为支持,为其提供可靠的数据传输服务。

  • Web浏览器和Web服务器


    Paste_Image.png

HTTP1.1特性


  1. 应用层协议: HTTP工作在应用层, 运输层使用TCP协议, 默认端口为80
  2. 基于C/S模式: 客户端通过浏览器(并非一定是浏览器)向服务器发出请求, 服务器向客户端返回对请求的应答。
  3. 双向传输: 客户端向服务器发送请求, 服务器向客户端回应信息, 客户端负责将回应信息解析呈现给用户。客户端也可以将诸如表单一类的信息发送给服务器。
  4. 支持多个主机名: HTTP1.1版本允许一个Web服务器处理几十个甚至几百个虚拟机的请求。
  5. 持久连接:允许客户机在一个TCP连接中发送多个相关文档的请求。 HTTP1.0以前的版本一个请求需要一个新的TCP连接。
  6. 部分资源选择: 允许客户机只要求文档的部分资源的请求, 这样可以减少服务器的负载, 节省了资源。
  7. 支持高速缓存的代理: Web浏览器将用户浏览过的网页内容缓存在本机高速缓存中; 亦可在客户机和服务器之间建立代理服务器, 将本网络中曾经访问过的网页缓存在本地代理服务器中,客户端优先从代理服务器中读取信息, 减少不必要的Internet访问流量。
  8. 内容协商: 通过内容协商特性完成客户机和服务器的信息交换, 确定传输的细节。
  9. 安全性好:使用鉴别方法提高安全性能。

HTTP的工作过程


  • 客户机与服务器交互过程
交互过程
  1. Web服务器监听本地80端口。等待请求。
  2. 建立连接。由TCP协议建立连接, 开启一条传输通道, 提供数据传输的保障。
  3. 客户端发出请求。连接建立后, 即可向服务器发出请求, 获取数据。请求封装在HTTP请求报文中。
  4. Web服务器应答请求。 收到请求后, Web服务器将应答和对应文件放入HTTP应答报文中, 发送给客户端。
  5. 重复3, 4
  6. 通信结束, 关闭连接。

HTTP无状态特性

服务器不去记录访问的客户端。

持久连接和非持久连接

HTTP1.1默认使用持久连接。

  • 持久连接
Paste_Image.png

可一次连接请求多个文件

  • 非持久连接
Paste_Image.png

每次连接只能请求一个文件

HTTP报文


报文有请求和应答两种。一般以文本形式发送。

请求报文

客户端使用,指明所需文档的名字和位置。

  • 报文结构

Paste_Image.png

GET报文
最常用的的报文,请求参数以?para=val&para2=val2的形式加在URL后面。实体是空的,GET方式一般用来请求数据。当然要用来提交数据也没有人可以阻止你就是了。。。

Paste_Image.png
  1. Host: 表示所要访问的主机。Host字段与方法字段结合,可以明确要访问的资源。如上图中一个完整的URL应当是:http://i0.wp.com/ooly.club/pzyyll/wp-content/uploads/2016/04/cropped-b_authentique1.jpg?resize-825%2c510
  2. Connection: 告诉服务器对客户端做出应答后,是否保持连接,上图中的Keep-Alive,表示保持连接。例如一个网页文件中可能有多个图片连接,保持连接可以不断开连接而继续下载图片文件,提高效率和响应速度。
  3. Accept: 表示客户端所接受的文档类型。常见的还有 image/gif, image/jpeg, application/vnd.ms-word等等。
  4. User-Agent: 表示客户端类型。可以用于让服务器根据客户端类型返回应答内容,防止出现客户端无法理解应答的现象。
  5. Referer: HTTP參照位址referer,或HTTP referer),是HTTP表頭的一個欄位,用來表示從哪兒連結到目前的網頁,採用的格式是URL。換句話說,藉著HTTP參照位址,目前的網頁可以檢查訪客從哪裡而來,這也常被用來對付偽造的跨網站請求。
  6. Accept-Encoding: 表示客户端能够理解的编码方式。
  7. Accept-Language: 表示客户端优先接受的语言类型, 服务器可以根据语言的不同返回不同版本的主页。

POST报文
另一个最常用的请求报文,一般用于提交数据,或请求参数比较敏感的,例如密码信息等。因为用POST方式提交的数据都会放在请求报文的实体中。
POST报文的首部行还常常会用到下面这个:

  • Content-type: (实体解析类型)
    详细表单内容类型
    较为常用的就是以下两种:
    • application/x-www-form-urlencoded
    • multipart/form-data
    • 另外还有
    • application/json
    • text/xml
    • 等等
      用一个例子作为说明,比如我要传递一个下面的表单信息:

Name:Zhili Cai
Pwd:1234567
Email: pzyyll@gmail.com

1.application/x-www-form-urlencoded: 用这种方式的实体内容的键值对用“KEY=VAL&KEY2=VAL2&..."的方法表示。并且会对KEY和VAL中的某些字符进行URI Encoding转义,具体有哪些可以参照这个,对于空格的处理是转换为‘+’.

POST /post.php HTTP/1.1/r/n
...
Content_type: charset=utf-8; application/x-www-form-urlencoded/r/n
/r/n                          //记得首部行与实体之间空一行
Name=Zhili+Cai&Pwd=1234567&Email=+pzyyll%40gmail.com

2.multipart/form-data:这种方式的实体就稍微有点复杂了,除了要指明content_type外,还要设置一个分隔字符串boundary,详细见下面:

POST /post.php HTTP/1.1
...
Content_type: multipart/form-data; boundary=abcdefghijklmn
                                      //实体与首部行之间空一行
--abcdefghijklmn                      //分割符前还要再加--
Content-Disposition: form-data; name="Name"
                                      //内容与首部行之间空一行
Zhili Cai
--abcdefghijklmn
Content-Disposition:form-data; name="Pwd"

1234567
--abcdefghijklmn
Content-Disposition:form-data; name="Email"

 pzyyll@gmail.com
--abcdefghijklmn--            //结束--boundary--

另外boundary还可以嵌套,以下是摘自官方文档的

   Content-Type: multipart/form-data; boundary=AaB03x

   --AaB03x
   Content-Disposition: form-data; name="submit-name"

   Larry
   --AaB03x
   Content-Disposition: form-data; name="files"
   Content-Type: multipart/mixed; boundary=BbC04y

   --BbC04y
   Content-Disposition: file; filename="file1.txt"
   Content-Type: text/plain

   ... contents of file1.txt ...
   --BbC04y
   Content-Disposition: file; filename="file2.gif"
   Content-Type: image/gif
   Content-Transfer-Encoding: binary

   ...contents of file2.gif...
   --BbC04y--
   --AaB03x--

Content-Disposition 用来指示出内容的类型,例如还有attachment,表示附件。具体可以查看文档

3.application/json: 需要浏览器和服务器支持

POST /post.php HTTP/1.1
...
Content_type: charset=utf-8; application/json
 //记得首部行与实体之间空一行
{"Name":"Zhili Cai", "Pwd":"1234567", "Email":" pzyyll@gmail.com"}

其它的请求方法还有HEAD, PUT, DELETE等

  • HEAD:与GET类似,但是应答报文无实体内容,一般用于检测URI是否有效,能否被访问。
  • PUT:用于将一个文档上传到服务器上,文档内容存储在实体中, 服务器根据URI创建一个新文档,并将实体内容存入新文档中,如果文档在服务器上已经存在,则会覆盖旧文档。执行成功返回对应的应答报文,失败则报错。
  • DELETE:用来删除服务器上的文档。
    各种方式可以查看RFC2616的第9章
应答报文

结构与请求报文类似,但是第一行是状态行,不是请求行了。

应答报文

一个实例:

                        --> HTTP/1.1 302 Found
                            Server: nginx
                            Date: Wed, 04 May 2016 06:06:52 GMT
                            Content-Type: text/html; charset=UTF-8
                            Transfer-Encoding: chunked
                            Connection: keep-alive
                            X-Powered-By: PHP/5.4.41
                            Expires: Wed, 11 Jan 1984 05:00:00 GMT
                            Cache-Control: no-cache, must-revalidate, max-age=0
                            Pragma: no-cache
                            Set-Cookie: [52 bytes were stripped]
                            X-Frame-Options: SAMEORIGIN
                            Set-Cookie: [257 bytes were stripped]
                            Set-Cookie: [247 bytes were stripped]
                            Set-Cookie: [249 bytes were stripped]
                            Location: http://ooly.club/pzyyll/wp-admin/

另外再补充下,现在的HTTP协议已经到版本2了,请求行和状态行,首部行和现在的不太一样
感兴趣的可以查看文档RFC7540

     GET /resource HTTP/1.1           HEADERS
     Host: example.org          ==>     + END_STREAM
     Accept: image/jpeg                 + END_HEADERS
                                          :method = GET
                                          :scheme = https
                                          :path = /resource
                                          host = example.org
                                          accept = image/jpeg
/******************************************************/
     POST /resource HTTP/1.1          HEADERS
     Host: example.org          ==>     - END_STREAM
     Content-Type: image/jpeg           - END_HEADERS
     Content-Length: 123                  :method = POST
                                          :path = /resource
     {binary data}                        :scheme = https

                                      CONTINUATION
                                        + END_HEADERS
                                          content-type = image/jpeg
                                          host = example.org
                                          content-length = 123

                                      DATA
                                        + END_STREAM
                                      {binary data}
/******************************************************/
     HTTP/1.1 100 Continue            HEADERS
     Extension-Field: bar       ==>     - END_STREAM
                                        + END_HEADERS
                                          :status = 100
                                          extension-field = bar

     HTTP/1.1 200 OK                  HEADERS
     Content-Type: image/jpeg   ==>     - END_STREAM
     Transfer-Encoding: chunked         + END_HEADERS
     Trailer: Foo                         :status = 200
                                          content-length = 123
     123                                  content-type = image/jpeg
     {binary data}                        trailer = Foo
     0
     Foo: bar                         DATA
                                        - END_STREAM
                                      {binary data}

                                      HEADERS
                                        + END_STREAM
                                        + END_HEADERS
                                          foo = bar

首部行中还有一个Cookie来记录用户行为,现在也用的比较广。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容