面试关于HTTP的问题

HTTP协议相关问题是web工程师常被问到的问题

1. http协议组成:

请求:

 请求行(请求方法,url,http版本 )
 请求头
 请求体(请求的报文)

响应:

状态行(http版本,状态码,状态码描述)
响应头
响应体

2. http协议头的内容

点这里
请求头:

accept:text/xml; (客户端希望接受到的响应类型-请求报文头)点这里
accept-charset:utf-8;(客户端接受的字符集)
accept-encoding;(客户端接收的编码方式)
accept-languague(客户端接受的语言)
connection:keep-alive (使用的连接类型) http1.1默认keep-alive,http1.0默认close;
cookie
content-length:(以8进制表示请求体的长度)
content-type:application/xml (客户端发送的格式)
date:发送的日期和时间
host:服务器的地址和端口

响应头

connection
content-dispsition (对资源的处理,如下载、打开)
content-encoding
content-languague
content-length
content-type
date
server
location 用于在进行重定向,或在创建了某个新资源时使用。
Set-Cookie

响应码: 点这里

1xx 服务器已经收到消息,正在处理
2xx 接受处理成功
3xx 要完成请求,您需要进一步进行操作
4xx 客户端请求问题,如资源不存在,未授权等
5xx 服务器处理问题


200 处理成功
300 我把你redirect到其它的页面,目标的URL通过响应报文头的Location告诉你。
304 not modefied
告诉客户端,你请求的这个资源至你上次取得后,并没有更改,你直接用你本地的缓存吧,我很忙哦,你能不能少来烦我啊!
401 (UNAUTHORIZED): 客户端无权访问该资源。这通常会使得浏览器要求用户输入用户名和密码,以登录到服务器。
403 (FORBIDDEN): 客户端未能获得授权。这通常是在401之后输入了不正确的用户名或密码
404 Not Found 资源不存在
500 Internal Server Error 服务器异常

3. Cookie

点这里
由于http协议是无状态的,而cookie可以将客户端信息传递给服务端实现“有状态”。
cookie是由服务端生成,在响应头中设置set-cookie(name,value),客户端获取cookie后保存在内存中(若设置cookie的Expires或max-age属性,会保存在硬盘中),当关闭浏览器时失效。在下次请求中,浏览器会将cookie发送给服务端,服务端获取其中的信息。
值:
domain:
path
key,value
expires=DATE 有效时间
max-age
secure
HttpOnly

4. seesion

点这里
session跟cookie一样是为了实现http有状态通讯而存在的 ,不同的是session是将用户信息保存至服务器,而在通讯中以sessionid作为标识通讯,sessionid一般保存在cookie中。

session在访问tomcat服务器HttpServletRequest的getSession(true)的时候创建,tomcat的ManagerBase类提供创建sessionid的方法:随机数+时间+jvmid;
存储在服务器的内存中,tomcat的StandardManager类将session存储在内存中,也可以持久化到file,数据库,memcache,redis等。客户端只保存sessionid到cookie中,而不会保存session,session销毁只能通过invalidate或超时,关掉浏览器并不会关闭session。

创建:sessionid第一次产生是在直到某server端程序调用 HttpServletRequest.getSession(true)这样的语句时才被创建。
删除:超时;程序调用HttpSession.invalidate();程序关闭;
session存放在哪里:服务器端的内存中。不过session可以通过特殊的方式做持久化管理(memcache,redis)。
session的id是从哪里来的,sessionID是如何使用的:当客户端第一次请求session对象时候,服务器会为客户端创建一个session,并将通过特殊算法算出一个session的ID,用来标识该session对象

5. 集群处理seesion

点这里
当服务器部署为集群或分布式部署时,会出现客户端访问服务器A生成session保存在A上,而第二次访问被分到服务器B上,而B上没有保存的session这时会要求客户端重新验证信息了。
解决上述问题:
1 复制session
将每次访问的session分发到其他服务器上
缺点:消耗资源
2 转发请求
在Nginx采用ip_hash算法。保证同一个ip匹配到同一个tomcat上。
缺点:如果某个服务器挂了就会导致session丢失
3 持久化session
将session保存到数据库中
4 共享session
跟保存到数据库一样将session保存到redis中,每次请求根据sessionid到redis中去取
使用注解@EnableRedisHttpSession
在使用 httpRequest.getSession()时创建sessionid和session,

6. seesion和cookie的区别

session是将客户数据存到服务器上,而通讯时只需要传送sessionid。销毁时需要调用HttpSession.invalidate()或者关闭程序。session存储会消耗内存,可以存多种形式的数据
cookie是将客户数据直接作为内容传递。销毁时关闭浏览器,或者删除cookie文件,因为是客户端行为不消耗内存,只能存string。

7. http1.0/http1.1/http2.0 的区别

点这里
这个更好
1 http1.0默认短链接,若要使用长连接需要设置connection:keep-alive
http1.1 默认使用长连接。
http通讯是需要三次握手,建立连接有开销,使用长连接可以减少开销
2 http1.1支持只发送head,当返回100的时候再发送body,若返回401则可以不继续发送body,从而减少带宽
3 http1.1支持部分内容传送,即断点续传。
4 http1.1有host属性,http1.0没有 即支持虚拟站点 host


1http2.0 可以实现一个连接并发处理多个请求,即多路复用,减少对连接的建立时的开销。
2 数据压缩,head压缩
3 服务器推送,http2.0会将一些需要的数据返回给客户端,减少访问

8. http和https的区别

http被广泛应用于web通讯中,但是是以明文形式传输数据,若被拦截截取数据,可直接读取用户信息。因此需要对一些敏感信息进行加密。
因此在http协议基础上加入ssl协议,ssl依靠证书对客户端进行验证,并对数据进行加密。

区别:
1 https需要到ca申请证书
2 http是超文本传输协议是明文形式的,https通过ssl对数据进行加密
3 默认端口,https 443,http 80

https的工作原理
1 客户端访问服务器,建立ssl链接
2 服务器将证书与公钥发送给客户端
3 设置加密等级
4 客户端根据加密等级生成私钥,利用公钥对私钥加密,将结果发送给服务端
5 服务端根据公钥解出密钥。
6 客户端与服务器分别根据密钥对信息进行加解密。

你可能感兴趣的:(面试,http)