TCPS三次握手和四次挥手
在建立TCP连接时,需要通过三次握手来建立
- 客户端向服务端发送一个SYN
- 服务端接收到SYN后,向客户端发送一个SYN_ACK
- 客户端接收到SYN_ACK,再向服务端发送一个ACK
在断开TCP连接时,需要通过四次挥手来断开
- 客户端向服务端发送FIN
- 服务端接收到FIN后,向客户端发送ACK,表示我收到断开连接的请求,客户端你可以不发数据了,不过服务端这边可能还有数据要处理
- 服务端处理完所有数据后,向客户端发送FIN,表示服务端现在可以断开连接
- 客户端收到服务端的FIN,向服务端发送ACK,表示客户端也会断开连接了
浏览器发送一个请求到收到响应经历了哪些步骤
- 浏览器解析用户输入的URL,生成一个HTTP格式的请求
- 先根据URL域名从本地hosts文件查找是否有映射IP,如果没有就将域名发送发送给电脑所配置的DNS进行域名解析,得到IP地址
- 浏览器通过操作系统将请求通过四层网络协议发送出去
- 途中可能会经过各种路由器,交换器,最终到达服务器
- 服务器收到请求后,根据请求所指定的端口,将请求传递给绑定了该端口的应用程序,比如8080端口被tomcat占用
- tomcat接收到请求数据后,按照http协议的格式进行解析,解析得到所要访问的servlet
- 然后servlet来处理这个请求,如果是MVC中的DispatcherServlet,那么则会找到响应中的Controller中的方法,并执行该方法得到结果
- Tomcat得到响应结果后封装成HTTP响应的格式,并再次通过网络发送给浏览器所在的服务器
- 浏览器所在的服务器拿到结果后再传递给浏览器,浏览器则负责解析并渲染
零拷贝
零拷贝指的是应用程序在需要把内核中的一块区域数据转移到另一块区域时,不需要先复制到用户空间再转移到目标内核区域去了,而是直接实现转移。

通过transferTo()方法来完成内核之间的buffer的数据转移,省掉了数据的两次复制
布隆过滤器

布隆过滤器的原理是用bit数组+多哈希实现的一种概率性数据结构,用来快速判断一个元素是不是在集合中。插入元素时:元素经过多个哈希函数计算得到多个位置,这些位置的bit都置为1。而查询元素时,同样经过哈希得到多个位置,只要有一个位置是0,元素一定没有在,全是1也未必在,存在一定误判率,但不会放过不存在的数。
String StringBuffer StringBulider
String 是不可变的,底层的 char 数组被 final 修饰,一旦创建就定死在那了。每次拼接、替换都会生成新对象,原来那个不会变。
StringBuffer 和 StringBuilder 都是可变的,底层用一个可扩容的数组存字符。区别在于 StringBuffer 的方法都加了 synchronized,是线程安全的;StringBuilder 没加锁,单线程下性能更好。