图解HTTP

Posted lryepoch

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图解HTTP相关的知识,希望对你有一定的参考价值。

--HTTP:超文本传输协议。
概念:是TCP/IP协议的一个【应用层】协议,用于定义web浏览器与web服务器之间交换数据的过程,定义两端通讯的格式。
HTTP协议是建立在请求/响应模型上的。首先由客户建立一条与服务器的TCP链接,并发送一个请求到服务器,请求中包含请求方法、URI、协议版本以及相关的MIME样式的消息。服务器响应一个状态行,包含消息的协议版本、一个成功和失败码以及相关的MIME式样的消息。

HTTP协议版本:

    0.9:只有get;

    1.0:GET, POST 和 HEAD方法。缺点是连接后只能发送一个请求。为了复用连接,使用一个非标准字段:Connection:keep-alive,但这样并不保险。
            HTTP/1.0为每一次HTTP的请求/响应建立一条新的TCP链接,因此一个包含html内容和图片的页面将需要建立多次的短期的TCP链接。
            一次TCP链接的建立将需要3次握手。另外,为了获得适当的传输速度,则需要TCP花费额外的回路链接时间(RTT)。每一次链接的建立需要这种经常性的开销,而其并不带有实际有用的数据,只是保证链接的可靠性。

    1.1:新增了五种请求方法:OPTIONS,PUT,DELETE,TRACE和CONNECT方法。
            持久连接,TCP连接后默认不关闭,可以被多个请求复用,不用声明Connection:keep-alive。
            管道机制:客户端可同时发送多个请求,即异步请求。            缺点是所有通信只能按次序进行,存在“队头阻塞”问题。解决是减少请求数,多开持久连接。
            HTTP/1.1提出了可持续链接的实现方法。HTTP/1.1将只建立一次TCP的链接而重复地使用它传输一系列的请求/响应消息,因此减少了链接建立的次数和经常性的链接开销。
    
    2.0:仍在制订中

2者区别:
                在1.0中,连接后,只能获得一个web资源,然后连接关闭;
                1.1中,连接后,在一个连接上可以获取多个web资源。

--HTTP请求报文,响应报文:

1.HTTP请求:【请求某个web资源】
        --请求行:
                ---请求方式:GET方式的URL可携带参数但不能超过1KB;
                                    POST方式传输数据在实体内容中且无限制大小。

                ---资源路径:URL:统一资源定位符,是一种自愿位置的抽象唯一识别方法。
                                        组成:<协议>://<主机>:<端口>/<路径>

                ---版本号:HTTP/主版本号.次版本号,常用的有HTTP/1.0和HTTP/1.1;

        --请求头:通知服务器有关于客户端请求的信息。由“名/值”对组成,每行一对,名和值之间使用冒号分隔;
                        为请求报文添加了一些附加信息:User-Agent:产生请求的浏览器类型。
                                                                            Accept:客户端可识别的内容类型列表。
                                                                            Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。

        --空行:请求头部的最后会有一个空行,表示请求头部结束,这一行非常重要,必不可少。

        --请求内容:可选部分,比如GET请求就没有请求数据。

    eg:下面是一个POST方法的请求报文:
                                                                POST  /index.php HTTP/1.1    请求行
                                                                Host: localhost
                                                                User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2  请求头
                                                                Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
                                                                Accept-Language: zh-cn,zh;q=0.5
                                                                Accept-Encoding: gzip, deflate
                                                                Connection: keep-alive
                                                                Referer: http://localhost/          Refer【告诉服务器,客户机是哪个页面的,防止盗链】

                                                                Content-Length:25
                                                                Content-Type:application/x-www-form-urlencoded
                                                                  空行
                                                                username=aa&password=1234  请求数据

