HTTP协议

目录

目录

Web介绍

网络协议TCP/IP协议族

URI与URL

统一资源标识符URI

统一资源定位符URL

URI与URL区别

版本区别

返回结果的状态码

HTTP请求报文

HTTP响应报文

https协议

http通信流程

https通信流程

         cookie和session

cookie机制

session机制

cookie与session区别

http常见面试题

Web介绍

        Web使用一种名为HTTP( HyperText Transfer Protocol,超文本传输协议)的协议作为规范,完成从客户端到服务器端等一系列运作流程。而协议是指规则的约定。可以说,Web是建立在HTTP协议上通信的。

网络协议TCP/IP协议族

        计算机与网络设备要相互通信,双方就必须基于相同的方法。比如,如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通信、怎样结束通信等规则都需要事先确定。不同的硬件、操作系统之间的通信,所有的这一切都需要一种规则。而我们就把这种规则称为协议( protocol )。

        协议中存在各式各样的内容。从电缆的规格到IP地址的选定方法、寻找异地用户的方法、双方建立通信的顺序,以及 Web页面显示需要处理的步骤,等等。 像这样把与互联网相关联的协议集合起来总称为TCP/IP。也有说法认为,TCP/IP是指TCP和IP这两种协议。还有一种说法认为,TCP/IP是在P协议的通信过程中,使用到的协议族的统称。

        TCP/IP协议族里重要的一点就是分层。TCP/IP协议族按层次分别分为以下4层:应用层、传输层、网络层和数据链路层。

TCP/IP协议族各层的作用如下。

  • 应用层

应用层决定了向用户提供应用服务时通信的活动。TCP/IP协议族内预存了各类通用的应用服务。比如,FTP ( FileTransfer Protocol,文件传输协议)和 DNS ( Domain Name System,域名系统)服务就是其中两类。HTTP协议也处于该层。

  • 传输层

传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输。在传输层有两个性质不同的协议:TCP ( Transmission ControlProtocol,传输控制协议)和UDP ( User Data Protocol,用户数据报协议)。

  • 网络层(又名网络互连层)

网络层用来处理在网络上流动的数据包。数据包是网络传输的最小数据单位。该层规定了通过怎样的路径(所谓的传输路线)到达对方计算机,并把数据包传送给对方。与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所起的作用就是在众多的选项内选择一条传输路线。

  • 链路层(又名数据链路层,网络接口层)

用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC (Network Interface Card,网络适配器,即网卡),及光纤等物理可见部分(还包括连接器等一切传输媒介)。硬件上的范畴均在链路层的作用范围之内。

TCP/IP通信传输流

利用TCP/IP协议族进行网络通信时,会通过分层顺序与对方进行通信。发送端从应用层往下走,接收端则往应用层往上走。 我们用HTTP举例来说明,首先作为发送端的客户端在应用层( HTTP协议)发出一个想看某个Web页面的HTTP请求。 接着,为了传输方便,在传输层( TCP协议)把从应用层处收到的数据(HTTP请求报文)进行分割,并在各个报文上打上标记序号及端口号后转发给网络层。 在网络层(IP协议),增加作为通信目的地的MAC地址后转发给链路层。这样一来,发往网络的通信请求就准备齐全了。 接收端的服务器在链路层接收到数据,按序往上层发送,一直到应用层。当传输到应用层,才能算真正接收到由客户端发送过来的HTTP请求。

URI与URL

URI,统一资源标志符(Uniform Resource Identifier, URI),表示的是web上每一种可用的资源,如 HTML文档、图像、视频片段、程序等都由一个URI进行标识的。

URI用字符串标识某一互联网资源,而URL表示资源的地点(互联网上所处的位置)。可见URL是URI的子集。

统一资源标识符URI

  • Uniform

规定统一的格式可方便处理多种不同类型的资源,而不用根据上下文环境来识别资源指定的访问方式。另外,加入新增的协议方案(如http:或ftp:)也更容易。

  • Resource

资源的定义是“可标识的任何东西”。除了文档文件、图像或服务(例如当天的天气预报)等能够区别于其他类型的,全都可作为资源。另外,资源不仅可以是单一的,也可以是多数的集合体。

  • ldentifier

表示可标识的对象。也称为标识符。

  • URI格式:

  1. 登录信息(认证)

    指定用户名和密码作为从服务器端获取资源时必要的登录信息(身份认证)。此项是可选项。

  2. 服务器地址

    使用绝对URI必须指定待访问的服务器地址。地址可以是类似hackr.jp这种DNS可解析的名称,或是192.168.1.1这类IPv4地址名,还可以是[0:0:0:0:0:0:0:1]这样用方括号括起来的IPv6地址名。

  3. 服务器端口号

    指定服务器连接的网络端口号。此项也是可选项,若用户省略则自动使用默认端口号。

  4. 带层次的文件路径

    指定服务器上的文件路径来定位特指的资源。这与UNIX系统的文件目录结构相似。

  5. 查询字符串

    针对已指定的文件路径内的资源,可以使用查询字符串传入任意参数。此项可选。

  6. 片段标识符

    使用片段标识符通常可标记出已获取资源中的子资源(文档内的某个位置)。但在RFC中并没有明确规定其使用方法。该项也为可选项。

如:https://blog.csdn.net/qq_32595453/article/details/7951678

我们可以这样解释它:

①这是一个可以通过https协议访问的资源,

②位于主机 blog.csdn.net上,

③通过“/qq_32595453/article/details/79516787”可以对该资源进行唯一标识(注意,这个不一定是完整的路径)

统一资源定位符URL

与URI(统―资源标识符)相比,我们更熟悉URL ( Uniform Resource Locator,统一资源定位符)。URL正是使用Web浏览器等访问Web页面时需要输入的网页地址。

通常而言,我们所熟悉的 URL 的常见定义格式为:

 scheme://host[:port#]/path/.../[;url-params][?query-string][#anchor]
  ​
  http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name
  ​
  scheme //有我们很熟悉的http、https、ftp以及著名的ed2k,迅雷的thunder等。
  ​
  host   //HTTP服务器的IP地址或者域名
  ​
  port#  //HTTP服务器的默认端口是80,这种情况下端口号可以省略。如果使用了别的端口,必须指明,例如tomcat的默认端口是8080 http://localhost:8080/
  ​
  path   //访问资源的路径
  ​
  url-params  //所带参数
  ​
  query-string    //发送给http服务器的数据
  ​
  anchor //锚点定位

例:[博客更新大纲] 可跳转到已发布文章_u014294681的博客-CSDN博客

从上面的URL可以看出,一个完整的URL包括以下几部分:

  • 协议部分:该URL的协议部分为"https:",这代表网页使用的是https协议,在"https"后面的"//"为分隔符。

  • 域名部分:该URL的域名部分为"blog.csdn.net"。一个URL中,也可以使用IP地址作为域名使用。

  • 端口部分:跟在域名后面的是端口,域名和端口之间使用":"作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口。默认http的端口号为80,https的端口号为443。

  • 虚拟目录部分:从域名后的第一个"/"开始到最后一个"/"为止,是虚拟目录部分。虚拟目录也不是一个URL必须的部分,上述URL的虚拟目录为"u014294681/article/details/"。

  • 文件名部分:从域名后的最后一个"/"开始到"?"为止,是文件名部分,如果没有"?",则是从域名后的最后一个"/"开始到"#"为止,是文件部分,如果没有"?"和"#",那么从域名后的最后一个"/"开始到结束,都是文件名部分。本例中的文件名是"85333095"。文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名。

  • 锚部分:从"#"开始到最后,都是锚部分,锚部分也不是一个URL必须的部分。

  • 参数部分:从"?"开始到"#"为止之间的部分为参数部分,又称搜索部分、查询部分。参数可以允许有多个参数,参数与参数之间用"&"作为分隔符。

URI与URL区别

URI和URL都定义了资源是什么,但URL还定义了该如何访问资源。URL是一种具体的URI,它是URI的一个子集,它不仅唯一标识资源,而且还提供了定位该资源的信息。URI 是一种语义上的抽象概念,可以是绝对的,也可以是相对的,而URL则必须提供足够的信息来定位,是绝对的。

版本区别

  • HTTP0.9:

只有GET请求,也不支持请求头信息请求信息只有下面一行GET www.baidu.com

只能发送HTML格式字符串

  • HTTP1.0:

支持多种数据格式,每次只能发送一个请求

在请求中指定版本号,支持GET、POST、HEAD

(无持久连接)

  • HTTP1.1:

