计算机网络-八股-学习摘要

一:HTTP的基本概念

全称:

超文本传输协议

从三个方面介绍HTTP协议

1,超文本 :我们先来理解「文本」,在互联网早期的时候只是简单的字符文字,但现在「文本」的涵义已经可以扩展为图片、视频、压缩包 等,在 HTTP 眼里这些都算作「文本」。再来理解「 文本」,它就是超越了普通文本的文本,它是文字、图片、视频等的混合体,最关键有超链接 ,能从一个超文本跳转到另外一个超文本。HTML 就是最常见的超文本了,它本身只是纯文字文件 ,但内部用很多标签定义了图片、视频等的链接 ,再经过浏览器的解释 ,呈现给我们的就是一个文字、有画面的网页了。

2,传输 :从A->B或者从B->A,这里表示HTTP是一个双向的协议。我们在上网冲浪时,浏览器是请求方 A,百度网站就是应答方 B。双方约定用 HTTP 协议来通信,于是浏览器把请求数据发送给网站,网站再把一些数据返回给浏览器,最后由浏览器渲染在屏幕,就可以看到图片、视频了。

3,协议:协议表示的是两者以上共同履行的一个约定,或一个规范,超文本传输协议HTTP 使用计算机能够理解的语言确立了一种计算机之间交流通信的规范,以及相关的各种控制和错误处理方式。

二:常见的状态码:

1)1xx: 信息响应

100 Continue:服务器已接收请求的初步部分,客户端应继续请求。

101 Switching Protocols:服务器同意切换协议,如从HTTP 切换到 WebSocket.

2)2xx: 成功

200 OK:请求成功,服务器返回所请求的资源或数据。

201 Created:请求成功并创建了新的资源,常用于 POST 请求。204 No Content:请求成功但服务器不返回任何内容,常用于除操作。

3)3xx: 重定向

301 Moved Permanently:资源已永久移动到新的 URL,客户端应使用新 URL 访问

302 Found:资源临时移动到新的 URL,客户端应继续使用原来的 URL。

304 Not Modified:资源未修改,客户端可以使用缓存版本

4)4xx: 客户端错误

400 Bad Request:请求无效或语法错误,服务器无法处理,

401 Unauthorized:请求需要身份验证,客户端未提供有效的凭证。

403 Forbidden:服务器理解请求但拒绝执行,通常是权限问题。

404 Not Found:请求的资源在服务器上未找到。

5)5xx: 服务器错误

500 Internal Server Error:服务器内部错误,无法完成请求。

502 Bad Gateway:服务器作为网关或代理,从上游服务器接收到无效响应。

503 Service Unavailable:服务器暂时无法处理请求,通常是因为过载或维护

三:HTTP请求、响应的内容

请求:
请求行

请求行是 HTTP 请求的第一行,包含了以下三个部分:

****请求方法:****指明客户端要对服务器执行的操作,常见的有:

GET:用于从服务器获取资源,请求的资源会附带在响应中返回,例如在浏览器地址栏输入网址访问网页,就是使用 GET 方法向服务器请求网页资源。

POST:通常用于向服务器提交数据,比如在网页上填写表单并提交时,一般会使用 POST 方法将表单数据发送到服务器。

PUT:用于更新服务器上的资源,将请求体中的数据替换指定的资源。

DELETE:用于删除服务器上指定的资源。

等等.....

****请求 URL:****指定客户端要请求的资源的统一资源定位符(URL)地址,它标识了请求的目标资源在服务器中的位置,例如https://www.example.com/index.html

****协议版本:****指定客户端使用的 HTTP 协议版本,常见的有 HTTP/1.0、HTTP/1.1 等,例如HTTP/1.1 。

求头

请求头是客户端发送给服务器的附加信息,包含了客户端的相关配置和要求等元数据,常见的有:

Host: 指定请求的目标服务器的主机名端口号(若端口号是默认的 80(HTTP)或 443(HTTPS),则端口号可省略),用于服务器识别请求的目标。

User - Agent: 标识发起请求的客户端应用程序 的信息,包括浏览器类型、版本、操作系统、设备类型等,例如Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 ,服务器可据此返回适合该客户端的内容。

Accept: 指定客户端能够接受的响应内容的类型(MIME 类型),例如text/html,application/json ,表示客户端可以接受 HTML 和 JSON 格式的数据。

