计算机基础之HTTP
⼀、what's the HTTP and HTTPS
  HTTP 是⼀种超⽂本传输协议(Hypertext Transfer Protocol),HTTP 是⼀个在计算机世界⾥专门在两点之间传输⽂字、图⽚、⾳频、视频等超⽂本数据的约定和规范。
  HTTP 主要内容分为三部分,超⽂本(Hypertext)、传输(Transfer)、协议(Protocol)。
超⽂本就是不单单只是本⽂,它还可以传输图⽚、⾳频、视频,甚⾄点击⽂字或图⽚能够进⾏超链接的跳转。
上⾯这些概念可以统称为数据,传输就是数据需要经过⼀系列的物理介质从⼀个端系统传送到另外⼀个端系统的过程。通常我们把传输数据包的⼀⽅称为请求⽅,把接到⼆进制数据包的⼀⽅称为应答⽅。
协议指的是⽹络中(包括互联⽹)传递、管理信息的⼀些规范。如同⼈与⼈之间相互交流是需要遵循⼀定的规矩⼀样,计算机之间的相互通信需要共同遵守⼀定的规则,这些规则就称为协议,只不过是⽹络协议。
TCP/IP ⽹络模型
||||||||||||||||          五层模型     ||||||||||||||||     四层模型                    ||||||||||||||||        七层模型   
 ||||||||||||||||
HTTP 和 HTTPS 的区别
HTTP 是⼀种超⽂本传输协议(Hypertext Transfer Protocol),HTTP 是⼀个在计算机世界⾥专门在两点之间传输⽂字、图⽚、⾳频、视频等超⽂本数据的约定和规范。
HTTPS 的全称是 Hypertext Transfer Protocol Secure,HTTPS ⽐ HTTPS 多 secure 安全性的概念,实际上, HTTPS 并不是⼀个新的应⽤层协议,它其实就是 HTTP + TLS/SSL 协议组合⽽成,⽽安全性的保证正是 TLS/SSL 所做的⼯作。
HTTP 在地址栏上的协议是以 开头,⽽ HTTPS 在地址栏上的协议是以 开头
HTTP 是未经安全加密的协议,它的传输过程容易被攻击者监听、数据容易被窃取、发送⽅和接收⽅容易被伪造;⽽ HTTPS 是安全的协议,它通过密钥交换算法 - 签名算法 - 对称加密算法 - 摘要算法能够解决上⾯这些问题。
HTTP 的默认端⼝是 80,⽽ HTTPS 的默认端⼝是 443。
⼆、POST 和 GET 的区别
  HTTP 中包括许多⽅法,Get 和 Post 是 HTTP 中最常⽤的两个⽅法,基本上使⽤ HTTP ⽅法中有 99% 都是在使⽤ Get ⽅法和 Post ⽅法。
