已经发到程序员的灰色小公众号了前端问题。是的,了解浏览器的工作原理,对你的工作有帮助;了解TCP/IP、HTTP等网络协议,对你以后的职业发展大有裨益。下面,我总结了4个面试中经常考到的关于浏览器和网络通信的问题,为大家重新梳理了浏览器、网络通信、页面渲染、JavaScript、浏览器安全等知识点,让你看懂整个前端——端和后端系统。有了全新的认识。第一个问题:为什么Chrome打开一个页面,有4个进程?学习并掌握:浏览器中的网络流程、页面渲染流程、JavaScript执行流程、Web安全理论。把问题扩展一下,理解多进程架构:多进程架构学习进程和线程的概念混淆了。比如在计算中,单线程就是一个计算一个计算,而多线程就是同时处理多个计算。多线程是指一个程序包含多个执行流,即一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行。单线程是程序中的一个执行流程。每个线程都有自己专用的寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同一个函数。多线程也是程序,所以线程需要占用内存,线程越多占用内存越大,多线程需要协调和管理,所以需要CPU时间来跟踪线程;线程之间访问共享资源会相互影响,必须解决争用共享资源的问题;线程太多会导致控制过于复杂。单线程在执行程序的时候,它走的程序都是有顺序的,前面的一定要处理好,后面的才会执行。多线程运行是指一个进程中有多个相对独立、特定的任务在竞争CPU执行。宏观上看是并发,但实际上是分时执行,只是执行时间片短。每个运行的程序都是一个进程,其中至少包含一个线程。这个线程称为主线程,是在程序开始执行main函数时创建的。只有一个主线程的程序称为单线程程序。具有多个线程的程序称为多线程程序。进程是程序开始运行时的进程。进程包括正在运行的程序和程序使用的内存和系统资源(一个进程由多个线程组成)。多线程的好处是可以提高CPU利用率,在多线程程序中,如果一个线程必须等待,CPU可以运行其他线程而不是等待,这样可以大大提高程序的效率。因此,线程不能单独存在,它是由进程启动和管理的,进程是程序的运行实例。线程依附于进程,在一个进程中使用多线程并行处理可以提高计算效率。进程中的数据在线程之间共享。当一个进程关闭时,操作系统会回收该进程占用的内存。目前的多进程架构浏览器Chrome包括一个浏览器主进程、一个GPU进程、一个网络进程、多个渲染进程和多个插件进程。那么,打开一个页面,为什么会有4个进程呢?因为打开一个页面至少需要1个网络进程、1个浏览器进程、1个GPU进程和1个渲染进程。多进程模型虽然提高了浏览器的稳定性、流畅性和安全性,但带来了更高的资源占用和更复杂的架构。所以,Chrome官方希望构建一个更内聚、松散耦合、易于维护和扩展的系统。第二个问题:TCP协议如何保证页面文件能够完整的传递给浏览器?对于网络,我们知道一个文件通常会被分成很多个数据包进行传输,数据包在传输过程中很可能会丢失或者出错。确保页面文件完整地传送到浏览器很重要。必要的。下面分别介绍这三个方面:数据包是如何传递给主机的,主机是如何将数据包传递给应用程序的,数据是如何完整地传递给应用程序的。数据包从主机A发送给主机B,数据包会附在主机B上。主机A本身的IP地址信息,这些附加信息会被加载到IP头(包括IP版本、源IP地址、目标IP地址、存活时间等),也就是我们一般理解的,下面主要介绍TCP(TransmissionControlProtocol)。传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。在简化的计算机网络OSI模型中,它完成了传输层的第四层。规定的功能。用户数据报协议(UDP)是同一层内的另一个重要传输协议。在互联网协议族中,TCP层位于IP层之上,TCP->IP,中间层在应用层之下,应用层->中间层。不同主机的应用层之间往往需要可靠的、管道式的连接,但IP层并没有提供这样的流机制,而是提供不可靠的报文进行交换。为了保证不发生丢包,TCP给每个数据包一个序号,序号也保证了传送给接收端实体的数据包按顺序接收。接收实体针对成功接收的数据包发回相应的确认(ACK)。如果发送实体在合理的往返延迟(RTT)内未收到确认,则假定已收到相应的数据包。丢失并重新传输。TCP层的数据称为流数据包,称为TCP协议的分段操作:连接创建、数据传输、连接终止。那么你知道TCP是什么吗?在这一点上,大多数人应该只能说是约定。TCPTransmissionControlProtocol是TCP/IP中的主要协议之一,TransmissionControlProtocolInternetProtocol,一组用于连接Internet和大多数其他计算机网络上的主机的通信协议。协议是双方商定的做某事的格式。对于计算机,最常用于指使计算机能够相互连接和传输数据的一组规则,称为通信协议。TCP是一种面向连接的协议,它在主机之间建立并保持虚拟连接,直到交换消息或由运行在其上的应用程序交换消息。数据包是TCP/IP网络中最基本的数据传输单位。TCP运行在传输层,负责维护整个网络端到端的可靠通信。IP是网络层协议,是传输层的下一层。传输层运行:UDP(用户数据报协议)、RTP(实时传输协议)、SCTP(流控制传输协议)。连接创建TCP使用三次握手过程来创建连接三次握手协议:a.客户端向服务器发送一个SYN包,请求主动打开。该报文携带客户端为本次连接请求设置的随机数A作为报文序号。b.服务器收到SYN报文后,将报文放入SYN队列,并发回SYN/ACK。ACK的确认码应该是A+1,SYN/ACK包本身携带一个随机生成的序号B。c.客户端收到SYN/ACK包后,发送ACK包。数据包序号设置为A+1,ACK的确认码为B+1。服务器收到ACK包后,从SYN队列中取出请求帧,放入ACCEPT队列中。场景:服务端收到客户端发送的SYN并返回SYN-ACK后,客户端下线,服务端没有收到客户端返回的ACK,此时连接处于中间状态,失败了没有'也不会失败。但是,如果服务器在一定时间内没有收到TCP,就会重新发送SYN-ACK。当主机收到一个TCP数据包时,它使用两端的IP地址和端口号来识别这个TCP数据包属于哪个会话。使用一张表来存储所有的会话,表中的每一项称为TCB。tcb结构的定义包括:用于连接的源端口、目的端口、目的ip、序列号、响应序列号、对端窗口大小、本方窗口大小、tcp状态、tcp输入/输出队列、应用层输出队列、tcp重传相关变量等服务器端的连接数是无限的,只受内存限制。数据传输在每个TCP报文段中都有一对序列号和确认号。TCP报文的发送方称自己的字节流编号为序号,称从对方收到的字节流编号为确认号。通过使用序列号和确认号,TCP层可以将接收到的报文段中的字节按正确的顺序传送到应用层。TCP协议使用序列号来标识每一端发送的字节的顺序。从另一端接收数据可以重建顺序,而不用担心乱序传递或传输数据包丢失。发送确认包acks,携带接收方发送的字节流的编号(确认号),告诉对方已成功接收到的数据流的字节位置。上图描述了数据传输的过程图数据包结构我们来看一下数据包结构图:包括:偏移字节、源连接端口、目的连接端口、序号、确认号、校验和、紧急指针等。.源连接端口,16位长,标识发送连接端口目的连接端口,16位长,标识接收连接端口序号(seq,32位长)确认号(ack,32位长),数据开头expectedtoreceived序列号,即接收数据的字节长度加上1个数据偏移量(4位长),以4字节为单位计算的数据段起始地址的偏移值。保留,必须设置为0ACK—1表示确认号字段有效SYN—1表示这是一个连接请求或连接接受请求,用于创建连接和同步序号FIN—1表示发送方没有数据要传输,请求释放连接RST-1表示发生严重错误。可能需要重新创建TCP连接。它还可以用于拒绝非法报文段和拒绝连接请求。紧急指针(16位长)——本报文段(WIN,16位长)紧急数据最后一个字节的序号窗口——表示从机确认号初始,本报文的发送方可以接收的字节数,即接收窗口的大小。流量控制校验和(Checksum,16位长度)——以16位字计算整个TCP段,包括TCP报头和TCP数据。这是一个必填字段,要记住IP是将数据包发送到目标主机,然后数据包到达主机。那么如何将数据包传递给应用程序呢?UDP用于向应用程序传送数据包。UDP是在IP的基础上发展起来的一种可以处理应用程序的协议。用户数据包协议决定将数据包发送给哪个程序。IP只负责将数据包传送给另一台计算机。我们先看一下UDP协议和TCP协议在TCP/IP体系中的位置:看完了位置,我们简单比较一下UDP和TCP:UDP:无连接;支持一对一、一对多、多对一和多对多的交互通信;应用层下发的数据包直接打包;尽力交付,即不可靠;没有流量控制和拥塞控制;标头开销小,只有8个字节。TCP:面向连接;每个TCP连接只能有两个端点EP,只能一对一通信;面向字节流;可靠传输,使用流量控制和拥塞控制;标头中最少20个字节,最多60个字节。再来看看UDP和TCP头的开销对比:UDP最重要的一点就是端口号,因为UDP是通过端口号把数据包分发给正确的程序。UDP不能保证数据的可靠性,但传输速度快。重要的解释是:数据是如何完整地交付给应用程序的?TCP是将数据完整地交付给应用程序。TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,提供重传机制,引入数据包排序机制(TCP头,提供排序后的序号,用于按序号重新排列数据包).说到TCP连接,就要说说经常被采访建立连接的TCP/IP的三次握手;挥手四次以断开连接。三次握手示意图:三次TCP握手完成:女朋友发给男朋友:“Areyouthere?”男友回复女友:“我是!”女友回复男友:“知道了!”向上。四挥手图片:完整的四挥手:女朋友发给男朋友:“分手!”男友回复女友:嗯?男友回复女友:“认真的?”女友回男友:认真!就在这时,女友删除了男友的微信。根据我描述的三向握手和四向挥手,相信你明白了,哈哈!第三个问题:HTTP请求流程,为什么很多网站第二次打开速度很快?说到HTTP协议,它是建立在TCP连接基础上的超文本传输??协议,HTTP是分布式、协作和超媒体信息系统的应用层协议,HTTP是万维网数据通信的基础。有人说:要想学好浏览器,必须对HTTP有深刻的理解。浏览器使用HTTP协议作为应用层协议封装请求的文本信息,并使用TCP/IP作为传输层协议发送到网络(http的内容是通过TCP的数据传输阶段实现的)。域名与IP地址的映射关系,将域名映射到IP的系统称为“域名系统”,简称DNS。域名系统DNS是Internet的一项服务。作为一个将域名和IP地址相互映射的分布式数据库,可以让人们更方便地访问互联网。域名如:dadaqianduan.cn(网址地址)IP地址:xx.233.xxs.12(访问)首先,浏览器会请求DNS返回第一步域名对应的IP,浏览器也会提供DNS数据缓存服务,如果某个域名已经被解析过,浏览器会将解析后的结构缓存起来,在下次查询时直接使用,减少一次网络请求。获取到IP后,还需要获取端口号。如果url没有明确标明端口号,HTTP协议默认80端口,此时就清楚了,IP和端口号。那么说一下对HTTP协议的描述,为了更好的理解,在这里加上:HTTP是客户端和服务器之间请求和响应的标准,通常使用TCP协议,通过使用网页浏览器,web爬虫或其他工具,客户端向服务器指定端口发起HTTP请求,默认端口为80。一些资源存储在响应服务器上,如HTML文件和图片等,源服务器;(客户端称为用户代理程序),用户代理和源服务器之间可能有多个“中间层”,如代理服务器、网关、隧道等,因此,HTTP服务器监听客户端的请求港口。一旦收到请求,服务器会向客户端返回一个状态,如:“HTTP/1.1200OK”,以及返回的内容,如请求的文件、错误信息或其他信息。这里先回答一下:浏览器发起一个HTTP请求流程:1.Buildtherequest(构建请求行信息);2.找到缓存(浏览器缓存是在本地保存一份资源,下次请求时直接使用的一种方式3.准备IP地址和端口;4.等待TCP队列;5.建立TCP连接;6.发送HTTP请求,然后服务器处理请求,服务器返回请求,连接断开,其实端口和IP地址准备好后,不需要直接建立TCP连接,因为有Chrome中的机制,即同一个域名最多可以同时建立6个TCP连接,如果同一个域名下同时有10个请求发生,那么就有4个请求进入队列等待状态,如果请求数小于6,直接去建立TCP连接。发送HTTP请求上面已经讲过了,那么浏览器是如何向服务器发送请求信息的呢?这里是post请求的图片抓包:这里是浏览器向服务器发送请求接收返回的过程:说明:用户在浏览器中输入请求的url地址,浏览器内部的核心代码会对url进行拆分解析。最后将域名发送给DNS服务器,DNS服务器会根据域名查询对应的ip地址,从而将IP地址返回给浏览器。一旦浏览器有了IP地址,它就会知道请求发送到哪里。通过(局域网、交换机、路由器、骨干网)到达服务器。经常了解HTTP的朋友应该能理解上面的表达方式,那么我们再来看一下HTTP请求数据格式(见上图->一个post请求抓包图):HTTP请求数据格式:浏览器首先发送请求行到服务器(请求方法;请求URI;HTTP协议版本)——告诉服务器浏览器需要什么资源,常见的请求方式是GET,请求头(用来告诉浏览器的一些基本信息——浏览器使用的操作系统浏览器,浏览器Kernel等信息,以及当前请求的域名信息,浏览器cookie信息等),请求体(比如常用的POST,用来向服务器发送一些数据,准备好的数据通过请求正文发送)。服务器处理HTTP请求流程:返回请求;断开;重定向。查看返回的请求数据,-i,获取返回的响应行(包括协议版本和状态码)、响应头、响应体数据。一般来说,当服务器向客户端返回请求数据时,TCP连接必须关闭。但是在头信息中加入了这个字段:Connection:Keep-Alive,这样TCP连接就保持连接状态,同一个TCP连接可以继续发送请求,可以节省下一次请求建立连接所需的时间.其实一般都是请求返回,连接就没了,但是有一种是你在浏览器打开url,发现最后的页面地址不一样,那是因为有重定向操作。如图:-I表示只需要获取响应头的location字段和响应行数据时的重定向地址;状态码301和302的区别是301MovedPermanently所请求的资源已经被永久移动到一个新的位置,任何未来对这个资源的请求的所有引用都应该使用这个响应返回的几个URI之一。如果可能,具有链接编辑功能的客户端应自动将请求的地址更改为从服务器返回的地址。除非另有说明,否则此响应也是可缓存的。302Found请求的资源现在暂时响应来自不同URI的请求。由于这种重定向是暂时的,客户端应该继续向原始地址发送未来的请求。仅当在Cache-Control或Expires中指定时,响应才可缓存。字面区别:301是永久重定向,302是临时重定向。302重定向是临时重定向。搜索引擎将抓取新内容并保留旧地址。因为服务器返回302,搜索引擎认为ThenewURListemporary。301重定向是永久重定向。在抓取新内容的同时,搜索引擎也会用重定向的URL替换旧的URL。接下来我们来整理一下HTTP版本号,相信大家在学习过程中都想知道。HTTP/0.9:已过时。只支持GET请求方式,只能请求访问HTML格式的资源。通信中没有指定版本号,不支持请求头。HTTP/1.0:这是HTTP协议的第一个版本,在通信中指定了版本号,增加了请求方法POST和HEAD;不再局限于0.9版本的HTML格式,可以根据Content-Type支持多种数据格式;包括状态码、多字符集支持、多部分类型、授权、缓存、内容编码等。1.0版本:每个TCP连接只能发送一个请求。当服务器响应时,连接将被关闭,下一次请求需要重新建立TCP连接。HTTP/1.1:默认使用持续连接(TCP连接默认不关闭,可以多次请求,无需声明Connection:keep-alive即可复用),可以很好的配合代理服务器使用。一个TCP连接可以允许多个HTTP请求。添加管道机制。在同一个TCP连接中,允许同时发送多个请求,提高了并发度,进一步提高了HTTP协议的效率。1.1版本规定不能使用Content-Length字段,而使用“chunkedtransferencoding”——只要请求或响应头信息中有Transfer-Encoding字段,就表示响应将由一个未指定的数字组成的数据块。Transfer-Encoding:chunked增加了PUT、PATCH、OPTIONS、DELETE等请求方法。Chunked传输编码:是超文本传输??协议中的一种数据传输机制,允许web服务器向客户端应用程序发送HTTP数据被分割成Multiple-part,chunkedtransfer-encoding仅在HTTP协议(HTTP/1.1)1.1版本中可用。在同一个TCP连接中,所有的数据通信都是按顺序进行的。如果响应慢,就会有很多请求排队,造成“队头拥堵”。HTTP/2:2015年5月正式作为互联网标准发布,增加了双工模式,即不仅客户端可以同时发送多个请求,服务端也可以同时处理多个请求,解决了队头拥堵问题。采用多路复用技术,同一个连接可以并发处理多个请求,并发请求数比HTTP1.1大几个数量级。增加服务端推送功能,服务端主动向客户端发送数据,无需请求。HTTP1.1和HTTP1.0协议的区别:缓存处理带宽优化和网络连接在网络中使用错误通知管理消息来维护互联网地址的安全性和完整性lastandlast,secondsite为什么打开这么快?原因是在第一次加载页面的过程中缓存了一些耗时的数据。主要缓存包括DNS缓存和页面资源缓存。浏览器缓存当第一次发送请求,服务器返回一个HTTP响应头给浏览器时,浏览器会通过响应头中的CacheControl字段来设置是否缓存资源。通常,还需要设置一个缓存时间,Cache-Control:Max-age=2000。如果缓存没有过期,则在发送请求请求资源时,缓存中的资源会直接返回给浏览器。如果缓存过期,浏览器会继续发起网络请求。盲区:问题4:输入网址显示页面会发生什么?简单来说:浏览器主进程提交url给网络进程,网络进程请求服务器,返回响应头行,判断是否需要重定向网络进程提交该页面类型的响应资源到渲染过程。渲染过程结束,加载完成。简单来说,步骤如下:首先,域名解析,建立TCP链接,建立Http请求,服务器处理Http请求。关闭TCP连接。页面的步骤https://github.com/webVueBlog...文末留给大家一道面试题,也就是上面说的:“从输入URL到显示页面,什么是中间送的?”这个问题,如果采访你,你会怎么回答?如果你是面试官,你应该测试哪些点?阅读数据浏览器的工作原理和实践https://time.geekbang.org/col...综上所述,以上就是我今天要讲的内容。本文简单介绍Chrome流程,梳理TCP和HTTP协议,了解三次握手。感谢您阅读。如果您觉得本文对您有帮助,欢迎分享给更多的朋友。喜欢本文的朋友,欢迎关注,观看更多精彩内容
