程序员人生 网站导航

HTTP详解

栏目:互联网时间:2016-07-13 10:16:55

     

1. HTTP简介

         HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地阅读器的传送协议。它可使阅读器更加高效,使网络传输减少。它不但保证计算机正确快速地传输超文本文档,还肯定传输文档中的哪1部份,和哪部份内容首先显示(如文本先于图形)等。

         在了解HTTP如何工作之前,我们先了解计算机之间的通讯。

2. 计算机相互之间的通讯

        互联网的关键技术就是TCP/IP协议。两台计算机之间的通讯是通过TCP/IP协议在因特网上进行的。实际上这个是两个协议:

        TCP : Transmission Control Protocol 传输控制协议和IP: Internet Protocol  网际协议。

        IP:计算机之间的通讯

        IP协议是计算机用来相互辨认的通讯的1种机制,每台计算机都有1个IP.用来在internet上标识这台计算机。  IP 负责在因特网上发送和接收数据包。通过 IP,消息(或其他数据)被分割为小的独立的包,并通过因特网在计算机之间传送。IP 负责将每一个包路由至它的目的地。

        IP协议仅仅是允许计算机相互发消息,但它其实不检查消息是不是以发送的次序到达而且没有破坏(只检查关键的头数据)。为了提供消息检验功能,直接在IP协议上设计了传输控制协议TCP.

        

       TCP : 利用程序之间的通讯

       TCP确保数据包以正确的次序到达,并且尝试确认数据包的内容没有改变。TCP在IP地址之上引端口(port),它允许计算机通过网络提供各种服务。1些端口号为不同的服务保存,而且这些端口号是尽人皆知。

       服务或守护进程:在提供服务的机器上,有程序监听特定端口上的通讯流。例如大多数电子邮件通讯流出现在端口25上,用于wwww的HTTP通讯流出现在80端口上。

       当利用程序希望通过 TCP 与另外一个利用程序通讯时,它会发送1个通讯要求。这个要求必须被送到1个确切的地址。在双方“握手”以后,TCP 将在两个利用程序之间建立1个全双工 (full-duplex) 的通讯,占用两个计算机之间全部的通讯线路。TCP 用于从利用程序到网络的数据传输控制。TCP 负责在数据传送之前将它们分割为 IP 包,然后在它们到达的时候将它们重组。

       TCP/IP 就是TCP 和 IP 两个协议在1起协同工作,有上下层次的关系。

       TCP 负责利用软件(比如你的阅读器)和网络软件之间的通讯。IP 负责计算机之间的通讯。TCP 负责将数据分割并装入 IP 包,IP 负责将包发送至接受者,传输进程要经IP路由器负责根据通讯量、网络中的毛病或其他参数来进行正确地寻址,然后在它们到达的时候重新组合它们。

 

3. HTTP协议所在的协议层

      HTTP是基于TCP协议之上的。在TCP/IP协议参考模型的各层对应的协议以下图,其中HTTP是利用层的协议。

      


 

4. HTTP要求响应模型   

       HTTP由要求和响应构成,是1个标准的客户端服务器模型(B/S)。HTTP协议永久都是客户端发起要求,服务器回送响应。见下图:

    

 

       HTTP是1个无状态的协议。无状态是指客户机(Web阅读器)和服务器之间不需要建立持久的连接,这意味着当1个客户端向服务器端发出要求,然后服务器返回响应(response),连接就被关闭了,在服务器端不保存连接的有关信息.HTTP遵守要求(Request)/应对(Response)模型。客户机(阅读器)向服务器发送要求,服务器处理要求并返回适当的应对。所有HTTP连接都被构造成1套要求和应对。

 

