前言
最近一直在看后端开发的面经🙌,里面涉及到了好多计算机网络的知识😁,在这里以问题的形式写一个学习笔记(其中参考了: JavaGuide 和 小林coding 这两个很好的学习网站😘)
1.当键入网址后,到网页显示,其间发生了什么?
(1)首先浏览器会解析URL。(如确定协议像Http或Https)
(2)然后通过DNS服务器把域名解析为IP地址。(找到服务器啦)
(3)接着TCP协议三次握手和服务器建立连接。(客户端与服务器之间建立起连接了)
(4)成功建立连接后,浏览器向服务器发送一个 HTTP 请求报文。(发送数据了)
(5)服务器收到 HTTP 请求报文后,处理请求,并返回 HTTP 响应报文给浏览器。
(6)最后,浏览器把这些内容解析并展示出来。
2.TCP 传输数据之前,要先三次握手建立连接,过程是什么?
我们都知道在 HTTP 传输数据之前,首先需要 TCP 建立连接,Http数据的传输是要基于TCP 连接的。
(1)首先,客户端发一个SYN包给服务器(这就像打招呼说:你好!我想连你了😘)
(2)服务器收到后,发送一个SYN+ACK包回去(我收到啦,同意连接)
(3)客户端收到后,再发一个ACK包给服务器,确认连接。
3.HTTP1.0,1.1,2.0,3.0区别?
这个吧,它这个很多,我也没咋学全面,我感觉吧,因为Http数据的传输是要基于TCP 连接的,这个技术基于传输层,就是不断提升不断升级就是是运输的效率更高?稍微总结一下:
(1)HTTP/1.0 每次请求响应都要建立新连接,效率低。
(2)HTTP/1.1 支持持久连接,能减少连接开销,但还是按顺序来处理请求。
(3)HTTP/2.0 能同时处理多个请求,多路复用,传输更快。
(4)HTTP/3.0 用UDP协议替代了TCP,减少了TCP握手延迟,改进了拥塞控制,在高丢包网络环境下性能更好。
4.HTTP 是不保存状态的协议, 如何保存用户状态?
这个在后端开发登陆界面的时候有很大用处
方法一:Session (会话) 配合 Cookie (主流方式)
🙌先来了解一下Cookie和Session:
cookie:是主要在客户端,能存一些小数据,,就像身份证,负责在客户端和服务器见传递标志;
Session:主要在服务端,就像档案库,在服务器端存客户端的状态信息
基本流程是这样的:
(1)用户向服务器发送用户名、密码、验证码用于登陆系统。
(2)服务器验证通过后,会为这个用户创建一个专属的 Session 对象
(3)服务器通过 HTTP 响应头中的 Set-Cookie 指令,把这个 Session发送给用户的浏览器。
(4)浏览器接收到 SessionID 后,会将其以 Cookie 的形式保存在本地。
(5)当用户保持登录状态时,每次向该服务器发请求,浏览器都会自动带上这个存有 Session 的 Cookie。
(6)服务器收到请求后,从 Cookie 中拿出 Session,就能找到之前保存的那个 Session 对象
注🤯:然而这种方法不支持跨域请求,所以一般使用以下方法:
方法二:Token-based 认证 (如 JWT - JSON Web Tokens)
这个我在苍穹外卖登录界面的文章里写过,里面还有实现代码感兴趣想进一步学习可以看看: 点我🙌
实现步骤如下:
(1)用户向服务器发送用户名、密码以及验证码用于登陆系统;
(2)如果用户用户名、密码以及验证码校验正确的话,服务端会返回已经签名的 Token,也就是 JWT;
(3)客户端收到 Token 后自己保存起来(比如浏览器的 localStorage )用户以后每次向服务端发请求都在 Header 中带上这个 JWT (直接当发送信息储存到HTTP传输数据中);
(4)服务端检查 JWT 并从中获取用户相关信息。