本文包含大量文字内容
url从客户端到服务端经历了什么?
- 第一步先由浏览器解析URL中的协议、主机、端口、路径、构建一个http请求。浏览器在发送请求之前会先检测缓存是否命中,如果命中则不会发起请求。(缓存中包含:强缓存、协商缓存、存储位置)之后便会经历DNS解析后返回对应的IP地址
- 第二步在获取到对应的IP地址后便会创建一个TCP Connection用来在客户端和服务端进行通信,也就是最初的三次握手:第一次握手由Client端发起一个包含位码syn和seq两个信息给到服务端,服务端通过解析syn知道client想要发起一个连接请求。第二次握手由服务端发起,服务端会生成一个acknumber=seq+1,syn=1,ack=seq+1,seq发送给客户端,告知客户端可以发送了。第三次握手,由客户端发起在检验ack码和syn码全部正确后,便建立连接成功。
在第一次收到服务端反馈的时候,此时的连接会被放入一个半连接队列中,完成三次握手后便会放入全连接队列中
- 第三步就是发送给web service处理请求,这里分为静态资源和动态资源,静态资源根据路径直接寻址获取,动态资源需要webservice将请求委托给对应的服务处理,最终在进行返回结果集
- 第四步浏览器渲染,作为Java后端开发工程师对于这块简单了解即可,基本分为,拿到字节码转为字符然后令牌化然生成dom树之后在进行渲染
- 第五步就是四次挥手:刚开始双方都处于established状态,假如是客户端先发起关闭请求
第一次挥手:客户端发送一个FIN报文,报文中会指定一个序列号。此时客户端处于FIN_WAIT1状态
第二次挥手:服务端收到FIN之后,会发送ACK报文,且把客户端的序列号值+1作为ACK报文的序列号值,表明已经收到客户端的报文了,此时服务端处于CLOSE_WAIT状态
第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发送FIN报文,且指定一个序列号。此时服务端处于LAST_ACK的状态
需要过一阵子以确保服务端收到自己的ACK报文之后才会进入CLOSED状态,服务端收到ACK报文之后,就处于关闭连接了,处于CLOSED状态。
作者:FinGet
链接:https://juejin.cn/post/6935232082482298911
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
上述就是一个url到服务端的基本流程中间还有许多细节的点可以参考从输入URL开始建立前端知识体系
Java类加载过程
在面试一家中字开头的企业,人家问了我这个问题,着实有些生疏,今天接着记录一下java类加载过程
- 首先我们java的类加载过程是:加载-验证-准备-解析-初始化。
- 类加载器分类有:
- Bootstrap ClassLoader 这个加载器用来加载java的核心类库
- Extension ClassLoader 这个加载器可以用来加载指定目录下的文件
- Application Classloader 用来加载环境变量和系统属性配置下的文件,Java中的类就是由此加载器完成
- 自定义加载器 此加载器可以用来加载网络上的相关文件 - 类加载最为重要的类加载机制-双亲委派机制。简言之就是类加载器由自定义-application-extension-bootstrap这样的顺序依次委派至最顶层,如果bootstrap可以完成加载则由顶级父加载器完成加载,不行则交由子类自行加载
- 而对于一种特殊的情况,就是第三方包加载spi,对于这种类,java采用了线程上下文加载器来实行委托加载
Java常用的集合框架(木仓科技)
Java多线程(必问)
tcp和udp的区别(小红书)
名称 | tcp | udp |
---|---|---|
是否连接 | 需要连接 | 无需连接 |
是否可靠 | 可靠 | 不可靠 |
连接对象个数 | 只能是一对一通信 | 支持一对一,一对多,多对一和多对多交互通信 |
传输方式 | 面向字符流 | 面向报文 |
适用场景 | 适用于要求可靠传输的应用,例如文件传输 | 适用于实时应用(IP电话、视频会议、直播等) |
首部开销 | 首部最小20字节,最大60字节 | 首部开销小,仅8字节 |
http和https的区别(小红书)
名称 | http | https |
---|---|---|
是否需要证书 | 不需要 | 需要 |
连接端口 | 80 | 443 |
文本传输方式 | 超文本协议传输,明文传输 | 具有安全性的加密文本传输 |
连接协议 | 无状态连接 | ssl和http协议构建的加密传输,身份认证的安全传输协议 |
经济性 | 无需费用 | 需要付费申请 |