****Content - Type:****当请求体中包含数据时,用于指定请求体中发送的数据的类型,比如application/x - www - form - urlencoded 表示表单数据以 URL 编码形式发送,application/json 表示请求体是 JSON 格式的数据。

****Authorization:****用于在请求中传递授权凭证,以便客户端进行身份验证,例如包含访问令牌等信息,服务器据此验证客户端是否有权限访问请求的资源。

****Cookie:****用于在请求中传递保存在客户端的会话信息,服务器可以利用这些信息识别用户身份、跟踪用户会话等。

****Accept - Charset:****指示客户端可以接受的字符集,如utf - 8 ,表示接受 UTF - 8 编码的数据。

****Accept - Encoding:****指示客户端可以接受的内容编码方式,常见的有gzip 、deflate 等,服务器可以按照客户端支持的方式对响应数据进行压缩。

****Accept - Language:****指示客户端可以接受的语言,例如en - US 表示接受美国英语,服务器可据此返回对应语言的内容。

Referer:指示当前请求页面的来源页面地址,用于跟踪用户从哪个页面发起的请求,例如从页面 A 点击链接跳转到页面 B,页面 B 的请求头中的 Referer 字段会包含页面 A 的地址。

Connection: 主要用于控制客户端和服务器之间的连接行为。keep - alive:这是 HTTP/1.1 协议中的默认值。它表示客户端希望在本次请求完成后,该 TCP 连接不会立即关闭,而是保持打开状态,以便后续可以在同一个连接上发送新的 HTTP 请求。值为close:表示客户端希望在本次请求完成后,服务器关闭该 TCP 连接。

http响应:

状态行

状态行由三部分组成,用于描述响应的状态信息,具体如下:

****协议版本:****表明服务器使用的 HTTP 协议版本,常见的有 HTTP/1.0、HTTP/1.1、HTTP/2 等。例如 "HTTP/1.1" 。

****状态码:****是一个三位数,用于表示请求的处理结果,常见的状态码有:

200 OK:表示服务器成功处理了请求,请求的资源正常返回。

****状态描述:****是对状态码的简短文本描述,用于更直观地说明状态码的含义,例如 "OK" 对应状态码 200,"Not Found" 对应状态码 404 等。

响应头

响应头由多个键值对组成,包含了与响应有关的元数据,常见的响应头有:

****Content - Type:****指定响应体的内容类型(MIME 类型)和字符集,例如 "text/html; charset=utf - 8" 表示响应体是 HTML 格式,字符编码为 UTF - 8;"application/json" 则表示响应体是 JSON 格式的数据。

****Content - Length:****用于指定响应体的长度(字节数),以便客户端知道需要接收多少数据。

****Location:****在重定向响应(如 301、302 状态码)中,该字段指定资源新的 URL 地址,客户端会根据此地址重新发送请求。

****Set - Cookie:****用于在客户端设置 Cookie,服务器可以通过它来识别用户身份、跟踪用户会话等,例如 "Set - Cookie: session_id=123456; expires=Thu, 01 - Jan - 2026 00:00:00 GMT; path=/" 。

****Cache - Control:****指定缓存策略,控制客户端和中间缓存服务器如何缓存和处理响应,例如 "Cache - Control: no - cache" 表示不允许缓存,每次都需要从服务器获取最新内容;"Cache - Control: max - age = 3600" 表示响应可以被缓存,且在 3600 秒内是有效的。

****Date:****表示服务器生成响应的日期和时间,例如 "Date: Sat, 26 Nov 2023 08:45:30 GMT" 。

****Server:****指明处理请求的 Web 服务器软件信息,如 "Server: Apache/2.4.41 (Ubuntu)" ,但出于安全考虑,有时服务器可能会隐藏或模糊此信息。

****Expires:****指定响应的过期时间,在该时间之后,缓存的响应将被视为无效,需要重新从服务器获取,例如 "Expires: Thu, 01 Dec 2023 12:00:00 GMT" 。

****Last - Modified:****表示所请求资源在服务器上的最后修改时间,客户端可以利用这个信息进行缓存验证,例如 "Last - Modified: Mon, 15 Nov 2023 10:30:00 GMT" 。

Connection: 主要用于控制客户端和服务器之间的连接行为。值为 keep - alive:服务器通过该值告知客户端,本次响应完成后,连接将保持打开状态,客户端可以继续在该连接上发送新请求。值为close:表示服务器在发送完本次响应后,会关闭该 TCP 连接。当服务器检测到客户端可能存在异常行为、资源紧张或者需要强制关闭连接等情况时,可能会在响应头中设置Connection: close

