HTTP面试题精选

1. 简述下TCP三次握手的过程,并解释采用3次握手建立连接的原因?

1. 客户端发送建立连接请求,携带信息syn = 1,seq =X --第一次握手

2. 服务端在收到建立连接的请求之后,服务回复确认建立连接,携带信息:syn = 1,ack = X+1, seq =Y --第二次握手(服务端准备好了)

3. 客户端在收到服务端的确认信息后,向服务端回复确认连接建立通知,携带信息:ack = Y+1, seq=X+1(客户端也准备 好了)

这样建立连接的原因:

具体例子:“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。”

2. TCP连接断开的过程?为什么要进行四次挥手?

过程:

1. 客户端发送个FIN报文,请求关闭连接

2. 服务端回复:收到关闭连接请求

3. 服务发送FIN报文,告知客户端服务端将关闭连接

4. 客服端回复,收到你的通知。

原因:连接建立后是双向的,必须双方同意才能断开。

5.什么是2MSL?

MSL, maxmium segment lifetime 最大包存活时间;2MSL即两倍的最大包存活时间。那么为什么要等待2MSL呢?为了保证客户端最后一次挥手的报文能够到达服务器,如果第四次挥手的报文段丢失了,服务器会超时重传这个第三次挥手的报文段,所以客户端不是直接进入CLOSED,而是要保持TIME_WAIT(等待2MSL就是TIME_WAIT)就起到作用了。主要还是server端关闭没办法发送第5次回复了,所以客户端只能等待2MSL后,主动关闭。

6.如果服务端超过2MSL依然没有收到来自客户端的ACK报文,服务端该怎么办?

客户端重发FIN报文,客户端搜到后回复RST报文(不用服务端回复),服务端收到后关闭连接。

总结:3次握手和4次挥手的核心设计点,其实可靠的消息接收机制,必须是发出后,收到确认回复,才会认为是可靠的。所以,建连要3次。挥手要4次,并且挥手的第4次需要使用重试机制来保证。

3. 状态码有哪些?分别是什么含义?

200:请求成功

301,302

        301 redirect: 301 代表永久性转移(Permanently Moved)

        302 redirect: 302 代表暂时性转移(Temporarily Moved )

         详细来说,301和302状态码都表示重定向,就是说浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取(用户看到的效果就是他输入的地           址A瞬间变成了另一个地址B)——这是它们的共同点。他们的不同在于。301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向           之后的网址;302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。

4xx:客户端异常

401:未授权,一些请求需要服务端授权,但是又未得到授权

403:403是因为服务器拒绝了你的地址请求

404:未找到请求资源,

405:方法禁用,例如:使用post方法请求静态文件,但静态文件又不允许post方法请求;接口定义的是post请求,但是调用时用get, 也会返回405

406:请求的文本格式和响应的文本格式不一样,如请求是application/json, 但响应式text/html

407: 代理服务器未授权,客户端使用代理服务器访问服务端,而代理服务器又未得到授权

500:服务端异常

503:是一种HTTP协议的服务器端错误状态代码,它表示服务器尚未处于可以接受请求的状态。通常造成这种情况的原因是由于服务器停机维护或者已超载

4. 什么是https?

https是基于http协议和ssl/tls

协议的,通信时使用密文进行传输,并且换校验通信双方的身份来保证通信安全。

过程如下图:

参考链接:关于HTTPS的原理及证书、验证和数据加密、解密过程解析_用户证书解密-优快云博客

非对称:RSA

对称:DES, AES

核心点:客户端的信号和服务端的信息都是需要密文传输的。那如果客户端和服务的信息都使用非对称加密的方式,安全性肯定是没问题的,就是速度差些。都使用对称加密安全性又很差。所以采用服务端使用非对称加密的方式,客户端使用服务端的公钥加密自己的共享密钥,这样共享密钥也只有自己和服务端知道。黑客是不知道的,因为他没有服务端的私钥。

5. 常见的WEB攻击?

a. sql注入,通过一些特殊字符改变sql的语义,比如:select * from A where b = 字符串,当前语义找到A表中b字段为某个字符串的记录,如果字符串是1 or 1=1,那么语义就变成了全表查询。

当前可以通过预编译的方式防止sql注入攻击,如上面的例子,预编译之后sql语义会固定,1 or 1=1 会被当做一串字符串去和b字段进行匹配。

b. xss, 脚本注入,通过修改前端代码来进攻,但后端做好强校验就好了

c. csrf, 跨站式请求伪造。先正常登入A网站,浏览器存放了登入态。用户又打开了个B网站,让后B网站利用用户的登入态去访问A网站,冒充用户进行操作。

预防方式:校验请求头中的refer属性,登入态的校验使用token来进行,通过哦请求头进行传递。

6. 什么是http?

应用端的协议

特点:无状态,基于TCP/IP协议

http请求构成:

简单来说请求报文就是由请求行、请求头、内容实体组成的,注意,每一行的末尾都有回车和换行,在内容实体和请求头之间另有一个空行。

