八股文集合

介绍一下TCP/IP模型和OSI模型的区别

OSI和TCP/IP都是一个计算机进行通信的一种体系,而OSI模型师国际组织制定的一个标准体系,TCP/IP是实际网络通信中的实际的体系结构。

OSI自底向上分为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。

TCP/IP分四层,每个层负责特定的网络功能。

自底向上是网络接口层,这层对应OSI的数据链路层和物理层,,这层负责物理传输媒介的定义和管理,比如有线的以太网传输,无线的WIFI传输,此外,网络接口层还管理硬件地址(MAC地址)的管理。

然后是网络层,这层对应OSI的网络层,主要协议是IP,他负责数据包的路由和转发,选择一个最佳路径来将数据包从源主机传送到目标主机。IP协议使用IP地址来进行逻辑地址寻址。

传输层对应OSI的传输层,这层负责应用与应用间的数据传输。主要的传输协议是TCP和UDP。TCP提供可靠的数据传输,UDP提供不可靠的实时传输。

应用层对应OSI的应用层、表示层和会话层,他用于网络上的各种应用提供服务,比如网页浏览,文件传输等。

以上就是osi和tcp/ip的区别了。

从输入URL到页面展示到底发生了什么

个人版:

首先是用户输入url当按下回车键的时候浏览器会先解析url

把url分成

1、协议:http还是https

2、域名:类似于www.baidu.com

3、端口:如果是http的话默认是80端口https默认是443端口

4、路径:/index.html类似这种访问域名服务器下的哪个路径

5、还有一些请求参数等类似于?id=1这种

当解析完url之后再进行DNS解析,就是将域名转换成对应的ip地址就称为DNS解析了,转换的流程是先从浏览器中查看是否有之前的浏览缓存记录,如果浏览器中没有就从操作系统的host文件中查找,如果hosts文件也没有就从ISP的DNS服务器中查找域名对应的IP地址,就是中国移动那种运营商的DNS服务器中查找,如果还没有就从根DNS服务器中查找,直到找到对应的ip地址。找到对应的IP地址后客户端和服务器会开始建立三次握手根服务器建立tcp连接,客户端向服务端发送同步报文的信息,类似于跟服务器说我想跟你建立连接了,然后服务器向客户端发送确认收到连接信息的响应信息,然后客户端再向服务器发送我收到连接建立成功的信息了,

  1. 第一次握手:客户端发送 SYN=1,随机生成初始序号 ISN=x
  2. 第二次握手:服务器确认 SYN=1,并回复 SYN=1, ACK=1,同时生成自己的 ISN=y;
  3. 第三次握手:客户端发送 ACK=1,确认服务器的 ISN=y+1。

如果是https连接的话在建立完tcp连接后还需要

  • 开始进行 TLS/SSL 握手,包括:
    1. 客户端发送 ClientHello(支持的加密套件、协议版本等)
    2. 服务器回应 ServerHello + 证书(包含公钥)
    3. 双方协商密钥、验证身份、完成加密通道建立
    4. 加密通道建立成功后,才开始发送加密的 HTTP 请求

然后这样tcp连接就建立成功了,tcp建立成功后,客户端会向服务器发送请求,包含请求头,请求体等信息,然后服务端就会响应信息,包含响应头,响应体,还有cookie等信息,然后连接保持的字段有个keep-alive这个字段来确认保持连接的状态,燃弧响应后浏览器会解析响应信息,会先解析HTML文件然后形成DOM树,然后再解析CSS文件生成CSSOM,最后将两个图层合并就形成一个好看的页面了,之后再解析JS文件,解析JS文件的过程中会导致页面的重排和重绘,也会有一些外部的资源文件的加载,异步的请求等。

然后会连接可能保持也可能断开,如果数据传输完成了,断开的是四次挥手,客户端向服务器发送我要断开连接的消息,然后服务端向客户端发送我收到断开连接申请的信息,然后再发送我已经断开连接的信息,然后客户端向服务端发送我收到已经断开连接的信息了,以上就是所有。

  • 在 HTTP 请求结束后,如果设置了 Connection: close,则立即断开;
  • 如果是 keep-alive,则 TCP 连接暂时保留,等待下一次复用;
  • 如果一段时间没有新请求(例如服务器设置 idle=60s),连接会被关闭。

HTTP请求报文和响应报文是怎样的,有哪些常见的字段?

HTTP报文分为请求报文和响应报文。

1、请求报文主要由请求行、请求头、空行和请求体构成

请求行包括:

方法:指定要执行的操作,如GET、POST、PUT、DELETE等

资源路径:请求的资源的URI(统一资源标识符)

HTTP版本:使用的HTTP协议版本如HTTP/1.1或HTTP/2.0

请求头字段比较多,通常包含:

Host:请求的服务器域名

Accept: 客户端能够处理的媒体类型

Accept-Encoding:客户端能够解码的内容编码

Authorization:用于认证的凭证信息,比如token数据

Content-Length:请求体长度

Content-Type:请求体的媒体类型

Cookie: 存储在客户端的cookie数据

If-None-Match:资源的ETag值,用于缓存控制

Connection:管理连接的选项比如keep-alive

空行是请求头和请求体之间的空行,主要用于分隔请求头和请求体。请求体通常用于POST和PUT请求,包含发送给服务器的JSON数据。

2、响应报文,HTTP响应报文是服务器向客户端返回的数据格式用于传达服务器对客户端请求的处理结果以及相关数据。通常包含状态行、响应头、空行、响应体。

