http1.0,2.0和3.0
HTTP1.0是早期使用的HTTP版本,支持HTTP请求和响应,包含
状态码
和状态行
,也支持HTML文件以外的其他类型。然而,HTTP1.0存在一些明显的缺点,如连接无法复用
、阻塞问题
以及安全问题
。每次发送请求都需要进行三次握手
的过程,重新建立连接
,效率较低。同时,HTTP1.0是阻塞的,即下一个请求的发送必须等待上一个请求返回后才能进行。此外,HTTP1.0传输的内容都是明文
的,数据安全性无法得到保障。
HTTP2.0在HTTP1.0的基础上进行了大量的改进,主要特点包括
二进制协议
、头部压缩
、服务端推送以及多路复用
。HTTP2.0采用二进制格式传输数据,而非纯文本,这大大提高了传输效率。同时,HTTP2.0对头部元数据
进行了压缩
,减小了开销。更重要的是,HTTP2.0支持多路复用,这意味着只需要一个TCP连接就可以传输所有的请求数据,极大地提高了网络资源的利用率。
HTTP3.0则在HTTP2.0的基础上进行了进一步的革新。它基于
UDP协议
而非TCP协议,这使得HTTP3.0具备了前向纠错能力
和连接迁移能力
。前向纠错能力解决了之前HTTP丢包阻塞
的问题,而连接迁移能力则支持设备在切换到新网络
时无需发送另一次握手
,特别适合移动端设备。此外,HTTP3.0的头压缩采用了QPACK
算法,相对于HTTP2.0
的HPACK
算法,具有更好的压缩比
、更快的压缩和解压缩速度以及更大的灵活性。
http的短连接和长连接
HTTP短连接(非持久连接)是指,客户端和服务端进行一次HTTP请求/响应之后,就关闭连接。所以,下一次的HTTP请求/响应操作就需要重新建立连接。这种方式在处理少量请求时更为有效,因为每次请求都需要单独建立连接,可以更好地控制并发连接数和网络流量。然而,短连接也有一些缺点,例如需要更多的网络开销和建立新连接的时间,这可能会影响性能和响应时间。
HTTP长连接(持久连接)则是指,客户端和服务端建立一次连接之后,可以在这条连接上进行多次请求/响应操作。这种连接可以设置过期时间,也可以不设置。实际上,HTTP的长连接是从HTTP1.1开始的,它是基于TCP的持久连接。多个HTTP请求可以复用一个TCP连接,减少了TCP连接建立和断开的消耗,提高了效率,减少了网络开销,特别是在处理大量请求的情况下。然而,如果长连接没有正确管理,也可能导致资源浪费和性能问题。
http和https
-
安全性
:HTTP的传输是明文的,数据在传输过程中可能被截获或被篡改,而HTTPS则通过SSL/TLS协议进行加密传输,这种加密方式可以保护数据在传输过程中的安全,防止数据被窃取或篡改。 -
证书管理
:HTTPS需要使用CA(证书颁发机构)颁发的证书来进行加密和解密操作,而HTTP则不需要证书。因此,在使用HTTPS时,需要配置证书,而HTTP则不需要。 -
端口号
:HTTP和HTTPS使用的端口号不同。HTTP的端口是80,而HTTPS的端口是443。 -
资源消耗
:由于HTTPS使用了加密和解密操作,因此在数据传输过程中需要消耗更多的计算资源。
http的连接过程
-
域名解析
:浏览器在发起HTTP请求之前,首先需要对目标URL进行域名解析,获取对应的IP地址(通过dns获取ip)。 -
发起TCP的3次握手
:在获取到IP地址后,浏览器与服务器之间会建立TCP连接。这个过程通过三次握手来完成,确保双方都可以进行数据传输。三次握手的具体步骤是: - Web浏览器向Web服务器发送
HTTP请求报文
:一旦TCP连接建立成功,浏览器会向服务器发送HTTP请求报文。这个报文由请求行、请求头部、空行和请求数据四个部分组成。请求行包含请求方法(如GET或POST)、请求的URL地址和HTTP协议版本。
Web服务器响应请求
:服务器在收到HTTP请求后,会根据请求内容生成HTTP响应报文。这个响应报文包含状态码、响应头部和响应正文等信息。
浏览器解析并显示页面
:如果响应正文是HTML代码,浏览器会解析这个HTML代码,生成DOM树、CSS样式树和渲染树等,然后按照这些树的结构绘制页面并展示给用户。
断开TCP连接
:当浏览器完成对服务器的请求并成功接收到响应后,会关闭TCP连接。这个过程通过四次挥手来完成,确保双方都可以安全地断开连接。
https请求加密过程说明
![](https://img.haomeiwen.com/i2648722/d414138d82b1615c.png)
1、【浏览器】向服务器发送 https 请求
2、【服务器】向 CA 机构获取证书
3、【服务器】向浏览器发送数字证书(包含 public key)
4、【浏览器】用预置的 CA 列表验证证书,生成随机对称秘钥【key】,并使用公钥加密,如有问题会提示风险,
5、【浏览器】加密后的【key】,发送给【服务器】,作为接下来请求的秘钥
6、【服务器】用自己的 private key 解密得到对称秘钥 key,使用key进行加密
7、【浏览器】使用随机秘钥 key 进行解密数据
8、【浏览器】【服务器】使用该秘钥进行通信
12.tcp三次握手
第一次握手:客户端发送一个SYN报文给服务器,该报文包含一个初始序列号(seq)和一个SYN标志位(设置为1)。客户端进入SYN_SENT状态,等待服务器的确认。
第二次握手:服务器收到客户端的SYN报文后,向客户端发送一个SYN+ACK报文,该报文包含服务器的初始序列号(seq)和一个确认号(ack),确认号是对客户端初始序列号的加1(即ack=客户端初始序列号+1)。同时,SYN标志位也设置为1。服务器进入SYN_RCVD状态。
第三次握手:客户端收到服务器的SYN+ACK报文后,向服务器发送一个ACK报文,该报文包含一个确认号(ack),确认号是对服务器初始序列号的加1(即ack=服务器初始序列号+1)。此时,客户端和服务器都进入ESTABLISHED状态,表示连接已建立,双方可以开始数据传输。
TCP断开连接的四次握手
客户端(例如HostA)发起断开连接请求,发送一个FIN报文,并携带一个序列号。
服务端(例如HostB)收到FIN报文后,给客户端回复一条消息,告诉客户端它已经收到断开连接的请求。这个消息中包括一个确认号,用于确认已经收到的序列号,以及一个控制标志位CTL设为ACK,表示这是一个确认消息。
服务端在数据发送完毕后,会再次向客户端发送一条信息,告诉客户端它的数据也发送完毕,可以断开连接了。这条信息中同样包括一个确认号和序列号,以及控制标志位CTL设为FIN和ACK,表示这既是一个断开连接的请求,也是对上一条消息的确认。
客户端收到服务端的断开连接请求后,给服务端发送一条确认信息,之后他们断开连接。
tcp三次握手,最后一次ack包丢失会怎样
服务器端由于未收到这个ACK包,其连接状态仍然是SYN_RECV,并会按照预设的规则(如等待3秒、6秒、12秒后)重新发送SYN+ACK包。如果在这些重发尝试后仍未收到ACK应答,服务器最终会自动关闭这个连接。
客户端这边由于认为连接已经建立,如果它继续尝试向服务器写数据,服务器将以RST包响应,这样客户端才能感知到服务器的错误状态。
需要注意的是,虽然第三次握手的ACK包丢失后,客户端不会重传这个ACK包,但如果客户端接着发送数据包,服务器端可以从接收到的数据包中得到与ACK包同样的信息。因此,ACK包的丢失并不会影响数据包的传输,只是需要额外的机制来处理连接状态的不一致问题。
HTTP 状态码
(1) 状态码分类
- 1xx:信息,服务器收到请求,需要请求者继续操作
- 2xx:成功
- 3xx:重定向
- 4xx:客户端错误
- 5xx:服务端错误
(2) 常用状态码
- 200:请求成功
- 301:永久重定向
- 302:临时移动
- 400 bad request:客户端请求语法错误
- 401 unauthorized:客户端没有权限
- 403 forbidden:服务器拒绝客户端请求
- 404 not found:客户端请求资源不存在
- 500 Internal Server Eerro:服务器内部错误
- 502 bad gateway:网关错误,代理服务器后面的真实服务器节点配置出了问题或者已经挂掉了(比如:nginx与fastcgi即PHP进程配合的不恰当)
- 503 Service Unavailable 超载或系统维护(暂时的)
- 504 Gateway timeout:网关超时(上游服务器关闭),代理服务器后面的真实服务器已经过载,它要处理的请求报文实在太多
TCP 和 UDP 、ip的特点和区别
- TCP传输层协议,面向连接,所以只能一对一,面向字节流传输,数据可靠,不丢失,全双工通信
- UDP传输层协议。(根据TCP特点反记),无连接,支持一对一,一对多,多对多,面向报文传输,首部开销小,数据不一定可靠(可能会丢包)但是速度更快
- IP,网络层协议,无连接性、不可靠性(不关心数据包传输的可靠性和顺序),主机之间的通信服务,同时还有分组交换、网络独立性、简单性、封装性、弹性和可扩展性。
WebSocket和HTTP区别
- 连接方式:HTTP是一种无状态的协议,每次请求都需要建立一个新的连接,并在完成请求后立即关闭连接。这意味着HTTP是短连接,且服务器预先并不知道这个连接。相反,WebSocket则是一种全双工的协议,它在客户端和服务器之间建立一条持久的连接,可以实现双向通信。这种持久连接的特性使得WebSocket具有更好的实时性。
- 数据传输:HTTP协议是基于请求-响应模式的,客户端发送请求,服务器返回响应。而WebSocket允许服务器主动向客户端推送数据,实现了服务器和客户端之间的实时双向通信。
- 数据格式:HTTP协议传输的数据通常是文本或二进制数据。而WebSocket可以传输任意格式的数据,包括文本、二进制、JSON等。
- 端口:HTTP协议使用的默认端口是80(HTTP)或443(HTTPS),而WebSocket使用的默认端口是80(WS)或443(WSS)。
- 协议开头:WebSocket的协议是以ws/wss开头,而HTTP对应的是http/https。
osi七层模型
- 物理层:位于最底层,负责将数字信号转换为物理信号,并在网络中进行传输。具体涉及到的硬件有电缆、光缆、中继器、集线器等。
- 数据链路层:在物理层之上,以帧为单位传输数据,具体功能有误码检测、帧同步、流量控制、差错控制等。
- 网络层:在数据链路层之上,负责数据的路由和转发,实现主机之间的通信,如IP地址的分配和路由的计算等。(ip)
- 传输层:负责端到端的数据传输,为应用层提供可靠的数据传输服务,例如TCP协议。
- 会话层:负责建立、管理和终止会话,如服务器验证用户登录便是由会话层完成的。(SMTP,dns)
- 表示层:对上层数据或信息进行变换以保证一个主机应用层信息可以被另一个主机的应用层识别。表示层的数据转换包括数据的加密、压缩、格式转换等。(telnet)
- 应用层:为操作系统或网络应用程序提供访问网络服务的接口。(http、ftp。)
tcp如何保证消息的可靠性
-
确认和重传机制
:TCP使用确认和重传机制来确保数据的完整传输。当接收方收到数据后,会发送一个确认消息给发送方,告诉它已经收到数据。如果发送方在一定时间内没有收到确认消息,它会认为数据包可能已丢失或损坏,然后重传该数据包,直到接收方发送确认消息为止。 -
序列号和确认号
:TCP为每个数据段分配一个唯一的序列号,用于标识数据段的位置。接收方使用序列号来确保数据的顺序,并通过发送包含确认号的确认消息来告诉发送方它已经收到的数据位置。这有助于避免数据丢失或乱序。 -
流量控制
:TCP使用滑动窗口协议来控制发送方发送数据的速率。接收方会告诉发送方它的缓冲区大小,发送方根据这个信息来调整发送速率,以避免接收方因数据速率过快而丢失数据。 -
拥塞控制
:TCP还使用拥塞控制机制来应对网络拥塞。当网络拥塞时,TCP会减少发送速率,以避免过多的数据包导致网络堵塞。这有助于保持网络的稳定性,减少数据包丢失的风险。 -
数据分块和校验和
:TCP将数据包划分为合适的大小以适应网络限制,并使用校验和来确保数据在传输过程中没有发生变化。如果校验和检查发现数据被修改,TCP会丢弃这个数据包,并要求重传。 -
连接管理
:TCP通过三次握手建立连接,并在数据传输完成后通过四次挥手关闭连接。这种连接管理机制有助于确保数据传输的可靠性和有序性。
粘包/拆包怎么发生的
主要是由于TCP是面向字节流的传输协议,没有消息保护边界,导致发送方发送的多个数据包在接收方可能被当成一个包来处理(即粘包),或者发送方将一个数据包分成多个小包发送,而接收方将它们当成多个包进行处理(即拆包)。
具体来说,粘包和拆包的发生可能有以下原因:
要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包。
待发送数据大于MSS(最大报文长度),TCP在传输前将进行拆包。
要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包。
接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包。
解决TCP粘包/拆包的方法包括:
消息定长:发送端发送的每个消息都是固定长度的,接收端每次接收到固定长度的数据就进行一次处理。
添加包首部:发送端给每个数据包添加包首部,首部中至少包含数据包的长度,这样接收端在接收数据时就可以根据首部信息来区分不同的数据包。
dns
DNS(Domain Name System,域名系统)是万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便地访问互联网,而不用去记住IP地址。通过域名,最终得到该域名对应的IP地址的过程叫做域名解析(或主机名解析)。
DNS协议的基本工作原理是:
当用户在浏览器中输入URL时,
浏览器会查自己的缓存中是否有该域名的IP地址记录
如果没有则会向本地DNS服务器发送查询请求。(host文件)
如果本地DNS服务器能够解析该域名,则返回该域名对应的IP地址给用户的计算机;
如果本地DNS服务器无法解析该域名,则向Root DNS服务器发送查询请求,通过一系列查询过程,最终得到域名对应的IP地址,并返回给用户的计算机。
在浏览器输入www.baidu.com的全过程
在浏览器中输入www.baidu.com的全过程涉及多个步骤,包括URL输入、DNS域名解析、TCP连接建立、HTTP请求发送与接收,以及浏览器渲染和展示结果。以下是详细的步骤:
-
URL输入
:用户在浏览器的地址栏中输入www.baidu.com。浏览器会对输入的信息进行评判,检查是否是一个合法的网址。如果是合法且完整的网址,浏览器会接收这个网址;如果不完整,浏览器会尝试补全地址的前缀或后缀。 -
DNS域名解析
:浏览器需要解析输入的域名www.baidu.com对应的IP地址。这个解析过程可能涉及浏览器缓存、系统缓存以及根域名服务器的查询。浏览器会首先检查自己的缓存中是否有该域名的IP地址记录;如果没有,它会检查系统的Hosts文件中是否有相应的记录;如果仍然没有找到,浏览器会向根域名服务器发送查询请求,直到找到对应的IP地址。 -
TCP连接建立
:得到域名对应的IP地址后,浏览器会发起TCP连接请求,与服务器进行三次握手建立连接。这个过程是为了确保数据可以在客户端和服务器之间可靠地传输。 - HTTP请求发送与接收:TCP连接建立成功后,浏览器会通过HTTP协议向服务器发送请求。服务器接收到请求后,会查询相应的结果,并生成HTTP响应返回给浏览器。这个响应中包含了网页的内容。
- 浏览器渲染和展示结果:浏览器接收到服务器的响应后,会对网页内容进行解析和渲染,最终将结果显示给用户。
转发和重定向的区别
转发(forwarding)和重定向(redirection)是两个在网络通信中常用的概念,它们之间存在一些明显的区别。
从定义和运作机制来看,
转发
通常指的是在网络层(如IP层)
将一个数据包从一个网络接口转发到另一个网络接口,而无条件地改变数据包的路径,但源地址
和目的地址
不会改变。转发对于发送方和接收方来说是透明的,即它们并不知道数据包在网络中经过了哪些转发操作。
重定向
通常发生在应用层(如HTTP层),它是服务器在接收到一个网络地址请求时,返回一个指向另一个地址的重定向响应。重定向是有条件的,并且会将请求从一个地址导向到另一个地址。在这个过程中,客户端会收到一个新的URL地址,并据此重新发送请求。
从
请求次数
和地址栏变化
的角度来看,重定向
涉及到至少两次
请求,因为客户端在收到重定向响应后需要向新的地址发送请求。在重定向过程中,地址栏的URL会发生变化,显示新的地址。而转发
只需要一次
请求,地址栏的URL不会发生变化。
从
数据共享
的角度来看,重定向
在两次请求之间不共享
数据,因为它们是两个独立的请求。而转发
在一次请求过程中共享
数据,这意味着在请求的生命周期内,数据可以在多个组件或服务器之间共享。
从
跳转范围
的角度来看,重定向
可以跳转到任意URL
,这可以是本站点内的资源,也可以是其他站点的资源。而转发
通常只能跳转到本站点内
的资源。
网友评论