请求行指定的是请求方法、请求URL、协议版本;

请求头是键值对的形式存在的,就是字段名:值;比如希望得到的文本的返回格式,字符集,编码,连接时间等

内容实体就是要传输的数据

7. http有哪些请求提交方式?

共有9种: 

http 1.0 3种:get, head(与get相似,没有返回值,校验接口是否通),post

http 1.1 6种:put(幂等控制),delete,patch(默认表单提交),trace(回显服务器收到的请求)主要用于测试或诊断,options(查看服务器的性能)

,connect(HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器)

8. 一串url从开始执行到结束经历了些什么?

这个问题涉及的知识面非常广。设置到dns域名解析,tcp建联,https的数据加密传输,服务端的io模型,服务端的架构,服务端的请求分发模型。

dns域名解析:将人类可识别的域名转化成机器可识别ip地址。域名解析器简单来说可以分为本地域名解析器和远端域名解析器。本地域名解析器实际上面没有域名解析的能力,他只是存放了远端域名解析结果的缓存。因为域名解析很少会改,这实际上是对域名解析过程的一个优化动作。

实战:因为本地会有域名解析结果的缓存,所有在进行域名解析变更时,会存在一定的延时。特别是在做C端域名切换的时候,要特别注意这个缓存时间,防止异常回滚时,不能及时生效。

TCP建联:3次握手。为什么要3三次?为了保证可靠。可靠的通信,不仅是说需要将请求发出,并且要保证收到响应。这个理论不仅是对客户端成立,对服务端也成立。所以最少是3次。

https:使用什么机制保证数据传输的安全。主要是3个机制,

第一数据加密传输,客户端和服务端发送的数据,都是使用了来自客户端的零时密钥进行加密的。所以如果临时密钥只要不暴露就是安全的。

第二,临时密钥加密传输。建联时,服务端会发送给客户端加密公钥,客户端使用公钥来加密临时密钥,来保证临时密钥的传输安全。所以只要保证加密公钥不被篡改,临时密钥的传递就是安全的。

第三,通过数字证书的方式,公钥没有被篡改。前提,客户端要安装受信任的根证书的公钥。证书中的内容包括:证书签名。具体的做法是,使用根证书的公钥来解密签名得到摘要。再使用摘要和证书的内容做对比,保证证书的内容没有被修改。(签名的加密算法未知,黑客无法串改证书签名)

服务端架构:请求到了服务端后,并不是第一时间到了业务处理的服务器。当代的微服务架构后端应用众多,业务服务器的前面,会有防火墙,网关,路由转发服务,负载均衡服务,最后才会到业务服务。

io模型:从io模型的角度上讲,请求数据需要从网卡加载到操作系统内核缓冲区,再加载到用户进程缓冲区。再会有工作线程去处理了对应的请求。

9. get和post的区别?

区别主要有下面几个:

从功能上来说:http协议,定义get是用来获取资源的,post是用来提交执行的。但也只是建议,并没有强制约束。

从数据的传输形式和数量限制讲:get的请求的参数一般放在url中,大小受浏览器的限制,像ie的限制是略多于2k。post请求一般将参数放在body中,大小受服务的限制,像tomcat默认可以处理大小是2M。但这也是一般请求,get方式也是可以使用body传递数据的,post方式也是可以使用url来传递数据的。

从浏览器可支撑的功能上讲:get方式会被浏览器默认缓存,也可以被保存为书签。但是post方式不可以

10. 为什么TCP协议相比UDP协议会更稳定

建立连接:TCP 是面向连接的协议,在数据传输之前需要经过三次握手(Three-way Handshake)建立连接。这确保了通信双方能够相互确认并准备好进行数据传输。

确认应答:TCP 使用确认(ACK)机制,接收方在成功接收数据后会向发送方发送确认消息。未得到确认的分组将被重发,从而保证数据的可靠性。

数据顺序:TCP 确保数据包按照发送顺序到达接收方。如果数据包乱序到达,TCP 会重新排序,确保应用层接收到的数据是有序的。

错误检测与校正:TCP 使用序列号和校验和来确保数据的完整性。如果数据包在传输中出现错误,TCP 会检测到并请求重传。这种机制保证了接收方收到的数据是完整且准确的。

拥塞控制与流量控制:TCP 实施拥塞控制算法(如慢启动、拥塞避免等),可以动态调整发送速率,以避免网络拥堵。此外,TCP 的流量控制机制(如滑动窗口)确保发送方不会淹没接收方,从而保持平稳的数据流。

11. 你知道粘包和拆包吗?为什么会发生?怎么解决?

粘包:是指多个数据包在网络传输时被合并成一个包,接收方无法区分各个独立的数据包。发送方的应用程序在发送数据时,可能会在发送缓冲区中积累多个数据包,然后一次性发送

拆包:拆包是指一个数据包在传输过程中被分割为多个包,接收方接收到的数据不完整,无法正确解析。

粘包问题解决方案:消息边界方式解决

拆包问题解决方案:整包长度标识,包序号

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值