zoukankan      html  css  js  c++  java
  • http简介看这篇就够了

    什么是协议

    协议,网络协议的简称,网络协议是通信计算机双方必须共同遵从的一组约定。如怎么样建立连接、怎么样互相识别等。只有遵守这个约定,计算机之间才能相互通信交流。它的三要素是:语法、语义、时序

    为了使数据在网络上从源到达目的,网络通信的参与方必须遵循相同的规则,这套规则称为协议(protocol),它最终体现为在网络上传输的数据包的格式。

    协议往往分成几个层次进行定义,分层定义是为了使某一层协议的改变不影响其他层次的协议。

    http协议

    超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。1960年美国人Ted Nelson构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext),这成为了HTTP超文本传输协议标准架构的发展根基。Ted Nelson组织协调万维网协会(World Wide Web Consortium)和互联网工程工作小组(Internet Engineering Task Force )共同合作研究,最终发布了一系列的RFC,其中著名的RFC 2616定义了HTTP 1.1

    1.0 版本

    简介

    1996年5月,HTTP/1.0 版本发布,内容大大增加。

    首先,任何格式的内容都可以发送。这使得互联网不仅可以传输文字,还能传输图像、视频、二进制文件。这为互联网的大发展奠定了基础。

    其次,除了GET命令,还引入了POST命令和HEAD命令,丰富了浏览器与服务器的互动手段。

    再次,HTTP请求和回应的格式也变了。除了数据部分,每次通信都必须包括头信息(HTTP header),用来描述一些元数据。

    其他的新增功能还包括状态码(status code)、多字符集支持、多部分发送(multi-part type)、权限(authorization)、缓存(cache)、内容编码(content encoding)等。

    请求格式

    下面是一个1.0版的HTTP请求的例子。

        GET / HTTP/1.0
        User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5)
        Accept: */*
    

    可以看到,这个格式与0.9版有很大变化。

    第一行是请求命令,必须在尾部添加协议版本(HTTP/1.0)。后面就是多行头信息,描述客户端的情况。

    回应格式

    服务器的回应如下。

        HTTP/1.0 200 OK 
        Content-Type: text/plain
        Content-Length: 137582
        Expires: Thu, 05 Dec 1997 16:00:00 GMT
        Last-Modified: Wed, 5 August 1996 15:55:28 GMT
        Server: Apache 0.84
    

    回应的格式是"头信息 + 一个空行( ) + 数据"。其中,第一行是"协议版本 + 状态码(status code) + 状态描述"。

    Content-Type 字段

    关于字符的编码,1.0版规定,头信息必须是 ASCII 码,后面的数据可以是任何格式。因此,服务器回应的时候,必须告诉客户端,数据是什么格式,这就是Content-Type字段的作用。

    下面是一些常见的Content-Type字段的值。

            text/plain
            text/html
            text/css
            image/jpeg
            image/png
            image/svg+xml
            audio/mp4
            video/mp4
            application/javascript
            application/pdf
            application/zip
            application/atom+xml
    

    这些数据类型总称为MIME type,每个值包括一级类型和二级类型,之间用斜杠分隔。

    除了预定义的类型,厂商也可以自定义类型。

        application/vnd.debian.binary-package
    

    上面的类型表明,发送的是Debian系统的二进制数据包。

    MIME type还可以在尾部使用分号,添加参数。

        Content-Type: text/html; charset=utf-8
    

    上面的类型表明,发送的是网页,而且编码是UTF-8。

    客户端请求的时候,可以使用Accept字段声明自己可以接受哪些数据格式。

        Accept: */*
    

    上面代码中,客户端声明自己可以接受任何格式的数据。

    MIME type不仅用在HTTP协议,还可以用在其他地方,比如HTML网页。

        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <!-- 等同于 -->
        <meta charset="utf-8" /> 
    

    Content-Encoding 字段

    由于发送的数据可以是任何格式,因此可以把数据压缩后再发送。Content-Encoding字段说明数据的压缩方法。

        Content-Encoding: gzip
        Content-Encoding: compress
        Content-Encoding: deflate
    

    客户端在请求时,用Accept-Encoding字段说明自己可以接受哪些压缩方法。

        Accept-Encoding: gzip, deflate
    

    缺点

    HTTP/1.0 版的主要缺点是,每个TCP连接只能发送一个请求。发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接。

    TCP连接的新建成本很高,因为需要客户端和服务器三次握手,并且开始时发送速率较慢(slow start)。所以,HTTP 1.0版本的性能比较差。随着网页加载的外部资源越来越多,这个问题就愈发突出了。

    为了解决这个问题,有些浏览器在请求时,用了一个非标准的Connection字段。

        Connection: keep-alive
    

    这个字段要求服务器不要关闭TCP连接,以便其他请求复用。服务器同样回应这个字段。

        Connection: keep-alive
    

    一个可以复用的TCP连接就建立了,直到客户端或服务器主动关闭连接。但是,这不是标准字段,不同实现的行为可能不一致,因此不是根本的解决办法。

    1.1 版本

    1997年1月,HTTP/1.1 版本发布,只比 1.0 版本晚了半年。它进一步完善了 HTTP 协议,一直用到了20年后的今天,直到现在还是最流行的版本。

    持久连接

    1.1 版的最大变化,就是引入了持久连接(persistent connection),即TCP连接默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive。

    客户端和服务器发现对方一段时间没有活动,就可以主动关闭连接。不过,规范的做法是,客户端在最后一个请求时,发送Connection: close,明确要求服务器关闭TCP连接。

        Connection: close
    

    目前,对于同一个域名,大多数浏览器允许同时建立6个持久连接。

    管道机制

    1.1 版还引入了管道机制(pipelining),即在同一个TCP连接里面,客户端可以同时发送多个请求。这样就进一步改进了HTTP协议的效率。

    举例来说,客户端需要请求两个资源。以前的做法是,在同一个TCP连接里面,先发送A请求,然后等待服务器做出回应,收到后再发出B请求。管道机制则是允许浏览器同时发出A请求和B请求,但是服务器还是按照顺序,先回应A请求,完成后再回应B请求。

    Content-Length 字段

    一个TCP连接现在可以传送多个回应,势必就要有一种机制,区分数据包是属于哪一个回应的。这就是Content-length字段的作用,声明本次回应的数据长度。

        Content-Length: 3495
    

    上面代码告诉浏览器,本次回应的长度是3495个字节,后面的字节就属于下一个回应了。

    在1.0版中,Content-Length字段不是必需的,因为浏览器发现服务器关闭了TCP连接,就表明收到的数据包已经全了。

    分块传输编码

    使用Content-Length字段的前提条件是,服务器发送回应之前,必须知道回应的数据长度。

    对于一些很耗时的动态操作来说,这意味着,服务器要等到所有操作完成,才能发送数据,显然这样的效率不高。更好的处理方法是,产生一块数据,就发送一块,采用"流模式"(stream)取代"缓存模式"(buffer)。

    因此,1.1版规定可以不使用Content-Length字段,而使用"分块传输编码"(chunked transfer encoding)。只要请求或回应的头信息有Transfer-Encoding字段,就表明回应将由数量未定的数据块组成。

        Transfer-Encoding: chunked
    

    每个非空的数据块之前,会有一个16进制的数值,表示这个块的长度。最后是一个大小为0的块,就表示本次回应的数据发送完了。下面是一个例子。

        HTTP/1.1 200 OK
        Content-Type: text/plain
        Transfer-Encoding: chunked
    
        25
        This is the data in the first chunk
    
        1C
        and this is the second one
    
        3
        con
    
        8
        sequence
    
        0
    

    其他功能

    1.1版还新增了许多动词方法:PUT、PATCH、HEAD、 OPTIONS、DELETE

    另外,客户端请求的头信息新增了Host字段,用来指定服务器的域名。

        Host: www.example.com
    

    有了Host字段,就可以将请求发往同一台服务器上的不同网站,为虚拟主机的兴起打下了基础。

    缺点

    虽然1.1版允许复用TCP连接,但是同一个TCP连接里面,所有的数据通信是按次序进行的。服务器只有处理完一个回应,才会进行下一个回应。要是前面的回应特别慢,后面就会有许多请求排队等着。这称为"队头堵塞"(Head-of-line blocking)。

    为了避免这个问题,只有两种方法:一是减少请求数,二是同时多开持久连接。这导致了很多的网页优化技巧,比如合并脚本和样式表、将图片嵌入CSS代码、域名分片(domain sharding)等等。如果HTTP协议设计得更好一些,这些额外的工作是可以避免的。

    Http请求数据解释

    请求的数据里面包含三个部分内容 : 请求行 、 请求头 、请求体

    • 请求行
    POST /examples/servlets/servlet/RequestParamExample HTTP/1.1 //请求路径
    

    POST :请求方式 ,以post去提交数据

    /examples/servlets/servlet/RequestParamExample
    请求的地址路径 , 就是要访问哪个地方。

    HTTP/1.1: 协议版本

    • 请求头
    		Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */*
    		Referer: http://localhost:8080/examples/servlets/servlet/RequestParamExample
    		Accept-Language: zh-CN
    		User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)
    		Content-Type: application/x-www-form-urlencoded
    		Accept-Encoding: gzip, deflate
    		Host: localhost:8080
    		Content-Length: 31
    		Connection: Keep-Alive
    		Cache-Control: no-cache
    

    Accept: 客户端向服务器端表示,我能支持什么类型的数据。
    Referer : 真正请求的地址路径,全路径
    Accept-Language: 支持语言格式
    User-Agent: 用户代理 向服务器表明,当前来访的客户端信息。
    Content-Type: 提交的数据类型。经过urlencoding编码的form表单的数据
    Accept-Encoding: gzip, deflate : 压缩算法 。
    Host : 主机地址
    Content-Length: 数据长度
    Connection : Keep-Alive 保持连接
    Cache-Control : 对缓存的操作

    • 请求体

    浏览器真正发送给服务器的数据

    发送的数据呈现的是key=value,如果存在多个数据,那么使用 &firstname=zhang&lastname=sansan

    Http响应数据解析

    请求的数据里面包含三个部分内容 : 响应行 、 响应头 、响应体

    	HTTP/1.1 200 OK
    	Server: Apache-Coyote/1.1
    	Content-Type: text/html;charset=ISO-8859-1
    	Content-Length: 673
    	Date: Fri, 17 Feb 2017 02:53:02 GMT
    
    	...这里还有很多数据...
    
    • 响应行
    		HTTP/1.1 200 OK
    

    HTTP/1.1:协议版本

    200:状态码

    咱们这次交互到底是什么样结果的一个code.

    200 : 成功,正常处理,得到数据。
    403 : for bidden 拒绝
    404 : Not Found
    500 : 服务器异常

    OK:对应前面的状态码

    • 响应头
    		Server:  服务器是哪一种类型。  Tomcat
    	
    		Content-Type : 服务器返回给客户端你的内容类型
    
    		Content-Length : 返回的数据长度
    
    		Date : 通讯的日期,响应的时间	
    
    HTTP之状态码

    状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:

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

    常见状态码

    200 OK //客户端请求成功
    400 Bad Request //客户端请求有语法错误,不能被服务器所理解
    401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
    403 Forbidden //服务器收到请求,但是拒绝提供服务
    404 Not Found //请求资源不存在,eg:输入了错误的URL
    500 Internal Server Error //服务器发生不可预期的错误
    503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

    更多状态码 http://www.runoob.com/http/http-status-codes.html

    Get 和 Post请求区别
    • post
    1. 数据是以流的方式写过去,不会在地址栏上面显示。 现在一般提交数据到服务器使用的都是POST

    2. 以流的方式写数据,所以数据没有大小限制。

    • get
    1. 会在地址栏后面拼接数据,所以有安全隐患。 一般从服务器获取数据,并且客户端也不用提交上面数据的时候,可以使用GET

    2. 能够带的数据有限, 1kb大小

    HTTP工作原理

    HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。

    以下是 HTTP 请求/响应的步骤

    1、客户端连接到Web服务器

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

    2、发送HTTP请求

    通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。

    3、服务器接受请求并返回HTTP响应

    Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。

    4、释放连接TCP连接

    若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;

    5、客户端浏览器解析HTML内容

    客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。

    例如:在浏览器地址栏键入URL,按下回车之后会经历以下流程

    1、浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;

    2、解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;

    3、浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;

    4、服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;

    5、释放 TCP连接;

    6、浏览器将该 html 文本并显示内容;

    参考资料
  • 相关阅读:
    循环排序总结
    # 区间合并总结
    快慢指针
    #双指针总结
    滑动窗口总结
    leetcode 第 221 场周赛
    剑指 Offer 07. 重建二叉树
    leetcode 406. 根据身高重建队列
    [JLOI2014]松鼠的新家 T22 D71
    软件包管理器 T21 D71
  • 原文地址:https://www.cnblogs.com/SIHAIloveYAN/p/9459249.html
Copyright © 2011-2022 走看看