1.什么是HTTP协议?
HTTP 是一个在计算机世界里专门在「两点」之间「传输」文字、图片、音频、视频等「超文本」数据的「约定和规范」。
2.HTTP 常见的状态码,有哪些?
1xx 类状态码属于提示信息,是协议处理中的一种中间状态
2xx 类状态码表示服务器成功处理了客户端的请求.
「200 OK」是最常见的成功状态码,表示一切正常。如果是非 HEAD 请求,服务器返回的响应头都会有 body 数据。
「204 No Content」也是常见的成功状态码,与 200 OK 基本相同,但响应头没有 body 数据。
「206 Partial Content」是应用于 HTTP 分块下载或断电续传,表示响应返回的 body 数据并不是资源的全部,而是其中
的一部分,也是服务器处理成功的状态。
3xx 类状态码表示客户端请求的资源发送了变动,需要客户端用新的 URL 重新发送请求获取资源,也就是重定向。
「301 Moved Permanently」表示永久重定向,说明请求的资源已经不存在了,需改用新的 URL 再次访问。
「302 Moved Temporarily」表示临时重定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问。
301 和 302 都会在响应头里使用字段 Location,指明后续要跳转的 URL,浏览器会自动重定向新的 URL。
「304 Not Modified」不具有跳转的含义,表示资源未修改,重定向已存在的缓冲文件,也称缓存重定向,用于缓存控制。
4xx 类状态码表示客户端发送的报文有误,服务器无法处理,也就是错误码的含义。
「400 Bad Request」表示客户端请求的报文有错误,但只是个笼统的错误。
「403 Forbidden」表示服务器禁止访问资源,并不是客户端的请求出错。
「404 Not Found」表示请求的资源在服务器上不存在或未找到,所以无法提供给客户端。
5xx 类状态码表示客户端请求报文正确,但是服务器处理时内部发生了错误,属于服务器端的错误码。
「500 Internal Server Error」与 400 类型,是个笼统通用的错误码,服务器发生了什么错误,我们并不知道。
「501 Not Implemented」表示客户端请求的功能还不支持,类似“即将开业,敬请期待”的意思。
「502 Bad Gateway」通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发
生了错误。
「503 Service Unavailable」表示服务器当前很忙,暂时无法响应服务器,类似“网络服务正忙,请稍后重试”的意思。
3.http 常见字段有哪些?
Host:客户端发送请求时,用来指定服务器的域名。有了 Host 字段,就可以将请求发往「同一台」服务器上的不同网站。
Content-Length 字段:服务器在返回数据时,会有 Content-Length 字段,表明本次回应的数据长度。
Connection 字段:用于客户端要求服务器使用 TCP 持久连接,以便其他请求复用。
Content-Type 字段:用于服务器回应时,告诉客户端,本次数据是什么格式。
Accept字段:客户端声明自己可以接受哪些数据格式(Accept: /表示接收任何格式)
Content-Encoding 字段:说明数据的压缩方法
4.GET 和 POST 的区别?
Get 方法是请求从服务器获取资源,是安全且幂等的,而POST 方法则是它向 URI 指定的资源提交数据,数据就放
在报文的 body 里,不是安全的也不是幂等的。
5. HTTP(1.1) 的优点有哪些? 缺点?
简单,灵活易扩展,应用广泛,跨平台.1.1:长连接和管道通信(服务器还是按照顺序相应请求,存在队头阻塞问题)
缺点是不安全,通信使用明文(不加密),内容可能会被窃听。不验证通信方的身份,因此有可能遭遇伪装。无法
证明报文的完整性,所以有可能已遭篡改。还有是双刃剑的明文传输和无状态.
6.HTTP 与 HTTPS 有哪些区别?
①HTTP 信息是明文传输,存在安全风险的问题。HTTPS 则解决 HTTP 不安全的缺陷,在 TCP 和 HTTP 网络层之
间加入了 SSL/TLS 安全协议,使得报文能够加密传输。
②HTTP 连接建立相对简单, TCP 三次握手之后便可进行 HTTP 的报文传输。而 HTTPS 在 TCP 三次握手之后,
还需进行 SSL/TLS 的握手过程,才可进入加密报文传输。
③HTTP 的端口号是 80,HTTPS 的端口号是 443。
④HTTPS 协议需要向 CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。
7.HTTPS 解决了 HTTP 的哪些问题?
混合加密的方式实现信息的机密性,解决了窃听的风险。
摘要算法的方式来实现完整性,它能够为数据生成独一无二的「指纹」,用于校验数据的完整性,解决篡改风险
将服务器公钥放入到数字证书中,解决了冒充的风险。
8.SSL/TLS 协议建立的详细流程?
①首先,由客户端向服务器发起加密通信请求,主要包括:客户端支持的 SSL/TLS 协议版本,客户端生产的随
数,后面用于生产「会话秘钥」客户端支持的密码套件列表,如 RSA 加密算法。
②服务器收到客户端请求后,向客户端发出响应,包括:确认 SSL/ TLS 协议版本,如果浏览器不支持,则关闭加
密通信。服务器生产的随机数(Server Random),后面用于生产「会话秘钥」.确认的密码套件列表,如 RSA 加
密算法。服务器的数字证书。
③客户端收到服务器的回应之后,首先通过浏览器或者操作系统中的 CA 公钥,确认服务器的数字证书的真实性。
如果证书没有问题,客户端会从数字证书中取出服务器的公钥,然后使用它加密报文,向服务器发送如下信息:一
个随机数(pre-master key)。该随机数会被服务器公钥加密。加密通信算法改变通知,表示随后的信息都将用「会
话秘钥」加密通信。客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时把之前所有内容的发生的
数据做个摘要,用来供服务端校验。
④服务器收到客户端的第三个随机数(pre-master key)之后,通过协商的加密算法,计算出本次通信的「会话秘
钥」。然后,向客户端发生最后的信息:加密通信算法改变通知,表示随后的信息都将用「会话秘钥」加密通信。
服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时把之前所有内容的发生的数据做个摘要,用来
供客户端校验。整个 SSL/TLS 的握手阶段全部结束。接下来,客户端与服务器进入加密通信,就完全是使用普通的
HTTP 协议,只不过用「会话秘钥」加密内容.
9.HTTP2和HTTP3都有什么优化?
HTTP2:使用HPACK算法进行头部压缩.采用二进制格式的报文,提高传输速度.以及数据流,多路复用,服务
端推送.
HTTP3:TCP 协议改成了 UDP,基于 UDP 的 QUIC 协议 可以实现类似 TCP 的可靠性传输。
10.浏览器输入一条URL后发生了什么?
①首先对 URL 进行解析,浏览器确定 Web 服务器和文件名,根据这些信息来生成 HTTP 请求消息.
②生成 HTTP 消息后,需要委托操作系统将消息发送给 Web 服务器,在发送前需要查询web服务器的域名相对
应的ip地址.首先会先查找浏览器上面的缓存,再查找.host文件的缓存。如果没有会发送一个DNS请求给本地
DNS域名服务器。本地域名服务器收到客户端的请求后,如果缓存里的表格能找到。则它直接返回 IP 地址。如
果没有,本地 DNS 会去问它的根域名服务器.根 DNS 收到来自本地 DNS 的请求后,告诉本地域名服务器该
域名的顶级域名服务器地址。本地DNS再去问顶级域名服务器,顶级域名服务器地址告诉本地DNS 权威DNS服
务器地址,本地DNS再去问 这就拿到了ip地址了.
③拿到ip地址后,通过TCP协议传输HTTP请求,在 HTTP 传输数据之前,首先需要 通过三次握手建立TCP连
接。在双方建立了连接后,TCP 报文中的数据部分就是HTTP 头部 + 数据,组装好 TCP 报文之后,交给
下面的网络层处理。
④IP层为TCP报文添加IP头部信息,包括源地址IP,目的地址IP等.网络包还需要在 IP 头部的前面加上 MAC 头
部。
⑤网卡将数字信息转换为电信号,在网线上传输,经过交换机和路由器最终到达服务器.
⑥服务器层层解析,将浏览器请求的数据返回。最后浏览器获得数据后进行渲染就能呈现出页面出来了.
11.ICMP 功能都有啥?
ICMP 主要的功能:确认 IP 包是否成功送达目标地址、报告发送过程中 IP 包被废弃的原因和改善网络设置等。
ICMP 报文是封装在 IP 包里面,它工作在网络层,是 IP 协议的助手。
12.查询报文类型和差错报文类型是什么?
包括回送请求和回送应答,回送消息用于进行通信的主机或路由器之间,判断所发送的数据包是否已经成功到达对端的一种消息,ping 命令就是利用这个消息实现的。
差错报文类型有目标不可达,重定向,超时等消息.traceroute就是用这个消息实现的,他的主要作用有:故意设置特殊的 TTL,来追踪去往目的地时沿途经过的路由
器(设置不可到达的端口)。故意设置不分片,从而确定路径的 MTU。
13.TCP实战
①TCP 第一次握手 SYN 丢包:超时时间内没收到服务端的 ACK,就会超时重传 SYN 数据包,每次超时重传的
RTO 是翻倍上涨的,直到 SYN 包的重传次数到达 tcp_syn_retries (默认5)值后,客户端不再发送 SYN 包。
②TCP 第二次握手 SYN、ACK 丢包:客户端 SYN 包会发生超时重传,服务端 SYN、ACK 也会发生超时重传。
客户端 SYN 包超时重传的最大次数,是由 tcp_syn_retries 决定的,默认值是 5 次;服务端 SYN、ACK 包时重
传的最大次数,是由 tcp_synack_retries 决定的,默认值是 5 次。
③TCP 第三次握手 ACK 丢包:则服务端就会短暂处于 SYN_RECV 状态,而客户端会处于 ESTABLISHED 状
态。服务端收不到 TCP 第三次握手的 ACK,会一直重传 SYN、ACK 包,直到重传次数超过
tcp_synack_retries 值(默认值 5 次)后,服务端就会断开 TCP 连接。而客户端则会有两种情况:
如果客户端没发送数据包,一直处于 ESTABLISHED 状态,经过 2 小时 11 分 15 秒才可以发现一个「死亡」连
接,于是客户端连接就会断开连接。如果客户端发送了数据包,一直没有收到服务端对该数据包的确认报文,
则会一直重传该数据包,直到重传次数超过 tcp_retries2 值(默认值 15 次)后,客户端就会断开 TCP 连接。
14.什么是 TCP 半连接队列和全连接队列?
在 TCP 三次握手的时候,Linux 内核会维护两个队列,分别是:半连接队列,也称 SYN 队列;全连接队列,也
称 accepet 队列.
增大全连接队列:min(somaxconn, backlog).所以要调大 backlog 以及 somaxconn 参数。somaxconn 是 Linux
内核的参数,默认值128,可以通过 /proc/sys/net/core/somaxconn 来设置其值;backlog 是 listen(int sockfd, int
backlog) 函数中的 backlog 大小,Nginx 默认值是 511,可以通过修改配置文件设置其长度.
增大半连接队列:增大 tcp_max_syn_backlog 的值,增大 somaxconn 和 backlog,也就是增大全连接队列.
服务端处于 SYN_RECV 状态的最大个数分为如下两种情况:
1). 如果「当前半连接队列」没超过「理论半连接队列最大值」,但是超过 max_syn_backlog -
(max_syn_backlog >> 2),那么处于 SYN_RECV 状态的最大个数就是 max_syn_backlog - (max_syn_backlog
>> 2);2). 如果「当前半连接队列」超过「理论半连接队列最大值」,那么处于 SYN_RECV 状态的最大个数就
是「理论半连接队列最大值」. 当 max_syn_backlog > min(somaxconn, backlog) 时, 半连接队列理论最大值
max_qlen_log = min(somaxconn, backlog) * 2;当 max_syn_backlog < min(somaxconn, backlog) 时, 半连接队
列理论最大值 max_qlen_log = max_syn_backlog * 2
网友评论