面经总结2(http/https,计算机网络相关的其他东西)

Posted Zephyr丶J

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面经总结2(http/https,计算机网络相关的其他东西)相关的知识,希望对你有一定的参考价值。

面经总结2(http/https,计算机网络相关的其他东西)

网络模型与相关协议:

OSI七层模型:
1.物理层:建立、维护、断开物理连接,透明的传输比特流,为数据段设备提供传输数据通路,传输单位是比特
2.数据链路层:将网络层传输下来的IP数据报封装成帧,建立节点间的数据链路,在两个相邻结点之间的链路上“透明的”传输帧中的数据,传输单位是帧(framing),每一帧包括数据和必要的控制信息(如同步信息、地址信息、差错控制等)。典型的帧长是几百字节到一千多字节
注意:”透明”是一个很重要的术语。它表示,某一个实际存在的事物看起来却好像不存在一样。”在数据链路层透明传送数据”表示无论什么样比特组合的数据都能够通过这个数据链路层。因此,对所传送的数据来说,这些数据就“看不见”数据链路层。或者说,数据链路层对这些数据来说是透明的:
(1) 在接收数据时,控制信息使接收端能知道一个帧从哪个比特开始和到哪个比特结束。这样,数据链路层在收到一个帧后,就可从中提取出数据部分,上交给网络层。
(2) 控制信息还使接收端能检测到所收到的帧中有无差错。如发现有差错,数据链路层就简单地丢弃这个出了差错的帧,以免继续传送下去白白浪费网络资源。如需改正错误,就由运输层的TCP协议来完成。
3.网络层:将传输层传下来的报文段封装成分组,选择合适的路由,实现不同网络间的路径选择,使得分组能够交付到目的主机,协议:IP、ICMP、IGMP、ARP、RARP、OSPF,传输单位是分组/包/IP数据报/数据报
4.传输层:负责主机中两个进程的通信,定义传输数据的协议端口号,提供流量控制、差错校验、服务质量管理等,传输单位是报文段(TCP)或者用户数据报(UDP),协议TCP、UDP
由于一个主机可同时运行多个进程,因此运输层有复用和分用的功能:
​ a. 复用,就是多个应用层进程可同时使用下面运输层的服务。
​ b. 分用,就是把收到的信息分别交付给上面应用层中相应的进程。
会话层:不同主机上各进程间的对话,管理主机间的会话进程,建立、管理、终止会话,指本地主机与远程主机正在进行的会话
表示层:数据的表示、安全、压缩。负责处理在两个内部数据表示结构不同的通信系统之间交换信息的表示格式,为数据加密和解密以及为提高传输效率提供必需的数据压缩以及解压等功能。
应用层:提供系统和用户的接口,协议:FTP、SMTP、HTTP、HTTPS、DNS、TELNET、DHCP、POP3
应用层的信息分组称为报文

HTTP协议和HTTPS协议

1.超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。设计 HTTP 最初的目的是为了提供一种发布和接收 html 页面的方法。它可以使浏览器更加高效。HTTP 协议是以明文方式发送信息的,如果黑客截取了 Web 浏览器和服务器之间的传输报文,就可以直接获得其中的信息。

HTTP原理
(1)客户端的浏览器首先要通过网络与服务器建立连接,该连接是通过 TCP 来完成的,一般 TCP 连接的端口号是80。 建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是 MIME 信息包括请求修饰符、客户机信息和许可内容。
(2)服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是 MIME 信息包括服务器信息、实体信息和可能的内容。

2.HTTPS(Hyper Text Transfer Protocol over SecureSocket Layer)是以安全为目标的 HTTP 通道,是 HTTP 的安全版。HTTPS 的安全基础是 SSL/TLS。SSL 协议位于 TCP/IP 协议与各种应用层协议之间,为数据通讯提供安全支持。SSL 协议可分为两层:SSL 记录协议(SSL Record Protocol),它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。SSL 握手协议(SSL Handshake Protocol),它建立在 SSL 记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。

SSL,Secure Sockets Layer,安全套接层协议
TLS,Transport Layer Security,安全传输层协议,是SSL3.0以后的版本

HTTP协议的特点

五大特点:1.支持客户端/服务器模式 2.简单快捷 3.灵活 4.无连接 5.无状态

无连接含义:限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
无状态含义:指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送 HTTP 请求之后,服务器根据请求,会给我们发送数据过来,但是,发送完不会记录任何信息。

HTTP和HTTPS的区别

1.HTTPS协议需要到CA(Certificate Authority,证书颁发机构)申请证书,但是一般免费的整数很少,需要一定费用
2.HTTP是超文本传输协议,信息是明文传输,而HTTPS是具有安全性的SSL加密传输协议
3.HTTP和HTTPS采用完全不同的连接方式,HTTP端口是80,HTTPS的端口是443
4.HTTP是无连接,无状态的;HTTPS是由SSL/TLS+HTTP协议构建的可以加密传输、身份认证的网络协议,比http安全

HTTPS的优点和缺点

简单而言,优点就是比较安全,可以进行加密传输,身份认证,数据完整性校验,虽然不是绝对安全,但还是提高了中间人攻击的成本;缺点就是连接比较费时费电,使页面加载速度变慢;认证需要花一定的费用;不如http高效,会增加数据的开销和功耗;加密的范围也有限,对于一些攻击也起不到什么作用

