《面试官不讲武德》对Java初级程序猿死命摩擦Http协议

《面试官不讲武德》对Java初级程序猿死命摩擦Http协议

前言

我被Hr领进了一个小黑屋,让我在这里等面试官,过来一会,一位穿着拖鞋的中年男子走了进来,看着他绝顶聪明的发际线,知道这确定是位大佬,我内心倍感到了压力;javascript

《面试官不讲武德》对Java初级程序猿死命摩擦Http协议

面试官果真不是盖的,刚坐下后就开始当即暴力输出了java


面试官:我看你简历上写了熟悉Http协议,当咱们使用浏览器访问网址: https://silently9527.cn会发生什么?

我:(这尼玛就是怕被搞事情因此没写精通,这也被搞。会发生什么,固然是展现出网页啊,大脑飞速旋转,脖子快断的时候,终于想到面试官可能想要问什么了)程序员

我:英俊潇洒的面试官,你好!面试

首先浏览器会去访问DNS服务器,查询到域名对应的ip地址是多少,而后浏览器再去访问这个ip地址;若是还要往底层在说的话,就会涉及到tcp/ip的分层,我仍是来画张图吧。浏览器

《面试官不讲武德》对Java初级程序猿死命摩擦Http协议

服务器返回资源的过程也是相似的方式安全


面试官:你刚才有谈到tcp/ip的分层,能详细说下吗?

我:(还好前前大学女朋友没把我当年上课的笔记给扔掉,恰好昨晚找回来温习了一下,温故而知新!只是笔记而已,你们别想歪了!)
插图服务器

我:TCP/IP协议族分为4层:应用层、传输层、网络层、数据链路层cookie

  • 应用层:主要是与应用通讯使用到的协议,好比:FTP、DNS、HTTP
  • 传输层:为应用层提供在两台机器之间数据传输,有两种协议:TCP、UDP
  • 网络层:两台机器之间在传输的过程当中会通过多个路由器有多条路线,网络层主要是从中选择一条路线
  • 数据链路层:用来处理链接网络的硬件部分,好比说网卡、设备驱动等

面试官:在tcp/ip的分层里面,当客户端发起http请求到达服务端的过程当中,数据包的封装以及解包的过程是怎样的?

《面试官不讲武德》对Java初级程序猿死命摩擦Http协议

我:在这个分层中,每次网络请求都会按照分层的顺序与对方进行通讯,发送端从应用层往下走,接收端从数据链路层往上走;以Http来举例的话:网络

  1. 客户端在应用层(Http协议)发起一个HTTP请求
  2. 在传输层(TCP协议)把从应用层收到的Http请求数据包分隔成小的数据包,并打好序
  3. 网络层(IP协议)收到数据包后选择发送路径
  4. 服务器收到数据后按照顺序往上发送,直到应用层收到数据

《面试官不讲武德》对Java初级程序猿死命摩擦Http协议

在发送方每通过一层,就会被加上该层的首部信息,当接收方接受到数据后,在每个层会去掉对应的首部信息并发


面试官:TCP如何保证数据可靠到达目的地?

我:TCP协议采用的三次握手策略

  • 第一次握手:创建链接时,客户端发送 syn 包(syn=j)到服务器,并进入 SYN_SEND 状态,等待服务器确认;
  • 第二次握手:服务器收到 syn 包,必须确认客户的 SYN(ack=j+1),同时本身也发送一个 SYN 包(syn=k),即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态;
  • 第三次握手:客户端收到服务器的 SYN+ACK 包,向服务器发送确认包 ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED 状态,完成三次握手。

《面试官不讲武德》对Java初级程序猿死命摩擦Http协议

《面试官不讲武德》对Java初级程序猿死命摩擦Http协议


面试官:为何是三次握手,而不是两次或者4次呢?

我:假如说是两次握手,若是客户端本身处理异常或者是服务器返回的ack消息丢失,那么客服端会认为链接创建失败,再次从新发送请求创建链接,可是服务端却无感知,觉得链接以及正常创建,致使服务器创建无用的链接,浪费资源

假如四次握手,若是三次已经足够,那就不须要四次了。若是四次的话,最后一个ACK丢失,那么又会出现两次握手的问题。


面试官:居然都到说了三次握手,那就说说四次挥手吧?

《面试官不讲武德》对Java初级程序猿死命摩擦Http协议

