面试题
阅读重点:重点TCP/UDP、数据库索引原理
写面试题不是重点,利用面试题总结知识点才是重点,以点到线,以线到面
1、浏览器输入www.xxxx.com之后都发生了什么?
2、请写出5个常见的HTTP状态码及含义?
3、TCP和UDP的区别?TCP的握手和挥手流程是什么?
4、数据库的索引有什么用?创建索引原则是什么?索引的底层数据结构是什么?
5、HTTP1.0/HTTP1.1/HTTP2.0/HTTP3.0 各有什么特点
6、已知map中可能可能含有键名为key,类型为cls的对象。请实现函数getBean,根据传入的key,返回map中存在的对象,若不存在,则在map添加键名为key,类型为cls的对象,并返回map中键名为key的对象,注意该函数要支持多线程并发处理。
public static T getBean(ConcurrentHashMap map,String key,Class cls){
//implement here
}
答案:
一、浏览器输入www.xxxx.com之后都发生了什么?
1.DNS域名解析
2.建立TCP连接
3.发送HTTP请求
4.接受响应结果
5.浏览器解析html
6.浏览器布局渲染
更深入的回答参考链接:
https://blog.csdn.net/guofang110/article/details/83035619
https://blog.csdn.net/baidu_34122324/article/details/84800878
二、请写错5个常见的HTTP状态码及含义?
200 OK 一切正常 301 Moved Permanently 重定向到新的URL,永久性 302 Found 重定向到临时的URL,非永久性 304 Not Modified 请求的资源未更新 400 Bad Request 非法请求 401 Unauthorized 请求未经授权 403 Forbidden 禁止访问 404 Not Found 没有找到对应页面 500 Internal Server Error 服务器内部出现错误 501 Not Implemented 服务器不支持实现请求所需要的功能
三、TCP和UDP的区别?TCP的握手和挥手流程是什么?
区别:
1.TCP面向连接的运输层协议,UDP无连接
2.TCP是可靠交付,UDP是尽最大努力交付
3.TCP面向字节流,UDP面向报文
4.TCP是点对点连接的,UDP一对一,一对多,多对多都可以
5.TCP适合用于网页,邮件等,UDP适合用于视频,语音广播等
流程:
三次握手:建立连接
1、客户端发送请求【寻址请求】2、服务器端收到报文请求,回应客户端【确认请求】3、客户端收到服务端的报文进行回应。【连接请求】三次握手完成,TCP客户端和服务端成功地建立连接,可以传输数据。
四次挥手:断开连接
1、数据验证请求码2、传输结束标记3、确认结束标记4、连接断开标记
使用场景
使用TCP的应用:Web浏览器;电子邮件、文件传输程序等等。
使用UDP的应用:域名系统 (DNS);视频流;IP语音(VoIP)等等。
备注:文章最后有更深入的介绍-感兴趣的可以参阅
更深入的回答参考链接:
https://blog.csdn.net/guofang110/article/details/83035619
https://blog.csdn.net/baidu_34122324/article/details/84800878
https://www.cnblogs.com/zeze/p/9509926.html
四、数据库的索引有什么用?创建索引原则是什么?索引的底层数据结构是什么?
数据库的索引用途:
索引的目的就是提升查询速度。
索引是帮助数据库高效获取数据的数据结构。
创建索引原则是:
1、 对于查询频率高的字段创建索引;
2、 对排序、分组、联合查询频率高的字段创建索引;
3、 索引的数目不宜太多
每创建一个索引都会占用相应的物理控件;
过多的索引会导致insert、update、delete语句的执行效率降低;
4、若在实际中,需要将多个列设置索引时,可以采用多列索引
创建多列索引,需要遵循BTree类型,即第一列使用时,才启用索引。
5、选择唯一性索引
唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。例如,学生表中学号是具有唯一性的字段。为该字段建立唯一性索引可以很快的确定某个学生的信息。如果使用姓名的话,可能存在同名现象,从而降低查询速度。
6、尽量使用数据量少的索引
如果索引的值很长,那么查询的速度会受到影响。例如,对一个CHAR(100)类型的字段进行全文检索需要的时间肯定要比对CHAR(10)类型的字段需要的时间要多。
7、尽量使用前缀来索引
如果索引字段的值很长,最好使用值的前缀来索引。例如,TEXT和BLOG类型的字段,进行全文检索会很浪费时间。如果只检索字段的前面的若干个字符,这样可以提高检索速度。
8、删除不再使用或者很少使用的索引
如果索引字段的值很长,最好使用值的前缀来索引。例如,TEXT和BLOG类型的字段,进行全文检索会很浪费时间。如果只检索字段的前面的若干个字符,这样可以提高检索速度。
索引的底层数据结构是
Btree索引(B+tree,B-tree) 哈希索引 full-index全文索引 RTree
explain sql执行计划
explain select 字段列 from 表名 where 条件
附:EXPLAIN列的解释
table:显示这一行的数据是关于哪张表的
type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、index和ALL
type显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
一般来说,得保证查询至少达到range级别,最好能达到ref。possible_keys:显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句
key:实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MYSQL忽略索引
key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好
ref:显示索引的哪一列被使用了,如果可能的话,是一个常数
rows:MYSQL认为必须检查的用来返回请求数据的行数
Extra:关于MYSQL如何解析查询的额外信息。将在表4.3中讨论,但这里可以看到的坏的例子是Using temporary和Using filesort,意思MYSQL根本不能使用索引,结果是检索会很慢
更深入的回答参考链接:
https://blog.csdn.net/CEVERY/article/details/109997013
https://www.cnblogs.com/niuben/p/11250230.html
五、HTTP1.0/HTTP1.1/HTTP2.0/HTTP3.0 各有什么特点
HTTP 1.0
短连接:每次发送请求都要重新建立tcp请求,即三次握手,非常浪费性能
无host头域,也就是http请求头里的host,
不允许断点续传,而且不能只传输对象的一部分,要求传输整个对象
HTTP 1.1
长连接,流水线,使用connection:keep-alive使用长连接,与http 2.0不同的是,
host头域
由于长连接会给服务器造成压力
HTTP 2.0
头部压缩,双方各自维护一个header的索引表,使得不需要直接发送值,通过发送key缩减头部大小
多路复用,使用多个stream,每个stream又分帧传输,使得一个tcp连接能够处理多个http请求
可以使用服务端推送
HTTP 3.0
基于google的QUIC协议,而quic协议是使用udp实现的
减少了tcp三次握手时间,以及tls握手时间
解决了http 2.0中前一个stream丢包导致后一个stream被阻塞的问题
优化了重传策略,重传包和原包的编号不同,降低后续重传计算的消耗
连接迁移,不再用tcp四元组确定一个连接,而是用一个64位随机数来确定这个连接
更合适的流量控制
更深入的回答参考链接:
https://blog.csdn.net/org_hjh/article/details/109140765
六、已知map中可能可能含有键名为key,类型为cls的对象。请实现函数getBean,根据传入的key,返回map中存在的对象,若不存在,则在map添加键名为key,类型为cls的对象,并返回map中键名为key的对象,注意该函数要支持多线程并发处理。
public static T getBean(ConcurrentHashMap map,String key,Class cls){
//implement here
//思路采用双重检查锁
}
实现细节
package com.xxxx.common.util;
import java.util.concurrent.ConcurrentHashMap;
public class Test {
public static T getBean(ConcurrentHashMap map,String key,Class cls){
//implement here 双重检查锁
T obj=(T) map.get(key);
if(obj==null){
synchronized (cls) {
if(obj==null) {
map=new ConcurrentHashMap();
map.put(key, cls);
return (T) cls;
}
}
}
return obj;
}
}
-------------------------------UDP/TCP长篇大论----------------------------
互联网上所有的信息交互,都离不开网络传输。
其中网络传输主要分为以下7大层
物理层 实现计算机系统与网络间的物理连接
数据链路层 进行数据打包与解包,形成信息帧
网络层 提供数据通过的路由
传输层 提供传输顺序信息与响应
会话层 建立和中止连接
表示层 数据转换、确认数据格式
应用层 提供用户程序接口
本次主要讨论传输层的协议,也就是大家熟悉的 TCP 和UDP传输协议
什么是TCP
(Transmission Control Protocol传输控制协议)
TCP是一种面向连接的,可靠的,基于字节流的传输通信协议。
1、tcp(Transmission Control Protocol传输控制协议)
2、传输层协议
3、原因:应用层需要可靠的连接,但是IP层没有这样的流机制
4、面向连接,即在客户端和服务器之间发送数据之间,必须先建立连接
5、位于应用层和IP层之间
6、连接需要建立三次握手、四次挥手断开连接
7、传输数据时可靠的
TCP连接建立——使用三次握手建立连接
1、客户端发送请求【寻址请求】
2、服务器端收到报文请求,回应客户端【确认请求】
3、客户端收到服务端的报文进行回应。【连接请求】
三次握手完成,TCP客户端和服务端成功地建立连接,可以传输数据。
TCP终止一个连接——四次握手
1、数据验证请求码
2、传输结束标记
3、确认结束标记
4、连接断开标记
UDP
(User Datagram Protocol用户数据报协议)
1、UDP(User Datagram Protocol用户数据报协议)
2、传输层协议
3、无连接的数据报协议
4、不能提供数据报分组,组装和不能对数据报进行排序
5、主要用于不要求分组顺序到达的传输中,分组传输顺序的检查和排序有应用层完成。
6、提供面向事务的简单不可靠传递服务。
7、UDP协议使用端口分别运行在同一台设备上的多个应用程序
8、功能:为了在给定的主机上能识别多个目的的地址,同时允许多个应用程序在同一台主机上工作并能够独立地进行数据包的发送和接受,设计用户数据报协议UDP
TCP与UDP的异同(服务端接收数据,客户端发送数据)
面向TCP连接的socket通信程序:
服务端:创建套接字,指定协议族(sockaddr_in),绑定,监听(listen),接受链接(accept),发送或接收数据;客户端:创建套接字,指定协议族,连接,发送或接收数据
这几个步骤都是必须的。补充:在发送和接受数据时:write/send/sendto,read/recv/recvfrom都可以用,通常会用:send,recv;但需要注意的是:在面向UDP的socket程序中,发送数据时,如果用sendto的话,就不用connect了;但是,在面向TCP的程序中,在发送数据时,即使sendto,也必须connect,也就是说connect这一步是必不可少的。
面向UDP连接的socket通信程序:
服务端:创建套接字,指定协议族(sockaddr_in),绑定(不需要listen和accept),发送或接收数据;客户端:创建套接字,指定协议族,连接(和TCP的客户端步骤一样),发送或接收数据。补充:在发送和接收数据时,和TCP大同小异,write/send/sendto,read/recv/recvfrom都可以用,但UDP通常会用sendto,recvfrom;需要注意的是:当用sendto发送数据的时候,就不用connect了(用了也没事),其他的(write,send)必须connect。
区别:
TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能顺序地从一端传到另一端。
UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,不保证数据按顺序传递,故而传输速度很快。
总结:
TCP与UDP区别总结:
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保 证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
TCP一般用于文件传输(对数据准确性要求高,速度可以相对慢);UDP一般用于即时通信,网络游戏包的数据传输( 对数据准确性和丢包要求比较低,但速度必须快
步骤:
TCP编程的服务器端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt(); * 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、开启监听,用函数listen();
5、接收客户端上来的连接,用函数accept();
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;
8、关闭监听;
TCP编程的客户端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、设置要连接的对方的IP地址和端口等属性;
5、连接服务器,用函数connect();
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;
UDP编程的服务器端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、循环接收数据,用函数recvfrom();
5、关闭网络连接;
UDP编程的客户端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、设置对方的IP地址和端口等属性;
5、发送数据,用函数sendto();
6、关闭网络连接;
补充(来自网络):
1.socket()的参数不同
2.UDP Server不需要调用listen和accept
3.UDP收发数据用sendto/recvfrom函数
4.UDP:shutdown函数无效
5.TCP:地址信息在connect/accept时确定
UDP:在sendto/recvfrom函数中每次均需指定地址信息
三次握手:建立连接
建立连接时,客户端发送syn包到到服务器,服务器收到syn包时,向客户端发送ACk 包,同时发送一个自己的syn包,客户端收到服务器的SYN+ACK包后向服务器发送ACK 这样就建立三次握手连接
四次挥手:断开连接
断开连接可以是客户端发起,也可以是服务器端发起。假设客户端发起中断连接请求。客户端首先发送FIN报文给服务器端,表示客户端这边已完成发送数据的任务。服务器接到FIN报文后,如何此时服务器端还有数据没有发送完成,可以继续发送数据,所以服务器先发送ACK 包给客户端。当服务器端确定数据已经发送完成,则向客户端发送FIN 报文,告诉客户端,服务器这边数据发送完了。客户端接收到FIN报文后,就知道可以断开连接了。但是他还是不相信网络,所以发送ACK包给服务器进入TIME_WAIT状态,服务器端收到ACK后就断开连接了。客户端在等待了一段时间后没有收到来自服务器的回复,则证明,服务器端已经正常关闭,最后客户端关闭连接 最终完成了4次挥手的断开连接。
扩展阅读
点->线->面
技术点->技术专题线->技术体系面
扩展阅读其他的点、线、面
http://www.woshipm.com/operate/1026799.html
喜欢就关注我,点击关注。
(声明:本公众号均为原创,个人可以分享和转发,但其他公众号等公共平台均不得盗链发布,原文转发、复制抄袭,一经发现,将向微信平台进行举报。)