四:GET和POST的区别

浏览器行为

GET:通常用于获取资源,浏览器会将 GET 请求的 URL 显示在地址栏中,用户可以直接在地址栏输入 URL 发起 GET 请求,并且可以对其进行收藏。例如,在浏览器中输入百度的搜索词,URL 会包含搜索内容,此时就是一个 GET 请求。

POST:一般用于向服务器提交数据,浏览器不会在地址栏中显示 POST 请求的数据,用户无法直接通过地址栏发起 POST 请求,也不能直接收藏 POST 请求。例如,用户登录网站时,输入的用户名和密码通过 POST 请求发送,这些信息不会显示在地址栏。

传参方式

GET:参数通过 URL 的查询字符串传递,多个参数之间用&符号分隔。例如,http://example.com/search?keyword=apple\&page=1,其中keyword和page是参数名,apple和1是对应的值。URL 的长度受限于浏览器和服务器的限制,一般较短。

POST:参数放在请求体中,不在 URL 中显示。请求体可以包含各种格式的数据,如表单数据(application/x-www-form-urlencoded)、JSON 数据(application/json)等。这种方式理论上对数据长度没有限制,适用于传输大量数据。

安全性

GET:由于参数暴露在 URL 中,容易被他人通过查看浏览器历史记录、服务器日志等方式获取,安全性较差。例如,如果在 GET 请求的 URL 中传递密码,很容易被泄露。

POST:参数在请求体中,相对不易被窃取,但这并不意味着 POST 请求就是绝对安全的。如果传输过程没有加密(如未使用 HTTPS),数据仍然可能被拦截和篡改。要确保安全性,还需要结合其他安全措施,如加密传输、身份验证等。

幂等性

GET:具有幂等性,即多次执行相同的 GET 请求,对服务器资源的影响是相同的,不会产生额外的副作用。例如,多次请求获取一篇文章的内容,每次得到的结果应该是一样的,且不会对文章本身造成改变。

POST:不具有幂等性,多次提交相同的 POST 请求,可能会在服务器上创建多个相同的资源。例如,多次提交订单创建请求,可能会产生多个相同的订单。

缓存机制

GET:通常可以被浏览器缓存,因为 GET 请求主要用于获取资源,且多次请求结果相同。浏览器可以根据缓存策略,直接从本地缓存中返回响应,减少服务器负载和网络传输。例如,用户刷新页面时,如果资源在缓存有效期内,浏览器可能直接从缓存中加载。

POST:一般不会被缓存,因为 POST 请求用于提交数据,每次请求的结果可能不同,缓存没有意义。而且如果缓存 POST 请求,再次使用缓存数据时可能会导致重复提交等问题。

TCP 连接

GET:在发送请求时,浏览器会先将请求头和参数组装好,然后一次性发送给服务器。因为 GET 请求的参数通常在 URL 中,数据量相对较小,这种一次性发送的方式效率较高。一般可以复用

POST:浏览器会先发送请求头,服务器响应后再发送请求体。这是因为 POST 请求的请求体可能较大,分头发送可以让服务器先处理请求头中的信息,如验证用户身份等,然后再根据情况处理请求体。但在实际应用中,现代浏览器和服务器的优化机制可能会使这种差异不太明显。某些情况会启用新的tcp链接

数据发送

GET:适合发送少量的数据,因为 URL 长度有限制。一般来说,不同浏览器对 URL 长度的限制不同,但通常在几千字节左右。如果数据量过大,可能会导致请求失败。

POST:适合发送大量数据,因为请求体理论上没有大小限制。这使得 POST 请求在处理如文件上传、大量表单数据提交等场景时更为适用。

五:HTTP缓存技术

对于一些具有重复性的 HTTP 请求,比如每次请求得到的数据都一样的,我们可以把这对「请求-响应」的数据都缓存在本地,那么下次就直接读取本地的数据,不必在通过网络获取服务器的响应了

强制缓存:

强缓存是利用下面这两个 HTTP 响应头部(Response Header)字段实现的,它们都用来表示资源在客户端缓存的有效期:Cache-Control, 是一个相对时间;Expires,是一个绝对时间;如果 HTTP 响应头部同时有 Cache-Control 和 Expires 字段的话,Cache-Control 的优先级高于 Expires 。

