标签:自己 四次挥手 href res 温习 驱动 http通信 sessionid 精通
我被Hr领进了一个小黑屋,让我在这里等面试官,过来一会,一位穿着拖鞋的中年男子走了进来,看着他绝顶聪明的发际线,知道这肯定是位大佬,我心里倍感到了压力;
面试官果然不是盖的,刚坐下后就开始立即暴力输出了
https://silently9527.cn
会发生什么?我:(这尼玛就是怕被搞事情所以没写精通,这也被搞。会发生什么,当然是展示出网页啊,大脑飞速旋转,脖子快断的时候,终于想到面试官可能想要问什么了)
我:英俊潇洒的面试官,你好!
首先浏览器会去访问DNS服务器,查询到域名对应的ip地址是多少,然后浏览器再去访问这个ip地址;如果还要往底层在说的话,就会涉及到tcp/ip的分层,我还是来画张图吧。
服务器返回资源的过程也是类似的方式
我:(还好前前大学女友没把我当年上课的笔记给扔掉,刚好昨晚找回来温习了一下,温故而知新!只是笔记而已,大家别想歪了!)
插图
我:TCP/IP协议族分为4层:应用层、传输层、网络层、数据链路层
我:在这个分层中,每次网络请求都会按照分层的顺序与对方进行通信,发送端从应用层往下走,接收端从数据链路层往上走;以Http来举例的话:
在发送方每经过一层,就会被加上该层的首部信息,当接收方接受到数据后,在每一个层会去掉对应的首部信息
我:TCP协议采用的三次握手策略
我:假如说是两次握手,如果客户端自己处理异常或者是服务器返回的ack消息丢失,那么客服端会认为连接建立失败,再次重新发送请求建立连接,但是服务端却无感知,以为连接以及正常建立,导致服务器建立无用的连接,浪费资源
假如四次握手,如果三次已经足够,那就不需要四次了。如果四次的话,最后一个ACK丢失,那么又会出现两次握手的问题。
我:
我:因为当服务器收到客户端断开连接的请求后,服务器不能立即断开连接,因为可能服务器端还有数据未发送完成,所以只能回复一个ACK表示我已收到消息;等服务器端数据发送完成之后再发送一个FIN希望端开连接的消息,客户端回复ACK之后,就可以安全断开了
我:本身HTTP协议是不保存状态的,自身不对请求和响应直接的通信状态进行保存,所以是无状态的协议。因为在有些场景下我们需要保存用户的登录信息,所以引入了cookie来管理状态。客户端第一次请求服务器的时候,服务器会生成cookie添加在响应头里面,以后客户端的每次请求都会带上这个cookie信息。
我:
Set-Cookie
字段向客户端设置Cookie,属性:
我:
我:(毛线啊,我只是个来面试Java的初级程序员,干嘛要反复拿Http来摩擦我呢?!不过没事,我皮的很,这道题我又会)
我:在HTTP协议的早期,每进行一次HTTP通信就要断开一次tcp连接,当时传输的内容少还能接受,现在每个网页一般的会包含大量的图片,每次请求都会造成TCP连接的连接和断开,增加通信的开销。
为了解决这个问题所以想出了持久连接的方法,也叫做keep-alive,只要一端没有提出断开连接就会一直保持TCP连接的状态。持久化连接使的客户端可以同时并发发送多个请求,不用一个接着一个的等待响应。
我:HTTP请求头有个Range字段;我们下载文件的时候如果遇到网络中断,如果重头开始下载会浪费时间,所以我们可以从上一次中断处继续开始下载;具体的操作:
Range: bytes=5001-10000
或者指定5001以后的所有数据
Range: bytes=5001-
响应返回的状态码是206
我:(面试官我简历上忘记写了,我曾经是学霸,记忆力好,背书没输过)
我:HTTP的状态码主要分为了四类:
常见的状态码有: 200(请求正常处理完成)、204(请求处理成功,但是没有资源返回)、206(表示客户端进行了范围请求,响应报文中包含了Content-Range)、301(永久性重定向,请求的资源以及被分配到了新的地址)、302(临时重定向,希望用户并且请求新地址)、400(客户端请求报文出现错误,通常是参数错误)、401(客户端未认证错误)、403(没有权限访问该资源)、404(未找到请求的资源)、405(不支持该请求方法,如果服务器支持GET,客户端用POST请求就会出现这个错误码)、500(服务器异常)、503(服务器不能提供服务)
我:(这我都能记住,是不是的给我点个赞)(已疯狂暗示兄弟们点赞,不要白嫖哦)
我:报文的类型分为了请求报文和响应报文两种;
请求报文包含三部分:
我:Http的问题
我:首先需要说到两种加密机制
由于这两个加密的特别,HTTPS采用的时候混合加密机制,在交换密钥的阶段使用的是非对称加密,在建立通信交换报文阶段采用的是对称加密
以访问 https://silently9527.cn 举例
我:虽然https是可以加密的,但是因为请求还是可以被拦截,如何让客户端知道返回给自己的公钥是真实服务器给的而不是***者给的;这就需要验证证书的合法性,所以需要引入第三方认证机构。通常https的证书需要到第三方机构去申请购买,如果是我们自己生成的https证书浏览器验证不过会弹出警告。
我:浏览器在向证书认证中心验证证书的过程使用的也是非对称加密,这里想要让公钥能够安全的转交给客户端,是非常困难的,所以浏览器的开发商通常会在浏览器内部植入常用认证机构的公开密钥
能撑到现在,你自己都忍不住自己给自己点个赞了!(再次暗示点赞)
本篇面试故事纯属虚构,请大家不要当真,玩笑归玩笑,莫拿面试开玩笑。
文中或许会存在或多或少的不足、错误之处,有建议或者意见也非常欢迎大家在评论交流。
最后,白嫖不好,创作不易,希望朋友们可以点赞评论关注三连,因为这些就是我分享的全部动力来源
标签:自己 四次挥手 href res 温习 驱动 http通信 sessionid 精通
原文地址:https://blog.51cto.com/15049004/2568352