网站首页 > 技术文章 正文
http响应常见状态码
- 100-199 表示成功接受请求,要求客户端继续提交下一次请求才能完成整个处理过程
- 200-299 表示成功接受请求并已完成整个处理过程,常用200
- 300-399 为完成请求, 客户需进一步细化需求: 例如: 请求的资源已经移动一个新地址, 常用 302(重定向), 307 和 304(拿缓存)
- 400-499 客户端请求有错误,包含语法错误或者不能正确执行,常用404(请求的资源在web服务器中没有) 403(服务器拒绝访问,权限不够)
- 500-599 服务器出现错误
常用
- 200 表示一切正常,返回的是正常请求结果
- 302/307 临时重定向,请求的文档已经被临时移动到别处,此文档的新url在location的响应头中给出
- 304 未修改,表示客户机缓存的版本是最新的,客户机应该继续使用他
- 403 服务器禁止访问
- 404 服务器上找不到请求的资源
- 500 服务器内部错误
http1.0跟http1.1的区别
- http 1.0 对于每个连接都得建立一次连接,一次只能传送一个请求和响应,请求就会关闭,http 1.0没有host字段
- http 1.1 在同一个连接中可以传送多个请求和响应,多个请求可以重叠进行,http 1.1必须有host字段
- http1.1 中引入了 ETag 头, 它的值 entity tag 可以用来唯一的描述一个资源. 请求消息中可以使用 If-None-Match 头域来匹配资源的 entitytag 是否有变化
- http1.1 新增了 Cache-Control 头域(消息请求和响应请求都可以使用), 它支持一个可扩展的指令子集
- http1.0 中只定义了 16 个状态响应码, 对错误或警告的提示不够具体. http1.1 引入了一个 Warning 头域, 增加对错误或警告信息的描述. 且新增了 24 个状态响应码
TCP三次握手和四次挥手
建立 TCP 连接需要三次握手,三次握手: 首先 Client 端发送连接请求报文,Server 段接受连接后回复 ACK 报文,并为这次连接分配资源。Client 端接收到 ACK 报文后也向 Server 段发生 ACK 报文,并分配资源,这样 TCP 连接就建立了
- 第一步: 客户机的 TCP 先向服务器的 TCP 发送一个连接请求报文. 这个特殊的报文中不含应用层数据, 其首部中的 SYN 标志位被置 1. 另外, 客户机会随机选择一个起始序号 seq=x(连接请求报文不携带数据,但要消耗掉一个序号)
- 第二步: 服务器端的 TCP 收到连接请求报文后, 若同意建立连接, 就向客户机发送请求, 并为该 TCP 连接分配 TCP 缓存和变量. 在确认报文中,SYN 和 ACK 位都被置为 1, 确认号字段的值为 x+1, 并且服务器随机产生起始序号 seq=y(确认报文不携带数据, 但也要消耗掉一个序号). 确认报文同样不包含应用层数据.
- 第三步: 当客户机收到确认报文后, 还要向服务器给出确认, 并且也要给该连接分配缓存和变量. 这个报文的 ACK 标志位被置为 1, 序号字段为 x+1, 确认号字段为 y+1
四次挥手:
- 第一步: 客户机打算关闭连接,就向其 TCP 发送一个连接释放报文,并停止再发送数据,主动关闭 TCP 连接, 该报文的 FIN 标志位被置 1, seq=u, 它等于前面已经传送过的数据的最后一个字节的序号加 1(FIN 报文即使不携带数据,也要消耗掉一个序号)
- 第二步: 服务器接收连接释放报文后即发出确认, 确认号是 ack=u+1, 这个报文自己的序号是 v, 等于它前面已传送过的数据的最后一个自己的序号加 1. 此时, 从客户机到服务器这个方向的连接就释放了, TCP 连接处于半关闭状态. 但服务器若发送数据, 客户机仍要接收, 即从服务器到客户机的连接仍未关闭.
- 第三步: 若服务器已经没有了要向客户机发送的数据, 就通知 TCP 释放连接, 此时其发出 FIN=1 的连接释放报文
- 第四步: 客户机收到连接释放报文后, 必须发出确认. 在确认报文中, ACK 字段被置为 1, 确认号 ack=w+1, 序号 seq=u+1. 此时, TCP 连接还没有释放掉, 必须经过等待计时器设置的时间 2MSL 后, A 才进入到连接关闭状态.
http协议
超文本传输协议,是互联网上应用最广泛的一种网络协议。所有的www文件都必须遵守这个标准,设计http的最初目的是为了提供一种发布和接收html的方法
http与https的区别
- http运行在tcp协议之上,使用铭文传输,客户端与服务端都无法验证对方的身份,https是身披ssl外壳的http,运行于ssl上,ssl运行于tcp上,是添加了加密和认证机制的http,而知之间存在如下不同
- 端口不同,http与https使用不同的连接方式,用的端口也不一样,前者是80,后者是443
- 消耗资源,https消耗更多的cpu和内存资源
- 开销:https通信需要证书,而证书一般需要向认证机构购买
- https的加密机制是一种共享秘钥加密和公开秘钥加密的混合加密机制
从输入URL到页面加载发生了什么
- 进行DNS解析
- 建立TCP链接
- 发送Http请求
- 服务器处理请求并返回http报文
- 浏览器解析渲染页面
- 链接结束
http的几种请求方法的用途
- get方法:发送一个请求来获取服务器上的某一资源
- post方法:向url指定的资源提交数据或附加新的数据
- PUT 方法:跟 POST 方法很像,也是想服务器提交数据。但是,它们之间有不同。PUT 指定了资源在服务器上的位置,而 POST 没有
- head方法:只请求页面的首部
- delete方法:删除服务器上的某资源
- options方法:它用于获取当前 URL 所支持的方法。如果请求成功,会有一个 Allow 的头包含类似“GET,POST”这样的信息
- TRACE 方法:TRACE 方法被用于激发一个远程的,应用层的请求消息回路
- CONNECT 方法:把请求连接转换到透明的 TCP/IP 通道
127.0.0.1 与 192.168.0.1 有什么区别
首先明确二者没有区别!两个 IP 地址的角度不一样,127.0.0.1 是从 IETF(因特尔工程任务组)规定看,是保留给本机使用的 IP 地址,所有的计算机默认都是相同的。而 192.168.0.1 其实只是 IETF 在 c 类网址中,专门留出给专用网络用的一个网段中的一个 IP 而已,该网段包含了 192.168.0.1 到 192.168.255.255 中所有的 IP 地址
HTTP 长连接、短连接
在 HTTP/1.0 中默认使用短连接。也就是说,客户端和服务器每进行一次 HTTP 操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个 HTML 或其他类型的 Web 页中包含有其他的 Web 资源(如 JavaScript 文件、图像文件、CSS 文件等),每遇到这样一个 Web 资源,浏览器就会重新建立一个 HTTP 会话。
而从 HTTP/1.1 起,默认使用长连接,用以保持连接特性。使用长连接的 HTTP 协议,会在响应头加入这行代码
Connection:keep-alive
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输 HTTP 数据的 TCP 连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive 不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如 Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。
HTTP 协议的长连接和短连接,实质上是 TCP 协议的长连接和短连接。
HTTP 长连接、短连接究竟是什么?
如何理解 HTTP 协议是无状态的【常考
HTTP 协议是无状态的,指的是协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。也就是说,打开一个服务器上的网页和上一次打开这个服务器上的网页之间没有任何联系。HTTP 是一个无状态的面向连接的协议,无状态不代表 HTTP 不能保持 TCP 连接,更不能代表 HTTP 使用的是 UDP 协议(无连接)
Socket 连接与 HTTP 连接的联系与区别
由于通常情况下 Socket 连接就是 TCP 连接,因此 Socket 连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。但在实际网络应用中,客户端到服务器之间的通信往往需要穿越多个中间节点,例如路由器、网关、防火墙等,大部分防火墙默认会关闭长时间处于非活跃状态的连接而导致 Socket 连接断连,因此需要通过轮询告诉网络,该连接处于活跃状态。
而 HTTP 连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。
很多情况下,需要服务器端主动向客户端推送数据,保持客户端与服务器数据的实时与同步。此时若双方建立的是 Socket 连接,服务器就可以直接将数据传送给客户端;若双方建立的是 HTTP 连接,则服务器需要等到客户端发送一次请求后才能将数据传回给客户端,因此,客户端定时向服务器端发送连接请求,不仅可以保持在线,同时也是在“询问”服务器是否有新的数据,如果有就将数据传给客户端。
HTTP 的缓存机制(常考)
Http 的缓存主要利用 header 里的两个字段来控制
- Cache-control主要包含以及几个字段:
- private:则只有客户端可以缓存
- public:客户端和代理服务器都可以缓存
- max-age:缓存的过期时间
- no-cache:需要使用对比缓存来验证缓存数据
- no-store:所有内存都不会进行缓存
- ETag:即用来进行对比缓存,Etag 是服务端资源的一个标识码
- 当客户端发送第一次请求时服务端会下发当前请求资源的标识码 Etag,下次再请求时,客户端则会通过 header 里的 If-None-Match 将这个标识码 Etag 带上,服务端将客户端传来的 Etag 与最新的资源 Etag 做对比,如果一样,则表示资源没有更新,返回 304
通过 Cache-control 和 Etag 的配合来实现 Http 的缓存机制
cookie
Cookie 就是用来在本地缓存记住一些状态的,一个 Cookie 一般都包含 domin(所属域)、path、Expires(过期时间)等几个属性。服务端可以通过在响应头里的 set-cookies 来将状态写入客户端的 Cookie 里
Http2.0 与 http1.x 相比有什么优点(常考)
二进制格式:http1.x 是文本协议,而 http2.0 是二进制以帧为基本单位,是一个二进制协议,一帧中除了包含数据外同时还包含该帧的标识:Stream Identifier,即标识了该帧属于哪个 request,使得网络传输变得十分灵活。
多路复用: 一个很大的改进,原先 http1.x 一个连接一个请求的情况有比较大的局限性,也引发了很多问题,如建立多个连接的消耗以及效率问题
http1.x 为了解决效率问题,可能会尽量多的发起并发的请求去加载资源,然而浏览器对于同一域名下的并发请求有限制,而优化的手段一般是将请求的资源放到不同的域名下来突破这种限制。
而 http2.0 支持的多路复用可以很好的解决这个问题,多个请求共用一个 TCP 连接,多个请求可以同时在这个 TCP 连接上并发,一个是解决了建立多个 TCP 连接的消耗问题,一个也解决了效率的问题。那么是什么原理支撑多个请求可以在一个 TCP 连接上并发呢?基本原理就是上面的二进制分帧,因为每一帧都有一个身份标识,所以多个请求的不同帧可以并发的无序发送出去,在服务端会根据每一帧的身份标识,将其整理到对应的 request 中。
header 头部压缩:主要是通过压缩 header 来减少请求的大小,减少流量消耗,提高效率。因为之前存在一个问题是,每次请求都要带上 header,而这个 header 中的数据通常是一层不变的。
支持服务端推送
- 上一篇: 那些你不知道的HTML知识,快来学习一下吧
- 下一篇: 一个合格的Web前端工程师要掌握的哪些知识点?
猜你喜欢
- 2025-06-08 惬意!清晨慢品 HTML canvas 标签题,面试知识轻松 get
- 2025-06-08 前端实现知识图谱-force(d3.js)(前端知识树)
- 2025-06-08 高级前端必须要懂得nginx知识(nginx做前端服务器)
- 2025-06-08 前端八股文都不会,还想靠“临场发挥”拿Offer?
- 2024-09-29 前端知识-概念篇 “前端”
- 2024-09-29 前端开发应当掌握的10大板块内容,每一个知识点应当相当熟悉
- 2024-09-29 web开发之-前端知识介绍 web前端基本知识
- 2024-09-29 web前端基础知识 web前端基础知识 相关课程
- 2024-09-29 前端小知识点汇总,常忘记的知识点汇总(面试,笔试)学习笔记
- 2024-09-29 高级前端开发应该掌握的知识图谱 高级前端开发应该掌握的知识图谱是什么
你 发表评论:
欢迎- 580℃几个Oracle空值处理函数 oracle处理null值的函数
- 575℃Oracle分析函数之Lag和Lead()使用
- 561℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 560℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 556℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 545℃【数据统计分析】详解Oracle分组函数之CUBE
- 533℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 529℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端懒加载 (49)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle的函数 (57)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)