Cache-control 选项更多一些,设置更加精细,所以建议使用 Cache-Control 来实现强缓存。具体的实现流程如下:

当浏览器第一次 请求访问服务器资源时,服务器会在返回这个资源的同时,在 Response 头部加上 Cache-Control,Cache-Control 中设置了过期时间大小

浏览器再次请求访问服务器中的该资源时,会先通过请求资源的时间与 Cache-Control 中设置的过期时间大小,来计算出该资源是否过期,如果没有,则使用该缓存,否则重新请求服务器;

服务器再次收到请求后,会再次更新 Response 头部的 Cache-Control。

协商缓存:

当我们在浏览器使用开发者工具的时候,你可能会看到过某些请求的响应码是 304,这个是告诉浏览器可以使用本地缓存的资源,通常这种通过服务端告知客户端是否可以使用缓存的方式被称为协商缓存。

协商缓存可以基于两种头部来实现。

第一种:请求头部中的 If-Modified-Since 字段与响应头部中Last-Modified 字段实现,这两个字段的意思是:

响应头部中的 Last-Modified:标示这个响应资源的最后修改时间;

请求头部中的 If-Modified-Since:当资源过期了,发现响应头中具有Last-Modified 声明,则再次发起请求的时候带上 Last-Modified 的时间,服务器收到请求后发现有 If-Modified-Since 则与被请求资源的最后修改时间进行对比(Last-Modified),如果最后修改时间较新(大),说明资源又被改过,则返回最新资源,HTTP 200 OK;如果最后修改时间较旧(小),说明资源无新修改,响应 HTTP 304 走缓存。

第二种:请求头部中的 If-None-Match 字段与响应头部中的 ETag 字段,这两个字段的意思是:

响应头部中 Etag:唯一标识响应资源;

请求头部中的 If-None-Match:当资源过期时,浏览器发现响应头里有 Etag,则再次向服务器发起请求时,会将请求头 If-None-Match 值设置为 Etag 的值。服务器收到请求后进行比对,如果资源没有变化返回 304,如果资源变化了返回 200。

第一种实现方式是基于时间实现的,第二种实现方式是基于一个唯一标识实现的,相对来说后者可以更加准确地判断文件内容是否被修改,避免由于时间篡改导致的不可靠问题。

如果在第一次请求资源的时候,服务端返回的 HTTP 响应头部同时有 Etag 和 Last-Modified 字段,那么客户端再下一次请求的时候,如果带上了 ETag 和 Last-Modified 字段信息给服务端,这时 Etag 的优先级更高,也就是服务端先会判断 Etag 是否变化了,如果 Etag 有变化就不用在判断 Last-Modified 了,如果 Etag 没有变化,然后再看 Last-Modified。

**为什么 ETag 的优先级更高?**这是因为 ETag 主要能解决 Last-Modified 几个比较难以解决的问题:

在没有修改文件内容情况下文件的最后修改时间可能也会改变,这会导致客户端认为这文件被改动了,从而重新请求;

可能有些文件是在秒级以内修改的,If-Modified-Since 能检查到的粒度是秒级的,使用 Etag就能够保证这种需求下客户端在 1 秒内能刷新多次;

有些服务器不能精确获取文件的最后修改时间。

注意,协商缓存这两个字段都需要配合强制缓存中 Cache-Control 字段来使用,只有在未能命中强制缓存的时候,才能发起带有协商缓存字段的请求。

相关推荐
快往胃里来7 小时前
计算机网络结课设计:通过思科Cisco进行中小型校园网搭建
计算机网络
Eugene__Chen9 小时前
计算机网络和操作系统常见面试题目(带脑图)
计算机网络·面试·职场和发展
岑梓铭10 小时前
计算机网络第九章——数据链路层《概念、组帧、差错控制、可靠传输...》
网络·网络协议·计算机网络·考研·408
所待.3831 天前
初始计算机网络
java·计算机网络
武汉唯众智创1 天前
计算机网络综合实训室解决方案(2025年最新版)
计算机网络·计算机网络技术·计算机网络技术实训室·计算机网络实训室·计算机网络综合实训室
行則独善其身2 天前
计算机网络-VRF基本概念
计算机网络
Nydia.J2 天前
【学习笔记】计算机网络(三)
计算机网络
S-X-S4 天前
Java面试题-计算机网络
java·开发语言·计算机网络
无限大.4 天前
计算机网络知识速记:TCP 与 UDP
tcp/ip·计算机网络·udp