状态行:HTTP版本、状态码和状态消息比如HTTP/1.1 200 OK

响应头也是以键值对的形式提供信息,一些常见的相应头包括

Content-Type:指定相应主题的媒体类型

Content-Length:指定响应主题的长度(字节数)。

Server:指定服务器的信息

Expires:响应的过期时间,之后内容被认为是过时的。

Etag:响应体的实体标签,用于缓存和条件请求。

Last-Modified:资源最后被修改的日期和时间。

Location:在重定向时指定新的资源位置

Set-Cookie:在响应中设置Cookie

Access-Control-Allow-Origin:夸资源共享CORS策略,指定哪些域可以访问资源。

空行是在响应头和响应体之间表示响应头结束。而响应体式服务端实际传输的数据,可以是文本、HTML页面、图片、视频等,也可能是空。

HTTP有哪些请求方式

  1. GET:请求指定的资源。
  2. POST:向指定资源提交数据进行处理请求(例如表单提交)。
  3. PUT:更新指定资源。
  4. DELETE:删除指定资源。
  5. HEAD:获取报文首部,不返回报文主体。
  6. OPTIONS:查询服务器支持的请求方法。
  7. PATCH:对资源进行部分更新。

GET请求和POST请求的区别

  1. 用途:GET请求通常用于获取数据,POST请求用于提交数据。
  2. 数据传输:GET请求将参数附加在URL之后,POST请求将数据放在请求体中。
  3. 安全性:GET请求由于参数暴露在URL中,安全性较低;POST请求参数不会暴露在URL中,相对更安全。
  4. 数据大小:GET请求受到URL长度限制,数据量有限;POST请求理论上没有大小限制。
  5. 幂等性:GET请求是幂等的,即多次执行相同的GET请求,资源的状态不会改变;POST请求不是幂等的,因为每次提交都可能改变资源状态。
  6. 缓存:GET请求可以被缓存,POST请求默认不会被缓存。

HTTP中常见的状态码有哪些

200 :表示客户端请求成功

201:创建了新资源

204:无内容,服务器成功处理请求,但未返回任何内容

301:永久重定向

302:临时重定向

304:请求的内容没有修改过,所以服务器返回响应时,不会返回网页内容,而是使用缓存。

401:请求需要身份验证

403:请求的对应资源禁止被访问

404:服务器无法找到对应的资源

500:服务器内部错误

503:服务不可用

什么是强缓存和协商缓存

强缓存和协商缓存是HTTP缓存机制的两种类型,他们用于减少服务器的负担和提高网页加载速度。

1、强缓存:客户端在没用向服务发送请求的情况下,直接从本地缓存中获取资源。

Expires强缓存:这个是用于设置强缓存时间,此时间范围内,从内存中读取缓存并返回。但是因为Expires判断强缓存过期的机制是获取本地时间戳,与之前拿到的资源文件中的Expires字段的时间做比较来判断是否需要对服务器发起请求。这里有一个巨大的漏洞,如果我本地时间不准怎么办?所以目前已经被废弃了。

Cachee-Control强缓存:目前使用的强缓存是通过HTTP响应头中的Cache-Control字段实现,通过max-age来告诉浏览器在指定时间内可以直接使用缓存数据,无需再次请求。

2、协商缓存:当强缓存失效时,浏览器会发送请求到服务器,通过ETag或Last-Modified等HTTP响应头与服务器进行验证,以确定资源是否被修改。如果资源未修改,服务器服务器返回304 Not Modified状态码,告知浏览器使用本地缓存。如果资源已经修改,则返回新的资源,浏览器更新本地缓存。这种凡是需要与服务器通信,但可以确保用户总是获取最新的内容。

如果是基于缓存的资源获取的话一个是基于Last-Modified一个是基于ETag。

  1. 如果是基于Last-Modified的协商缓存,Last-Modified是资源的最后修改时间,服务器在响应头部中返回。当客户端读取到Last-modified的时候,会在下次的请求标头中携带一个字段If-Modified-Since,而这个请求头中的If-Modified-Since就是服务器第一次修改时候给他的时间服务器比较请求中的If-Modified-Since值与当前资源的Last-Modified值,如果比对的结果是没有变化,表示资源未发生变化,返回状态码304 Not Modified,如果比对的结果说资源已经更新了,就会给浏览器正常资源,返回200状态。

但是这种协商缓存有两个缺点:

  • 因为是更改文件修改时间来判断的,所以在文件内容本身不修改的情况下,依然有可能更新文件修改时间(比如修改文件名再改回来),这样有可能文件内容明明没修改但是缓存依然失效了。
  • 当文件在极短时间内完成修改的时候(比如几百毫秒)。因为文件修改事件记录的最小单位是秒,所以,如果文件在几百毫秒内完成修改的话,文件修改时间不会改变,这样即使文件内容修改了,依然不会返回新的文件。
  1. 基于ETag的协商缓存:将原先协商缓存的比较时间戳的形式修改成了比较文件指纹(根据文件内容计算出的唯一哈希值)
  • ETag是服务器为资源生成的唯一标识符(文件指纹),可以是根据文件内容计算出的哈希值,服务端将其和资源一起放回给客户端。
  • 客户端在请求头部的If-None-Match字段中携带上次响应的ETag值。
  • 服务器比较请求中的If-None-Match值与当前资源的ETag值,如果匹配,表示资源未发生变化,返回状态码 304 Not Modified。如果两个文件指纹不吻合,则说明文件被更改,那么将新的文件指纹重新存储到响应头的ETag中并返回给客户端

image-20250620095824176