面试题总结
计算机网络
介绍OSI七层协议,以及他们是如何工作的?
- 应用层 :为特定的应用程序定义通信和交互的规则,比如HTTP、DNS和SMTP等协议。数据单位为报文。
- 表示层 :负责数据压缩、加密等,这使得应用程序不必关心在各台主机中数据内部格式不同的问题。
- 会话层 :建立及管理会话。
- 传输层 :为两个进程之间提供通用数据传输服务。由于应用层协议很多,定义通用的传输层协议就可以支持多种应用层协议(这里有一个复用和分用的概念)。运输层包括两种协议:传输控制协议 TCP和用户数据报协议 UDP。
- 网络层 :为两台主机提供数据传输服务。网络层把传输层传递下来的报文段或者用户数据报封装成分组和包进行传送。网络层使用 IP 协议,分组也叫 IP 数据报 ,简称 数据报。
- 数据链路层 :主机之间可以有很多链路,链路层协议就是为同一链路的主机提供数据传输服务。数据链路层把网络层传下来的分组封装成帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。
- 物理层 :实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输媒体和通信手段的差异。考虑的是怎样在传输媒体上传输数据比特流,而不是指具体的传输媒体。
TCP的三次握手,四次挥手?
三次握手:
- 首先 B 处于 LISTEN(监听)状态,等待客户的连接请求。
- A 向 B 发送连接请求报文,SYN=1,ACK=0,选择一个初始的序号 x。
- B 收到连接请求报文,如果同意建立连接,则向 A 发送连接确认报文,SYN=1,ACK=1,确认号为 x+1,同时
也选择一个初始的序号 y。 - A 收到 B 的连接确认报文后,还要向 B 发出确认,确认号为 y+1,序号为 x+1。
- B 收到 A 的确认后,连接建立。
为什么要有第三次握手?
防止失效的连接请求到达服务器,让服务器错误打开连接。
四次挥手:
- A 发送连接释放报文,FIN=1,一个序号u。
- B 收到之后发出确认,返回一个ACK和确认序号u+1,此时 TCP 属于半关闭状态,B 能向 A 发送数据但是 A 不能向 B 发送数据。
- 当 B 不再需要连接时,发送连接释放报文,FIN=1。
- A 收到后发出确认,进入 TIME-WAIT 状态,等待 2 MSL(最大报文存活时间)后释放连接。
- B 收到 A 的确认后释放连接。
为什么要有四次挥手?
- 服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了,但是还能接收数据,而自己也未必全部数据都发送给对方了,四次挥手主要是为了让服务器端发送还未传送完毕的数据。
为什么客户端最后还要有TIME_WAIT? - 保证客户端发送的最后一个ACK报文能够到达服务器。因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次。
- 防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。
HTTPS和HTTP的差别?
- HTTP默认使用端口80,HTTPS默认使用端口443
- HTTP协议运行在TCP之上,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。HTTPS是运行在SSL/TLS之上的HTTP协议,SSL/TLS 运行在TCP之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。
介绍一下非对称加密技术?
对称密钥加密:加密和解密使用同一密钥。
非对称密钥加密:加密和解密使用不同的密钥。公开密钥所有人都可以获得,通信发送方获得接收方的公开密钥之后,就可以使用公开密钥进行加密,接收方收到通信内容后使用私有密钥解密。常用算法有RSA和DH(DiffieˉHellman)。
HTTP状态码
常见的状态码:
- 200 OK
- 301:永久重定向,表示请求的资源分配了新的url,以后应使用新url
- 302:临时重定向,请求的资源临时分配了新的