HTTP1.0和HTTP1.1的区别
HTTP1.0 HTTP1.1 连接方式 非持久连接 持久连接 缓存 主要使用 header 里的 If-Modified-Since、Expires 来做为缓存判断的标准
引入了更多的缓存控制策略,例如 Etag、If-Unmodified-Since、If-Match、If-None-Match 等更多可供选择的缓存头来控制缓存策略
host字段 认为每台服务器都绑定一个唯一的 IP 地址,因此,请求消息中的 URL 并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机,并且它们共享一个IP地址。因此有了 host 字段,这样就可以将请求发往到同一台服务器上的不同网站
新增了 host 字段,用来指定服务器的域名
新增请求方法 如 PUT、HEAD、OPTIONS 等
资源请求 存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能
在请求头引入了 range 头域,它允许只请求资源的某个部分,即返回码是 206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接
非持久连接和持久连接
在HTTP1.0中,每个TCP连接都只能处理一项任务,也就是说每个连接都只能请求一个资源,这种方式会导致建立和关闭连接的开销过大,特别是在处理大量小文件的时候,连接的开销往往比传输文件的开销还要大。
非持久连接是指每个请求和响应都需要建立新的TCP连接,完成后立即关闭连接。
持久连接是指客户端发送一个请求后,服务器不立即关闭连接,而是等待客户端的下一个请求,他们可以使用同一个连接,而不用重新建立连接。如果客户端在一段时间内没有再次发送请求,服务器会自动关闭连接,以释放资源。
所以说,持久连接可以提高HTTP协议的效率,减少网络延迟和连接管理的开销,加快网页的加载速度。
TCP
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层协议,用于在网络上进行数据传输。TCP协议通过建立连接、数据传输和连接释放等步骤来确保数据的可靠传输。
TCP连接的建立过程通常包括以下步骤:
- 客户端发起连接请求:客户端向服务器发送一个SYN(同步)数据包,请求建立连接。
- 服务器响应连接请求:服务器收到客户端的SYN数据包后,会发送一个带有SYN和ACK(确认)标志的数据包给客户端,表示同意建立连接。
- 客户端确认连接:客户端收到服务器的响应后,会发送一个带有ACK标志的数据包给服务器,表示连接已建立。
- 数据传输:连接建立后,客户端和服务器之间可以开始进行数据传输。
- 连接释放:当数据传输完成后,双方中的任意一方可以发送一个FIN(结束)数据包,请求关闭连接。对方接收到FIN后会发送ACK确认,然后自己也发送一个FIN数据包,最终完成连接的关闭。
TCP连接的特点包括:
1)面向连接
面向连接,是指发送数据之前必须在两端建立连接。建立连接的方法是“三次握手”,
这样能建立可靠的连接。建立连接,是为数据的可靠传输打下了基础。
2)仅支持单播传输
每条TCP传输连接只能有两个端点,只能进行点对点的数据传输,不支持多播和广播
传输方式。
3)面向字节流
TCP不像UDP一样那样一个个报文独立地传输,而是在不保留报文边界的情况下以字
节流方式进行传输。
4)可靠传输
对于可靠传输,判断丢包、误码靠的是TCP的段编号以及确认号。TCP为了保证报文
传输的可靠,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序
接收。然后接收端实体对已成功收到的字节发回一个相应的确认(ACK);如果发送端
实体在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被
重传。
5)提供拥塞控制
当网络出现拥塞的时候,TCP能够减小向网络注入数据的速率和数量,缓解拥塞。
6)提供全双工通信
TCP允许通信双方的应用程序在任何时候都能发送数据,因为TCP连接的两端都设有
缓存,用来临时存放双向通信的数据。当然,TCP可以立即发送一个数据段,也可以
缓存一段时间以便一次发送更多的数据段(最大的数据段大小取决于MSS)。
TCP和UDP区别
UDP TCP 是否连接 无连接 面向连接 是否可靠 不可靠传输,不使用流量控制和拥塞控制 可靠传输(数据顺序和正确性),使用流量控制和拥塞控制 连接对象个数 支持一对一,一对多,多对一,多对多交互通信 只能一对一通信 传输方式 面向报文 面向字节流 首部开销 首部开销小,仅8字节 首部最小20字节,最大60字节 使用场景 实时应用,例如视频会议,直播 要求可靠传输的应用,例如文件传输
TCP的三次握手和四次挥手
三次握手其实就是在建立一个TCP连接时,需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接受能力和发送能力是否正常,指定自己的初始化序列为后面的可靠性传输做准备。实质上其实就是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,交换TCP窗口大小信息。
简单来说就是以下三步:
- 第一次握手:客户端向服务端发送连接请求报文段。该报文段中包含自身的数据通讯初始序号。请求发送后,客户端便进入 SYN-SENT 状态。
- 第二次握手:服务端收到连接请求报文段后,如果同意连接,则会发送一个应答,该应答中也会包含自身的数据通讯初始序号,发送完成后便进入 SYN-RECEIVED 状态。
- 第三次握手:当客户端收到连接同意的应答后,还要向服务端发送一个确认报文。客户端发完这个报文段后便进入 ESTABLISHED 状态,服务端收到这个应答后也进入 ESTABLISHED 状态,此时连接建立成功。
TCP 三次握手的建立连接的过程就是相互确认初始序号的过程,告诉对方,什么样序号的报文段能够被正确接收。 第三次握手的作用是客户端对服务器端的初始序号的确认。如果只使用两次握手,那么服务器就没有办法知道自己的序号是否 已被确认。同时这样也是为了防止失效的请求报文段被服务器接收,而出现错误的情况。
四次挥手
简单来说就是以下四步:
- 第一次挥手:若客户端认为数据发送完成,则它需要向服务端发送连接释放请求。
- 第二次挥手:服务端收到连接释放请求后,会告诉应用层要释放 TCP 链接。然后会发送 ACK 包,并进入 CLOSE_WAIT 状态,此时表明客户端到服务端的连接已经释放,不再接收客户端发的数据了。但是因为 TCP 连接是双向的,所以服务端仍旧可以发送数据给客户端。
- 第三次挥手:服务端如果此时还有没发完的数据会继续发送,完毕后会向客户端发送连接释放请求,然后服务端便进入 LAST-ACK 状态。
- 第四次挥手:客户端收到释放请求后,向服务端发送确认应答,此时客户端进入 TIME-WAIT 状态。该状态会持续 2MSL(最大段生存期,指报文段在网络中生存的时间,超时会被抛弃) 时间,若该时间段内没有服务端的重发请求的话,就进入 CLOSED 状态。当服务端收到确认应答后,也便进入 CLOSED 状态。
TCP 使用四次挥手的原因是因为 TCP 的连接是全双工的,所以需要双方分别释放到对方的连接,单独一方的连接释放,只代表不能再向对方发送数据,连接处于的是半释放的状态。
最后一次挥手中,客户端会等待一段时间再关闭的原因,是为了防止发送给服务器的确认报文段丢失或者出错,从而导致服务器端不能正常关闭。
总结,用一个通俗易懂的例子来解释TCP的三次握手和四次挥手过程:
三次握手(Three-Way Handshake):
假设你想和一个朋友通过对讲机进行沟通,但是你们之间从未通话过。这时候就需要进行三次握手来建立通信连接:
- 第一次握手:你对朋友说:“喂,你能听到我说话吗?”这个动作表示你想和朋友建立通信,发送一个连接请求。
- 第二次握手:你的朋友听到后回答说:“是的,我能听到你,你也能听到我吗?”这个动作表示你的朋友已经收到了你的请求,并且同意和你建立通信。
- 第三次握手:你回答说:“是的,我能听到你,我们可以开始交流了。”这个动作表示你确认收到了朋友的回应,可以开始通信了。
此时,双方已经建立了通信连接,可以开始正常的对讲了。
四次挥手(Four-Way Handshake):
现在,假设你们通话结束,需要关闭对讲机连接,这时候就需要进行四次挥手:
- 第一次挥手:你对朋友说:“我不想再继续对讲了,你收到我的消息了吗?”发送连接释放请求。
- 第二次挥手:你的朋友回答说:“好的,我收到了你的消息,我也不想再继续对讲了,我们可以断开连接了。”发送确认消息。
- 第三次挥手:你再次确认说:“好的,我们可以断开连接了。”发送连接释放请求。
- 第四次挥手:你的朋友最后回答:“收到,我们已经断开连接了。”发送确认消息。
经过四次挥手,双方正式断开了连接,通话结束。
HTTP与HTTPS协议的区别
HTTP(Hypertext Transfer Protocol,超文本传输协议) HTTPS(Hypertext Transfer Protocol Secure,安全超文本传输协议) 数据传输方式 明文传输,不安全 使用SSL/TLS协议对数据进行加密,安全 端口号 80 443 证书要求 无要求,属于非安全协议 需要SSL证书,用于验证服务器身份 URL前缀 http:// https:// SSL/TSL协议:安全传输层协议,功能实现主要依赖于三类基本算法:散列函数hash,对称加密,非对称加密
- 基于散列函数验证信息的完整性
- 对称加密算法采用协商的秘钥对数据加密
- 非对称加密实现身份认证和秘钥协商
对称加密的方法是,双方使用同一个秘钥对数据进行加密和解密。但是对称加密的存在一个问题,就是如何保证秘钥传输的安全性,因为秘钥还是会通过网络传输的,一旦秘钥被其他人获取到,那么整个加密过程就毫无作用了。 这就要用到非对称加密的方法。
非对称加密的方法是,我们拥有两个秘钥,一个是公钥,一个是私钥。公钥是公开的,私钥是保密的。用私钥加密的数据,只有对应的公钥才能解密,用公钥加密的数据,只有对应的私钥才能解密。我们可以将公钥公布出去,任何想和我们通信的客户, 都可以使用我们提供的公钥对数据进行加密,这样我们就可以使用私钥进行解密,这样就能保证数据的安全了。但是非对称加密有一个缺点就是加密的过程很慢,因此如果每次通信都使用非对称加密的方式的话,反而会造成等待时间过长的问题。
状态码
(1) 2XX 成功
- 200 OK,表示从客户端发来的请求在服务器端被正确处理
- 204 No content,表示请求成功,但响应报文不含实体的主体部分
- 205 Reset Content,表示请求成功,但响应报文不含实体的主体部分,但是与 204 响应不同在于要求请求方重置内容
- 206 Partial Content,进行范围请求
(2)3XX 重定向
- 301 moved permanently,永久性重定向,表示资源已被分配了新的 URL
- 302 found,临时性重定向,表示资源临时被分配了新的 URL
- 303 see other,表示资源存在着另一个 URL,应使用 GET 方法获取资源
- 304 not modified,表示服务器允许访问资源,但因发生请求未满足条件的情况
- 307 temporary redirect,临时重定向,和302含义类似,但是期望客户端保持请求方法不变向新的地址发出请求
(3)4XX 客户端错误
- 400 bad request,请求报文存在语法错误
- 401 unauthorized,表示发送的请求需要有通过 HTTP 认证的认证信息
- 403 forbidden,表示对请求资源的访问被服务器拒绝
- 404 not found,表示在服务器上没有找到请求的资源
- 405 method not allowed,表示客户端请求的方法虽然能被服务器识别,但是服务器禁止使用该方法
(4)5XX 服务器错误
- 500 internal sever error,表示服务器端在执行请求时发生了错误
- 501 Not Implemented,表示服务器不支持当前请求所需要的某个功能
- 503 service unavailable,表明服务器暂时处于超负载或正在停机维护,无法处理请求
- 504 gateway timeout,表示网关或者代理的服务器无法在规定的时间内获得想要的响应。他是HTTP 1.1中新加入的
304
浏览器缓存相关。
该状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况。304 状态码返回时,不包含任何响应的主体部分。304 虽然被划分在 3XX 类别中,但是和重定向没有关系。
带条件的请求(Http 条件请求):使用 Get方法 请求,请求报文中包含(
if-match
、if-none-match
、if-modified-since
、if-unmodified-since
、if-range
)中任意首部。状态码304并不是一种错误,而是告诉客户端有缓存,直接使用缓存中的数据。返回页面的只有头部信息,是没有内容部分的,这样在一定程度上提高了网页的性能。