5. HTTP工作进程      

     1次HTTP操作称为1个事务,其工作全部进程以下:

     1 ) 、地址解析,

     如用客户端阅读器要求这个页面:http://localhost.com:8080/index.htm

     从中分解出协议名、主机名、端口、对象路径等部份,对我们的这个地址,解析得到的结果以下:
     协议名:http
     主机名:localhost.com
     端口:8080
     对象路径:/index.htm

      在这1步,需要域名系统DNS解析域名localhost.com,得主机的IP地址。


    2)、封装HTTP要求数据包

     把以上部份结合本机自己的信息,封装成1个HTTP要求数据包


     3)封装成TCP包,建立TCP连接TCP的3次握手

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

     4)客户机发送要求命令

       建立连接后,客户机发送1个要求给服务器,要求方式的格式为:统1资源标识符(URL)、协议版本号,后边是MIME信息包括要求修饰符、客户机信息和可内容。

     5)服务器响应

     服务器接到要求后,给予相应的响应信息,其格式为1个状态行,包括信息的协议版本号、1个成功或毛病的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。

        实体消息是服务器向阅读器发送头信息后,它会发送1个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应对头信息所描写的格式发送用户所要求的实际数据

     6)服务器关闭TCP连接

     1般情况下,1旦Web服务器向阅读器发送了要求数据,它就要关闭TCP连接,然后如果阅读器或服务器在其头信息加入了这行代码

    Connection:keep-alive

   TCP连接在发送后将依然保持打开状态,因而,阅读器可以继续通过相同的连接发送要求。保持连接节省了为每一个要求建立新连接所需的时间,还节俭了网络带宽。

 

 

6. HTTP协议栈中各层数据流      

             首先我们看看客户端要求的时候,数据在各层协议的数据组织以下图:

         

            而服务器解析客户机要求就是反向操作的进程,以下图:

           
       

       客户机发起1次要求的时候:

       客户机会将要求封装成http数据包-->封装成Tcp数据包-->封装成Ip数据包--->封装成数据帧--->硬件将帧数据转换成bit流(2进制数据)-->最后通过物理硬件(网卡芯片)发送到指定地点。

       服务器硬件首先收到bit流....... 然后转换成ip数据包。因而通过ip协议解析Ip数据包,然后又发现里面是tcp数据包,就通过tcp协议解析Tcp数据包,接着发现是http数据包通过http协议再解析http数据包得到数据。



6. HTTPS实现原理    

             HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL。其所用的端口号是443。

         SSL:安全套接层,是netscape公司设计的主要用于web的安全传输协议。这类协议在WEB上取得了广泛的利用。通过证书认证来确保客户端和网站服务器之间的通讯数据是加密安全的。

      有两种基本的加解密算法类型:

      1)对称加密(symmetrcic encryption):密钥只有1个,加密解密为同1个密码,且加解密速度快,典型的对称加密算法有DES、AES,RC5,3DES等;

       对称加密主要问题是同享秘钥,除你的计算机(客户端)知道另外1台计算机(服务器)的私钥秘钥,否则没法对通讯流进行加密解密。解决这个问题的方案非对称秘钥。

      2)非对称加密:使用两个秘钥:公共秘钥和私有秘钥。私有秘钥由1方密码保存(1般是服务器保存),另外一方任何人都可以取得公共秘钥。

      这类密钥成对出现(且根据公钥没法推知私钥,根据私钥也没法推知公钥),加密解密使用不同密钥(公钥加密需要私钥解密,私钥加密需要公钥解密),相对对称加密速度较慢,典型的非对称加密算法有RSA、DSA等。

   下面看1下https的通讯进程:

   

        进程大致以下:
        1) SSL客户端通过TCP和服务器建立连接以后(443端口),并且在1般的tcp连接协商(握手)进程中要求证书。
              即客户端发出1个消息给服务器,这个消息里面包括了自己可实现的算法列表和其它1些需要的消息,SSL的服务器端会回应1个数据包,这里面肯定了这次通讯所需要的算法,然后服务器向客户端返回证书。(证书里面包括了服务器信息:域名。申请证书的公司,公共秘钥)。                 
       2)Client在收到服务器返回的证书后,判断签发这个证书的公共签发机构,并使用这个机构的公共秘钥确认签名是不是有效,客户端还会确保证书中列出的域名就是它正在连接的域名。
       3)  如果确认证书有效,那末生成对称秘钥并使用服务器的公共秘钥进行加密。然后发送给服务器服务器使用它的私钥对它进行解密,这样两台计算机可以开始进行对称加密进行通讯。

https通讯的优点:

1)客户端产生的密钥只有客户端和服务器端能得到;

2)加密的数据只有客户端和服务器端才能得到明文;

3)客户端到服务真个通讯是安全的。




7. HTTP各种长度限制   


1. URL长度限制

在Http1.1协议中并没有提出针对URL的长度进行限制,RFC协议里面是这样描写的,HTTP协议其实不对URI的长度做任何的限制,服务器端必须能够处理任何它们所提供服务多能接受的URI,并且能够处理无穷长度的URI,如果服务器不能处理太长的URI,那末应当返回414状态码。
 
 
虽然Http协议规定了,但是Web服务器和阅读器对URI都有自己的长度限制。

服务器的限制:我接触的最多的服务器类型就是Nginx和Tomcat,对url的长度限制,它们都是通过控制http要求头的长度来进行限制的,nginx的配置参数为large_client_header_buffers,tomcat的要求配置参数为maxHttpHeaderSize,都是可以自己去进行设置。

阅读器的限制:每种阅读器也会对url的长度有所限制,下面是几种常见阅读器的url长度限制:(单位:字符)
IE : 2803
Firefox:65536
Chrome:8182
Safari:80000
Opera:190000

对get要求,在url的长度限制范围以内,要求的参数个数没有限制。

2. Post数据的长度限制

Post数据的长度限制与url长度限制类似,也是在Http协议中没有规定长度限制,长度限制可以在服务器端配置最大http要求头长度的方式来实现。

3. Cookie的长度限制

Cookie的长度限制分这么几个方面来总结。

(1) 阅读器所允许的每一个域下的最大cookie数目,没有去自己测试,从网上找到的资料大概是这么个情况
IE :本来为20个,后来升级为50个
Firefox: 50个
Opera:30个
Chrome:180个
Safari:无穷制

当Cookie数超过限制数时阅读器的行动:IE和Opera会采取LRU算法将老的不常使用的Cookie清除掉,Firefox的行动是随机踢出某些Cookie的值。固然不管怎样的策略,还是尽可能不要让Cookie数目超过阅读器所允许的范围。

(2) 阅读器所允许的每一个Cookie的最大长度

Firefox和Safari:4079字节
Opera:4096字节
IE:4095字节

(3) 服务器中Http要求头长度的限制。Cookie会被附在每次http要求头中传递给服务器,因此还会遭到服务器要求头长度的影响。

4. Html5 LocalStorage

Html5提供了本地存储机制来供Web利用在客户端存储数据,虽然这个其实不属于Http协议的1部份,但是随着Html5的流行,我们可能需要愈来愈多使用LocalStorage,乃至当它普及的时候跟它打交道就会同今天我们跟Cookie打交道1样多。

对LocalStorage的长度限制,同Cookie的限制类似,也是阅读器针对域来限制,只不过cookie限制的是个数,LocalStorage限制的是长度:

Firefox\Chrome\Opera都是允许每一个域的最大长度为5MB

但是这次IE比较大方,允许的最大长度是10MB


1. HTTP版本

HTTP/1.0

HTTP/1.1

HTTP-NG

 

2. 会话方式

HTTP/1.0

建立连接->要求->响应->断开连接

每次连接只处理1次要求和相应,对资源的每次访问都要建立1个单独的连接。

阅读器到服务器的每次通讯都是完全分开的。

没有Host域,所以不可以创建基于主机头的虚拟主机。

 

HTTP/1.1

在1个TCP连接中可以传送多个HTTP要求和响应

不需要等待上次HTTP响应终了,可以多个HTTP要求同时进行。服务器会根据阅读器发送的要求顺序来按顺序进行响应,这被称作管线

Host域,可以建立虚拟主机。

 

