对这一块整理一些常见的面试题。

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
2
User currentUserInfo = userService.getUserByUsernameAndPasswd(username,password);
session.setAttribute("currentUser",currentUserInfo);

下次,我就可以在我们之间的会话中随时获取我的个人信息:

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两种方式去实现。

代码地址:https://github.com/sunweiguo/TcpAndUdp/