优点
尽管HTTPS并非绝对安全,掌握根证书的机构、掌握加密算法的组织同样可以进行中间人形式的攻击,但HTTPS仍是现行架构下最安全的解决方案,主要有以下几个好处:
(1)使用HTTPS协议可认证用户和服务器,确保数据发送到正确的客户机和服务器;
(2)HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性。
(3)HTTPS是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本。
(4)谷歌曾在2014年8月份调整搜索引擎算法,并称“比起同等HTTP网站,采用HTTPS加密的网站在搜索结果中的排名将会更高”。

缺点
虽然说HTTPS有很大的优势,但其相对来说,还是存在不足之处的:
(1)HTTPS协议握手阶段比较费时,会使页面的加载时间延长近50%,增加10%到20%的耗电;
(2)HTTPS连接缓存不如HTTP高效,会增加数据开销和功耗,甚至已有的安全措施也会因此而受到影响;
(3)SSL证书需要钱,功能越强大的证书费用越高,个人网站、小网站没有必要一般不会用。
(4)SSL证书通常需要绑定IP,不能在同一IP上绑定多个域名,IPv4资源不可能支撑这个消耗。
(5)HTTPS协议的加密范围也比较有限,在黑客攻击、拒绝服务攻击、服务器劫持等方面几乎起不到什么作用。最关键的,SSL证书的信用链体系并不安全,特别是在某些国家可以控制CA根证书的情况下,中间人攻击一样可行。

对称加密、非对称加密、混合加密

1.为什么需要加密?
​因为http的内容是明文传输的,明文数据会经过中间代理服务器、路由器、wifi热点、通信服务运营商等多个物理节点,如果信息在传输过程中被劫持,传输的内容就完全暴露了,他还可以篡改传输的信息且不被双方察觉,这就是中间人攻击。所以我们才需要对信息进行加密。最简单容易理解的就是对称加密。

2.什么是对称加密?
就是有一个密钥,它可以对一段内容加密,加密后只能用它才能解密看到原本的内容,和我们日常生活中用的钥匙作用差不多。

3.只用对称加密可行吗?
如果通信双方都各自持有同一个密钥,且没有别人知道,这两方的通信安全当然是可以被保证的(除非密钥被破解)。然而最大的问题就是这个密钥怎么让传输的双方知晓,同时不被别人知道。如果由服务器生成一个密钥并传输给浏览器,那这个传输过程中密钥被别人劫持弄到手了怎么办?之后他就能用密钥解开双方传输的任何内容了,所以这么做当然不行。
​ 换种思路?试想一下,如果浏览器内部就预存了网站A的密钥,且可以确保除了浏览器和网站A,不会有任何外人知道该密钥,那理论上用对称加密是可以的,这样浏览器只要预存好世界上所有HTTPS网站的密钥就行啦!这么做显然不现实。
​ 所以我们就需要神奇的非对称加密。

4.什么是非对称加密?
有两把密钥,通常一把叫做公钥、一把叫做私钥,用公钥加密的内容必须用私钥才能解开,同样,私钥加密的内容只有公钥能解开。

5.只用非对称加密可行吗?
鉴于非对称加密的机制,我们可能会有这种思路:服务器先把公钥直接明文传输给浏览器,之后浏览器向服务器传数据前都先用这个公钥加密好再传,这条数据的安全似乎可以保障了!因为只有服务器有相应的私钥能解开这条数据
然而由服务器到浏览器的这条路怎么保障安全?如果服务器用它的的私钥加密数据传给浏览器,那么浏览器用公钥可以解密它,而这个公钥是一开始通过明文传输给浏览器的,这个公钥被谁劫持到的话,他也能用该公钥解密服务器传来的信息了。所以目前似乎只能保证由浏览器向服务器传输数据时的安全性(其实仍有漏洞,下文会说)。

混合加密
非对称加密耗时,非对称加密+对称加密结合可以吗?而且得尽量减少非对称加密的次数。当然是可以的,而且非对称加密、解密各只需用一次即可。以下就是加密过程:
(1)某网站拥有用于非对称加密的公钥A、私钥A’。
(2)浏览器像网站服务器请求,服务器把公钥A明文给传输浏览器。
(3)浏览器随机生成一个用于对称加密的密钥X,用公钥A加密后传给服务器。
(4)服务器拿到后用私钥A’解密得到密钥X。
(5)这样双方就都拥有密钥X了,且别人无法知道它。之后双方所有数据都用密钥X加密解密。

常见的加密算法

常见的对称加密算法有:DES、3DES、Blowfish、IDEA、RC4、RC5、RC6和AES
​常见的非对称加密算法有:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用);
常见的Hash算法有:MD2、MD4、MD5、HAVAL、SHA;

补充:hash算法
Hash算法是一种单向算法, 用户可以通过hash算法对目标信息生成一段特定长度的唯一的hash值,但是不能通过这个hash值重新获得目标信息。常用在不可还原的密码存储,信息完整性校验等

HTTPS证书认证过程

HTTPS在传输的过程中会涉及到三个密钥:服务器端的公钥和私钥,用来进行非对称加密;客户端生成的随机密钥,用来进行对称加密。一个HTTPS请求实际上包含了两次HTTP传输:

1.客户端要访问一个网站,发起第一个https请求,向支持https的服务器发送请求,把自己支持的加密规则发送给服务器
2.服务器从中选取一套加密算法并将自己的CA证书发送给客户端,证书中包括网站的地址,加密公钥,以及证书的颁发机构等信息
3.客户端收到证书后,验证证书的合法性,如果证书不受信会给出提示。如果证书受信的话,会生成一个随机数,用协商好的机密算法加密生成随机秘钥(对称机密的秘钥),然后用公钥加密,发起第二个https请求,发送给服务器
4.服务器收到以后,用自己的私钥将其解密,取出对称加密的秘钥,并用这个秘钥加密一段信息发送给客户端
5.然后就能通过这个公钥来发送信息

数字签名、数字证书

数字证书是指在互联网通讯中标志通讯各方身份信息的一个数字认证,人们可以在网上用它来识别对方的身份。它的出现,是为了避免身份被篡改冒充的。比如Https的数字证书,就是为了避免公钥被中间人冒充篡改

数字证书构成:
公钥和个人等信息,经过Hash摘要算法加密,形成消息摘要;将消息摘要拿到拥有公信力的认证中心(CA),用它的私钥对消息摘要加密,形成数字签名。
公钥和个人信息、数字签名共同构成数字证书。

HTTP发展历程(各版本区别)

1.HTTP0.9

最简单的只有请求行 GET index.html

2.HTTP1.0

(1)增加请求头、响应头,让请求和相应都更清晰
(2)增加状态码,让响应更清晰
(3)增加缓存功能,已请求过的内容再次请求时就可直接使用缓存

http1.0默认使用短链接,但是可以设置Connection:keep-alive,开启长链接

3.HTTP1.1

(1)持久连接,多个http请求使用同一个tcp连接,减少了tcp建立连接时的开销
(2)客户端和服务器之间可以建立多个tcp连接以解决队头阻塞的问题
(3)响应体可以分块传输,无需一次传输全部内容
(4)响应头增加content-length字段满足动态内容无法一次计算出长度和无法一次传输完成的问题
(5)增加了安全机制和cookie机制

4.HTTP2.0

(1)HTTP2.0使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大了好几个数量级。HTTP1.1也可以多建立几个TCP连接,来支持处理更多并发的请求,但是创建TCP连接本身也是有开销的。多路复用,客户端和服务器之间只建立一条tcp,每个http请求被切分成多帧,多个http的帧混合在一起在一个tcp连接上传送

(2)头部压缩:在HTTP1.1中,HTTP请求和响应都是由状态行、请求/响应头部、消息主体三部分组成。一般而言,消息主体都会经过gzip压缩,或者本身传输的就是压缩过后的二进制文件,但状态行和头部却没有经过任何压缩,直接以纯文本传输。随着Web功能越来越复杂,每个页面产生的请求数也越来越多,导致消耗在头部的流量越来越多,尤其是每次都要传输UserAgent、Cookie这类不会频繁变动的内容,完全是一种浪费。 HTTP1.1不支持header数据的压缩,HTTP2.0使用HPACK算法对header的数据进行压缩,这样数据体积小了,在网络上传输就会更快。
(3)**服务端推送:**服务端推送是一种在客户端请求之前发送数据的机制。网页使用了许多资源:HTML、样式表、脚本、图片等等。在HTTP1.1中这些资源每一个都必须明确地请求。这是一个很慢的过程。浏览器从获取HTML开始,然后在它解析和评估页面的时候,增量地获取更多的资源。因为服务器必须等待浏览器做每一个请求,网络经常是空闲的和未充分使用的。
​ 为了改善延迟,HTTP2.0引入了server push,它允许服务端推送资源给浏览器,在浏览器明确地请求之前,免得客户端再次创建连接发送请求到服务器端获取。这样客户端可以直接从本地加载这些资源,不用再通过网络。

1.1版本的时候,头信息是文本ASCII编码,数据体可以是文本或者二进制;2.0中,头信息和数据体都是二进制

5.HTTP3.0

不再使用tcp协议,因为tcp依然是顺序发送,顺序接收的,依然有队头堵塞问题,干掉tcp才能解决队头堵塞问题。google的QUIC就使用了udp协议。

HTTP长连接和短连接

HTTP协议的底层使用TCP协议,所以HTTP协议的长连接和短连接在本质上是TCP层的长连接和短连接。由于TCP建立连接、维护连接、释放连接都是要消耗一定的资源,浪费一定的时间。所对于服务器来说,频繁的请求释放连接会浪费大量的时间,长时间维护太多的连接的话又需要消耗资源。所以长连接和短连接并不存在优劣之分,只是适用的场合不同而已。长连接和短连接分别有如下优点和缺点:

长连接优点:可以节省较多的TCP连接和释放的操作,节约时间,对于频繁请求资源的用户来说,适合长连接。

长连接缺点:由于有保活功能,当遇到大量的恶意连接时,服务器的压力会越来越大。这时服务器需要采取一些策略,关闭一些长时间没有进行读写事件的的连接。

短连接优点:短连接对服务器来说管理比较简单,只要存在的连接都是有效连接,不需要额外的控制手段,而且不会长时间占用资源 。

短连接缺点:如果客户端请求频繁的话,会在TCP的建立和释放上浪费大量的时间。

​ 注意:从HTTP/1.1版本起,默认使用长连接用以保持连接特性。使用长连接的HTTP协议,会在响应消息报文段加入: Connection: keep-alive。TCP中也有keep alive,但是TCP中的keep alive只是探测TCP连接是否活着,而HTTP中的keep-alive是让一个TCP连接获得更久一点。

HTTP的缓存机制