我:

  • 客户端向服务器发送FIN但愿断开链接请求。
  • 服务器向客户端发送ACK,表示赞成释放链接。
  • 服务器向客户端发送一个FIN表示但愿断开链接。
  • 客户端向服务器返回一个ACK表示赞成释放链接。

《面试官不讲武德》对Java初级程序猿死命摩擦Http协议


面试官:为何断开链接须要四次而不是三次呢?

我:由于当服务器收到客户端断开链接的请求后,服务器不能当即断开链接,由于可能服务器端还有数据未发送完成,因此只能回复一个ACK表示我已收到消息;等服务器端数据发送完成以后再发送一个FIN但愿端开链接的消息,客户端回复ACK以后,就能够安全断开了


面试官:为何说Http协议无状态协议?怎么解决Http协议无状态?

《面试官不讲武德》对Java初级程序猿死命摩擦Http协议

我:自己HTTP协议是不保存状态的,自身不对请求和响应直接的通讯状态进行保存,因此是无状态的协议。由于在有些场景下咱们须要保存用户的登陆信息,因此引入了cookie来管理状态。客户端第一次请求服务器的时候,服务器会生成cookie添加在响应头里面,之后客户端的每次请求都会带上这个cookie信息。

《面试官不讲武德》对Java初级程序猿死命摩擦Http协议


面试官:Cookie与Session有什么区别?

我:

  • Cookie是有服务器生成,写入到请求的响应头中,浏览器会保存;服务器经过Set-Cookie字段向客户端设置Cookie,属性:
    1. Name=value 设置cookie的名字和值
    2. expires 设置Cookie的有效期
    3. domain=域名 表示只能在哪一个域名下生效
    4. secure表示只能在Https的通讯时才发送cookie
    5. HttpOnly 表示不能被javascript访问
  • Session也是服务器生成的,表示服务器中的一片内存,每一个客服端对应一个Session,客户端之间的Session相互独立;每次客户端发起请求,都会带上Cookie,Cookie里面通常都会有一个JSESSIONID,服务器就是经过这个JESSIONID来找到客户端对应Session,因此通常用户的登陆信息都会存放在Session;这样也解决了Http协议无状态的问题

面试官:Http协议中有那些请求方式?如何选择使用什么方法?

我:

  • GET : 获取资源; 因此查询操做通常用GET
  • POST: 传输实体主体, 建立更新操做用POST
  • PUT: 传输文件
  • HEAD: 获取报文首部,若是想要查询某个请求的头信息能够用这个方法
  • DELETE: 删除资源,因此删除操做用DELETE
  • OPTIONS: 询问服务器支持哪些方法,响应头中返回 Allow: GET,POST,HEAD
  • TRACE: 追踪路径;在请求头中在Max-Forwards字段设置数字,每通过一个服务器该数字就减一,当到0的时候就直接返回,通常经过该方法检查请求发送出去是否被篡改

面试官:Http如何实现持久链接的呢?

《面试官不讲武德》对Java初级程序猿死命摩擦Http协议

我:(毛线啊,我只是个来面试Java的初级程序员,干吗要反复拿Http来摩擦我呢?!不过没事,我皮的很,这道题我又会)
我:在HTTP协议的早期,每进行一次HTTP通讯就要断开一次tcp链接,当时传输的内容少还能接受,如今每一个网页通常的会包含大量的图片,每次请求都会形成TCP链接的链接和断开,增长通讯的开销。

《面试官不讲武德》对Java初级程序猿死命摩擦Http协议

为了解决这个问题因此想出了持久链接的方法,也叫作keep-alive,只要一端没有提出断开链接就会一直保持TCP链接的状态。持久化链接使的客户端能够同时并发发送多个请求,不用一个接着一个的等待响应。


面试官:大文件的断点续传是如何实现的呢?

《面试官不讲武德》对Java初级程序猿死命摩擦Http协议

我:HTTP请求头有个Range字段;咱们下载文件的时候若是遇到网络中断,若是重头开始下载会浪费时间,因此咱们能够从上一次中断处继续开始下载;具体的操做:

Range: bytes=5001-10000

或者指定5001之后的全部数据

Range: bytes=5001-

响应返回的状态码是206


面试官:刚才你有提到状态码,那常见Http协议状态码有哪些?

我:(面试官我简历上忘记写了,我曾经是学霸,记忆力好,背书没输过)

《面试官不讲武德》对Java初级程序猿死命摩擦Http协议

我:HTTP的状态码主要分为了四类:

  • 2xx: 成功状态码,表示请求正常处理完毕
  • 3xx: 重定向状态码,表示须要附加操做才能完成成请求
  • 4xx: 客户端错误状态码
  • 5xx: 服务器错误状态码

常见的状态码有: 200(请求正常处理完成)、204(请求处理成功,可是没有资源返回)、206(表示客户端进行了范围请求,响应报文中包含了Content-Range)、301(永久性重定向,请求的资源以及被分配到了新的地址)、302(临时重定向,但愿用户而且请求新地址)、400(客户端请求报文出现错误,一般是参数错误)、401(客户端未认证错误)、403(没有权限访问该资源)、404(未找到请求的资源)、405(不支持该请求方法,若是服务器支持GET,客户端用POST请求就会出现这个错误码)、500(服务器异常)、503(服务器不能提供服务)

我:(这我都能记住,是否是的给我点个赞)(已疯狂暗示兄弟们点赞,不要白嫖哦)


面试官:HTTP报文由哪些部分组成?

《面试官不讲武德》对Java初级程序猿死命摩擦Http协议

我:报文的类型分为了请求报文和响应报文两种;

  • 请求报文包含三部分:

    1. 请求行:包含请求方法、URI、HTTP版本信息
    2. 请求首部字段
    3. 请求内容实体
  • 响应报文包含三部分:
    1. 状态行:包含HTTP版本、状态码、状态码的缘由短语
    2. 响应首部字段
    3. 响应内容实体

面试官:Http有哪些问题,什么是https?

我:Http的问题

  • 通讯使用明文不加密,内容可能被窃听
  • 不验证通讯方身份,可能遭到假装
  • 没法验证报文完整性,可能被篡改
    HTTPS就是HTTP加上SSL加密处理(通常是SSL安全通讯线路)+认证+完整性保护

面试官:HTTPS是如何保证数据安全的?

《面试官不讲武德》对Java初级程序猿死命摩擦Http协议

我:首先须要说到两种加密机制

  • 对称加密:客户端和服务器都使用了同一个密钥加密,效率较高
  • 非对称加密:分为了公开密钥和私有密钥,公开密钥能够在网络上传输,使用公开密钥加密后的内容只有私有密钥才能解密,效率较低

因为这两个加密的特别,HTTPS采用的时候混合加密机制,在交换密钥的阶段使用的是非对称加密,在创建通讯交换报文阶段采用的是对称加密

以访问 https://silently9527.cn 举例

  1. 浏览器向服务器发起请求,服务器在接收到请求以后,返回证书和密钥
  2. 浏览器向第三方证书机构验证证书是否合法,若是不合法浏览器将会弹出警告页面,让用户选择是否继续访问
  3. 若是证书合法浏览器生成随机串,使用公钥加密发送给服务器,服务器使用私钥解密出随机串,服务器使用随机串加密内容返回给客户端
  4. 以后客户端和服务器端都将经过随机串进行对称加密

《面试官不讲武德》对Java初级程序猿死命摩擦Http协议


面试官:为何须要证书认证机构,不要https就不安全了吗?

我:虽然https是能够加密的,可是由于请求仍是能够被拦截,如何让客户端知道返回给本身的公钥是真实服务器给的而不是***者给的;这就须要验证证书的合法性,因此须要引入第三方认证机构。一般https的证书须要到第三方机构去申请购买,若是是咱们本身生成的https证书浏览器验证不过会弹出警告。


面试官:那浏览器是如何保证证书验证的过程是安全的呢?

《面试官不讲武德》对Java初级程序猿死命摩擦Http协议
我:浏览器在向证书认证中心验证证书的过程使用的也是非对称加密,这里想要让公钥可以安全的转交给客户端,是很是困难的,因此浏览器的开发商一般会在浏览器内部植入经常使用认证机构的公开密钥


面试官:http相关的协议掌握的还能够,咱们继续聊聊Java.....

能撑到如今,你本身都忍不住本身给本身点个赞了!(再次暗示点赞)


写到最后(点关注,不迷路)

本篇面试故事纯属虚构,请你们不要当真,玩笑归玩笑,莫拿面试开玩笑。

文中或许会存在或多或少的不足、错误之处,有建议或者意见也很是欢迎你们在评论交流。

最后,白嫖很差,创做不易,但愿朋友们能够点赞评论关注三连,由于这些就是我分享的所有动力来源

相关文章
相关标签/搜索