目录
6. HTTP和HTTPS有什么区别?HTTPS是怎么做的加密机制?
1. 计算机网络的体系结构
2. 介绍一下五层协议体系结构
- 应用层:应用程序之间的交互。这一层有http协议、FTP协议、支持电子邮件的SMTP协议;
- 运输层:负责两台主机之间的数据传输。这一层有TCP、UDP、Dubbo协议;
- 网络层:负责找到主机在网络中的位置,确保数据准确传输。有IP协议;
- 数据链路层:把网络层传下来的IP数据包组装成帧,在两台主机之间传输帧;
- 物理层:物理层的传输数据的单位是比特,负责在两台主机之间传输比特流。
3. TCP/UDP协议有什么区别?
- UDP面向无连接,数据传输不可靠,但是效率高,支持一对多,比如IP电话、视频会议、直播都用的UDP协议
- TCP面向连接,数据传输可靠,只能一对一,比如文件传输就用的TCP协议
基于TCP/UDP的应用层协议有哪些?
基于TCP的协议:http、https、FTP、SMTP(发邮件)、POP3(收邮件)
基于UDP的协议:NTP(网络时间协议,用于网络同步)、DHCP(动态主机配置协议)
基于
TCP
和UDP的
协议:DNS,用于完成地址查找、邮件转发
4. 三次握手
讲解链接:TCP的三次握手与四次挥手理解及面试题(很全面) - 李卓航 - 博客园
- 第一次握手:客户端向服务端发送一个同步报文(SYN=1,seq=x),服务端收到后,就确定了客户端的发件能力和自己的收件能力;
- 第二次握手:服务端向客户端发送确认报文+同步报文(SYN=1, ACK=1, seq=y, ack=x+1),客户端收到后,就确认了自己和服务端的收发件能力;
- 第三次握手:客户端向服务端发送确认报文(ACK=1, ack=y+1, seq=x+1),服务端收到后,就确认了自己的发件能力和客户端的收件能力。
seq:序列号,每次由计算机随机生成
ack:确认号,取值是seq+1
SYN、ACK、FIN:这种大写的都是标志位,要么是1,要么是0,表示序列号或者确认号是否有效
5. 四次挥手
- 第一次挥手:客户端向服务端发送释放连接报文(FIN=1, seq=u),并不再给服务端发送数据包;
- 第二次挥手:服务端收到后,向客户端发送确认释放连接报文(ACK=1, ack=u+1, seq=v),告诉客户端自己知道客户端要释放连接了;
- 第三次挥手:服务端等待一段时间后,确认自己也没有要向客户端发送的数据包,就给客户端发送 确认连接释放报文+连接释放报文(FIN=1, ACK=1, ack=u+1, seq=w);
- 第四次挥手:客户端收到后,向服务端发送确认报文(ACK=1,ack=w+1, seq=u+1),告诉服务端自己收到服务端已关闭的消息了,服务端收到后,关闭连接。客户端等待2MSL(最长报文段生存时间)后,自动关闭连接。
为什么客户端要再等待2MSL(最长报文段生存时间)才关闭?
因为最后一次客户端给服务端发的确认包有可能丢失,此时服务端没收到消息,就会继续向客户端发送确认包+连接释放报文,所以客户端要再等待一个发送和回复报文的时间再关闭,保证服务端确实已经关闭连接了。
为什么握手三次,而挥手要四次?
因为释放连接的时候,服务端要确认自己也没有数据包发给客户端,才会发送释放连接报文
为什么握手要三次?两次不行吗?
不行,三次握手是客户端和服务端确认双方收发件能力的过程,如果只有前两次握手,没有最后一次,服务端就无法得知自己的发件能力和客户端的收件能力。
并且两次握手如果第二次握手的报文丢失,服务端就不会再给客户端发送报文;但是三次握手,服务端没收到客户端的确认报文就会重发第二次握手的报文。
如果已经建立了连接,但是客户端突然故障了怎么办?
TCP设有一个保活计时器,通常时间是2小时。每次客户端给服务端发送数据,服务端都会把计时器复位,如果超过2小时客户端都没发送数据,服务端就会每隔75秒向客户端发送一个探测报文,连续10次客户端还没响应,服务端就会关闭连接。
6. HTTP和HTTPS有什么区别?HTTPS是怎么做的加密机制?
https信息传输更加安全,因为它加上了SSL安全协议。
SSL主要有三个作用:身份验证(非对称加密)、数据加密(对称加密)、数据完整性验证(散列算法,比如md5)
Https工作流程
准备阶段:
- 服务器生成公钥S.pub和私钥S.pri,公钥发给CA,私钥自己保存
- CA生成C.pub和C.pri,并用C.pri对S.pub签名生成CA证书
- 然后把证书给服务器,证书和C.pub给客户端
客户端和服务端交互阶段:
- 客户端发起一个请求(三次握手)
- 服务端把CA证书发给客户端
- 客户端用C.pub验证证书合法性
- 如果证书合法,客户端则生成对称秘钥,并用S.pub把对称秘钥加密发给服务端
- 双方通过客户端生成的随机秘钥进行通信
其中涉及到两对公钥和私钥,C.pub和C.pri用于签名(CA机构用C.pri给S.pub加签形成证书,客户端用C.pub对证书验签),S.pub和S.pri用于加解密(S.pub用于给对称秘钥加密,S.pri用于解密对称秘钥)
7. 从输入URL到页面展示到底发生了什么?
- 用户输入URL后,浏览器会通过DNS服务器获取域名对应的IP和端口
- 浏览器根据IP和端口,向目标服务器发起一个TCP连接请求(过程中发送数据使用的是IP协议)
- 浏览器在TCP连接上,向服务器发送一个HTTP请求,并等待服务器处理后返回的HTTP响应
- 浏览器收到响应报文后,解析响应体中的HTML代码,并渲染网页结构和样式
- 浏览器在不需要和服务器通信时,可以主动关闭TCP连接,或等待服务器的关闭请求
8. 常见的HTTP状态码
- 1xx:请求处理中
- 2xx:成功。比如:200-请求成功
- 3xx:重定向。比如:302-临时重定向
- 4xx:客户端错误。比如:404-找不到资源、403-请求的资源被服务端拒绝
- 5xx:服务端错误。比如:500-服务器内部错误
9. GET和POST请求的区别?
get是不安全的,请求参数都在url中,而post的请求参数对用户不可见。
get请求提交的url长度不能超过2048个字节,这是浏览器限制的,防止有人恶意发送请求,post则没有这个限制。
10. 跨域同源是什么?怎么解决跨域问题?
同源:两个URL的协议,域名,端口一致,反之就是跨域.
出现跨域的根本原因:浏览器的同源策略不允许非同源的 URL 之间进行资源的交互
怎么解决跨域问题?
常用的两种解决方案:分别是JSONP和CORS
- JSONP:兼容性好,但是是一种临时解决方案,只支持GET请求,不支持POST
- CORS:从根本上解决问题,但是不兼容某些低版本的浏览器
JSONP:
实现原理就是通过<script>标签的src属性,请求跨域的接口数据,并通过函数调用的形式,接受跨域接口响应回来的数据
CORS:
在服务端配置 CORS,允许指定的源(域名、协议、端口)访问资源
原理:浏览器会在请求头中携带一个字段:
Origin,
Origin中会指出当前请求属于哪个域(协议+域名+端口)。服务会根据这个值决定是否允许其跨域。
11. 什么是对称加密和非对称加密?
对称加密:加解密使用的秘钥是同一个。比如AES对称加密
非对称加密:公钥加密,私钥解密。比如RSA非对称加密
为什么公钥加密的数据可以用私钥解密?
非对称加密的算法就是可以用一对秘钥,一个加密,一个解密。具体就是数学问题了
12. cookie、session和token是什么?
- cookie:保存在客户端的key-value格式的文件,也叫浏览器缓存。可以存储用户名密码等,用于实现自动登录,自动填充用户名等;
- session:保存在服务端的存储空间,一般用来存储用户的身份信息、登录状态。客户端发起请求时,cookie里会携带sessionId,服务端根据sessionId找到对应的session
- token:用户的身份令牌,用户第一次请求时,服务端查询数据库对比用户名和密码是否匹配,并生成token并返回给客户端,客户端每次请求携带上token,服务端校验token的合法性
13. servlet是什么?线程安全吗?
servlet用于接收用户请求的HttpServletRequest,在doGet()、doPost()中做相应的处理,并返回HttpServletResponse。
servlet线程不安全,但是servlet是无状态的,也就是不存储数据,因此也就不存在并发写共享数据问题,所以某种程度上可以说它是线程安全的。
servlet是单例的吗?
默认是单例的,但是可以支持多例,给一个类上边加@webServlet注解,web容器启动的时候扫描到该注解,就会创建该类的视力,并加载到容器中。
14. servlet的生命周期?
web容器启动的时候,会调用servlet的init方法,初始化servlet
当有请求进入时,调用servlet的service()方法,service()会根据需要调用doGet()或doPost()
当服务器销毁的时候,会调用servlet的destory()方法,销毁servlet
15. 拆包和粘包
TCP在接受数据的时候,用缓冲区来控制接收数据的大小。
- 如果一次请求发送的数据包较小,没达到缓冲区大小,TCP则会把多个请求合并为一个请求进行发送,这就是粘包。
- 如果一次请求发送的数据包较大,超过了缓冲区大小,TCP则会把其分为多次发送,这就是拆包。也就是也一个大数据包拆陈多个小包进行发送。
由于TCP传输的数据是以流的形式,流数据没有明确的开始和结束位置,所以会导致消息的正确性受影响(比如数据混淆)。
UDP不存在粘包问题,因为UDP有保护消息边界,每个UDP包中都有消息头。
解决方案:
- 发送端将数据包封装为固定长度。缺点是数据量小时会用空字符还填充,额外增加网络传输负担
- 在数据尾部增加特殊字符进行分割,比如\n,读的时候使用readline按行读取。缺点是如果传输的数据中有\n就会造成半包,所以最好对内容进行编码和解码
- 将数据分为两部分,一部分是头部,一部分是内容体。其中头部结构大小固定,且有一个字段声明内容体的大小
HTTP是如何解决粘包拆包的?
http请求报文格式 1)请求行:以\r\n结束; 2)请求头:以\r\n结束; 3)\r\n; 3)请求体:数据; http响应报文格式 1)响应行:以\r\n结束; 2)响应头:以\r\n结束; 3)\r\n; 4)请求体:数据;
- 遇到第一个\r\n表示请求行结束
- 遇到\r\n\r\n表示请求头结束
- 请求头中有content-length标识body长度,依赖此字段读取请求体数据