分成强缓存和协商缓存:
强缓存:服务器通知浏览器一个缓存时间,在缓存时间内,下次请求,直接用缓存,不在时间内,执行比较缓存策略
协商缓存:让客户端和服务器之间能实现缓存文件是否更新的验证、提升缓存的复用率,将缓存信息中的Etag和Last-Modified通过请求发送给服务器,由服务器校验,返回304状态码时,浏览器直接使用缓存

简单叙述:第一次请求资源时,服务器返回资源,并在相应头中设置资源的缓存策略;
第二次请求时,浏览器判断这些请求参数,先查看是否有强缓存,如果有并且在时间范围内(没有过期),就直接读取浏览器本地的资源;当强缓存过期未命中或者响应报文Cache-Control中有must-revalidate标识必须每次请求验证资源的状态时,便使用协商缓存的方式去处理缓存文件。从缓存数据库中取出缓存的标识,然后向浏览器发送请求验证请求的数据是否已经更新,如果已更新则返回新的数据,若未更新则使用缓存数据库中的缓存数据

控制强缓存的字段有:Cache-Control(http1.1)和Expires(http1.0)
前者是相对时间,用以表达自上次请求正确的资源之后的多少秒的时间内缓存有效
后者是绝对时间,用以表达在这个时间之前发起的请求可以直接从浏览器中读取数据,而无需发起请求
前者比后者的优先级高,前者的出现是为了解决后者在浏览器时间被手动更改导致缓存判断错误、服务器和浏览器时间不一致导致的问题

协商缓存的状态码由服务器决策返回200或者304
当浏览器的强缓存实效或者请求头设置了不走强缓存,并且在请求头设置了IF-Modified-Since或者If-None-Match时,会将这两个属性值到服务器去验证是否命中协商缓存,如果命中了,返回304,加在浏览器缓存,并且响应头会设置Last-Modified和Etag
协商缓存有两组字段:Last-Modified/If-Modified-Since(http1.0)和Etag/If-None-Match(http1.1)
后一组比前一组优先级高
前者表示的是服务器的资源最后一次修改的时间,后者表示的是服务器资源的唯一标识,只要资源变化,Etag就会重新生成
前一组相比于后一组问题在于无法识别一秒内进行多次修改的情况,如果资源更新的速度施以秒以下的单位,那么缓存就不可用,因为它的时间单位最低是秒

协商缓存的过程:
在我们的请求中有这样两个字段if-modifind-since和if-none-match,两个字段分别对应着响应中的last-Modified和etag,用来对协商缓存进行判断:
​ a. 首先,如果在第一次请求中有etag和last-modified时,缓存数据库会保存这两个字段,并且在再次发起同样的请求时以if-none-match和if-modified-since发送保存的etag河last-modified数据。
​ b. 服务器收到请求后会以优先级if-none-match > if-modifind-since的顺序进行判断,如果资源的etag和if-none-match相等,即所请求的资源没有变化,此时浏览器即可以使用缓存数据库中的数据,此时http的请求状态码为304,请求的资源未变化。
​ c. 如果请求字段中没有if-none-match,就使用if-modified-since来判断。如果if-modified-since的值和所请求的资源时间一致,即所请求的资源相同,浏览器即可以使用缓存数据库中的数据。http状态码304。

304:当用户第一次请求index.html时,服务器会添加一个名为Last-Modified响应头,这个头说明了index.html的最后修改时间,浏览器会把index.html内容,以及最后响应时间缓存下来。当用户第二次请求index.html时,在请求中包含一个名为If-Modified-Since请求头,它的值就是第一次请求时服务器通过Last-Modified响应头发送给浏览器的值,即index.html最后的修改时间,If-Modified-Since请求头就是在告诉服务器,我这里浏览器缓存的index.html最后修改时间是这个,您看看现在的index.html最后修改时间是不是这个,如果还是,那么您就不用再响应这个index.html内容了,我会把缓存的内容直接显示出来。而服务器端会获取If-Modified-Since值,与index.html的当前最后修改时间比对,如果相同,服务器会发响应码304,表示index.html与浏览器上次缓存的相同,无需再次发送(节省传输成本),浏览器可以显示自己的缓存页面,如果比对不同,那么说明index.html已经做了修改,服务器会响应200。

Session和Cookie

Cookie是保存在客户端的一小块文本串的数据。客户端向服务器发起请求时,服务端会向客户端发送一个Cookie,客户端就把Cookie保存起来。在客户端下次向同一服务器再发起请求时,Cookie被携带发送到服务器。服务器就是根据这个Cookie来确认身份的。
Session指的就是服务器和客户端一次会话的过程。Session利用Cookie进行信息处理的,当用户首先进行了请求后,服务端就在用户浏览器上创建了一个Cookie,当这个Session结束时,其实就是意味着这个Cookie就过期了。Session对象存储着特定用户会话所需的属性及配置信息。

用户第一次请求服务器时,服务器根据用户提交的信息,创建对应的Session对象,该对象具有一个唯一的表示SessionID。响应时,服务器创建一个Cookie,并将此Session的唯一标识信息SessionID存入其中,返回给浏览器
客户端通过响应的cookie而持有SessionID。接收到服务器返回的SessionID信息后,会将此信息存入Cookie中,同时Cookie记录此SessionID是属于哪个域名。
当用户第二次访问服务器时,请求会自动判断此域名下是否存在Cookie信息,如果存在,则自动将Cookie信息也发送给服务端,服务端会从Cookie中获取SessionID,再根据 SessionID查找对应的 Session对象,如果没有找到,说明用户没有登录或者登录失效,如果找到Session证明用户已经登录可执行后面操作。