GET ⽅法⼀般⽤于请求,⽐如在浏览器地址栏输⼊⽹址其实就是发送了⼀个 GET 请求,它的主要特征是请求服务器返回资源,⽽POST ⽅法⼀般⽤于表单的提交,相当于是把信息提交给服务器,等待服务器作出响应,GET 相当于⼀个是 pull/拉的操作,⽽ POST 相当于是⼀个 push/推的操作。
GET ⽅法是不安全的,因为在发送请求的过程中,请求参数会拼在 URL 后⾯,从⽽导致容易被攻击者窃取,对信息造成破坏和伪造;⽽ POST ⽅法是把参数放在请求体 body 中的,这对⽤户来说不可见。
GET 请求的 URL 有长度限制,⽽ POST 请求会把参数和值放在消息体中,对数据长度没有要求。
GET 请求会被浏览器主动 cache,⽽ POST 不会,除⾮⼿动设置。
GET 请求在浏览器反复的回退/前进操作是⽆害的,⽽ POST 操作会再次提交表单请求。
GET 请求在发送过程中会产⽣⼀个 TCP 数据包;POST 在发送过程中会产⽣两个 TCP 数据包。对于 GET ⽅式的请求,浏览器会把http header 和 data ⼀并发送出去,服务器响应 200(返回数据);⽽对于 POST,浏览器先发送 header,服务器响应 100
continue,浏览器再发送 data,服务器响应 200 ok(返回数据)。
三、⽆状态协议及解决⽅法
  ⽆状态协议(Stateless Protocol) 指浏览器对于事务的处理没有记忆能⼒。
  举个例⼦来说客户请求获得⽹页之后关闭浏览器,然后再次启动浏览器,登录该⽹站,但是服务器并不知道客户关闭了⼀次浏览器。
  HTTP 是⼀种⽆状态的协议,他对⽤户的操作没有记忆能⼒。可能⼤多数⽤户不相信,他可能觉得每次输⼊⽤户名和密码登陆⼀个⽹站后,下次登陆就不再重新输⼊⽤户名和密码了。这其实不是 HTTP 做的事情,起作⽤的是⼀个叫做 Cookie 的机制。它能够让浏览器具有记忆能⼒。查看⽅式 chrome://settings/content/cookies
  当浏览器向服务端发送请求时,服务端会发送⼀个认证信息,服务器第⼀次接收到请求时,开辟了⼀块 Session 空间(创建了Session 对象),同时⽣成⼀个 sessionId ,并通过响应头的 Set-Cookie:JSESSIONID=XXXXXXX 命令,向客户端发送要求设置 Cookie 的响应;客户端收到响应后,在本机客户端设置了⼀个 JSESSIONID=XXXXXXX 的 Cookie 信息,该 Cookie 的过期时间为浏览器会话结束;
  接下来客户端每次向同⼀个⽹站发送请求时,请求头都会带上该 Cookie信息(包含 sessionId ),然后,服务器通过读取请求头中的Cookie 信息,获取名称为 JSESSIONID 的值,得到此次请求的 sessionId。这样,浏览器才具有了记忆能⼒。
JWT 机制
  JWT 能够让浏览器具有记忆能⼒的⼀种机制。与 Cookie 不同,JWT 是保存在客户端的信息,它⼴泛的应⽤于单点登录的情况。JWT 具有两个特点
JWT 的 Cookie 信息存储在客户端,⽽不是服务端内存中。也就是说,JWT 直接本地进⾏验证就可以,验证完毕后,这个 Token 就会在 Session 中随请求⼀起发送到服务器,通过这种⽅式,可以节省服务器资源,并且 token 可以进⾏多次验证。
JWT ⽀持跨域认证,Cookies 只能⽤在单个节点的域或者它的⼦域中有效。如果它们尝试通过第三个节点访问,就会被禁⽌。使⽤JWT 可以解决这个问题,使⽤ JWT 能够通过多个节点进⾏⽤户认证,也就是跨域认证。
ssl协议全称四、UDP 和 TCP
  TCP 和 UDP 都位于计算机⽹络模型中的运输层,它们负责传输应⽤层产⽣的数据。
UDP
  UDP 的全称是 User Datagram Protocol,⽤户数据报协议。它不需要所谓的握⼿操作,从⽽加快了通信速度,允许⽹络上的其他主机在接收⽅同意通信之前进⾏数据传输。
UDP 的特点主要有
UDP 能够⽀持容忍数据包丢失的带宽密集型应⽤程序
UDP 具有低延迟的特点
UDP 能够发送⼤量的数据包
UDP 能够允许 DNS 查,DNS 是建⽴在 UDP 之上的应⽤层协议。
TCP
  TCP 的全称是Transmission Control Protocol ,传输控制协议。它能够帮助你确定计算机连接到 Internet 以及它们之间的数据传输。通过三次握⼿来建⽴ TCP 连接,三次握⼿就是⽤来启动和确认 TCP 连接的过程。⼀旦连接建⽴后,就可以发送数据了,当数据传输完成后,会通过关闭虚拟电路来断开连接。
TCP 的主要特点有
TCP 能够确保连接的建⽴和数据包的发送
TCP ⽀持错误重传机制
TCP ⽀持拥塞控制,能够在⽹络拥堵的情况下延迟发送
TCP 能够提供错误校验和,甄别有害的数据包。
TCP 和 UDP 的不同
五、TCP 三次握⼿和四次挥⼿
TCP 三次握⼿
  在连接建⽴时需要经历3次握⼿
SYN:它的全称是Synchronize Sequence Numbers,同步序列编号。是 TCP/IP 建⽴连接时使⽤的握⼿信号。在客户机和服务器之间建⽴TCP 连接时,⾸先会发送的⼀个信号。客户端在接受到 SYN 消息时,就会在⾃⼰的段内⽣成⼀个随机值 X。
SYN-ACK:服务器收到 SYN 后,打开客户端连接,发送⼀个 SYN-ACK 作为答复。确认号设置为⽐接收到的序列号多⼀个,即 X + 1,服务器为数据包选择的序列号是另⼀个随机数 Y。
ACK:Acknowledge character, 确认字符,表⽰发来的数据已确认接收⽆误。最后,客户端将 ACK 发送给服务器。序列号被设置为所接收的确认值即 Y + 1。
如果⽤现实⽣活来举例的话就是
⼩明 - 客户端⼩红 - 服务端
⼩明给⼩红打电话,接通了后,⼩明说喂,能听到吗,这就相当于是连接建⽴。
⼩红给⼩明回应,能听到,你能听到我说的话吗,这就相当于是请求响应。
⼩明听到⼩红的回应后,好的,这相当于是连接确认。在这之后⼩明和⼩红就可以通话/交换信息了。
TCP 四次挥⼿
  在连接终⽌阶段使⽤4次挥⼿,连接的每⼀端都会独⽴的终⽌。下⾯我们来描述⼀下这个过程。
⾸先,客户端应⽤程序决定要终⽌连接(这⾥服务端也可以选择断开连接)。这会使客户端将 FIN 发送到服务器,并进⼊FIN_WAIT_1状态。当客户端处于 FIN_WAIT_1 状态时,它会等待来⾃服务器的 ACK 响应。
然后第⼆步,当服务器收到 FIN 消息时,服务器会⽴刻向客户端发送 ACK 确认消息。
当客户端收到服务器发送的 ACK 响应后,客户端就进⼊FIN_WAIT_2状态,然后等待来⾃服务器的FIN消息
服务器发送 ACK 确认消息后,⼀段时间(可以进⾏关闭后)会发送 FIN 消息给客户端,告知客户端可以进⾏关闭。
当客户端收到从服务端发送的 FIN 消息时,客户端就会由 FIN_WAIT_2 状态变为TIME_WAIT状态。处于 TIME_WAIT 状态的客户端允许重新发送 ACK 到服务器为了防⽌信息丢失。客户端在 TIME_WAIT 状态下花费的时间取决于它的实现,在等待⼀段时间后,连接关闭,客户端上所有的资源(包括端⼝号和缓冲区数据)都被释放。
还是可以⽤上⾯那个通话的例⼦来进⾏描述
⼩明对⼩红说,我所有的东西都说完了,我要挂电话了。
⼩红说,收到,我这边还有⼀些东西没说。
经过若⼲秒后,⼩红也说完了,⼩红说,我说完了,现在可以挂断了
⼩明收到消息后,⼜等了若⼲时间后,挂断了电话。
六、HTTP 1.0/1.1/1.2 的区别
HTTP 1.0
  HTTP 1.0 是在 1996 年引⼊的,从那时开始,它的普及率就达到了惊⼈的效果。
HTTP 1.0 仅仅提供了最基本的认证,这时候⽤户名和密码还未经加密,因此很容易收到窥探。
HTTP 1.0 被设计⽤来使⽤短链接,即每次发送数据都会经过 TCP 的三次握⼿和四次挥⼿,效率⽐较低。
HTTP 1.0 只使⽤ header 中的 If-Modified-Since 和 Expires 作为缓存失效的标准。
HTTP 1.0 不⽀持断点续传,也就是说,每次都会传送全部的页⾯和数据。
HTTP 1.0 认为每台计算机只能绑定⼀个 IP,所以请求消息中的 URL 并没有传递主机名(hostname)。
HTTP 1.1
  HTTP 1.1 是 HTTP 1.0 开发三年后出现的,也就是 1999 年,它做出了以下⽅⾯的变化
HTTP 1.1 使⽤了摘要算法来进⾏⾝份验证
HTTP 1.1 默认使⽤长连接,长连接就是只需⼀次建⽴就可以传输多次数据,传输完成后,只需要⼀次切断连接即可。长连接的连接时长可以通过请求头中的keep-alive来设置
HTTP 1.1 中新增加了 E-tag,If-Unmodified-Since, If-Match, If-None-Match 等缓存控制标头来控制缓存失效。
HTTP 1.1 ⽀持断点续传,通过使⽤请求头中的Range来实现。
HTTP 1.1 使⽤了虚拟⽹络,在⼀台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享⼀个IP地址。
HTTP 2.0
  HTTP 2.0 是 2015 年开发出来的标准,它主要做的改变如下
头部压缩,由于 HTTP 1.1 经常会出现 User-Agent、Cookie、Accept、Server、Range 等字段可能会
占⽤⼏百甚⾄⼏千字节,⽽ Body 却经常只有⼏⼗字节,所以导致头部偏重。HTTP 2.0 使⽤ HPACK 算法进⾏压缩。
⼆进制格式,HTTP 2.0 使⽤了更加靠近 TCP/IP 的⼆进制格式,⽽抛弃了 ASCII 码,提升了解析效率
强化安全,由于安全已经成为重中之重,所以 HTTP2.0 ⼀般都跑在 HTTPS 上。
多路复⽤,即每⼀个请求都是是⽤作连接共享。⼀个请求对应⼀个id,这样⼀个连接上可以有多个请求。
七、HTTP 常见请求头
  HTTP 标头会分为四种,分别是通⽤标头、实体标头、请求标头、响应标头。
通⽤标头
  通⽤标头主要有三个,分别是 Date、Cache-Control 和 Connection
Date 是⼀个通⽤标头,它可以出现在请求标头和响应标头中,它的基本表⽰如下 Date: Wed, 21 Oct 2015 07:28:00 GMT # 表⽰的是格林威治标准时间,这个时间要⽐北京时间慢⼋个⼩时
Cache-Control 是⼀个通⽤标头,他可以出现在请求标头和响应标头中,Cache-Control 的种类⽐较多,虽然说这是⼀个通⽤标头,但是有⼀些特性是请求标头具有的,有⼀些是响应标头才有的。主要⼤类有可缓存性、阈值性、重新验证并重新加载和其他特性Connection 决定当前事务(⼀次三次握⼿和四次挥⼿)完成后,是否会关闭⽹络连接。Connection 有两种,⼀种是持久性连接,即⼀次事务完成后不关闭⽹络连接;另⼀种是⾮持久性连接,即⼀次事务完成后关闭⽹络连接 # 持久性连接 Connection: keep-alive # ⾮持久性连接 Connection: close
其他通⽤标头
实体标头
  实体标头是描述消息正⽂内容的 HTTP 标头。实体标头⽤于 HTTP 请求和响应中。头部 Content-Length、 Content-Language、
Content-Encoding 是实体头。
Content-Length 实体报头指⽰实体主体的⼤⼩,以字节为单位,发送到接收⽅。
Content-Language 实体报头描述了客户端或者服务端能够接受的语⾔。
Content-Encoding 这⼜是⼀个⽐较⿇烦的属性,这个实体报头⽤来压缩媒体类型。Content-Encoding 指⽰对实体应⽤了何种编码。常见的内容编码有这⼏种: gzip、compress、deflate、identity ,这个属性可以应⽤在请求报⽂和响应报⽂中
其他实体标头
请求标头
Host:指明了服务器的域名(对于虚拟主机来说),以及(可选的)服务器监听的 TCP 端⼝号。如果没有给定端⼝号,会⾃动使⽤被请求服务的默认端⼝(⽐如请求⼀个 HTTP 的 URL 会⾃动使⽤ 80 作为端⼝)。Accpet、 Accept-Language、Accept-Encoding 都是属于内容协商的请求标头。
Host:
Referer:HTTP Referer 属性是请求标头的⼀部分,当浏览器向 web 服务器发送请求的时候,⼀般会带上 Referer,告诉服务器该⽹页是从哪个页⾯链接过来的,服务器因此可以获得⼀些信息⽤于处理。
Referer: /testpage.html
If-Modified-Since:If-Modified-Since 通常会与 If-None-Match 搭配使⽤,If-Modified-Since ⽤于确认代
理或客户端拥有的本地资源的有效性。获取资源的更新⽇期时间,可通过确认⾸部字段 Last-Modified 来确定。⼤⽩话说就是如果在 Last-Modified 之后更新了服务器资源,那么服务器会响应 200,如果在 Last-Modified 之后没有更新过资源,则返回 304。
If-Modified-Since: Mon, 18 Jul 2016 02:36:04 GMT
If-None-Match: HTTP 请求标头使请求成为条件请求。对于 GET 和 HEAD ⽅法,仅当服务器没有与给定资源匹配的 ETag 时,服务器才会以 200 状态发送回请求的资源。对于其他⽅法,仅当最终现有资源的ETag与列出的任何值都不匹配时,才会处理请求。
If-None-Match: "c561c68d0ba92bbeb8b0fff2a9199f722e3a621a"
Accept:接受请求 HTTP 标头会通告客户端其能够理解的 MIME 类型
Accept-Charset:规定服务器处理表单数据所接受的字符集
Accept-Language:⽤来告知服务器⽤户代理能够处理的⾃然语⾔集(指中⽂或英⽂等),以及⾃然语⾔集的相对优先级。可⼀次指定多种⾃然语⾔集。
其他请求标头
响应标头
Access-Control-Allow-Origin:⼀个返回的 HTTP 标头可能会具有 Access-Control-Allow-Origin ,Access-Control-Allow-Origin 指定⼀个来源,它告诉浏览器允许该来源进⾏资源访问。
Keep-Alive:表⽰的是 Connection ⾮持续连接的存活时间,可以进⾏指定。
Server:服务器标头包含有关原始服务器⽤来处理请求的软件的信息。应该避免使⽤过于冗长和详细的 Server 值,因为它们可能会泄露内部实施细节,这可能会使攻击者容易地发现并利⽤已知的安全漏洞。例如下⾯这种写法
Server: Apache/2.4.1 (Unix)
Set-Cookie:⽤于服务器向客户端发送 sessionID。
Transfer-Encoding:⾸部字段 Transfer-Encoding 规定了传输报⽂主体时采⽤的编码⽅式。 HTTP /1.1 的传输编码⽅式仅对分块传输编码有效。
X-Frame-Options:HTTP ⾸部字段是可以⾃⾏扩展的。所以在 Web 服务器和浏览器的应⽤上,会出现各种⾮标准的⾸部字段。⾸部字段 X-Frame-Options 属于 HTTP 响应⾸部,⽤于控制⽹站内容在其他 Web ⽹站的 Frame 标签内的显⽰问题。其主要⽬的是为了防⽌点击劫持(clickjacking)攻击。
其他响应标头

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。