3. 要求消息

结构:

要求行

若干消息头(可选)

(CRLF)

实体内容(可选)

 

GET无实体内容

 

4. 响应消息

结构:

状态行

若干消息头(可选)

(CRLF)

实体内容(可选)

 

5. HTTP消息

HTTP/1.1,如果消息中包括实体内容,且没有采取Transfer-Encoding: chunked传输编码方式,则必须要有Content-Length消息头。否则阅读器和服务器都不知道什么时候消息结束。

 

6. 简单要求消息和简单响应消息

没有消息头。

其中,简单要求消息只可用于GET方式,且要求行中不指定HTTP版本号,

对简单要求消息,服务器将会返回简单响应消息,只返回实体内容。

如:

ROOT /index.html

 

7. HTTP消息头概述

阅读器通过消息头,比如可以告知服务器阅读器的国家语言版本信息,可以告知服务器访问者是从哪一个页面访问到当前页面的。

 

服务器通过消息头,比如可以告知阅读器隔多长时间刷新1下,用哪一种字符集显示内容,创建Cookie

 

结构:

头字段名称(不辨别大小写):_值,值,值(CRLF)

头字段名称(不辨别大小写):_值,值,值(CRLF)

头字段名称(不辨别大小写):_值,值,值(CRLF)

 (可以任意顺序排列)

 

分为:通用信息头、要求头、响应头、实体头4类。

 

8. 要求行

结构:

要求方式_资源路径_HTTP版本号(CRLF)

如:

GET /index.htm HTTP/1.1

 

要求方式:

Method

 

GET

要求获得Request-URI所标识的资源

POST

Request-URI所标识的的资源后附加新的数据

HEAD

要求获得Request-URI所标识的资源的响应消息报头

PUT

要求服务器存储1个资源,并用Request-URI作为资源标识

DELETE

要求服务器删除Request-URI所标识的资源

TRACE

要求服务器回送收到的要求信息,主要用于测试和诊断

CONNECT

保存将来使用

OPTIONS

要求查询服务器的性能,或查询与资源相干的选项和需求

 

9. 状态行

结构:

HTTP版本号_状态码_状态描写(CRLF)

如:

HTTP/1.1 200 OK

 

10. 使用GETPOST传递参数

GET使用URL传递参数

如:

GET /List.aspx?Catagoryid=5&Cityid=23 HTTP/1.1

 

POST使用实体内容传递参数

如:

POST /List.aspx HTTP/1.1

Content-Type:application/x-www-form-urlencoded

Content-Length:22

 

Catagoryid=5&Cityid=23

 

POST消息头中要设置Content-Type的值为application/x-www-form-urlencoded,和使用Content-Length 以标识实体内容的长度。

 

Content-Length长度比实体内容长度短时,则会疏忽多出部份的实体内容。当Content-Length少于实体长度时,则会继续等待。

 

11. 响应状态码

 

状态代码由3位数字组成,第1位定义了响应的种别:

1xx:唆使信息——表示要求已接收,继续处理。

2xx:成功——表示要求已被成功接收、理解、接受。

3xx:重定向——要完成要求必须进行更进1步的操作。

4xx:客户端毛病——要求有语法毛病或要求没法实现。

5xx:服务器端毛病——服务器未能实现合法的要求。

 

常见状态码:

Status-Code

Reason-Phrase

 

200

OK

客户端要求成功

206

 

客户端发送了带有Range头的GET

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐

1.cyou 非常适合 Z 世代企业家的三大理由 2阿里、京东类ChatGPT产品正在内测 未来或将融入产品 3公会积极复工复产,2023直播行业有哪些新机遇? 4第三届OpenHarmony技术大会展区亮点纷呈,全方位洞见智慧互联未来 5第三届OpenHarmony技术大会应用生态实践分论坛成功举办 6第三届OpenHarmony技术大会OS安全分论坛圆满举办 7第三届 OpenHarmony 技术大会:创新成果丰硕,共筑开源生态新未来