本人方向为前端,从八月份准备到九月份面试到十月份拿到满意的offer,前先后后大概两个月,期间面试了不少互联网公司,在面试中发现基础占了80%,项目和其余占了20%,如今面试结束了,想系统的把前端常见的面试问题整理一下,主要分为计算机网络与HTTP,HTML5,CSS3,算法,其余面试遇到的问题这几个类别,方便本身之后查阅复习也能够给别人参考,尚未写完,目前正在补充中,地址: https://github.com/wangfengyu...
TCP/IP是一个协议族,是一组不一样层次上的多个协议的组合,一般可分为4层协议系统,每组负责不一样的功能html
数据链路层中的主要协议有点对点协议PPP,CSMA/CD协议,以太网802.3前端
网际层中主要协议有IP协议,地址解析协议ARP和网际控制报文协议ICMP等。git
IP协议是网际层的核心,经过路由选择将下一跳IP封装后交给网络接口层。IP 数据报是无链接服务。
ICMP是网际层的补充,能够回送报文。用来检测网络是否通畅(使用ping命令)。
ARP是经过已知IP,寻找对于主机的MAC地址。github
传输层:主要为两台主机身上的应用程序提供端到端的通讯;TCP(传输控制协议)和UDP(用户数据包协议)
二者的区别以下:web
OSI参考模型分层: 面试
模型把网络通讯的工做分为7层。1至4层被认为是低层,这些层与数据移动密切相关。5至7层是高层,包含应用程序级的数据。每一层负责一项具体的工做,而后把数据传送到下一层。由低到高具体分为:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。算法
每一层的功能和协议有:json
(1) 电路交换的三个过程
电路创建 -> 数据传输 -> 电路拆除
在通讯以前要在通讯双方之间创建一条被双方独占的物理通路(由通讯双方之间的交换设备和链路逐段链接而成)
(2) 报文交换
报文交换方式的数据传输单位是报文,报文就是站点一次性要发送的数据块,其长度不限且可变。当一个站要发送报文时,它将一个目的地址附加到报文上,网络节点根据报文上的目的地址信息,把报文发送到下一个节点,一直逐个节点地转送到目的节点。
每一个节点在收到整个报文并检查无误后,就暂存这个报文, 而后利用路由信息找出下一个节点的地址, 再把整个报文传送给下一个节点。所以,端与端之间无需先经过呼叫创建链接。
(3) 分组交换
分组交换是报文交换的一种改进,它将报文分红若干个分组,每一个分组的长度有一个上限,有限长度的分组使得每一个节点所需的存储能力下降了,分组能够存储到内存中,提升了交换速度。它适用于交互式通讯,如终端与主机通讯。浏览器
当应用程序用TCP传送数据时,数据被送入协议栈中,而后逐个经过每一层直到被看成一串比特流送入网络。其中每一层对收到的数据都要增长一些首部信息(有时还要增长尾部信息),该过程下图所示。TCP传给IP的数据单元称做 TCP报文段或简称为TCP段。IP传给网络接口层的数据单元称做 IP数据报(IP datagram)。经过以太网传输的比特流称做帧(Frame)。缓存
TCP对应的协议:
(1) FTP:定义了文件传输协议,使用21端口。
(2) Telnet:一种用于远程登录的端口,使用23端口,用户能够以本身的身份远程链接到计算机上,可提供基于DOS模式下的通讯服务。
(3) SMTP:邮件传送协议,用于发送邮件。服务器开放的是25号端口。
(4) POP3:它是和SMTP对应,POP3用于接收邮件。POP3协议所用的是110端口。
(5)HTTP:是从Web服务器传输超文本到本地浏览器的传送协议。
UDP对应的协议:
(1) DNS:用于域名解析服务,将域名地址转换为IP地址。DNS用的是53号端口。
(2) SNMP:简单网络管理协议,使用161号端口,是用来管理网络设备的。因为网络设备不少,无链接的服务就体现出其优点。
(3) TFTP(Trival File Transfer Protocal),简单文件传输协议,该协议在熟知端口69上使用UDP服务。
在 TCP/IP协议族中,链路层主要有三个目的:
IP模块发送和接收IP数据报;
为ARP模块发送ARP请求和接收ARP应答;
为RARP发送RARP请求和接收RARP应答。TCP/IP支持多种不一样的链路层协议,这取决于网络所使用的硬件。
2.1 基本概念
以太网和802.3对数据帧的长度都有一个限制,其最大值分别是1500和1492字节。链路层的这个特性称做MTU,最大传输单元。不一样类型的网络大多数都有一个上限。
当在同一个网络上的两台主机互相进行通讯时,该网络的MTU是很是重要的。可是若是两台主机之间的通讯要经过多个网络,那么每一个网络的链路层就可能有不一样的MTU。重要的不是两台主机所在网络的MTU的值,重要的是两台通讯主机路径中的最小MTU。它被称做路径MTU。
两台主机之间的路径 MTU不必定是个常数。它取决于当时所选择的路由。而选路不必定是对称的(从A到B的路由可能与从B到A的路由不一样),所以路径MTU在两个方向上不必定是一致的。
IP是TCP/IP协议族中最为核心的协议,全部的TCP、UDP、ICMP及IGMP数据都以IP数据报格式传输。IP提供不可靠、无链接的数据报传输服务。不可靠是指它不能保证IP数据报能成功地到达目的地,仅提供最好的传输服务。无链接是IP并不维护任何关于后续数据报的状态信息。
互联网上的每一个接口必须有一个惟一的Internet地址(也称做IP地址)。IP地址长 32 bit。Internet地址并不采用平面形式的地址空间,如 一、 二、 3等。IP地址具备必定的结构,五类不一样的互联网地址格式如图所示
A类地址:以0开头, 第一个字节范围:0~127(1.0.0.0 - 126.255.255.255;
B类地址:以10开头, 第一个字节范围:128~191(128.0.0.0 - 191.255.255.255;
C类地址:以110开头, 第一个字节范围:192~223(192.0.0.0 - 223.255.255.255;
10.0.0.0—10.255.255.255, 172.16.0.0—172.31.255.255, 192.168.0.0—192.168.255.255。(Internet上保留地址用于内部)
IP地址与子网掩码相与获得主机号
回环地址:
主要做用有两个:一是测试本机的网络配置,能PING通127.0.0.1说明本机的网卡和IP协议安装都没有问题;另外一个做用是某些SERVER/CLIENT的应用程序在运行时需调用服务器上的资源,通常要指定SERVER的IP地址,但当该程序要在同一台机器上运行而没有别的SERVER时就能够把SERVER的资源装在本机,SERVER的IP地址设为127.0.0.1一样也能够运行。
本地回环地址指的是以127开头的地址(127.0.0.1 - 127.255.255.254),一般用127.0.0.1来表示。
ARP协议的用途:解决同一个局域网内主机或路由器的IP地址和MAC地址的映射问题。
如今源端计算机 A ( 192.168.3.1 )要和计算机 B(192.168.3.2)通讯。在计算机 A 发送信息前, 必须首先获得计算机B的MAC地址的映射关系。
ARP 协议工做过程以下:
注意:
(1)ARP 表的内容是按期更新的,若是一条 ARP 表项好久没有使用了,则它将被从 ARP 表中删除。
(2)若是所要找的主机和源主机不在同一个局域网上, 那么就要经过ARP找到一个位于本局域网上的某个路由器的硬件地址, 而后把分组发送给这个路由器, 让这个路由器把分组转发给下一个网络, 剩下的工做就由下一个网络来作.
反向地址转换协议就是将局域网中某个主机的物理地址转换为IP地址,好比局域网中有一台主机只知道物理地址而不知道IP地址,那么能够经过RARP协议发出征求自身IP地址的广播请求,而后由RARP服务器负责回答。
工做原理:
IP提供的是尽最大努力交付的无链接服务,所以并不能解决网络层中的数据报丢失、重复、延迟或乱序等问题,为了提升IP数据报成功交付的机会, 在网络层使用ICMP(Internet Control Message Protocol:Internet控制报文协议)协议来容许主机或者路由器报告差错和异常状况.
a. ICMP就像一个更高层的协议那样使用IP协议(ICMP消息被封装在IP数据报中);然而,ICMP是IP的一个组成部分,而且全部IP模块都必须实现它。
b. ICMP用来报告错误,是一个差错报告机制。它为遇到差错的路由器提供了向最初源站报告差错的办法,源站必须把差错交给一个应用程序或采起其它措施来纠正问题。
c. ICMP报文的种类有两种: ICMP差错报告报文和ICMP询问报文;
Ping(Packet Internet Groper)分组网间探测是ICMP的一个重要应用,用来测试两个主机之间的连通性。Ping使用了ICMP回送请求与回答报文。Ping是应用层直接使用网络层ICMP的一个例子。它没有经过运输层的TCP或UDP。
实现原理为: ping向目的主机发送4个32字节长的ICMP回送请求报文,若目的主机正常工做而且响应了该ICMP回送请求报文,就将发回ICMP回送回答报文。最后可得出的统计结果为目的IP地址,发送的,收到的和丢失的分组数,及往返时间的最小值、最大值和平均值。
Traceroute(Linux)/tracert(Windows)是用来侦测主机到目的主机之间所经路由状况的重要工具。
它的原理以下:
源主机首先给目的主机发送一个TTL=1的UDP数据包,而通过的第一个路由器收到这个数据包之后,就自动把TTL减1,而TTL变为0之后,路由器就把这个包给丢弃了,并同时产生”目的主机不可达”的ICMP差错报告报文给源主机。源主机收到这个数据报之后再发一个TTL=2的UDP数据报给目的主机,而后刺激第二个路由器给源主机发送差错报文。如此往复直到到达目的主机。这样,traceroute就拿到了全部的路由器IP。
传输层的主要功能:
流量控制与拥塞控制的区别:
流量控制每每是指在发送端和接收端之间的点对点通讯量的控制. 流量控制所要作的是抑制发送端发送数据的速率, 以便使接收端来得及接收;
拥塞控制必须确保通讯子网可以传送待传送的数据, 是一个全局性的问题, 涉及网络中全部的主机、路由器以及致使网络传输能力降低的全部因素.
端口:
端口就是传输层的服务访问点, 用一个16位的数字进行标标记。
端口号只具备本地意义,即端口号只是为了标志本计算机应用层中的各进程。在因特网中不一样计算机的相同端口号是没有联系的。端口的做用是让应用层的各类应用进程都能将其数据经过端口向下交付给传输层,以及让传输层知道应当将其报文段中的数据向上经过端口交付给应用层的哪一个进程。
从这个意义上讲,端口是用来标志应用层的进程;
须要注意的是:服务器端的资源是在完成第二次握手时分配的,而客户端的资源是在完成第三次握手时分配的。这就使得服务器易于受到SYN洪泛攻击。
为何须要采用三次握手?
主要是为了防止两次握手状况下已失效的链接请求报文段忽然又传送到服务端,而产生的错误。
举例以下:
客户A向服务器B发出TCP链接请求,第一个链接请求报文在网络的某个节点长时间滞留,A超时后认为报文丢失,因而再重传一次链接请求,B收到后创建链接。数据传输完毕后双方断开链接。而此时,前一个滞留在网络中的链接请求到达了服务端B,而B认为A又发来链接请求,若采用的是“两次握手”,则这种状况下B认为传输链接已经创建,并一直等待A传输数据,而A此时并没有链接请求,所以不予理睬,这样就形成了B的资源白白浪费了;但此时如果使用“三次握手”,则B向A返回确认报文段,因为是一个失效的请求,所以A不予理睬,创建链接失败。第三次握手的做用:防止已失效的链接请求报文段忽然又传送到了服务器。
TIME_WAIT状态:
若是客户端在TIME_WAIT状态不等待一段时间,而是在发送完ACK报文后当即释放链接,那么就没法收到服务器重传的FIN+ACK报文段,于是也不会再发送一次确认报文。这样,服务器就没法按照正常步骤进入CLOSED状态。
注意:服务器结束TCP链接的时间要比客户端早一些,由于客户机(最早提出close请求的一端)最后要等待2MSL后才能够进入CLOSED状态。
TCP:
UDP:
UDP没有拥塞控制,网络出现的拥塞不会使源主机的发送速率下降。
UDP支持一对1、一对多、多对一和多对多的交互通讯。
UDP的首部开销小,只有8个字节,比TCP的20个字节的首部要短。
HTTP 协议是无状态的(stateless),即不须要记忆交互的当前状态,由于过程简单。
HTTP 1.0协议是非持续链接。创建TCP链接后,一个HTTP请求过去,一个HTTP响应过来,而后就断开TCP链接。不一样于HTTP/1.0,HTTP/1.1 协议使用持续链接。
HTTP 使用了面向链接的 TCP 向上提供的服务。
请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1。
根据HTTP标准,HTTP请求可使用多种请求方法。
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:
User-Agent:产生请求的浏览器类型。
Accept:客户端可识别的内容类型列表。
Host:请求的主机名,容许多个域名同处一个IP地址,即虚拟主机。
最后一个请求头以后是一个空行,发送回车符和换行符,通知服务器如下再也不有请求头。
请求数据不在GET方法中使用,而是在POST方法中使用。POST方法适用于须要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。
状态码 | 英文名称 | 中文描述 |
---|---|---|
100 | Continue | 继续。客户端应继续其请求 |
101 | Switching Protocols | 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议 |
200 | OK | 请求成功。通常用于GET与POST请求 |
204 | No Content | 无内容。服务器成功处理,但未返回内容。在未更新网页的状况下,可确保浏览器继续显示当前文档 |
206 | Partial Content | 部份内容。服务器成功处理了部分GET请求 |
301 | Moved Permanently | 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。从此任何新的请求都应使用新的URI代替 |
302 | Found | 临时移动。与301相似。但资源只是临时被移动。客户端应继续使用原有URI |
304 | Not Modified | 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端一般会缓存访问过的资源,经过提供一个头信息指出客户端但愿只返回在指定日期以后修改的资源 |
400 | Bad Request | 客户端请求的语法错误,服务器没法理解 |
401 | Unauthorized | 请求要求用户的身份认证 |
403 | Forbidden | 服务器理解请求客户端的请求,可是拒绝执行此请求 |
404 | Not Found | 服务器没法根据客户端的请求找到资源(网页)。经过此代码,网站设计人员可设置"您所请求的资源没法找到"的个性页面 |
500 | Internal Server Error | 服务器内部错误,没法完成请求 |
502 | Bad Gateway | 充当网关或代理的服务器,从远端服务器接收到了一个无效的请求 |
503 | Service Unavailable | 因为超载或系统维护,服务器暂时的没法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中 |
504 | Gateway Time-out | 充当网关或代理的服务器,未及时从远端服务器获取请求 |
505 | HTTP Version not supported | 服务器不支持请求的HTTP协议的版本,没法完成处理 |
首部字段名 | 说明 |
---|---|
Cache-Control | 控制缓存的行为 |
Connection | 逐跳首部、链接的管理 |
Date | 建立报文的日期时间 |
Pragma | 报文指令 |
Transfer-Encoding | 指定报文主体的传输编码方式 |
Accept | 表明发送端(客户端)但愿接受的数据类型,如application/json、text/plain、text/html、image/jpeg、application/msword、image/png、application/pdf |
Accept-Charset | 优先的字符集 |
Accept-Encoding | 优先的内容编码 |
Accept-Language | 优先的语言 |
Host | 指定资源所在服务器 |
If-Match | 比较实体标记(ETag) |
If-Modified-Since | 比较资源的更新时间 |
If-None-Match | 比较实体标记(与If-Match相反) |
Referer | 对请求中URI的原始获取方 |
User-Agent | Http客户端程序的信息 |
Accept-Range | 是否接受字节范围请求 |
ETag | 资源的匹配信息 |
Location | 另客户端重定向至指定URI |
Server | Http服务器的安装信息 |
Vary | 代理服务器缓存的管理信息 |
在HTTP/1.0中,默认使用的是短链接。
从 HTTP/1.1起,默认使用长链接,用以保持链接特性。使用长链接的HTTP协议,会在响应头有加入这行代码:Connection:keep-alive在使用长链接的状况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的 TCP链接不会关闭,若是客户端再次访问这个服务器上的网页,会继续使用这一条已经创建的链接。Keep-Alive不会永久保持链接,它有一个保持时间,能够在不一样的服务器软件(如Apache)中设定这个时间。实现长链接要客户端和服务端都支持长链接。
HTTP协议的长链接和短链接,实质上是TCP协议的长链接和短链接。
短链接的操做步骤是:
创建链接——数据传输——关闭链接…创建链接——数据传输——关闭链接
长链接的操做步骤是:
创建链接——数据传输…(保持链接)…数据传输——关闭链接
参考文章: HTTP/2 头部压缩技术介绍
目前经常使用的加密算法主要分红对称加密算法与非对称加密算法
对称加密算法
发送方和接收方须要持有同一把密钥,发送消息和接收消息均使用该密钥。
相对于非对称加密,对称加密具备更高的加解密速度,但双方都须要事先知道密钥,密钥在传输过程当中可能会被窃取,所以安全性没有非对称加密高。
非对称加密算法
接收方在发送消息前须要事先生成公钥和私钥,而后将公钥发送给发送方。发送放收到公钥后,将待发送数据用公钥加密,发送给接收方。接收到收到数据后,用私钥解密。在这个过程当中,公钥负责加密,私钥负责解密,数据在传输过程当中即便被截获,攻击者因为没有私钥,所以也没法破解。非对称加密算法的加解密速度低于对称加密算法,可是安全性更高。
参考文章: