这是我参与8月更文挑战的第5天,活动详情查看: 8月更文挑战
微信公众号搜索【程序媛小庄】,Rest cannot be enjoyed by lazy people~
前情提要:绝顶聪明的面试官继续和小庄面试啦,大家一起来围观吧
面试官大佬:(面带慈祥)小伙子来啦,来来来咱们接着聊呀,今天来聊聊网络这块的东西~
我:(时刻准备着)您问~
面试官大佬:先说说HTTP协议get请求和post请求有啥区别呢?
我:get
请求的主要特征是向服务器获取资源,在发送请求的过程中,请求的参数会拼在URL后面。post
请求一般用于表单提交,相当于把信息提交给服务器,等待服务器响应,post
方式是把提交给后端的参数放在请求体中,对携带的参数长度没有要求。get
请求在发送过程中会产生一个TCP数据包,而post
请求在发送过程中会产生两个TCP数据包,对于get
请求浏览器会把http header
和data
一并发送出去,服务器响应状态码200返回客户端需要的资源;而对于post
请求浏览器先发送header
服务器响应状态码100表示continue,浏览器再发送data数据,服务器响应状态码200。
面试官大佬:TCP协议知道吧,简单讲一下TCP协议的三次握手四次挥手?
我:TCP协议是传输层的协议,基于TCP协议的通信客户端和服务端必须建立一个双向通信的连接,连接建立之后就可以发送数据了,三次握手和四次挥手分别对应TCP的连接和释放过程。
在建立TCP连接的时候,首先由客户端向服务端发送连接请求,服务端接收到请求后,会告诉客户端收到该请求并同时向客户端发送连接请求,然后客户端告诉服务端已经收到该请求,此时TCP连接就已经建立。
在断开TCP连接的时候,由哪一方提出都可以,比如说客户端想要断开连接,客户端向服务端发送想要断开连接的请求,服务端收到该请求后会告诉客户端已经收到该请求,但是不会立刻中断服务端与客户端的连接,因为此时可能客户端需要的数据还未传输完毕,当服务端向客户端传输的数据发送完毕后,服务端会向客户端发送断开连接的请求,客户端收到请求后会给服务端确认断开的信息,至此,TCP连接断开。
面试官大佬:粘包问题你知道吗?
我:粘包问题是TCP协议传输中的问题,TCP协议是面向流的协议,粘包问题的主要原因是接收方不知道消息之间的界限,不知道一次性提取多少字节的数据造成的。
发送方和接收方建立通信的底层还是基于操作系统,由于操作系统有自己的机制规定什么时候向接收方发送数据,因此可能会出现同一个业务数据被分割成多个数据包或者多个业务数据被打包到同一个数据包发送。
由于问题的根源是接收方不知道消息之间的界限,因此解决粘包问题的方法就是围绕如何让发送端在发送数据前,把自己要发送的数据流总大小告知接收端,然后接收端可以起一个循环接收完所有数据。
面试官大佬:(小伙子可以呀)cookie和session了解吗?
我:HTTP协议有一个特点就是无状态,每次请求都是独立的,客户端的服务当次会话产生的数据不会被保留,但是随着互联网的发展,又需要保存状态,为了解决HTTP协议的无状态这一特性出现了cookie。cookie具体指的是保存在客户端浏览器一小段信息,当用户第一次登陆时,服务端会产生随机串保存在客户端浏览器上,下次客户端浏览器再次访问服务端的时候会自动携带这个串,服务端就可以在这个串上获取用户的信息。
但是由于cookie是保存在客户端上的,有可能被拦截或者被窃取,存在很大的安全风险,就需要有一种新的技术,将用户信息保存在服务端上保证信息的安全性,就是session。
session是基于cookie的,session是存放在服务器上的随机串,当用户第一次登陆的时候,服务器会产生一个随机串保存在客户端浏览器中,下次客户端访问服务器的时候会携带该随机串,服务端通过客户端携带的数据去服务器的数据库中进行比对,校验当前登陆用户是否合法,但是如果有非常多的用户登陆的话,就会产生非常多的数据,当用户登陆时服务器查询数据库就会非常的慢,而且如果采用的分布式服务的话,就需要在每台服务器都配置相同的数据库,因为使用nginx转发的时候,并不知道当次请求会被转发到哪台服务器上,这样就会非常占用服务器资源,token就可以解决这个问题。
token也是基于cookie,token由三段组成,第一部分是头,第二部分是荷载,第三部分是签名,第一部分存放的是base64转码后的加密方式/公司信息等,第二部分荷载存放的是base64转码后的用户不敏感的信息比如用户名 过期时间等,第三部分是由前两部分组合转码之后再hash加密 得到的签名。
当用户第一次登陆之后,服务端会返回这样的一个随机串给客户端浏览器保存,下次再次访问服务器想要进行其他操作的时候,服务端就会通过自己的解码方式得到前两部分,通过相同的加密方式得到随机串与客户端浏览器携带的串进行对比,判断用户信息是否正确。
使用token的好处就是服务器不需要存储用户的数据,可以节省服务器资源,每台服务器只需要保存对应的方法即可。
面试官大佬:666,你在说一下地址栏中输入URL按下回车发生了什么?
我:首先浏览器分析链接指向页面的URL,浏览器向DNS请求解析目标URL的IP地址,域名系统DNS解析出URL的IP地址后,浏览器与服务器建立TCP连接,连接建立之后浏览器会向目标服务器发起HTTP请求,请求数据包,如果目标服务器是一个简单的页面,就会直接返回。对于需要的重定向的页面,浏览器在获取了重定向响应后,找到重定向地址,重复第一步操作,然后浏览器重新发送请求,携带新的 URL,目标服务器返回数据。
面试官大佬:我这边面试基本就没什么问题了,等下一位面试官和你聊聊哦~
我:好嘞~