目录
计算机网络HTTP
什么是HTTP?
HTTP是一种用于分布式、协作式、超媒体信息系统的通信协议。它定义了客户端和服务器之间请求和响应的格式。HTTP是互联网上应用最广泛的协议之一。
-
通信方式 :HTTP定义了客户端如何向服务器请求数据,以及服务器如何将数据返回给客户端的方式。
-
请求和响应 :客户端发送一个请求到服务器,服务器收到请求后,会返回一个响应。这个响应包含了客户端请求的数据。
-
无状态 :HTTP协议是无状态的,意味着每次请求都是独立的,服务器不会记住之前发生过的请求。
-
基于文本 :HTTP的请求和响应都是基于文本的,这使得它们易于阅读和调试。
-
使用端口 :HTTP默认使用80端口进行通信,而其安全版本HTTPS则使用443端口。
-
请求方法 :HTTP定义了几种请求方法,最常见的是GET(获取资源)和POST(提交资源)。
-
状态码 :服务器在响应中会包含一个状态码,告诉客户端请求是否成功。例如,200表示成功,404表示找不到资源,500表示服务器错误。
-
头部信息 :HTTP请求和响应都包含头部信息,这些信息提供了关于请求和响应的额外数据,比如内容类型、内容长度等。
-
超媒体:HTTP最初设计用来传输超文本,即包含链接的文本,这些链接可以指向其他文档或资源。
-
安全性:虽然HTTP本身不加密,但其安全版本HTTPS通过SSL/TLS提供了加密,保护数据传输的安全。
简而言之,HTTP是一种让网页浏览器和其他客户端能够从服务器请求和接收网页内容的协议。
HTTP和HTTPS有什么区别?
HTTP(超文本传输协议)和HTTPS(安全超文本传输协议)是互联网上用于传输数据的两种协议,它们的主要区别在于安全性和加密。以下是HTTP和HTTPS之间的一些关键区别:
HTTP和HTTPS区别关键字记忆
HTTP | HTTPS | |
---|---|---|
加密 | 明文传输 | 密文传输 |
端口 | 80 | 443 |
安全性 | 低 | 高 |
性能 | 理论上略高 | 理论上略低 |
成本 | 无额外成本 | 需购买SSL/TLC证书 |
配置 | 无额外配置 | 需在服务器安装和配置SSL/TLC证书 |
-
加密:
- HTTP :是明文传输,不提供数据加密,传输的数据可能被窃听或篡改。
- HTTPS:在HTTP的基础上加入了SSL/TLS协议,提供了数据加密、完整性校验和身份验证,保护数据传输的安全。
-
端口:
- HTTP :默认使用80端口。
- HTTPS :默认使用443端口。
-
安全性:
- HTTP:由于没有加密,容易受到中间人攻击、数据泄露等安全威胁。
- HTTPS :通过SSL/TLS加密,提供了更高的安全性,可以有效防止数据在传输过程中被窃取或篡改。
-
性能:
- HTTP:由于没有加密和解密的过程,理论上性能略高于HTTPS。
- HTTPS:由于需要进行加密和解密,可能会有轻微的性能开销,但现代的SSL/TLS实现已经非常优化,性能差异不大。
-
搜索引擎优化(SEO):
- HTTP:搜索引擎可能会降低没有采用HTTPS的网站的排名。
- HTTPS:搜索引擎(如谷歌)倾向于提高采用HTTPS网站的排名,因为它提供了更好的安全性。
-
浏览器显示:
- HTTP:现代浏览器可能会对没有使用HTTPS的网站显示安全警告。
- HTTPS:浏览器会显示一个锁形图标,表示网站是安全的。
-
成本:
- HTTP:不需要额外的成本。
- HTTPS :需要购买SSL/TLS证书,虽然现在有很多免费的证书提供(如Let's Encrypt)。
-
配置:
- HTTP:不需要额外的配置。
- HTTPS :需要在服务器上安装和配置SSL/TLS证书。
总的来说,HTTPS是HTTP的安全版本,它通过加密提供了更好的数据保护和隐私保护,已经成为现代网站的标准配置。
分别说明HTTP/1.0、HTTP/2.0、HTTP/3.0
HTTP/1.0、HTTP/2.0和HTTP/3.0是超文本传输协议(HTTP)的三个不同版本,每个版本都在前一个版本的基础上进行了改进和优化。以下是对这三个版本的详细说明:
HTTP/1.0
- 发布年份:1996年。
- 无连接:每个请求创建一个连接,请求完成后立即关闭连接,导致显著的开销,尤其是在处理多个小文件时。
- 队头阻塞:下一个请求必须在前一个请求响应到达之前才能发送,如果前一个请求响应一直不到达,那么下一个请求就不发送,后面的请求就阻塞了。
- 缓存:在HTTP1.0中主要使用header里的协商缓存last-modified/if-modified-since,强缓存Expires来做为缓存判断的标准。
HTTP/1.1
- 发布年份:1997年。
- 持久连接 :默认启用持久连接(Keep-Alive),允许多个请求使用同一个TCP连接,减少了连接建立和关闭的开销。
- 管道化:支持请求管道化(Pipelining),即在收到响应前可以发送多个请求,但由于实现复杂和问题多,实际使用较少。
- 分块传输编码:引入分块传输编码(Chunked Transfer Encoding),使得服务器可以分块发送响应,提高了传输效率。
- 增强缓存控制:新增了许多缓存控制头部,如Cache-Control,增强了缓存机制。
- 虚拟主机支持:引入Host头部,允许在同一IP地址上托管多个域名(虚拟主机)。
HTTP/2
- 发布年份:2015年。
- 二进制分帧:HTTP/2头信息和数据体都是二进制,统称为"帧":头信息帧和数据帧。
- 多路复用:通过单一的HTTP/2连接发起多重的请求-响应消息,即在一个连接里,客户端和浏览器都可以同时发送多个请求和响应,而不用按照顺序一一对应,这样避免了"队头堵塞"。
- 数据流:因为HTTP/2的数据包是不按顺序发送的,同一个连接里面连续的数据包,可能属于不同的回应。因此,必须要对数据包做标记,指出它属于哪个回应。
- 服务器推送:HTTP/2引入了服务器推送(Server Push)机制,这意味着服务器可以在客户端请求之前,主动向客户端推送数据。
HTTP/3
- 基于QUIC的传输层协议:HTTP/3不再依赖于TCP,而是使用QUIC来进行数据传输。QUIC具有更快的连接建立时间和更好的拥塞控制,同时支持快速的连接迁移和零RTT(Round-Trip Time)握手。
- 多路复用:HTTP/3延续了HTTP/2的多路复用特性,允许在单个连接上并行发送多个请求和响应,提高了网络利用率和性能。
- 0-RTT连接建立:基于QUIC的特性,HTTP/3支持零RTT连接建立,使得客户端可以在不进行完整的握手过程的情况下发送数据,进一步减少了延迟。
- 连接迁移:QUIC支持快速的连接迁移,即使在网络切换或IP地址变更的情况下,连接也能够快速恢复,提高了网络的稳定性和可靠性。
- 抗拥塞控制:HTTP/3内置了先进的拥塞控制算法,能够更好地适应网络环境的变化,提供更稳定和可靠的网络性能。
请说明访问网页的全过程
访问网页的全过程涉及多个步骤,包括DNS解析、建立TCP连接、发送HTTP请求、服务器处理请求、返回HTTP响应、浏览器渲染页面等。
简略说明
- 浏览器查找域名的IP地址
- 浏览器向web服务器发送一个HTTP请求
- 服务器处理请求
- 服务器发回一个HTML响应
- 浏览器开始显示HTML
详细说明
-
用户输入网址:
- 用户在浏览器地址栏输入一个网址(URL),如
https://www.example.com
。
- 用户在浏览器地址栏输入一个网址(URL),如
-
DNS解析:
- 浏览器首先需要将域名解析为IP地址。浏览器会查询本地的DNS缓存,如果没有找到,会向本地DNS服务器发送查询请求。
- 本地DNS服务器会尝试解析域名,如果它不知道答案,会向根DNS服务器查询,然后逐级查询直到找到对应的IP地址。
-
建立TCP连接(对于HTTP/1.1和HTTP/2):
- 浏览器使用解析得到的IP地址,通过TCP协议与服务器建立连接。这涉及到一个三次握手的过程:
- 客户端发送SYN(同步序列编号)报文给服务器。
- 服务器回应SYN-ACK(同步和确认)报文。
- 客户端发送ACK(确认)报文,完成握手。
- 浏览器使用解析得到的IP地址,通过TCP协议与服务器建立连接。这涉及到一个三次握手的过程:
-
TLS/SSL握手(对于HTTPS):
- 如果是HTTPS连接,接下来会进行TLS/SSL握手,以确保连接的安全性。
- 这个过程包括交换密钥、证书验证等步骤。
-
发送HTTP请求:
- 一旦TCP连接和TLS/SSL连接建立,浏览器会构建一个HTTP请求,包括请求行(如GET /)、请求头部(如User-Agent、Accept等)。
-
服务器处理请求:
- 服务器接收到HTTP请求后,会根据请求的URL、方法和头部信息处理请求。
- 服务器可能会查询数据库、执行后端逻辑,或者直接从文件系统中检索资源。
-
返回HTTP响应:
- 服务器处理完请求后,会返回一个HTTP响应给客户端,包括状态码(如200 OK)、响应头部(如Content-Type、Content-Length等)和响应体(即请求的资源内容)。
-
浏览器渲染页面:
- 浏览器接收到响应后,会根据响应内容进行渲染:
- 解析HTML文档,构建DOM树。
- 根据CSS样式表计算元素样式。
- 根据JavaScript脚本执行DOM操作和动态交互。
- 浏览器可能会发起额外的请求来获取页面中的图片、CSS文件、JavaScript文件等资源。
- 浏览器接收到响应后,会根据响应内容进行渲染:
-
关闭TCP连接(对于HTTP/1.0):
- 如果使用的是HTTP/1.0,或者HTTP/1.1但没有使用持久连接,服务器会在发送完响应后关闭TCP连接。
-
TCP连接复用(对于HTTP/1.1和HTTP/2):
- 如果使用的是HTTP/1.1或HTTP/2,并且启用了持久连接,那么同一个TCP连接可以被用来发送多个HTTP请求和响应,直到客户端或服务器决定关闭连接。
-
页面加载完成:
- 一旦所有资源都被加载和渲染,页面就完全显示在用户面前,网页加载完成。
这个过程涉及客户端(浏览器)、服务器以及中间网络设备(如DNS服务器、代理服务器)的协同工作,确保用户能够顺利访问和浏览网页。
请说明HTTP常见的状态码
HTTP状态码是服务器对客户端请求的响应状态的表示。它们分为五类,每类都反映了不同的响应情况:
状态码关键字记忆
状态码 | 说明 |
---|---|
1xx(信息性状态码) | 表示接收的请求正在处理 |
2xx(成功状态码) | 表示请求已已成功被服务器接收、理解、并接受 |
3xx(重定向状态码) | 表示需要进行额外操作以完成请求 |
4xx(客户端错误状态码) | 表示客户端的请求有错误 |
5xx(服务器错误状态码) | 表示服务器处理请求时发生了错误 |
-
1xx(信息性状态码):表示接收的请求正在处理。
100 Continue
:表明客户端可以继续发送请求的剩余部分,或者如果请求已经完成,则忽略它。101 Switching Protocols
:服务器已经理解了客户端的请求,并将通过Upgrade头信息进行协议切换。
-
2xx(成功状态码):表示请求已成功被服务器接收、理解、并接受。
200 OK
:请求成功,服务器返回请求的网页。201 Created
:请求成功并且服务器创建了新的资源。202 Accepted
:服务器已接受请求,但尚未处理。204 No Content
:服务器成功处理了请求,但没有返回任何内容。
-
3xx(重定向状态码):表示需要进行额外操作以完成请求。
301 Moved Permanently
:请求的网页已永久移动到新位置。302 Found
:请求的网页临时移动到另一个地址。303 See Other
:建议客户端使用GET方法获取资源。304 Not Modified
:自从上次请求后,请求的网页未修改,可以使用缓存版本。307 Temporary Redirect
:请求的网页临时移动到另一个地址,但应使用原方法(POST或GET)重新发起请求。308 Permanent Redirect
:与301类似,但要求使用原方法(POST或GET)重新发起请求。
-
4xx(客户端错误状态码):表示客户端的请求有错误。
400 Bad Request
:服务器无法理解请求,可能是请求格式有误。401 Unauthorized
:请求需要用户的身份认证。403 Forbidden
:服务器理解请求但拒绝执行,可能是权限问题。404 Not Found
:请求的资源在服务器上不存在或无法找到。405 Method Not Allowed
:请求方法不被允许。408 Request Timeout
:请求超时。409 Conflict
:请求与服务器当前状态冲突。410 Gone
:请求的资源已永久删除。
-
5xx(服务器错误状态码):表示服务器处理请求时发生了错误。
500 Internal Server Error
:服务器遇到错误,无法完成请求。501 Not Implemented
:服务器不支持请求的功能,无法完成请求。502 Bad Gateway
:服务器作为网关或代理,从上游服务器接收到无效响应。503 Service Unavailable
:服务器目前无法使用(由于超载或停机维护)。504 Gateway Timeout
:服务器作为网关或代理,但是没有及时从上游服务器收到请求。
这些状态码是HTTP协议的核心部分,它们帮助客户端理解服务器的响应,并根据响应采取适当的行动。
Cookie和Session有什么区别?
Cookie和Session是Web开发中用于管理用户会话和状态的两种常用技术。它们的主要区别在于存储位置、生命周期、安全性和使用场景,其他区别了解即可。以下是Cookie和Session的主要区别:
表格关键词记忆
Cookie | Session | |
---|---|---|
存储位置 | 客户端 | 服务器端 |
生命周期 | 设置过期时间 | 会话超时 |
安全性 | 低 | 高 |
存储空间 | 每个域名可存储Cookie有限 | 服务器端可以存储更多的数据 |
使用场景 | 数据不需要频繁变动 | 需要频繁读写用户状态 |
-
存储位置:
- Cookie:存储在客户端(用户的浏览器)上,通常以键值对的形式存在。
- Session:存储在服务器端,每个用户会话对应一个唯一的Session对象。
-
生命周期:
- Cookie :可以设置过期时间,当达到过期时间后,Cookie会被浏览器自动删除。如果未设置过期时间,则在浏览器关闭时消失(会话Cookie)。
- Session:依赖于服务器端的Session对象,当会话超时或服务器端Session对象被清除时,Session结束。
-
安全性:
- Cookie:由于存储在客户端,更容易受到XSS(跨站脚本攻击)和CSRF(跨站请求伪造)等攻击,因此敏感信息不应存储在Cookie中。
- Session :存储在服务器端,相对更安全,但需要确保Session ID的安全性,防止Session劫持。
-
存储空间:
- Cookie:每个域名下可以存储的Cookie数量有限,且每个Cookie的大小也有限制(通常每个Cookie不超过4KB)。
- Session:理论上服务器端可以存储更多的数据,但过多的Session会增加服务器的存储和处理负担。
-
传输:
- Cookie:每次HTTP请求都会携带Cookie数据,如果Cookie中存储了大量数据,会增加网络传输的开销。
- Session:不需要在每次请求中传输,只有Session ID在请求中传递,减少了网络传输的开销。
-
使用场景:
- Cookie :适用于存储用户偏好设置、会话标识(如Session ID)等不需要频繁变动的数据。
- Session :适用于需要频繁读写用户状态的场景,如购物车、用户登录状态等。
-
跨域问题:
- Cookie:可以设置为跨域访问,但需要服务器端配置CORS(跨源资源共享)策略。
- Session:由于存储在服务器端,不受跨域问题影响。
-
控制权:
- Cookie :由客户端控制,用户可以查看、修改或删除Cookie。
- Session :由服务器控制,用户无法直接访问Session数据。
总的来说,Cookie和Session各有优缺点,实际应用中可以根据需求和场景选择使用。为了提高安全性,通常会将Session ID存储在Cookie中,结合两者的优点来管理用户会话。
HTTP请求方式有哪些?请解释GET和POST的区别?
HTTP请求方式主要包括以下几种:
- GET:用于请求指定资源。GET请求应该只用于获取数据,而不会改变服务器上的数据。
- POST:用于向指定资源提交数据,通常会导致服务器上的状态变化或数据的创建。
- PUT:用于上传指定的资源,如果资源不存在则创建,如果资源已存在则更新。
- DELETE:用于删除指定的资源。
- HEAD:请求获取与GET请求相同的响应,但没有响应体。主要用于检查资源是否存在,以及获取资源的元数据。
- OPTIONS:用于描述目标资源的通信选项,可以用于跨域请求时获取服务器支持的方法。
- PATCH:用于对资源进行部分修改。
- CONNECT:用于将请求连接转换到由目标资源标识的服务器。
GET和POST的区别:
GET和POST关键字记忆
GET | POST | |
---|---|---|
数据可见性 | 可在URL中查看 | 不可在URL中查看 |
数据大小限制 | URL长度限制 | 没有数据大小限制 |
缓存 | 请求可被缓存 | 请求不可缓存 |
历史记录 | 请求浏览器保存 | 请求浏览器不保存 |
安全性 | 低 | 高 |
幂等性 | 是幂等 | 不是幂等 |
GET:
- 数据可见性:请求的数据会附在URL之后,通过查询字符串(query string)传递,因此数据在URL中可见。
- 数据大小限制:由于URL长度限制,GET请求传输的数据大小有限制。
- 缓存:GET请求可以被缓存。
- 历史记录:GET请求会被浏览器保存在历史记录中。
- 安全性:由于数据在URL中可见,因此GET请求不适合传输敏感信息。
- 幂等性:GET请求是幂等的,意味着多次执行相同的GET请求,结果总是相同的,不会影响资源的状态。
POST:
- 数据可见性:请求的数据放在请求体(body)中,不在URL中显示。
- 数据大小限制:理论上POST没有数据大小限制,可以传输大量数据。
- 缓存:POST请求不会被缓存。
- 历史记录:POST请求不会被浏览器保存在历史记录中。
- 安全性:由于数据不在URL中显示,POST请求相对更安全,适合传输敏感信息。
- 幂等性:POST请求不是幂等的,多次执行相同的POST请求可能会导致资源状态的不同变化。
总结来说,GET请求主要用于获取数据,而POST请求主要用于提交数据。GET请求的数据可见性和限制性使其不适合传输敏感或大量数据,而POST请求则适合处理这些情况。
HTTP请求和响应头部有哪些常见的字段?
HTTP请求和响应头部字段(Headers)是HTTP通信的重要组成部分,它们提供了关于请求和响应的附加信息。以下是一些常见的HTTP头部字段:
请求头部(Request Headers)
-
Host:指定请求的服务器的域名和端口号。
Host: www.example.com:8080
-
User-Agent:包含发出请求的浏览器或客户端信息。
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
-
Accept:客户端能够处理的媒体类型。
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
-
Accept-Language:客户端偏好的语言。
Accept-Language: en-US,en;q=0.5
-
Accept-Encoding:客户端能够处理的压缩编码。
Accept-Encoding: gzip, deflate, br
-
Connection:管理持久连接。
Connection: keep-alive
-
Cookie:存储在客户端的小块数据,用于跟踪会话状态。
Cookie: session_id=1234567890
-
Authorization:用于提供身份验证信息。
Authorization: Bearer token_value
-
Content-Type:请求体的媒体类型。
Content-Type: application/x-www-form-urlencoded
-
Content-Length:请求体的长度。
Content-Length: 1234
响应头部(Response Headers)
-
Content-Type:响应体的媒体类型。
Content-Type: text/html; charset=UTF-8
-
Content-Length:响应体的长度。
Content-Length: 1234
-
Set-Cookie:服务器发送给客户端的Cookie。
Set-Cookie: session_id=1234567890; Path=/; HttpOnly
-
Cache-Control:控制响应的缓存行为。
Cache-Control: no-cache, no-store, must-revalidate
-
Expires:响应过期的时间。
Expires: Thu, 01 Dec 1994 16:00:00 GMT
-
Last-Modified:资源最后被修改的时间。
Last-Modified: Wed, 21 Oct 2015 07:28:00 GMT
-
ETag:资源的特定版本标识符。
ETag: "3f80f-1b6-3z2"
-
Server:服务器软件名称。
Server: Apache/2.4.1 (Unix)
-
Location:用于重定向的URL。
Location: https://www.example.com/newpage.html
-
WWW-Authenticate:用于HTTP认证。
WWW-Authenticate: Basic realm="Access to the staging site"
这些头部字段在HTTP通信中扮演着重要的角色,它们帮助客户端和服务器交换必要的信息,以确保数据的正确传输和处理。