一些常见的面试题
对这一块整理一些常见的面试题。
1.TCP三次握手、四次挥手
这部分略。前面已经说的很详细,包括握手为什么不是两次、为什么不是四次,为什么挥手要等2MSL的时间。
2.常见的HTTP状态码及其含义
- 200 OK:正常返回信息
- 400 Bad Reqest:客户端请求有语法错误,不能被服务器所理解
- 401 Unauthorized:请求未经授权,这个状态码必须与WWW-Authenticate报头域一起使用
- 403 Forbidden:服务器收到请求,但是拒绝提供服务
- 404 Not Found:请求资源不存在
- 500 Internal Server Error:服务器发生不可预期的错误
- 503 Server Unavilable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常
3.Get请求和Post请求的区别
- Http报文层面:GET将请求信息放在URL,POST则放在报文体中
- 数据库层面:GET符合幂等性和安全性(查询不会改变数据库),POST不符合
- 其他层面:GET可以被缓存、被存储为书签,而POST不行
4.Cookie和Session的区别
对于session,字面上理解是会话,可以理解为用户与服务端一对一的交互。是一个比较抽象的概念。
但是我们常说的session其实是这里抽象概念的一种实现方式罢了,我觉得没有必要咬文嚼字,下面直接从面试角度来分析一下。
由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户,这个机制就是Session.典型的场景比如购物车,当你点击下单按钮时,由于HTTP协议无状态,所以并不知道是哪个用户操作的,所以服务端要为特定的用户创建了特定的Session,用用于标识这个用户,并且跟踪用户,这样才知道购物车里面有几本书。
这个Session是保存在服务端的,有一个唯一标识,这个唯一标识对应一个用户。在服务端保存Session的方法很多,内存、数据库、文件都有。
服务端解决了用户标识问题,但是服务端怎么知道此时操作浏览器的用户是谁呢?
这个时候Cookie
就登场了。每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。
实际上大多数的应用都是用 Cookie
来实现Session
跟踪的,第一次创建Session
的时候,服务端会在HTTP协议中告诉客户端(放在响应头中返回),需要在 Cookie
里面记录一个Session ID
,以后每次请求(请求头)把这个会话ID发送到服务器,我就知道你是谁了。
有人问,如果客户端的浏览器禁用了 Cookie
怎么办?一般这种情况下,会使用一种叫做URL重写的技术来进行会话跟踪,即每次HTTP交互,URL后面都会被附加上一个诸如 sid=xxxxx 这样的参数,服务端据此来识别用户。
Cookie
其实还可以用在一些方便用户的场景下,设想你某次登陆过一个网站,下次登录的时候不想再次输入账号了,怎么办?这个信息可以写到Cookie
里面,访问网站的时候,网站页面的脚本可以读取这个信息,就自动帮你把用户名给填了,能够方便一下用户。这也是Cookie
名称的由来,给用户的一点甜头。
总结:
Session
是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;
Cookie
是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session
的一种方式。
下面说一下很常见的一种写法。比如在单体应用中,我此时登陆你的网站了,你可以将我的信息保存在session
中:
1 | User currentUserInfo = userService.getUserByUsernameAndPasswd(username,password); |
下次,我就可以在我们之间的会话中随时获取我的个人信息:
1 | User currentUser = session.getAttribute("currentUser"); |
其实这些就是利用存放在Cookie
中的JSESSIONID
来实现的。
5.HTTP和HRTTPS的关系
来说一下SSL(Security Sockets Layer,安全套接层)
- 为网络通信提供安全及数据完整性的一种安全协议
- 是操作系统对外的API,SSL3.0之后更名为TLS
- 采用身份验证和数据加密保证网络通信的安全和数据的完整性
HTTPS数据传输流程:
- 浏览器将支持的加密算法信息发送给服务器
- 服务器选择一套浏览器支持的加密算法,以证书的形式回发浏览器
- 浏览器验证证书合法性,并结合证书公钥加密信息发给服务器
- 服务器使用私钥解密信息,验证哈希,加密响应消息回发浏览器
- 浏览器解密响应消息,并对消息进行验证,之后进行加密交互数据
这个也就不赘述了,下面直接说说区别。
- HTTPS需要到CA申请证书,HTTP不需要
- HTTPS密文传输,HTTP明文传输
- 连接方式不同,HTTPS默认使用443端口,HTTP使用80端口
- HTTPS=HTTP+加密+认证+完整性保护,更安全
但是仍然存在一定的风险:
- 浏览器默认填充http://,请求需要进行跳转,有被劫持的风险
- 可以使用HSTS(HTTP Strict Transport Security)优化(这个还不未主流,面试问的少)
Socket简介
我们知道,进程与进程直接的通信最基本的要求是:可以唯一确定进程。
在本地进程通信中,可以用PID来唯一标识一个进程。
但是PID只在本地唯一,网络中PID冲突的几率还是存在的。
我们知道,到IP层就可以唯一定位到一台主机了,TCP层(tcp协议+端口号)可以唯一定位一台主机中的一个进程。
这样,我们可以通过ip地址+协议+端口号可以唯一标识一台主机的一个进程。这样就可以通过socket进行网络通信了。
socket是对TCP/IP协议的抽象,是操作系统对外开放的接口。
socket起源于unix,而unix是遵从一切皆文件的哲学。Socket是一种基于从打开、读/写、关闭的模式实现的。客户端和服务器各自维护一个文件,在连接建立后,可以供对方读取或者读取对方内容。
socket相关题目
编写一个网络程序,有客户端和服务端,客户端向服务端发送一个字符串,服务器收到字符串之后打印到命令行上,然后向客户端返回该字符串的长度,最后,客户端输出服务端返回的该字符串的长度,分别用TCP和UDP两种方式去实现。