区别:
1.存储位置:cookie放在客户端,session放在服务器
2.存储容量:单个cookie存储数据小于等于4kb,一个站点最多20个cookie;而session没有限制
3.存储方式:cookie是ASCII字符串,而Session可以是任意类型
4.隐私策略:cookie对客户端是可见的,不安全;Session存放在服务器上,不存在信息泄露的风险
5.生命周期:可以设置cookie的属性,达到cookie长期有效的效果;session依赖于特定的cookie,而该cookie默认过期时间是-1,只需关闭窗口session就会失效
6.跨域:cookie支持跨域,session不支持

GET/POST的区别

GET是对服务器资源获取的简单请求,绝大部分HTTP请求报文使用GET方法
POST用于发送包含用户提交数据的请求

1.数据包:GET只能产生一个数据包,POST可能产生两个数据包
2.编码方式:GET只能进行URL编码,POST支持多准编码方式
3.请求参数:GET把参数包含在URL中,用&连接;POST通过request body(响应体)传递参数
4.请求缓存:GET会被主动Cache;POST不会缓存,除非主动设置
5.收藏为书签:GET支持收藏为书签;POST不支持
6.历史记录:GET参数会被完整保存在浏览历史记录里;POST不会保留
7.参数支持类型:GET采用ASCII的字符,POST没有限制数据类型
8.参数长度:GET在url中传送的参数长度是有限制的, post没有

Put:向指定资源上传最新内容。
Delete:请求删除资源

Get是从指定资源请求数据,而Post是向指定资源提交要被处理的数据。Get请求刷新无害,而post刷新,数据会被重复提交。Get请求的数据会附加到URL中,多个参数用&连接,URL编码采用ASCII编码。而POST请求会把请求的数据放到body中。因此get请求的数据会暴露在地址栏中,而post不会。又浏览器和服务器对url的长度有限制,所以get传输数据的大小受到url的限制。Get请求的资源会被浏览器缓存。post比get慢,因为post在发送数据之前会先将请求头发送给服务器进行确认,然后才真正发送数据。而get请求直接发送请求头和数据。

HTTP常见状态码

200 OK 表示从客户端发来的请求在服务器端被正确处理并返回
301 Permanently Moved 永久重定向:被请求的资源已永久移动到新位置,新的URL在Location头中给出,浏览器应该自动地访问新的URL。会缓存
302 Found 临时重定向:请求的资源现在临时从不同的URL响应请求。不会缓存
304 Not Modified 304状态码是告诉浏览器可以从缓存中获取所请求的资源(http缓存机制)
​400 bad request 客户端请求报文存在语法错误
403 forbidden 拒绝访问,表示对请求资源的访问被服务器拒绝
404 not found 表示在服务器上没有找到请求的资源,也可以在服务器拒绝请求但不想给拒绝原因时使用
500 internal sever error 表示服务器端在执行请求时发生了错误
503 service unavailable 表明服务器暂时处于超负载或正在停机维护,无法处理请求
504 网关超时

常见的端口号

ARP协议

ARP协议即地址解析协议,是根据IP地址获取MAC地址的一个网络层协议。

工作原理

​ ARP首先会发起一个请求数据包,数据包的首部包含了目标主机的IP地址,然后这个数据包会在链路层进行再次包装,生成以太网数据包,最终由以太网广播给子网内的所有主机,每一台主机都会接收到这个数据包,并取出标头里的IP地址,然后和自己的IP地址进行比较,如果相同就返回自己的MAC地址,如果不同就丢弃该数据包。ARP接收返回消息,以此确定目标机的MAC地址;与此同时,ARP还会将返回的MAC地址与对应的IP地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。

工作过程

主机A的IP地址为192.168.1.1,MAC地址为0A-11-22-33-44-01;
​主机B的IP地址为192.168.1.2,MAC地址为0A-11-22-33-44-02;
​当主机A要与主机B通信时,地址解析协议可以将主机B的IP地址(192.168.1.2)解析成主机B的MAC地址,以下为工作流程:
​第1步:根据主机A上的路由表内容,IP确定用于访问主机B的转发IP地址是192.168.1.2。然后A主机在自己的本地ARP缓存中检查主机B的匹配MAC地址。
​第2步:如果主机A在ARP缓存中没有找到映射,它将询问192.168.1.2的硬件地址,从而将ARP请求帧广播到本地网络上的所有主机。源主机A的IP地址和MAC地址都包括在ARP请求中。本地网络上的每台主机都接收到ARP请求并且检查是否与自己的IP地址匹配。如果主机发现请求的IP地址与自己的IP地址不匹配,它将丢弃ARP请求。
​第3步:主机B确定ARP请求中的IP地址与自己的IP地址匹配,则将主机A的IP地址和MAC地址映射添加到本地ARP缓存中。
​第4步:主机B将包含其MAC地址的ARP回复消息直接发送回主机A。
​第5步:当主机A收到从主机B发来的ARP回复消息时,会用主机B的IP和MAC地址映射更新ARP缓存。本机缓存是有生存期的,生存期结束后,将再次重复上面的过程。主机B的MAC地址一旦确定,主机A就能向主机B发送IP通信了。

应用层报文怎么传输到另一个应用层

简单来说,就是在每一层加上该层的头部信息,然后传输给下一层,解析是相反

数据的封装过程简介