默认持久连接,请求管道化、增加缓存处理、增加Host字段、需要指定host头,支持断点传输分块传输,新增了24个错误状态码,新增了OPTIONS、PUT、DELETE、TRACE、CONNECT五种HTTP请求方法。

  • HTTP2:

二进制传输:http1.x的解析是基于文本,http2的解析是基于二进制多路复用header压缩服务端推送

返回结果的状态码

状态码类别:

  • 状态码301(Moved Permanently)

永久性重定向。该状态码表示请求的资源已被分配了新的URI,以后应使用资源现在所指的URI。也就是说,如果已经把资源对应的URI保存为书签了,这时应该按Location首部字段提示的URI重新保存。像下方给出的请求URI,当指定资源路径的最后忘记添加斜杠“”,就会产生301状态码。

  http://example.com/sample
  • 状态码302(Found)

临时性重定向。该状态码表示请求的资源已被分配了新的URI,希望用户(本次)能使用新的URI访问。

和301 Moved Permanently状态码相似,但302状态码代表的资源不是被永久移动,只是临时性质的。换句话说,已移动的资源对应的URI将来还有可能发生改变。比如,用户把URI保存成书签,但不会像301状态码出现时那样去更新书签,而是仍旧保留返回302状态码的页面对应的URI

常见状态码:

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

HTTP请求报文

请求报文的组成:请求行,请求头,空行,请求体(get方式没有)

  • 请求行: 请求方式(方法) / 请求资源路径(URL) / HTTP协议版本

    例:                 GET        /         index.html       /         1.1

  • 请求头:紧接着请求行(即第一行)之后的部分,用来说明服务器要使用的附加信息。从第二行起为请求头,host将指出请求的目的地。User-Agent,服务器端和客户端脚本都能访问它,它是客户端类型检测逻辑的重要基础。该信息由你的客户端来定义,并且在每个请求中自动发送等。

  • 空行: \r\n

    请求头后面的空行是必须的,即使第四部分的请求体为空,也必须有空行。

  • 请求体: 想要给服务器传递的数据

    请求体可以添加任意的其他数据。

常见请求方法:

  1. GET: 请求指定的页面信息,并返回实体主体。

  2. POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。

  3. 两者区别:

    • get是从服务器上获取数据,post是向服务器传送数据。get和 post只是一种传递数据的方式,get也可以把数据传到服务器,它们的本质都是发送请求和接收结果。只是组织格式和数据量上面有差别,http协议里面有介绍。

    • get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过http post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。 因为get设计成传输小数据,而且最好是不修改服务器的数据,所以浏览器一般都在地址栏里面可以看到,但post一般都用来传递大数据,或比较隐私的数据,所以在地址栏看不到,能不能看到不是协议规定,是浏览器规定的。

    • get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。 post基本没有限制,我想大家都上传过文件,都是用post方式的,但是需要修改form里面的那个type参数。

    • get安全性非常低,post安全性稍微高点。但是如果没有加密的话,它们安全级别都是一样的,随便一个监听器都可以把所有的数据监听到。

HTTP响应报文

响应报文的组成:响应行,响应头,空行,响应体。

  • 响应行:        协议版本    /         状态码        /        状态描述

    例:              HTTP1.1     /         200(成功)    /         OK

  • 响应头:用来说明客户端要使用的一些附加信息。Date:生成响应的日期和时间;Content-Type:指定了MIME类型的html(text/html),编码类型是UTF-8。

  • 空行: \r\n

    响应头后面的空行是必须的。

  • 响应体:服务器返回给客户端的文本信息,html,css,JS,图片视频等。

https协议

  • http缺点

  1. 通信使用明文(不加密),内容可能会被窃听

  2. 不验证通信方的身份,因此有可能遭遇伪装

  3. 无法证明报文的完整性,所以有可能已遭篡改

  • HTTPS=HTTP+加密+认证+完整性保护

  1. HTTP加上加密处理和认证以及完整性保护后即是HITPS

  2. HTTPS是身披SSL外壳的HTTP

HTTPS并非是应用层的一种新协议。只是HTTP通信接口部分用SSL ( Secure Socket Layer)和TLS ( Transport Layer Security )协议代替而已。

通常,HTTP直接和TCP通信。当使用SSL时,则演变成先和SSL 通信,再由SSL 和 TCP通信了。简言之,所谓HTTPS,其实就是身披SSL协议这层外壳的HTTP。

在采用SSL后,HTTP就拥有了HTTPS的加密、证书和完整性保护这些功能。 SSL是独立于HTTP的协议,所以不光是 HTTP 协议,其他运行在应用层的SMTP和 Telnet等协议均可配合SSL 协议使用。可以说SSL是当今世界上应用最为广泛的网络安全技术。

  • https缺点

  1. 与纯文本通信相比,加密通信会消耗更多的CPU及内存资源。如果每次通信都加密,会消耗相当多的资源,平摊到一台计算机上时,能够处理的请求数量必定也会随之减少。因此,如果是非敏感信息则使用HTTP通信,只有在包含个人信息等敏感数据时,才利用HTTPS 加密通信。

  2. 购买证书也有开销

  • http和https的区别

  1. 端口: http端口号是 80; https端口号是 443

  2. 传输协议:http是超文本传输协议,属于明文传输;https是安全的超文本传输协议,是经过SSL加密后的传输协议

  3. 安全性:https使用了TLS/SSL加密,比http更加的安全

  4. 证书:https需要申请ca证书

http通信流程

  1. DNS解析,域名系统DNS将域名解析成IP地址

  2. 建立TCP连接,进行TCP的三次握手

  3. 浏览器发送请求

  4. 服务器响应浏览器,向浏览器发送数据

  5. 通信完成,TCP连接关闭

https通信流程

https通信是建立在ssl连接层之上的请求和响应,客户端将加密组件发送到服务端,服务端进行匹配后将数字证书等信息发送到客户端,客户端进行证书验证,验证通过后使用非对称加密对数据的密钥进行协商,协商后得到对称的加密密钥,然后使用对称算法进行TCP链接,然后与客户端进行三次握手后,进行数据传输,传输完成后,四次挥手,断开链接,通信结束。

  1. 客户端和服务器端通过TCP建立连接,并发送https请求。

  2. 服务器响应请求,并将数字证书发送给客户端,数字证书包括公共秘钥、域名、申请证书的公司。

  3. 客户端收到服务器端的数字证书之后,会验证数字证书的合法性。

  4. 如果公钥合格,那么客户端会生成client key,一个用于进行对称加密的密钥,并用服务器的公钥对客户端密钥进行非对称加密。

  5. 客户端会再次发起请求,将加密之后的客户端密钥发送给服务器。

  6. 服务器接收密文后,会用私钥对其进行非对称解密,得到客户端秘钥。并使用客户端秘钥进行对称加密,生成密文并发送。

  7. 客户端收到密文,并使用客户端秘钥进行解密,获取数据。

cookie和session

我们都知道http协议本身是一种无状态的协议,一个普通的请求大致分为三步:

1、客户端发送请求给服务器 

2、服务器处理该请求

3、服务器将处理结果响应该客户端。

之后该客户端再次向该服务区发送请求后,服务器端并不能知道这两个请求是否是同一个浏览器或用户发出来的。所以作为web服务器必须能够采用某种方式来唯一识别同一个用户,并记录该用户的状态。而这同一个客户端与服务器端的在一段时间内的多次交互,我们就可以称该客户端为该服务器端的一个客户端会话窗口,有了会话窗口,我们就能确定哪个请求是哪个用户发出的了,从而可以实现会话跟踪,并记录用户的行为。

javaweb中有两种实现会话的机制:

1)Cookie机制

2)Session机制

cookie机制

1.cookie介绍:

        cookie机制采用的是在客户端保持 HTTP 状态信息的方案。当浏览器访问WEB服务器的某个资源时,WEB服务器会在HTTP响应头中添加一个键值对传送给浏览器,再由浏览器将该cookie放到客户端磁盘的一个文件中,该文件可理解为cookie域(键值对的集合),往后每次访问某个网站时,都会在请求头中带着这个网站的所有cookie值。(至于怎么区分不同网站的cookie的,很简单,每个网站都给他一个唯一标识比如网址等,每次打开某网址时,就查询该网站下的所有cookie值即可。

        每一个cookie都有一个name和一个value,且name是唯一的。相同名字时,后者会覆盖掉前者(类似哈希表的key的效果)。

        一个WEB浏览器也可以存储多个WEB站点提供的Cookie。浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。

2.分类

1)会话级别的cookie
默认情况下它是一个会话级别的cookie,存储在浏览器的内存中,用户退出浏览器之后被删除。

2)持久化的cookie
若希望浏览器将该cookie存储在磁盘上,则需要设置该cookie的生命周期setMaxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。

3、cookie的作用域

cookie的domainpath属性定义了cookie的作用范围,即访问哪些网站或url时,会自动的带着该cookie。domain即域名,默认是当前主机(不包括子域名),path默认是*(所有路径),即域名后面的的路径。大部分情况下我们都是使用默认的设置即可。

4、基本原理

当一个浏览器访问某web服务器时,web服务器会调用HttpServletResponse的addCookie()方法,在响应头中添加一个名叫Set-Cookie的响应字段用于将Cookie返回给浏览器,当浏览器第二次访问该web服务器时会自动的将该cookie回传给服务器,来实现用户状态跟踪。

session机制

1.session介绍:

    session机制采用的是在服务器端保持 HTTP 状态信息的方案。为了加速session的读取和存储,web服务器中会开辟一块内存用来保存服务器端所有的session,每个session都会有一个唯一标识sessionid,根据客户端传过来的jsessionid(cookie中),找到对应的服务器端的session。为了防止服务器端的session过多导致内存溢出,web服务器默认会给每个session设置一个有效期,      (30分钟)若有效期内客户端没有访问过该session,服务器就认为该客户端已离线并删除该session。

2.保存sessionID的方式

1)cookie中

通过一个特殊的cookie,name为JSESSIONID,value为服务器端某个 session的ID,默认的方式。但是当浏览器禁用cookie后session就会失效。

2)url重写

当浏览器Cookie被禁时用。

就是把session的id附加在URL路径的后面。附加的方式也有两种,一种是作为URL路径的附加信息,另一种是作为查询字符串附加在URL后面。

3,基本原理

当用户发送一个请求到服务器端时,服务器会先检查请求中是否含有sessionid(存在cookie中或者在url中)

  • 如果存在sessionid,就会在服务器端查找是否有该sessionid对应的session,如果有就使用,没有就创建一个。

所以说,服务器端的session和客户端的cookie是息息相关的,若是没有了cookie,又不做其他处理的话,服务器端的session也没了。

4.关闭浏览器后session会消失吗?看起来会实际上不会。

这个问题需要从以下两个方面考虑:

1)从服务器端考虑

我们知道session是存在于服务器端内存中的,和浏览器没有关系,所以浏览器关闭后,服务器端的session不会消失。(除非服务器重启或session达到了过期时间)

2)从浏览器端考虑

我们知道浏览器是根据cookie中的jesessionid值来唯一找到服务器端的session的,此时若cookie没有持久化,浏览器关闭后cookie也跟着消失。所以当用户再次打开浏览器后,由于没有了cookie中的jesessionid,自然也无法唯一找到服务器端的session,对用户来说,确实是浏览器关闭后再次打开就无法找到上次的会话了,误以为是关闭浏览器后服务器端的session也跟着消失,其实还在。

cookie与session区别

  1. cookie数据存放在客户的浏览器上,session数据放在服务器上
  2. cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,如果主要考虑到安全应当使用session
  3. session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用COOKIE
  4. 单个cookie在客户端的限制是4K,就是说一个站点在客户端存放的COOKIE不能4K。Session对象没有对存储的数据量的限制,其中可以保存更为复杂的数据类型。
  5. 所以:将登陆信息等重要信息存放为SESSION;其他信息如果需要保留,可以放在COOKIE中, 虽然cookie不安全,但是可以加密 。

http常见面试题

HTTP1.0,1.1,2.0 的版本区别

POST和GET有哪些区别?各自应用场景?

HTTP 哪些常用的状态码及使用场景?

HTTP状态码301和302的区别,都有哪些用途?

HTTP 如何实现长连接?在什么时候会超时?

GET请求中URL编码的意义

简单说下 HTTPS 和 HTTP 的区别

对称加密与非对称加密的区别

HTTP 方法有哪些?

在浏览器中输入 URL 地址到显示主页的过程?

谈下你对 HTTP 长连接和短连接的理解?分别应用于哪些场景?

HTTPS 的工作过程?

HTTP 和 HTTPS 的区别?

HTTPS 的优缺点?

什么是数字签名?

什么是数字证书?

Cookie 和 Session 有什么区别?

HTTP 长连接短连接使用场景是什么

URI和 URL之间的区别

TIME_WAIT 状态会导致什么问题,怎么解决

有很多 TIME-WAIT 状态如何解决

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值