HTTP常用状态码及含义?
301和302区别?
- 301:永久性移动,请求的资源已被永久移动到新位置。服务器返回此响应时,会返回新的资源地址。
- 302:临时性性移动,服务器从另外的地址响应资源,但是客户端还应该使用这个地址。
HTTP有哪些请求方式?
PUT是新建或替换指定资源
GET可以实现写操作吗
可以但不建议,可能会导致严重的安全问题,如跨站请求伪造(CSRF)。
开发过程中杜绝使用GET,并在接口上明确规定使用哪种请求方式,请求方式错误会返回405
什么是幂等,幂等方式有哪些
无论操作执行多少次,,对服务器状态产生的影响是相同的。
在正确实现的条件下,GET、HEAD、PUT 和 DELETE 等方法都是幂等的,而 POST 方法不是。
GET和POST的区别
传参方式/是否缓存:GET的参数明文放在URL中(告诉服务器自己要找哪些资源),来做一些简单的请求资源操作,可能被浏览器缓存,不安全;POST将请求数据放在请求体中而不是URL中,让服务器来处理这些数据,如果用HTTPS的话请求体是加密的,更加安全,并且一般不会被缓存。
幂等性:GET请求是幂等的,不会改变服务器的状态;POST不是幂等的,会对服务器的数据有影响
GET的长度限制?
GET是通过URL 传递数据,但是URL本身不限长度,所以对GET做出长度限制的其实是浏览器。
例如 IE 浏览器对 URL 的最大限制是 2000 多个字符,大概 2kb 左右,像 Chrome、Firefox 等浏览器支持的 URL 字符数更多,其中 FireFox 中 URL 的最大长度限制是 65536 个字符,Chrome 则是 8182 个字符。
这个长度限制也不是针对数据部分,而是针对整个 URL。
HTTP请求的过程和原理
HTTP是基于TCP/IP的应用层协议,使用TCP作为传输层协议,通过建立TCP连接来传输数据。HTTP遵循标准的客户端-服务端模型。
DNS解析、TCP连接、HTTP请求、服务器处理响应、断开TCP连接。
客户端发送一个请求到服务器,服务器处理请求并返回一个响应。这个过程是同步的,也就是说,客户端在发送请求后必须等待服务器的响应。在等待响应的过程中,客户端不会发送其他请求。
怎么利用多线程下载一个数据?
- 采用分块下载,通过设置 HTTP 请求头的 Range 字段指定下载的字节区间。例如,
Range: bytes=0-1023
表示下载文件的前 1024 字节。 - 首先通过HEAD请求获取文件的总大小,然后根据文件大小和线程数对文件进行切割「connection.setRequestProperty("Range", "bytes=" + start + "-" + end);」,每个线程都获取一个输入流,负责一个特定范围的文件下载(本地待写入的RandomAccessFile文件从start开始:file.seek(start))。
- 最后启动多线程下载。
说一下HTTP的报文结构?
HTTP报文分为请求报文和相应报文,都包含了起始行、头部和消息正文
HTTP请求报文的结构
由请求行,请求头和消息正文(请求体)组成
GET /index.html HTTP/1.1 //请求行包括请求方法、请求 URL 和 HTTP 协议的版本
Host: www.javabetter.cn //请求头包括主机名、可接受媒体类型、浏览器类型,请求内容的范围等
Accept: text/html
User-Agent: AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3
请求头部和消息正文之间有一个空行,表示请求头部结束。
消息正文是可选的,POST 请求中的表单数据;GET 请求中没有消息正文
HTTP响应报文的结构
由状态行、响应头和消息征文(响应体)组成
HTTP/1.0 200 OK //状态行包括HTTP的版本、状态码、状态信息
Content-Type: text/plain //响应头包括响应数据类型、响应数据长度、资源过期时间、资源最后修改时间、服务器类型和版本
Content-Length: 137582
Expires: Thu, 05 Dec 1997 16:00:00 GMT
Last-Modified: Wed, 5 August 1996 15:55:28 GMT
Server: Apache 0.84
空行
// 响应体也是可选的,通常是HTML页面,也可能是 204 No Content 状态码的响应。
<html>
<body>Java八股</body>
</html>
URI和URL区别
- URI:统一资源标识符(Uniform Resource Identifier),标识的是Web上每一种可用资源,比如HTML文档、图像、视频片段、程序等都是由URI标识等
- URL:统一资源定位符(Uniform Resource Location)是URI的子集,主要作用是提供资源的路径。
主要区别在于URL除了提供了资源的标识,还提供了资源的访问方式,所有能够唯一标识一个资源的字符串就是URI,但是只有指明了如何定位或访问这个资源的URI才是URL
HTTP 1.0和HTTP2.0的区别?
HTTP 1.0默认是短连接,HTTP 1.1默认是长连接,HTTP 2.0默认是多路复用
说下HTTP 1.0
- 非持久连接:每个HTTP响应对之后TCP都会关闭连接,每次相同的请求也要重新建立TCP连接,可以设置Connection: keep alive开启长连接
- 无状态协议:HTTP 1.0是无状态的,每次请求是独立的,服务器不保存任何请求的状态信息
说下HTTP 1.1
- 持久连接:HTTP 1.1默认情况下是持久连接,请求完成后不会立即关闭连接,可以在一个连接上发送多次请求和响应,减轻了TCP连接的开销。
- 流水线处理:HTTP 1.1支持客户端在请求还未返回响应时发送下一个请求,但服务器必须按照接收到请求的顺序依次返回响应。
说下HTTP 2.0
目前使用最广泛的HTTP版本
- 二进制协议:HTTP 2.0采用二进制而不是文本格式来传输数据,解析更高效
- 多路复用:一个TCP连接上可以同时进行多个HTTP请求/响应,解决了头阻塞的问题
- 头部压缩:HTTP协议不带状态,所以每次请求都要附上全部信息。HTTP 2.0引入了头部压缩机制,可以使用gzip或compress压缩之后再发送,减少了冗余的头部信息。
- 服务器推送:服务器可以向客户端主动推送信息,而不需要客户端请求。
HTTP/3了解吗?
HTTP2虽然逻辑上各个流之间相互独立,但是在传输的过程中,如果某个流的数据有丢包,其后的流仍然会阻塞,HTTP/3采用的是QUIC,快速UDP连接,相比于采用TCP连接的HTTP2,HTTP3能够实现各个流之间的完全独立,互不干扰。同时QUIC协议能够实现在传输过程中就完成了TLS加密握手,更直接了。
HTTP长连接什么时候会超时?
可以在HTTP方面或TCP方面设置
HTTP有一个守护进程httpd,其中可以设置keep-alive timeout,也可以在header中设置超时时间
TCP的keep-alive包含三个参数,在系统内核的net.ipv4里设置,如果TCP闲置时间超过了tcp_keepalive_time,就会发送侦测包,并每隔tcp_keepalive_intvl发送一次,一共发送tcp_keepalive_probes后如果还没有收到客户端的ACK,就会关闭连接
tcp_keepalive_intvl = 15
tcp_keepalive_probes = 5
tcp_keepalive_time = 1800
HTTP与HTTPS的区别
HTTPS是加密的,在HTTP基础上加入了SSL/TSL协议。
HTTP 的默认端⼝号是 80,URL 以http://
开头;HTTPS 的默认端⼝号是 443,URL 以https://
开头。
为什么要使用HTTPS?
因为HTTP是明文传输的,存在数据窃听、数据篡改和数据伪造等,HTTP引入了SSL/TSL解决了这些问题。
SSL/TSL加密过程中涉及到两种加密方法:
对称加密:双方用会话密钥加密通信内容。
非对称加密:
- 服务器身份验证: 客户端通过服务器发送的数字证书(由CA签发,内含服务器公钥)来验证服务器身份。客户端使用预装的CA公钥验证证书签名。
- 客户端生成预主密钥: 客户端生成一个随机的预主密钥。
- 客户端加密预主密钥: 客户端使用从服务器证书中获得的服务器公钥来加密这个预主密钥。
- 客户端发送加密数据: 客户端将加密后的预主密钥发送给服务器。
- 服务器解密预主密钥: 服务器使用自己的私钥解密收到的数据,得到预主密钥。
- 双方派生会话密钥: 客户端和服务器现在都拥有了相同的预主密钥、以及之前交换的Client Random和Server Random。它们各自使用这些信息通过密钥派生函数计算出相同的对称会话密钥(通常包括用于加密的密钥和用于消息认证码MAC的密钥)。
- 安全通信: 之后,双方使用这个派生出的对称会话密钥进行加密和解密实际的HTTP应用数据。
HTTPS是怎么建立连接的?
握手阶段和数据传输阶段。
HTTPS会加密URL吗?
HTTPS会加密整个报文,URL是报文的一部分,所以也会被加密,但因为涉及SSL握手的过程,所以域名信息会被暴露出来,完整的URL也有可能会在日志中被记录,这些日志可能是明文的。
所以即使使用HTTPS,敏感信息也不要写入URL
什么是中间人攻击?
MITM,攻击者可以在通信双方的中间插入自己。
SSL 协议就是通过验证服务器的数字证书是否是由 CA(权威的受信任的数字证书认证机构)签发来防止中间人攻击的。
HTTPS怎么保证建立的信道是安全的?
主要通过 SSL/TLS 协议的多层次安全机制,首先在握手阶段,客户端和服务器使用得是非对称加密,生成的会话密钥只有服务器的私钥才能解密,而私钥只有服务器持有。
在数据传输阶段,即使攻击者拦截了通信数据,没有会话密钥也无法解密。
HTTP可以被抓包吗?
可以,但是信息是加密的,如果中间人通过伪造CA证书骗取客户端信任,那么就有可能得到会话密钥,再伪装客户端和服务器通信,服务器的响应转发给客户端,完成中间人攻击。
常用的抓包工具有 Wireshark、Fiddler、Charles 等。
CA证书的签发过程?
CA将申请方的公钥,域名,证书过期时间,证书颁发方、签名算法标识符等信息打成一个包(证书),然后进行Hash值计算,然后通过CA的私钥加密这个Hash值,生成签名,最后把签名放入证书中。
客户端如何校验证书的合法性?
首先检查证书的颁发者(通过比对内置的CA列表)、所有者、颁发日期、是否被吊销,持有方的域名。
检查通过后,用内置的CA中的公钥解密签名的内容,得到一个Hash2。
用同样的Hash算法获取证书的Hash值Hash1,比较Hash1和Hash2,如果值相同则为可信赖的证书。
如何理解HTTP协议是无状态的?
- 每个 HTTP 请求都包含了所有所必须的信息,服务器在处理当前请求时,不依赖于之前的任何请求信息。
- 服务器不会记录任何客户端请求的状态,每次请求都像是第一次与服务器通信。
由于 HTTP 是无状态的,像用户的购物车状态就必须通过其他方式来保持,如在每次请求中传递用户的 ID,或者使用 Cookie 在客户端保存购物车状态。
有什么办法记录状态?
Cookies:服务器通过Set-Cookies响应头将状态信息返回给客户端,客户端之后的请求就使用这些Cookies来维持状态。
Session:服务器生成一个唯一的会话ID,存储在Cookie中,并在服务器端维护该Session的状态信息。每次请求都发送Cookie中的Session ID以便服务器获取该会话之前的状态。
Token:使用 JWT(JSON Web Token)等机制在客户端存储状态信息,客户端在每次请求中发送该 Token。
Session和Cookie的区别和联系
区别:
- 存储位置:Session存储在服务器,Cookie存储在客户端
- 存储数据类型:Session可以存储任意类型,Cookies只能存储ASCII
- 有效期:Session一般有效期较短,客户端关闭或者Session超时都会失效;Cookies可设置为长时间保持,比如默认登陆。
- 安全性:Session存储在服务端较安全;Cookie存储在客户端容易被窃取
- 存储大小:Session可存储的数据容量较大,Cookies保存的数据不能超过4K
联系:
- 用户第一次请求服务器时,服务器会创建对应的Session及对应的ID用于唯一标识会话,将Session ID返回给客户端,客户端会把ID保存在Cookie中,同时用Cookies记录该ID属于哪个域名。
- 当用户第二次访问服务器时,请求会自动判断此域名下是否存在 Cookie 信息,如果存在,则自动将 Cookie 信息也发送给服务端,服务端会从 Cookie 中获取 SessionID,再根据 SessionID 查找对应的 Session 信息,如果没有找到,说明用户没有登录或者登录失效,如果找到 Session 证明用户已经登录可执行后面操作。
分布式环境下如何处理Session?
客户端的不同请求经过负载均衡可能被分配到不同的服务器上,可以使用Redis分布式缓存来存储Session,在多台服务器共享。
客户端无法使用Cookie怎么村Session ID?
可以使用客户端的本地存储,比如浏览器的sessionStorage。
然后把Session ID放在URL的请求参数里或者请求头里。