​传输层及其以下的机制由内核提供, 应用层由用户进程提供, 应用程序对通讯数据的含义进行解释, 而传输层及其以下处理通讯的细节,将数据从一台计算机通过一定的路径发送到另一台计算机。 应用层数据通过协议栈发到网络上时,每层协议都要加上一个相对应的头部(header),该过程称为封装,封装过程如下图所示:


数据的解封过程简介

​ 不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报(datagram) ,在链路层叫做帧(frame)。数据封装成帧后发到传输介质上,到达目的主机后,每层协议再剥掉相应的头部,最后将应用层数据交给应用程序处理,该过程称为解封。解封过程如下图所示:

举例说明数据封装和解封装过程
(1)从计算机 A 的应用层内网通软件向计算机 B 发出一个消息,生成数据;
(2)请求从计算机 A 的应用层下到 计算机A 的传输层,传输层在上层数据前面加上 TCP报头,报头中包括目标端口以及源端口;
(3)传输层数据下到网络层,计算机A 在网络层封装,源 IP地址为 计算机A地址,目标 IP地址为 计算机 B 地址;
(4)计算机 A 将计算机B 的 IP 地址和子网掩码与自己做比对,可以发现 计算机 B 与自己处于相同的子网。所以数据传输不必经过网关设备;
(5)数据包下到 计算机 A 的数据链路层进行封装,源 MAC 地址为 计算机A的 MAC地址,目标 MAC 地址查询自己的 ARP 表。
(6)计算机 A 把帧转换成 bit 流,从物理接口网卡发出;
(7)物理层接收到电信号,把它交给数据链路层进行查看帧的目标 MAC 地址,和自己是否相等,如果相等说明该帧是发送给自己的,于是将MAC帧头解开并接着上传到网络层;
(8)网络层查看目标 IP 地址和自己是否匹配,如果匹配即解开 IP 头封装。然后再把数据上传到传输层;
(9)传输层解开对应的包头之后,继续把数据传给应用层,计算机 B 即可接收到计算机 A 发的消息。

TCP队头阻塞和HTTP队头阻塞

1.TCP队头阻塞:因为TCP数据包是有序传输,如果有中间的数据包丢失,那么会等待这个数据包重传,导致后面的数据包阻塞
2.HTTP队头阻塞:
和TCP队头阻塞完全不是一回事

http1.x采用长连接(Connection:keep-alive),可以在一个TCP请求上,发送多个http请求。
有非管道化和管道化,两种方式:
非管道化,完全串行执行,请求->响应->请求->响应…,后一个请求必须在前一个响应之后发送。
管道化,请求可以并行发出,但是响应必须串行返回。后一个响应必须在前一个响应之后。原因是,没有序号标明顺序,只能串行接收。
管道化请求的致命弱点:
​ (1)会造成队头阻塞,前一个响应未及时返回,后面的响应被阻塞
​ (2)请求必须是幂等请求,不能修改资源。因为,意外中断的时候,客户端需要把未收到响应的请求重发,非幂等请求,会造成资源破坏。

(补充:什么是幂等请求,就是这个请求不会对服务端的数据做改变)
HTTP幂等方法,是指无论调用这个url多少次,都不会有不同的结果的HTTP方法。也就是不管你调用1次还是调用100次,1000次,结果都是一样的(前提是服务器端的数据没有被人为手动更改。比如说,你数据库中的数据被手动更改过,那两次调用的结果肯定是变化的)
比如get请求就是幂等请求,而post请求就不是

由于这个原因,目前大部分浏览器和Web服务器,都关闭了管道化,采用非管道化模式。
无论是非管道化还是管道化,都会造成队头阻塞(请求阻塞)。

解决http队头阻塞的方法
(1)并发TCP连接:浏览器一个域名可以采用6-8个并发的TCP连接,并发HTTP请求
(2)域名分片:多个域名,可以建立更多的tcp连接,从而提高http请求的并发

在http2.0中,使用一个域名单一的tcp连接发送请求,请求包被二进制分帧,不同请求可以相互穿插,避免了http层面的请求队友阻塞。但仍然不能避免tcp层面的队头阻塞。

IP地址、子网掩码、网关

1.IP地址
  IP地址是一个32位的连接地址,由4个8位字段组成,8位字段称为8位位组,每个8位位组之间用点号隔开,用于标识TCP/IP宿主机。每个IP地址都包含两部分:网络ID和主机ID,网络ID标识在同一个物理网络上的所有宿主机,主机ID标识网络上的每一个宿主机,运行TCP/IP的每个计算机都需要唯一的IP地址。
  Intenet委员会定义了五种地址类型以适应不同尺寸的网络。地址类型定义网络ID使用哪些位,它也定义了网络的可能数目和每个网络可能的宿主机数目.

2.子网掩码(Subnet Mask)
使用子网可以把单个大网分成多个物理网络,并用路由器把它们连接起来。子网掩码用于屏蔽IP地址的一部分,使得TCP/IP能够区别网络ID和宿主机ID。当TCP/IP宿主机要通信时,子网掩码用于判断一个宿主机是在本地网络还是在远程网络。
缺省的子网掩码用于不分成子网的TCP/IP网络,对应于网络ID的所有位都置为1,每个8位位组的十进制数是255,对应于宿主机ID的所有位都置为0。
用于子网掩码的位数决定可能的子网数目和每个子网的宿主机数目,子网掩码的位数越多,则子网越多,但是宿主机也较少。

例:假设A类地址子网数是14,则所需位数至少为4,用于子网的位为: 11111111, 11110000, 00000000, 00000000, 子网掩码为255.240.0.0,每个子网的宿主机数目为2^20-2=1,048, 574个。

3.网关(Gateway)
  网关就是一个网络连接到另一个网络的“关口”。 按照不同的分类标准,网关也有很多种。TCP/IP协议里的网关是最常用的,在这里我们所讲的“网关”均指TCP/ IP协议下的网关。
  网关实质上是一个网络通向其他网络的IP地址。比如有网络A和网络B,网络A的IP地址范围为“192.168.1.1~192. 168.1.254”,子网掩码为255.255.255.0;网络B的IP地址范围为“192.168.2.1~192. 168.2.254”,子网掩码为255.255.255.0。在没有路由器的情况下,两个网络之间是不能进行TCP/IP通信的,即使是两个网络连接在同一台交换机(或集线器)上,TCP/IP协议也会根据子网掩码(255.255.255.0)判定两个网络中的主机处在不同的网络里。而要实现这两个网络之间的通信,则必须通过网关。
   如果网络A中的主机发现数据包的目的主机不在本地网络中,就把数据包转发给它自己的网关,再由网关转发给网络B的网关,网络B的网关再转发给网络B的某个主机。网络B向网络A转发数据包的过程也是如此。而要实现这两个网络之间的通信,则必须通过网关。所以说,只有设置好网关的IP地址,TCP/IP协议才能实现不同网络之间的相互通信。那么这个IP地址是哪台机器的IP地址呢?网关的IP地址是具有路由功能的设备的IP地址,具有路由功能的设备有路由器、启用了路由协议的服务器(实质上相当于一台路由器)、代理服务器(也相当于一台路由器)。

IP地址分类


五类互联网地址:

IP地址根据网络号和主机号来分,分为A、B、C三类及特殊地址D、E。 全0和全1的都保留不用。
A类:(1.0.0.0-126.0.0.0)(默认子网掩码:255.0.0.0或 0xFF000000)第一个字节为网络号,后三个字节为主机号。该类IP地址的最前面为“0”,所以地址的网络号取值于1~126之间。一般用于大型网络。
B类:(128.0.0.0-191.255.0.0)(默认子网掩码:255.255.0.0或0xFFFF0000)前两个字节为网络号,后两个字节为主机号。该类IP地址的最前面为“10”,所以地址的网络号取值于128~191之间。一般用于中等规模网络。
C类:(192.0.0.0-223.255.255.0)(子网掩码:255.255.255.0或 0xFFFFFF00)前三个字节为网络号,最后一个字节为主机号。该类IP地址的最前面为“110”,所以地址的网络号取值于192~223之间。一般用于小型网络。
D类:是多播地址。该类IP地址的最前面为“1110”,所以地址的网络号取值于224~239之间。一般用于多路广播用户 。
E类:是保留地址。该类IP地址的最前面为“1111”,所以地址的网络号取值于240~255之间。

为什么要分类?
根据IP地址访问终端是通过路由器,路由器中有一张路由表,路由表中记录了所有的IP地址信息,这样就可以进行包的转发了。如果不区分网络的地址的话,那么这张路由表中就要保存所有的IP地址方向,路由表维就会很大,路由表中都是32位的地址,路由器维护路由表的代价很大,需要足够的性能才能存的下,并且转发速度变慢(因为查询变慢)。
有了分类的IP地址,就可以限定拥有相同网络地址的终端都在一个范围内,这样路由表只需要维护这个网络地址的方向,就可以找到相应的终端。

IP数据包传输过程

IP数据报传输的过程:(无论怎么传,IP源和目的地址不变,但MAC目的和源地址会变)

1.IP数据报需从主机A上传送到主机B上,主机A首先查找路由表;
2.if(目的主机是与自己在同一个网段内)
主机A查询自己的ARP表;如果存在目的IP地址到MAC的映射,将MAC地址作为目的MAC地址封装成帧,发给主机B。如果没有,发送ARP请求广播给网段内的所有主机,来查询该目的IP地址的MAC地址
3.else if(发现了能与目的网络号相匹配的表目)
则把报文发给该路由表目指定的下一站的路由器或直接连接的网络接口;
报文发送到下一站时,数据帧的目的MAC地址是下一个站路由器或者网络接口的MAC地址,而IP头部的目的IP地址是主机B的IP地址;
4.else
寻找标为“默认”的表目,把报文发送给该表目指定的下一站路由器;

IP寻址

与上面对照着看,差不多

IP寻址包括本地网络寻址和非本地网络寻址两部分

本地网络寻址
假设有2个主机,他们是属于同一个网段。主机A和主机B,首先主机A通过本机的hosts表或者wins系统或dns系统先将主机B的计算机名转换为IP地址,然后用自己的IP地址与子网掩码计算出自己所出的网段,比较目的主机B的ip地址与自己的子网掩码,发现与自己是出于相同的网段,于是在自己的ARP缓存中查找是否有主机B的mac地址,如果能找到就直接做数据链路层封装并且通过网卡将封装好的以太网帧发送有物理线路上去。
如果arp缓存中没有主机B的的mac地址,主机A将启动arp协议通过在本地网络上的arp广播来查询主机B的mac地址,获得主机B的mac地址厚写入arp缓存表,进行数据链路层的封装,发送数据。

非本地网络寻址
(缺省网关就是默认网关)
假设2个主机不是相同的网段,不同的数据链路层网络必须分配不同网段的IP地址并且由路由器将其连接起来。主机A通过本机的hosts表或wins系统或dns系统先主机B的计算机名转换为IP地址,然后用自己的IP地址与子网掩码计算出自己所处的网段,比较目的目的主机B的IP地址,发现与自己处于不同的网段。于是主机A将知道应该将次数据包发送给自己的缺省网关,即路由器的本地接口。

主机A在自己的ARP缓存中查找是否有缺省网关的MAC地址,如果能够找到就直接做数据链路层封装并通过网卡,将封装好的以太网数据帧发送到物理线路上去,如果arp缓存表中没有缺省网关的Mac地址,主机A将启动arp协议通过在本地网络上的arp广播来查询缺省网关的mac地址,获得缺省网关的mac地址后写入arp缓存表,进行数据链路层的封装,发送数据。

数据帧到达路由器的接受接口后首先解封装,变成IP数据包,对IP包进行处理,根据目的IP地址查找路由表,决定转发接口后做适应转发接口数据链路层协议帧的封装,并且发送到下一跳路由器,此过程继续直至到达目的的网络与目的主机。

重定向和请求转发的区别

直接转发方式(Forward) ,客户端和浏览器只发出一次请求到服务器,服务器发现匹配的Servlet、HTML、JSP或其它信息资源,指定它去执行,它再把请求转发给指定的第二个资源,由第二个信息资源响应该请求,在请求对象request中,保存的对象对于每个信息资源是共享的。
重定向(Redirect) 实际是两次HTTP请求,服务器端在响应第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的。

(1)请求次数:重定向是浏览器向服务器发送一个请求并收到响应后再次向一个新地址发出请求,转发是服务器收到请求后为了完成响应跳转到一个新的地址;重定向至少请求两次,转发请求一次;
(2)地址栏不同:重定向地址栏会发生变化,转发地址栏不会发生变化;
(3)是否共享数据:重定向两次请求不共享数据,转发一次请求共享数据(在request级别使用信息共享,使用重定向必然出错);
(4)跳转限制:重定向可以跳转到任意URL,转发只能跳转本站点资源;
(5)发生行为不同:重定向是客户端行为,转发是服务器端行为。

DNS域名解析

DNS就是域名系统,是因特网中的一项核心服务,是用于实现域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。

如上图所示,域名结构是树状结构,树的最顶端代表根服务器,根的下一层就是由我们所熟知的.com、.net、.cn等通用域和.cn、.uk等国家域组成,称为顶级域。网上注册的域名基本都是二级域名,比如http://baidu.com、http://taobao.com等等二级域名,它们基本上是归企业和运维人员管理。接下来是三级或者四级域名,这里不多赘述。总体概括来说域名是由整体到局部的机制结构。

域名解析过程(例如查找www.baidu.com):
1.首先会找浏览器的缓存,看看是否能找到这个域名的对应的IP地址,如果找到了,就直接返回,找不到就下一步
2.查询系统缓存,即本地的hosts文件,看是否配置过,如果没有,下一步
3.查询本地的DNS服务器,如果找不到下一步
4.本地DNS服务器向根域名服务器发起请求,根域名服务器返回负责.com的顶级域名服务器的IP地址的列表
5.本地DNS服务器再向.com的顶级域名服务器发送请求,返回.baidu的权威域名服务器的IP地址列表
6.本地DNS服务器再向这个权威域名服务器发起请求,返回www.baidu.com对应的IP地址
7.当拿到这个IP地址后,会存入浏览器缓存中,如果下次再请求这个域名,就直接把对应的记录返回

套接字Socket

套接字:IP地址+传输层协议+端口号
是网络中不同欧诺个主机上的应用进程之间进行双向通信的端点的抽象
其实就是用户开发面向应用的通信程序

WebSocket是一个持久化的协议,用来解决http不支持持久化连接的问题
Socket是网络编程的标准接口,而WebSocket是应用层通用协议

其他需要再补充

从浏览器地址栏输入url到显示主页的过程

1.首先DNS解析(浏览器缓存,本地hosts文件,路由器缓存,根域名…),查找域名对应的IP地址
2.与服务器通过三次握手,建立连接
3.向服务器发送HTTP请求(cookie会随着请求发送给服务器)
4.服务器处理请求,返回网页内容
5.浏览器解析并渲染页面
6.TCP四次挥手,断开连接

使用的协议:
1.DNS域名解析协议
2.TCP协议
3.IP协议,在网络层发送数据
4.OSPF 开放式最短路径优先,是一种路由协议,进行路由选择
5.ARP协议,IP地址转换为MAC地址
6.HTTP协议:页面的访问

URI和URL的区别

URI,全称是Uniform Resource Identifier),中文翻译是统一资源标志符,主要作用是唯一标识一个资源。
URL,全称是Uniform Resource Location),中文翻译是统一资源定位符,主要作用是提供资源的路径。
打个经典比喻吧,URI像是身份证,可以唯一标识一个人,而URL更像一个住址,可以通过URL找到这个人。

以上是关于面经总结2(http/https,计算机网络相关的其他东西)的主要内容,如果未能解决你的问题,请参考以下文章

大三后端暑期实习面经总结——计算机网络篇

前端面经知识总结及参考回答 —— 尽量日更

前端面经知识总结及参考回答 —— 尽量日更

网络面经总结

面经总结:计算机网络

(面经总结)冲刺大厂之面经总结