HTTP

HTTP 的特性

  • HTTP 超文本传输协议,构建于 TCP/IP 协议之上,是一个应用层协议,默认端口号是 80
  • HTTP 无连接无状态

 

请求报文

HTTP 协议是以 ASCII 码传输,建立在 TCP/IP 协议之上的应用层规范。把 HTTP 请求分为三个部分:状态行、请求头、请求主体。

HTTP 定义了与服务器交互的4种方法,分别是GETPOSTPUTDELETE

URL全称是资源描述符,可以这样认为:一个URL地址,它用于描述一个网络上的资源,而 HTTP 中的GETPOSTPUTDELETE就对应着对这个资源的查,增,改,删4个操作。

  1. GET 用于获取资源信息的请求

  2. POST 用于改变服务器上的资源的请求。

  3. 注意:

    • GET 可提交的数据量受到URL长度的限制,HTTP 协议规范没有对 URL 长度进行限制。这个限制是特定的浏览器及服务器对它的限制
    • 理论上讲,POST 是没有大小限制的,HTTP 协议规范也没有进行大小限制,出于安全考虑,服务器软件在实现时会做一定限制

 

POST 提交数据的方式

HTTP 协议中规定 POST 提交的数据必须在 body 部分中,服务端通常是根据请求头(headers)中的 Content-Type 字段来获知请求体中是用何种方式编码,服务端再根据对应解码方式对其进行解析。

POST 提交数据最常见的是:浏览器的原生 <form> 表单。随着越来越多的 Web 站点,尤其是 WebApp,全部使用 Ajax 进行数据交互之后,定义了许多新的数据提交方式,例如 application/jsontext/xml 。。。服务器可以根据 Content-Type 正确地解析出请求。

 

GET和POST的区别

  • GET的请求参数包含在URL中,POST通过request body传递参数。
  • GET在浏览器回退时是无害的,而POST会再次提交请求。

  • GET请求会被浏览器主动cache,而POST不会,除非手动设置。

  • GET请求只能进行url编码(Url的编码格式采用的是ASCII码),而POST支持多种编码方式。

  • GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。

  • GET请求在URL中传送的参数是有长度限制的,而POST没有。

  • 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。

  • GETPOST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。

  • GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变
  • GET是从服务器上获取数据,POST是向服务器传送数据。

响应报文

HTTP响应也由3个部分构成,分别是:

  • 状态行
  • 响应头(Response Header)
  • 响应正文

状态行由协议版本、数字形式的状态代码、及相应的状态描述,各元素之间以空格分隔。

常见的状态码有如下几种:

  • 200 OK 客户端请求成功
  • 301 Moved Permanently   请求永久重定向
  • 302 Moved Temporarily   请求临时重定向
  • 304 Not Modified   文件未修改,可以直接使用缓存的文件。
  • 400 Bad Request  由于客户端请求有语法错误,不能被服务器所理解。
  • 401 Unauthorized   请求未经授权。这个状态代码必须和WWW-Authenticate报头域一起使用
  • 403 Forbidden   服务器收到请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因
  • 404 Not Found   请求的资源不存在,例如,输入了错误的URL
  • 500 Internal Server Error   服务器发生不可预期的错误,导致无法完成客户端的请求。
  • 503 Service Unavailable    服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常。

 

Keep-Alive 持久连接

HTTP 协议采用“请求-应答”模式,当使用普通模式,即非 Keep-Alive 模式时,每个请求/应答客户和服务器都要新建一个连接,完成之后立即断开连接(HTTP 协议为无连接的协议),当使用 Keep-Alive 模式(又称持久连接、连接重用)时,Keep-Alive 功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive 功能避免了建立或者重新建立连接。

在 HTTP 1.0 版本中,并没有官方的标准来规定 Keep-Alive 如何工作,它是判断客户端浏览器如果支持 Keep-Alive ,那么就在HTTP请求头中添加一个字段 Connection: Keep-Alive,当服务器收到附带有 Connection: Keep-Alive 的请求时,它也会在响应头中添加一个同样的字段来使用 Keep-Alive 。这样一来,客户端和服务器之间的HTTP连接就会被保持,不会断开(超过 Keep-Alive 规定的时间,意外断电等情况除外),当客户端发送另外一个请求时,就使用这条已经建立的连接。

在 HTTP 1.1 版本中,默认情况下所有连接都被保持,如果加入 "Connection: close" 才关闭。目前大部分浏览器都使用 HTTP 1.1 协议,也就是说默认都会发起 Keep-Alive 的连接请求了。

注意:

  • HTTP Keep-Alive 简单说就是保持当前的TCP连接,避免了重新建立连接。

  • HTTP 长连接不可能一直保持,例如 Keep-Alive: timeout=5, max=100,表示这个TCP通道可以保持5秒,max=100,表示这个长连接最多接收100次请求就断开。

  • HTTP 是一个无状态协议,这意味着每个请求都是独立的,Keep-Alive 没能改变这个结果。另外,Keep-Alive也不能保证客户端和服务器之间的连接一定是活跃的,在 HTTP1.1 版本中也如此。唯一能保证的就是当连接被关闭时你能得到一个通知,所以不应该让程序依赖于 Keep-Alive 的保持连接特性,否则会有意想不到的后果。

  • 长连接时如何判断一次请求完成:Content-Length & Transfer-Encoding 

    • Content-Length表示实体内容的长度。浏览器通过这个字段来判断当前请求的数据是否已经全部接收。 所以,当浏览器请求的是一个静态资源时,即服务器能明确知道返回内容的长度时,可以设置Content-Length来控制请求的结束。但当服务器并不知道请求结果的长度时,如一个动态的页面或者数据,Content-Length就无法解决上面的问题,这个时候就需要用到Transfer-Encoding字段。  
    • Transfer-Encoding是指传输编码,在上面的问题中,当服务端无法知道实体内容的长度时,就可以通过指定Transfer-Encoding: chunked来告知浏览器当前的编码是将数据分成一块一块传递的。当然, 还可以指定Transfer-Encoding: gzip, chunked表明实体内容不仅是gzip压缩的,还是分块传递的。最后,当浏览器接收到一个长度为0的chunked时, 知道当前请求内容已全部接收。


 

会话跟踪【状态保持】

  1. 客户端打开与服务器的连接发出请求到服务器响应客户端请求的全过程称之为会话。

  2. 会话跟踪指的是对同一个用户对服务器的连续的请求和接受响应的监视。

  3. 浏览器与服务器之间的通信是通过HTTP协议进行通信的,而HTTP协议是”无状态”的协议,它不能保存客户的信息,即一次响应完成之后连接就断开了,下一次的请求需要重新连接,这样就需要判断是否是同一个用户,所以才有会话跟踪技术来实现这种要求。

  4. 会话跟踪常用的方法:
    • URL 重写,URL(统一资源定位符)是Web上特定页面的地址,URL重写的技术就是在URL结尾添加一个附加数据以标识该会话,把会话ID通过URL的信息传递过去,以便在服务器端进行识别不同的用户。

    • 隐藏表单域,将会话ID添加到HTML表单元素中提交到服务器,此表单元素并不在客户端显示。

    • Cookie 是Web 服务器发送给客户端的一小段信息,客户端请求时可以读取该信息发送到服务器端,进而进行用户的识别。对于客户端的每次请求,服务器都会将 Cookie 发送到客户端,在客户端可以进行保存,以便下次使用。客户端保存Cookie 对象方式:一种方式是保存在客户端内存中,称为临时 Cookie,浏览器关闭后这个 Cookie 对象将消失。另外一种方式是保存在客户机的磁盘上,称为永久 Cookie。以后客户端只要访问该网站,  就会自动将这个 Cookie 再次发送到服务器上,前提是这个 Cookie 在有效期内,这样就实现了对客户的跟踪。但注意Cookie 是可以被客户端禁用的。 

    • Session: 是由服务器端为每一位客户端创建的,会产生一个session_id来标识这个 session 对象,然后将这个 session_id 放入到 Cookie 中发送到客户端,下一次访问时,session_id 会跟随请求报文自动发送到服务器,  在服务器端可使用此 session_id 取出唯一标识用户的数据,进行识别不同的用户。每一个用户都有一个不同的 session,各个用户之间是不能共享的,是每个用户所独享的,在 session 中可以存放用户信息。

      Session 的实现依赖于 Cookie,如果 Cookie 被禁用,那么 session 也将失效。

 

 

HTTP & HTTPS:

HTTP:超文本传输协议,是被用于在Web浏览器和网站服务器之间传递信息的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),超文本传输协议HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。缺点:通信使用明文(不加密), 内容可能会被窃听。不验证通信方的身份, 因此有可能遭遇伪装。无法证明报文的完整性, 所以有可能已遭篡改

HTTPS:超文本传输安全协议HTTPS,HTTPS经由HTTP进行通信,但利用SSL/TLS来加密数据包。HTTPS开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性它不是应用层的一种新协议. 只是HTTP通信接口部分用SSL(Secure Socket Layer)TLS (Transport Layer Security) 协议替代。它是以安全为目标的HTTP通道,为了解决HTTP协议的明文传输可能造成信息泄露的缺陷,为了数据传输的安全,HTTPSHTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密,通常HTTP直接和TCP通信, 当使用SSL时, 演变成了先和SSL通信, 再由SSLTCP通信。在采用SSL后, HTTP就拥有了HTTPS的加密, 证书和完整性的保护这些功能。HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。HTTP+加密+认证+完整性保护=HTTPS

SSL如何加密:

SSLTLS协议的前身,SSL采用一种叫做非对称加密方式(RSA算法)生成公钥和私钥,对通信方做身份认证,之后交换对称密钥作为会话密钥(Session key)。这个会话密钥是用来将通信两方交换的数据做加密,保证两个应用间通信的保密性和可靠性,使客户与服务器应用之间的通信不被攻击者窃听。

SSL优点:

  • 机密性:SSL协议使用密钥加密通信数据。
  • 可靠性:服务器和客户都会被认证,客户的认证是可选的。
  • 完整性:SSL协议会对传送的数据进行完整性检查。

 

 

客户端和服务器都同意使用TLS协议前提下,通过使用一个握手过程协商出一个有状态的连接以传输数据:

  • 当客户端连接到支持TLS协议的服务器要求创建安全连接并列出了受支持的密码组合(加密密码算法和加密哈希函数),握手开始。
  • 服务器从该列表中决定加密和散列函数,并通知客户端。
  • 服务器发回其数字证书,此证书通常包含服务器的名称、受信任的证书颁发机构(CA)和服务器的公钥。
  • 客户端确认其颁发的证书的有效性。
  • 为了生成会话密钥用于安全连接,客户端使用服务器的公钥加密随机生成的密钥,并将其发送到服务器,只有服务器才能使用自己的私钥解密。
  • 利用随机数,双方生成用于加密和解密的对称密钥。这就是TLS协议的握手,握手完毕后的连接是安全的,直到连接(被)关闭。如果上述任何一个步骤失败,TLS握手过程就会失败,并且断开所有的连接。

一个HTTPS连接简洁版

  • 一、首先浏览器发送HTTP请求服务端生成证书,客户端对证书的有效期、合法性、域名是否与请求的域名一致、证书的公钥(RSA加密)等进行校验;
  • 二、客户端如果校验通过后,就根据证书的公钥是否有效,生成随机数,随机数使用公钥进行加密(RSA加密);
  • 三、消息体产生的后,对它的摘要进行MD5(或者SHA1)算法加密,此时就得到了RSA签名;
  • 四、发送给服务端,此时只有服务端(RSA私钥)能解密。
  • 五、解密得到的随机数,再用AES加密,作为密钥(此时的密钥只有客户端和服务端知道)。

一个HTTPS连接详细版:

1、客户端发起HTTPS请求:浏览器里输入一个https网址,连接到server的443端口。

2、服务端的配置:采用HTTPS协议的服务器必须要有一套数字证书,可自制也可向组织申请,只是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面。这套证书其实是一对公钥和私钥。

3、传送证书:这个证书其实是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。

4、客户端解析证书:由客户端的TLS来完成的,首先验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随机值,然后用证书对该随机值进行加密。

5、传送加密信息:传送的是用证书加密后得到的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密。

6、服务端解密信息:服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密(将信息和私钥通过某种算法混合在一起,除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥)

7、传输加密后的信息:这部分信息是服务端用私钥加密后的信息,可以在客户端被还原。

8、客户端解密信息:客户端用之前生成的私钥解密服务段传过来的信息,于是获取了解密后的内容,整个过程第三方即使监听到了数据,也束手无策。

 

HTTPS连接可被信任的情况:

  • 浏览器正确地实现了HTTPS且操作系统中安装了正确且受信任的证书颁发机构;
  • 证书颁发机构仅信任合法的网站;
  • 被访问的网站提供了一个有效的证书,也就是说它是一个由操作系统信任的证书颁发机构签发的(大部分浏览器会对无效的证书发出警告);
  • 该证书正确地验证了被访问的网站(例如,访问 https://example.com 时收到了签发给example.com而不是其它域名的证书);
  • 此协议的加密层(SSL/TLS)能够有效地提供认证和高强度的加密。

 

Http与Https的区别:

  • httpURLhttp://开头,而httpsURLhttps:// 开头

  • https协议需要到CA机构申请SSL证书,一般免费证书较少,需要一定费用。
  • http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议,对传输的数据进行了加密。
  • http工作在应用层,https的安全传输机制工作在传输层,http使用的默认端口是80,https使用的默认端口是443。
  • http的连接很简单是无状态的,攻击者可以通过监听和中间人攻击等手段,获取网站帐户和敏感信息等HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

  

HTTPS优点

  1、HTTPS具有更好的加密性能,可以更好的避免用户信息泄露;

  2、HTTPS复杂的传输方式,降低网站被劫持的风险;

  3、搜索引擎已经全面支持HTTPS抓取、收录,并且会优先展示HTTPS的结果;

  4、HTTPS协议可认证用户和服务器,确保数据发送到正确的客户机和服务器;

  5、HTTPS绿锁标志可以提升用户对网站信任程度;

  6、HTTPS是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人进行攻击的成本。

  7、HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比HTTP协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性。

  8、可以有效防止山寨、镜像网站;可以通过cdn等方式优化网站的加载速度

HTTPS缺点:

  1、HTTPS会降低用户访问速度,增加网站服务器的计算资源消耗;

  2、HTTPS需要申请加密协议,增加了运营成本;

  3、百度目前对HTTPS的优先展现效果不明显,谷歌较为明显;

  4、HTTPS维护比较麻烦,在网站不设计私密信息、搜索引擎支持HTTP的情况下,没必要做HTTPS;

 

URI和URL的区别

URI,是uniform resource identifier,统一资源标识符,用来标识唯一的一个资源。

  • Web上可用的每种资源如HTML文档、图像、视频片段、程序等都是一个来URI来定位的
  • URI一般由三部组成:
  • ①访问资源的命名机制
  • ②存放资源的主机名
  • ③资源自身的名称,由路径表示,着重强调于资源。

URL是uniform resource locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。<协议>://<主机>:<端口号>/<路径>

  • URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上,特别是著名的Mosaic。
  • 采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。URL一般由三部组成:
  • ①协议(或称为服务方式)
  • ②存有该资源的主机IP地址(有时也包括端口号)
  • ③主机资源的具体地址。如目录和文件名等
 

SSL证书申请

(1)制作CSR文件

  CSR就是由申请人制作的Certificate Secure Request证书请求文件,制作过程中,系统会产生2个密钥,一个是公钥就是这个CSR文件;另外一个是私钥,存放在服务器上。要制作CSR文件,申请人可以参考WEB SERVER的文档,一般APACHE等,使用OPENSSL命令行来生成KEY+CSR2个文件,Tomcat,JBoss,Resin等使用KEYTOOL来生成JKSCSR文件,IIS通过向导建立一个挂起的请求和一个CSR文件。

(2)CA认证:将CSR提交给CA,CA一般有2种认证方式

  ①域名认证:一般通过对管理员邮箱认证的方式,这种方式认证速度快,但是签发的证书中没有企业的名称

  ②企业文档认证:需要提供企业的营业执照,一般需要3-5个工作日。

也有需要同时认证以上2种方式的证书,叫EV证书,这种证书可以使IE7以上的浏览器地址栏变成绿色,所以认证也最严格。

(3)证书的安装

  在收到CA的证书后,可以将证书部署上服务器,一般APACHE文件直接将KEY+CER复制到文件上,然后修改HTTPD.CONF文件;TOMCAT等,需要将CA签发的证书CER文件导入JKS文件后,复制上服务器,然后修改SERVER.XML;IIS需要处理挂起的请求,将CER文件导入。

常见的首部:

  • 通用首部字段(请求报文与响应报文都会使用的首部字段)
    • Date:创建报文时间
    • Connection:连接的管理
    • Cache-Control:缓存的控制
    • Transfer-Encoding:报文主体的传输编码方式
  • 请求首部字段(请求报文会使用的首部字段)
    • Host:请求资源所在服务器
    • Accept:可处理的媒体类型
    • Accept-Charset:可接收的字符集
    • Accept-Encoding:可接受的内容编码
    • Accept-Language:可接受的自然语言
  • 响应首部字段(响应报文会使用的首部字段)
    • Accept-Ranges:可接受的字节范围
    • Location:令客户端重新定向到的URI
    • Server:HTTP服务器的安装信息
  • 实体首部字段(请求报文与响应报文的的实体部分使用的首部字段)
    • Allow:资源可支持的HTTP方法
    • Content-Type:实体主类的类型
    • Content-Encoding:实体主体适用的编码方式
    • Content-Language:实体主体的自然语言
    • Content-Length:实体主体的的字节数
    • Content-Range:实体主体的位置范围,一般用于发出部分请求时使用

一次完整的HTTP请求所经历的7个步骤

  • DNS域名解析(获取域名所对应的IP地址)
  • 3次握手建立TCP连接

    HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP协议来完成的,该协议与IP协议共同构建 Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。

    HTTP是比TCP更高层次的应用层协议,根据规则, 只有低层协议建立之后才能,才能进行更层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80。

  • Web浏览器向Web服务器发送请求行,一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令。例如:GET /sample/hello.jsp HTTP/1.1。
  • Web浏览器发送请求头,浏览器发送其请求命令之后,还要以头信息的形式向Web服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。

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

  • Web服务器发送响应头,正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。

  • Web服务器向浏览器发送数据,Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据

  • Web浏览器解析html代码,并请求html代码中的资源。浏览器拿到index.html文件后,就开始解析其中的html代码,遇到js/css/p_w_picpath等静态资源时,就向服务器端去请求下载。 
  • Web浏览器对页面进行渲染呈现给用户,浏览器利用自己内部的工作机制,把请求到的静态资源和html代码进行渲染,渲染之后呈现给用户。
  • Web服务器关闭TCP的发送连接,一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,如果浏览器或者服务器在其头信息加入了这行代码:Connection:keep-alive  TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

 

大概流程: 3次挥手建立TCP连接->发送请求行->发送请求头->(到达服务器)发送状态行->发送响应头->发送响应数据->断开TCP连接

  

 

 


 

原文地址:https://www.cnblogs.com/hsmwlyl/p/10590775.html