你好,是我琉忆,欢迎您来到 PHP 面试专栏。本周(2019.2-25 至 3 -1)的一三五更新的文章如下:
周一:PHP 面试常考之会话控制周三:PHP 面试常考之网络协议周五:PHP 面试常考题之会话控制和网络协议
送 2 本书:《PHP 程序员面试笔试真题解析》
自己整理了一篇面试最爱问的一道题“从网址输入到看到内容背后的流程是什么样的?”的文章,关注公众号:“琉忆编程库”,回复:“http”,我发给你。
以下正文的内容来自《PHP 程序员面试笔试宝典》书籍,如果转载请保留出处:
一、协议和 TCP/IP
在 20 世纪 80 年代,计算机网络诞生,它能够将一台台独立的计算机互相连接,使得位于不同地理位置的计算机之间可以进行通信,实现信息传递和资源共享,形成一组规模大、功能强的计算机系统。不过,计算机要想在网络中正常通信,必须遵守相关网络协议的规则,常用的网络协议有 TCP、UDP、IP 和 HTTP 等。
协议
协议可简单理解为计算机之间的一种约定,好比人与人之间对话所使用的语言。在国内,不同地区的人讲的方言都不同,如果要沟通,就要约定一种大家都会的语言,例如全国通用的普通话,普通话就相当于协议,沟通相当于通信,说话内容相当于数据信息。协议需要具备通用的特征,但在早期,每家计算机厂商都根据自己的标准来生产网络产品,这使得不同厂商制造的计算机之间难以通信,严重影响了用户的日常使用。为了应对这些问题,ISO(国际标准化组织)制定了一套国际标准 OSI(开放式系统互联通信参考模型),将通信系统标准化。所谓标准化是指建立技术标准,企业按照这个标准来制造产品,这大大提升了产品的兼容性、互操作性以及易用性。
OSI 参考模型将复杂的协议分成了 7 层(见下表),每一层各司其职,并且能独立使用,这相当于软件中的模块化开发,有较强的扩展性和灵活性。分层是一种管理哲学,将同一类功能的网络协议分到一层中,使协议变得灵活可控。
在 7 层 OSI 模型中,发送方从第 7 层的应用层到第 1 层的物理层,由上至下按顺序传输数据,而接收方则从第 1 层到第 7 层,由下至上接收数据,如右图所示。
TCP/IP
TCP/IP 是为互联网服务的协议族,它是网络通信协议的统称,由 IP、TCP、HTTP 和 FTP 等协议组成。TCP/IP 将通信过程抽象为 4 层,被视为简化的 OSI 参考模型(如右图所示,左边是 OSI 参考模型,右边是 TCP/IP 的模型),但负责维护这套协议族的不是 ISO 而是 IETF(互联网工程任务组)。TCP/IP 在标准化过程中注重开放性和实用性,需要标准化的协议会被放进 RFC(Request For Comment)文档中,RFC 文档详细记录了协议的实现、运用和实验等各方面的内容,并且这些文档可在线浏览。
发送的数据会在分层模型内传递,并且每到一层,就会附加该层的包首部,包首部包含了该层协议的相关信息,例如 MAC 地址、IP 地址和端口号。下图描绘了从传输层到互联网层,分别附加了 TCP 包首部和 IP 包首部。
互联网一词现在已经家喻户晓,它是由许多网络互联构成的一个巨型网络。早期的网络仅仅是连接计算机,而现代的互联网连接的却是全世界的人。互联网已经不再是单纯的以数据为核心,而是以人为中心,渗透到生活中的方方面面,颠覆了许多传统模式,例如足不出户就能购物、社交或娱乐。
自己整理了一篇面试最爱问的一道题“从网址输入到看到内容背后的流程是什么样的?”的文章,关注公众号:“琉忆编程库”,回复:“http”,我发给你。
二、HTTP
HTTP(HyperText Transfer Protocol)即超文本传输协议,是一种获取网络资源(例如图像、HTML 文档)的应用层协议,它是互联网数据通信的基础,由请求和响应构成(如右图所示)。通常,客户端发起 HTTP 请求(在请求报文中会指定资源的 URL),然后用传输层的 TCP 协议建立连接,最后服务器响应请求,做出应答,回传数据报文。HTTP 自问世到现在,经历了几次版本迭代,目前主流的版本是 HTTP/1.1,新一代 HTTP/2.0 是 HTTP/1.1 的升级版,各方面都超越了前者,但新技术要做到软硬件兼容还需要假以时日。
HTTP 协议有三个特征,分别是持久连接、管道化以及无状态。
(1)持久连接在 HTTP 的早期版本中,一次 HTTP 通信完成后就会断开连接,下一次再重新连接,如右图所示。在当时请求资源并不多的情况下,并不会造成大问题。但随着 HTTP 的普及,请求的资源越来越庞大,例如一个 HTML 文档中可能会包含多个 CSS 文件、JavaScript 文件、图像甚至视频,如果还这么操作,会造成巨大的通信开销。
为了解决上述问题,提出了持久连接,只要通信两端的任意一端没有明确提出断开,就保持连接状态,以便下一次通信复用该连接,这避免了重复建立和断开连接所造成的开销,加速了页面呈现,如下图所示。
(2)管道化管道化是建立在持久连接上的进一步性能优化。过去,请求必须按照先进先出的队列顺序,也就是发送请求后,要等待并接收到响应,才能再继续下一个请求。启用管道化后,就会将队列顺序迁移到服务器,这样就能同时发送多个请求,然后服务器再按顺序一个接一个地响应,如下图所示。
(3)状态管理 HTTP 是一种无状态协议,请求和响应一一对应,不会出现两个请求复用一个响应的情况(如下图所示)。也就是说,每个请求都是独立的,即使在同一条连接中,请求之间也没有联系。
在有些业务场景中,需要请求有状态,例如后台登录。成功登录后就得保存登录状态,否则每次跳转进入其他页面都会要求重新登录。为了能管理状态,引入了 Cookie 技术,Cookie 技术能让请求和响应的报文都附加 Cookie 信息,客户端将 Cookie 值发送出去,服务器接收并处理这个值,最终就能得到客户端的状态信息。
预告:本周五更新 PHP 面试常考题之会话控制和网络协议,敬请期待。
以上内容摘自《PHP 程序员面试笔试宝典》书籍,该书已在天猫、京东、当当等电商平台销售。
更多 PHP 相关的面试知识、考题可以关注公众号获取:琉忆编程库
对本文有什么问题或建议都可以进行留言,我将不断完善追求极致,感谢你们的支持。