文章目录
前言
随手记录一些八股,待整理
一、计算机网络
1.介绍一下TCP/IP模型和OSI模型的区别
OSI模型是ISO国际标准化组织制定的一个用于计算机或者通信系统间互联的标准体系,将计算机网络通信分为七层。
虽然OSI在理论上更全面,但TCP/IP在实际的通信中更为实用。TCP/IP模型分为四层:
- 应用层
该层与OSI模型的应用层、表示层、会话层类似。
提供与用户应用程序交互的接口,为网络上的各种应用提供服务。如电子邮件(SMTP)、网页浏览(HTTP)、文件传输(FTP)等。 - 传输层
该层对应OSI模型的传输层。
负责端到端的数据传输,提供可靠的、无连接的数据传输服务。主要的协议包括TCP,提供可靠的数据连接,保证数据的完整性和准确性;UDP是无连接的协议,用于不需要确保可靠性的传输,如实时的音频视频。 - 网络层
该层对应OSI模型的网络层。
主要的协议是IP,它负责数据包的路由和转发。选择最佳路径将数据从源主机传输到目标主机。IP协议使用IP地址来标识主机和网络,并进行逻辑地址寻址。 - 网络接口层
该层对应OSI模型的数据链路层和物理层。负责物理传输媒介上的传输,例如以太网、WiFi。也包含硬件地址(MAC地址)的管理。
2.从输入 URL 到页面展示到底发生了什么?
- 解析URL信息,准备发送HTTP请求
- 检查浏览器缓存是否有缓存该资源,如果有直接返回,没有就发送网络请求
- 网络请求前,根据域名进行DNS域名解析,获取域名的IP地址。DNS解析顺序为:本地浏览器缓存->本地Host文件->路由器缓存->DNS服务器->根DNS服务器。直到找到为止(如果请求协议是HTTPS,还需要建立TLS连接)
- 浏览器与服务器IP建立TCP连接,三次握手
- 建立连接后,客户端发送HTTP请求。浏览器构建请求行、请求头等信息,并把域名相关的cookie等数据加入请求头,向服务器构建请求信息(如果是HTTPS的话,还涉及到HTTPS的加解密流程)
- 服务器处理请求并返回响应数据
- 浏览器与服务器断开TCP连接,四次挥手
- 浏览器解析响应并渲染界面
3.HTTP请求报文和响应报文是怎样的,有哪些常见的字段?
HTTP报文分为请求报文和响应报文:
- 请求报文主要由请求行、请求头、空行、请求体构成
- 请求行包括
方法: 执行指定的操作,如GET、POST、PUT、DELETE 等
资源路径:请求的资源的URL
使用的HTTP版本:如 HTTP/1.1 或 HTTP/2.0 - 请求头的字段较多,常用的包含以下几个:
Host:请求的服务器的域名
Accept:客户端能够处理的媒体类型
Authorization:用于认证的凭证信息,比如token数据
Content-Length:请求体的长度
Content-Type:请求体的媒体类型
Cookie:存储在客户端的cookie数据
Connection:管理连接的选项,如 keep-alive - 接下来是空行,用于分割请求头和请求体。
- 而请求体通常用于 POST 和 PUT 请求,包含发送给服务器的数据。
- 响应报文是服务端向客户端返回的数据形式,主要包含状态行、响应头、空行、响应体
- 状态行包含HTTP版本、状态码和状态消息。例如:
HTTP/1.1 200 OK
- 响应头也是以键值对的形式提供的额外信息,类似于请求头,用于告知客户端有关响应的详细信息,包括
Content-Type:指定响应主体的媒体类型
Content-Length:指定响应主体的长度(字节数
Server:指定服务器的信息
Expires: 响应的过期时间,之后内容被认为是过时的
ETag: 响应体的实体标签,用于缓存和条件请求
Last-Modified: 资源最后被修改的日期和时间
Location:在重定向时指定新的资源位置
Set-Cookie:在响应中设置Cookie - 空行、在响应头和响应体之间,表示响应头的结束。
- 而响应体是服务端实际传输的数据,可以是文本、HTML页面、图片、视频等,也可能为空。
4.HTTP有哪些请求方式?
- GET:请求指定的资源
- POST:向指定资源提交数据进行处理请求(例如表单提交、上传文件),数据被包含在请求体中
- PUT:更新指定资源
- DELETE:请求服务器删除指定资源
- HEAD:类似于 GET 请求,只不过不返回报文主体,只获取报文首部
- OPTIONS:允许客户端查看服务器的性能
- PATCH:对 PUT 方法的补充,对资源进行部分更新
5.GET请求和POST请求的区别
- GET是获取数据、POST是提交数据进行处理
- GET请求将参数附加在URL之后,POST请求将数据放在请求体中
- GET请求由于参数暴露在URL中,安全性较低;POST相对更安全
- GET请求受到URL长度限制,数据量有限;POST请求理论上没有大小限制
- GET请求是幂等的,即多次执行相同的GET请求,资源的状态不会改变;POST请求不是幂等的,因为每次提交都可能改变资源状态
- GET请求被浏览器主动缓存,POST默认不会被缓存
幂等性是指一次和多次请求某一个资源应该具有同样的副作用。简单来说意味着对同一URL的多个请求应该返回同样的结果。
6.HTTP中常见的状态码有哪些?
- 1xx 信息(接收的请求正在处理)
100 Continue :表明到目前为止都很正常,客户端可以继续发送请求或者忽略这个响应。 - 2xx 成功(请求正常处理完毕)
200 OK:表示客户端请求成功
204 No Content :请求已经成功处理,但是返回的响应报文不包含实体的主体部分。一般在只需要从客户端往服务器发送信息,而不需要返回数据时使用。
206 Partial Content :表示客户端进行了范围请求,响应报文包含由 Content-Range 指定范围的实体内容。 - 3xx 重定向(需要进行附加操作以完成请求)
301 Moved Permanently :永久性重定向
302 Found :临时性重定向
303 See Other :和 302 有着相同的功能,但是 303 明确要求客户端应该采用 GET 方法获取资源。
304 Not Modified :请求的内容没有修改过,所以服务器返回此响应时,不会返回网页内容,而是使用缓存。就是如果请求报文首部包含一些条件,例如:If-Match,If-Modified-Since,If-None-Match,If-Range,If-Unmodified-Since,如果不满足条件,则服务器会返回 304 状态码。 - 4xx 客户端错误(服务器无法处理请求)
400 Bad Request :请求报文中存在语法错误。
401 Unauthorized :该状态码表示发送的请求需要有认证信息(BASIC 认证、DIGEST 认证)。如果之前已进行过一次请求,则表示用户认证失败。
403 Forbidden :请求被拒绝。请求的对应资源禁止被访问。
404 Not Found:服务器无法找到对应资源 - 5xx 服务器错误(服务器处理请求出)
500 Internal Server Error :服务器正在执行请求时发生错误。
503 Service Unavailable :服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。
7.什么是强缓存和协商缓存
强缓存和协商缓存是HTTP缓存机制的两种类型,它们用于减少服务器的负担和提高网页加载速度。
-
强缓存:客户端在没有向服务器发送请求的情况下,直接从本地缓存中获取资源。
- Expires强缓存:设置一个强缓存时间,此时间范围内,从内存中读取缓存并返回。但是因为Expires判断强缓存过期的机制是获取本地时间戳,与之前拿到的资源文件中的
Expires字段
的时间做比较来判断是否需要对服务器发起请求。这里有一个巨大的漏洞:“如果我本地时间不准咋办?”所以目前已经被废弃了。 - Cache-Control强缓存:目前使用的强缓存是通过HTTP响应头中的
Cache-Control
字段实现,通过max-age
来告诉浏览器在指定时间内可以直接使用缓存数据,无需再次请求。
- Expires强缓存:设置一个强缓存时间,此时间范围内,从内存中读取缓存并返回。但是因为Expires判断强缓存过期的机制是获取本地时间戳,与之前拿到的资源文件中的
-
协商缓存:当强缓存失效时,浏览器会发送请求到服务器,通过ETag或Last-Modified等HTTP响应头与服务器进行验证,以确定资源是否被修改。如果资源未修改,服务器返回304 Not Modified状态码,告知浏览器使用本地缓存;如果资源已修改,则返回新的资源,浏览器更新本地缓存。这种方式需要与服务器通信,但可以确保用户总是获取最新的内容。
基于Last-Modified的协商缓存-
Last-Modified 是资源的最后修改时间,服务器在响应头部中返回。
当客户端读取到Last-modified
的时候,会在下次的请求标头中携带一个字段:If-Modified-Since
,而这个请求头中的If-Modified-Since
就是服务器第一次修改时候给他的时间
服务器比较请求中的If-Modified-Since
值与当前资源的Last-Modified
值,如果比对的结果是没有变化,表示资源未发生变化,返回状态码304 Not Modified
。如果比对的结果说资源已经更新了,就会给浏览器正常返回资源,返回200状态。
但是这样的协商缓存有两个缺点:
因为是更改文件修改时间来判断的,所以在文件内容本身不修改的情况下,依然有可能更新文件修改时间(比如修改文件名再改回来),这样,就有可能文件内容明明没有修改,但是缓存依然失效了。
当文件在极短时间内完成修改的时候(比如几百毫秒)。因为文件修改时间记录的最小单位是秒,所以,如果文件在几百毫秒内完成修改的话,文件修改时间不会改变,这样,即使文件内容修改了,依然不会返回新的文件。 -
基于
ETag
的协商缓存:将原先协商缓存的比较时间戳的形式修改成了比较文件指纹(根据文件内容计算出的唯一哈希值)。
ETag
是服务器为资源生成的唯一标识符(文件指纹),可以是根据文件内容计算出的哈希值,服务端将其和资源一起放回给客户端。
客户端在请求头部的If-None-Match
字段中携带上次响应的ETag
值。
服务器比较请求中的If-None-Match
值与当前资源的ETag
值,如果匹配,表示资源未发生变化,返回状态码304 Not Modified
。如果两个文件指纹不吻合,则说明文件被更改,那么将新的文件指纹重新存储到响应头的ETag
中并返回给客户端
-
待续