2.HTTP响应:【向客户端回送数据】
        --响应状态行:描述对请求的处理结果。

                ---版本号:协议版本与请求报文一致;

                ---状态码:状态代码为3位数字。

                ---状态码描述:

        --响应消息头:描述服务器的基本信息。由“名/值”对组成,每行一对,名和值之间使用冒号分隔;
                                与请求头部类似,为响应报文添加了一些附加信息:Allow:服务器支持哪种请求方法。
                                                                                                              Refresh:表示浏览器在多久时间后刷新文档。
                                                                                                              Server:服务器名字。
                                                                                                              Set-Cookie:设置和页面关联的Cookie。
                                                                                                              Content-Type:内容类型,指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件。

        --空行:

        --响应正文:用于存放需要返回给客户端的数据信息。

        eg:下面是一个POST方法的响应报文:
                                                                    HTTP/1.1 200 OK  状态行
                                                                    Date: Sun, 17 Mar 2013 08:12:54 GMT  响应头部
                                                                    Server: Apache/2.2.8 (Win32) PHP/5.2.5
                                                                    X-Powered-By: PHP/5.2.5
                                                                    Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/
                                                                    Expires: Thu, 19 Nov 1981 08:52:00 GMT
                                                                    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
                                                                    Pragma: no-cache
                                                                    Content-Length: 4393
                                                                    Keep-Alive: timeout=5, max=100
                                                                    Connection: Keep-Alive
                                                                    Content-Type: text/html; charset=utf-8
                                                                      空行

                                                                    <html>  响应数据
                                                                    <head>
                                                                    <title>HTTP响应示例<title>
                                                                    </head>
                                                                    <body>
                                                                    Hello HTTP!
                                                                    </body>
                                                                    </html>

        >HTTP状态码的英文为HTTP Status Code。状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。

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

            常见状态代码、状态描述的说明如下。

            200 OK:客户端请求成功。
            303 Other //我把你redirect到其它的页面,目标的URL通过响应报文头的Location告诉你。
            304 Not Modified //告诉客户端,你请求的这个资源自从你上次取得后,并没有更改,你直接用你本地的缓存吧,我很忙哦,你能不能少来烦我啊!
            400 Bad Request:客户端请求有语法错误,不能被服务器所理解。
            401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。
            403 Forbidden:服务器收到请求,但是拒绝提供服务。
            404 Not Found:请求资源不存在,举个例子:输入了错误的URL。
            500 Internal Server Error:服务器发生不可预期的错误。
            503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常,举个例子:HTTP/1.1 200 OK(CRLF)。

--了解的端口及对应的服务?
80:HTTP超文本传输协议;
1521:Oracle数据库默认端口;
3306:mysql服务;

--HTTP特点:
1.基于请求与响应:客户端发送请求,服务器端响应数据。

2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。

3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。

4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
解决策略:
HTTP/1.1想出了持久连接(HTTP keep-alive)方法。其特点是,只要任意一端没有明确提出断开连接,则保持TCP连接状态。Connection:keep-alive。

5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
解决策略:
有时需要对用户之前的HTTP通信状态进行保存,比如执行一次登陆操作,在30分钟内所有的请求都不需要再次登陆。于是引入了Cookie技术。

--HTTP的缺点:
---通信使用明文,内容可能会被窃听;
解决:加密处理
通信的加密:可通过SSL(安全套接层)或TLS(完全层传输协议)的组合使用,加密HTTP的通信内容;
内容的加密:对HTTP协议传输的内容本身加密。即把HTTP报文里所含的内容进行加密处理;

    ---不验证通信方的身份,因此有可能遭遇伪装;
        解决:查明对手的证书
        虽然HTTP协议无法确定通信方,但SSL可以。SSL不仅提供加密处理,而且还使用了一种被称为证书的手段,应用于确定方;
        客户端持有证书即可完成个人身份的确认,也可用于Web网站的认证环节;

    ---无法证明报文的完整性,有可能已遭篡改,也就意味着无法判断信息是否准确;
        确定报文完整性常用的方法是MD5和SHA-1等散列值校验的方法,以及确认文件数字签名的方法;
        提供文件下载服务的Web网站也会提供相应的以PGP创建的数字签名及MD5算法生成的散列值;

综上,有必要使用HTTPS。
SSL提供认证和加密处理及摘要功能;仅靠HTTP自身确保安全性非常困难,应与其他协议组合达成目标;

--HTTPS的介绍:
---全称:Hypertext Transfer Protocol Secure,超文本传输安全协议;
---HTTPS=HTTP【上层协议】+TLS/SSL(安全套接字层)【解决安全问题】;
---一般的情况下http直接和Tcp进行通信,当使用了SSL之后,就会变成先和SSL通信,SSL再和Tcp进行通信;当采用了SSL协议之后,Http协议就具备了加密、证书、完整性保护三大功能,SSL是独立于Http存在的,它是现存的广泛 使用的网络安全技术。

--HTTP与HTTPS不同之处:

1.HTTP和HTTPS使用的端口也不一样,前者是80,后者是443;
2.HTTP是明文传输,HTTPS则是具有安全性的SSL加密传输;
3.HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费;

--对称加密和非对称加密:
1“对称加密技术”,意思就是说:“加密”和“解密”使用【相同的】密钥。SSL采用的加密技术就是这种。
但是,一旦被窃听,或者信息被挟持,就有可能破解密钥,进而破解其中的信息。因此“对称加密技术”这种方式存在安全隐患。
2“非对称加密技术”,意思就是说:“加密”和“解密”使用【不同的】密钥。
这里有两把锁,一把叫做“私钥”,一把是“公钥”。客户端按照服务器给的公钥进行加密处理,服务器接收到客户端的信息再通过私钥进行解密。这个过程中,解密的钥匙根本就不会进行传输,因此也就避免了被挟持的风险。
3“非对称加密”能干的事情比“对称加密”要多。

--HTTP通信过程:
HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤:

    1、建立TCP连接
    在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能进行更深层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80。

    2、Web浏览器向Web服务器发送请求命令
    一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令
    例如:GET/sample/hello.jsp HTTP/1.1。

    3、 Web浏览器发送请求头信息
    浏览器发送其请求命令之后,还要以头信息的形式向Web服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。

    4、Web服务器应答
    客户机向服务器发出请求后,服务器会客户机回送应答,
    HTTP/1.1 200 OK
    应答的第一部分是协议的版本号和应答状态码。

    5、Web服务器发送应答头信息
    正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。
     
    6、Web服务器向浏览器发送数据
    Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据。

    7、Web服务器关闭TCP连接
    一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码
    Connection:keep-alive
    TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

--HTTP 协议包括哪些请求?

HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

GET:对服务器资源的简单请求
POST:用于发送包含用户提交数据的请求
------------以及------------

HEAD:类似于GET请求,不过返回的响应中没有具体内容,用于获取报头
PUT:传说中请求文档的一个版本
DELETE:发出一个删除指定文档的请求
TRACE:发送一个请求副本,以跟踪其处理进程
OPTIONS:返回所有可用的方法,检查服务器支持哪些方法
CONNECT:用于ssl隧道的基于代理的请求

--HTTP中POST和GET方式的区别:
---POST和GET都是向服务器提交数据,并且都会从服务器获取数据。

    ---区别:
            1、传送方式:get通过地址栏传输;post通过报文传输。
            2、传送长度:get传送的数据量较小,一般不超过1KB;post传送的数据量较大,一般被默认为不受限制。因为GET请求的数据会附在URL后面,POST的数据放在HTTP包体。
            3、get安全性非常低;post安全性较高,但是执行效率却比Post方法好。
            4、GET和POST还有一个重大区别,
                    简单的说:
                    GET产生一个TCP数据包;POST产生两个TCP数据包;

                    长的说:
                    对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
                    而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
                    也就是说,GET只需要汽车跑一趟就把货送到了,而POST得跑两趟,第一趟,先去和服务器打个招呼“嗨,我等下要送一批货来,你们打开门迎接我”,然后再回头把货送过去。
                    因为POST需要两步,时间上消耗的要多一点,看起来GET比POST更有效。因此Yahoo团队有推荐用GET替换POST来优化网站性能。但这是一个坑!跳入需谨慎。为什么?
                            1. GET与POST都有自己的语义,不能随便混用。
                            2. 据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。
                            3. 并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。

    ---建议:
            1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;
            2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;

            案例:一般情况下,登录的时候都是用的POST传输,涉及到密码传输,而页面查询的时候,如文章id查询文章,用get 地址栏的链接为:article.php?id=11,用post查询地址栏链接为:article.php, 不会将传输的数据展现出来。


    ---拓展资料:
            GET在浏览器回退时是无害的,而POST会再次提交请求。
            GET产生的URL地址可以被Bookmark,而POST不可以。
            GET请求会被浏览器主动cache,而POST不会,除非手动设置。
            GET请求只能进行url编码,而POST支持多种编码方式。
            GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
            GET请求在URL中传送的参数是有长度限制的,而POST么有。
            对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
            GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
            GET参数通过URL传递,POST放在Request body中。

以上是关于图解HTTP的主要内容,如果未能解决你的问题,请参考以下文章

HTTP客户端代码片段

HTTP学习---图解HTTP[三次握手&&ISO模型]

图解HTTP读书笔记

HTTP图解

图解算法图解HTTP图解TCPIP

图解为什么要使用线程池?