C++游戏客户端都会被问到什么?(二)——计网

329 阅读23分钟

计网篇

1.浏览器输入URL到返回页面全过程

1.根据域名,进行DNS域名解析;
2.拿到解析的IP地址,建立TCP连接;
3.向IP地址,发送HTTP请求;
4.服务器处理请求;
5.返回响应结果;
6.关闭TCP连接;
7.浏览器解析HTML;
8.浏览器布局渲染;

2.为什么域名解析用UDP协议?(域名解析)

  1. UDP速度快;
  • UDP的DNS协议只要一个请求、一个应答就好了。
  • 而使用基于TCP的DNS协议要三次握手、发送数据以及应答、四次挥手。
  1. UDP传输数据量大小合适;
  • UDP协议传输内容不超过512字节。
  • 客户端向DNS服务器查询域名,一般返回的内容都不超过512字节,用UDP传输即可。

3.为什么区域传送用TCP协议?(区域传送)

  1. TCP可靠性好;从主DNS上复制内容需要可靠性。
  2. TCP传输内容大;同步数据一般大于512字节。

4.Http和Https的区别?

  • Http协议运行在TCP之上,明文传输,客户端与服务器端都无法验证对方的身份;
  • Https是身披SSL(Secure Socket Layer)外壳的Http,运行于SSL上,SSL运行于TCP之上,是添加了加密和认证机制的HTTP。

二者之间存在如下不同:

  • 端口不同:Http与Http使用不同的连接方式,用的端口也不一样,前者是80,后者是443;
  • 资源消耗:和HTTP通信相比,Https通信会由于加减密处理消耗更多的CPU和内存资源;
  • 开销:Https通信需要证书,而证书一般需要向认证机构购买;
  • Https的加密机制是一种共享密钥加密和公开密钥加密并用的混合加密机制。

5.对称加密与非对称加密

  • 对称密钥加密是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是密钥发送问题,即如何安全地将密钥发给对方;
  • 而非对称加密是指使用一对非对称密钥,即公钥和私钥,公钥可以随意发布,但私钥只有自己知道。
  • 发送密文的一方使用对方的公钥进行加密处理,对方接收到加密信息后,使用自己的私钥进行解密。
  • 由于非对称加密的方式不需要发送用来解密的私钥,所以可以保证安全性;
  • 但是和对称加密比起来,它非常的慢,所以我们还是要用对称加密来传送消息,但对称加密所使用的密钥我们可以通过非对称加密的方式发送出去。

6.常见HTTP状态码

  • 1xx(临时响应)
  • 2xx(成功)
  • 3xx(重定向):表示要完成请求需要进一步操作
  • 4xx(错误):表示请求可能出错,妨碍了服务器的处理
  • 5xx(服务器错误):表示服务器在尝试处理请求时发生内部错误

常见状态码:

  • 200(成功)
  • 304(未修改):自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容
  • 401(未授权):请求要求身份验证
  • 403(禁止):服务器拒绝请求
  • 404(未找到):服务器找不到请求的网页

7.DNS解析原理

1. DNS是什么

  • DNS(Domain Names System)域名翻译成ip地址的服务器 2. 查询方式
  • 递归查询:(告诉你ip地址) 如果 A 请求 B,那么 B 作为请求的接收者一定要给 A 想要的答案
  • 迭代查询:(告诉你怎么去搜ip地址) 如果接收者 B 没有请求者 A 所需要的准确内容,接收者 B 将告诉请求者 A,如何去获得这个内容,但是自己并不去发出请求 3.域名缓存
  • 在域名服务器解析的时候,使用缓存保存域名和IP地址的映射
  • 计算机中DNS的记录也分成了两种缓存方式:
  1. 浏览器缓存:浏览器在获取网站域名的实际 IP 地址后会对其进行缓存,减少网络请求的损耗
  2. 操作系统缓存:操作系统的缓存其实是用户自己配置的 hosts 文件

1. 查询过程

  • 首先搜索浏览器的 DNS 缓存,缓存中维护一张域名与 IP 地址的对应表
  • 搜索计算机本地Host的DNS缓存
  • 搜索本地域名服务器,采用递归查询本地域名服务器的 DNS 缓存,查找成功则返回结果
  • 本地域名服务器向上级域名服务器进行迭代查询
  1. 首先本地域名服务器向根域名服务器发起请求,根域名服务器返回顶级域名服务器的地址给本地服务器
  2. 本地域名服务器拿到这个顶级域名服务器的地址后,就向其发起请求,获取权限域名服务器的地址
  3. 本地域名服务器根据权限域名服务器的地址向其发起请求,最终得到该域名对应的 IP 地址
  4. 本地域名服务器将得到的 IP 地址返回给操作系统,同时自己将 IP 地址缓存起来
  5. 操作系统将 IP 地址返回给浏览器,同时自己也将 IP 地址缓存起
  6. 至此,浏览器就得到了域名对应的 IP 地址,并将 IP 地址缓存起

8.如何理解CDN?说说实现原理?

一、是什么

  • CDN (全称 Content Delivery Network),即内容分发网络
  • 构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。
  • CDN 的关键技术主要有内容存储和分发技术
  • 简单来讲,CDN就是根据用户位置分配最近的资源
  • 于是,用户在上网的时候不用直接访问源站,而是访问离他“最近的”一个 CDN 节点,术语叫边缘节点,
  • 其实就是缓存了源站内容的代理服务器。
  • 如下图:

image.png

二、原理分析

  • 在没有应用CDN时,我们使用域名访问某一个站点时的路径为
  • 用户提交域名→浏览器对域名进行解释→DNS 解析得到目的主机的IP地址→根据IP地址访问发出请求→得到请求数据并回复
  • 应用CDN后,DNS 返回的不再是 IP 地址,而是一个CNAME(Canonical Name ) 别名记录,指向CDN的全局负载均衡

CNAME实际上在域名解析的过程中承担了中间人(或者说代理)的角色,这是CDN实现的关键

1. 负载均衡系统

  • 由于没有返回IP地址,于是本地DNS会向负载均衡系统再发送请求 ,则进入到CDN的全局负载均衡系统进行智能调度:
  • 看用户的 IP 地址,查表得知地理位置,找相对最近的边缘节点
  • 看用户所在的运营商网络,找相同网络的边缘节点
  • 检查边缘节点的负载情况,找负载较轻的节点
  • 其他,比如节点的“健康状况”、服务能力、带宽、响应时间等
  • 结合上面的因素,得到最合适的边缘节点,然后把这个节点返回给用户,用户就能够就近访问CDN的缓存代理

整体流程如下图:

  • 简单来说利用CDN后DNS返回的不再是IP地址,而是一个CNAME别名记录,指向CDN的全局负载均衡,
  • CNAME在域名解析的过程中承担了代理的角色,
  • 负载均衡系统根据IP地址的地理地址和网络地址,结合考虑边缘节点的负载情况等条件来选择最合适的边缘节点
  • 然后把这个节点返回给用户,用户就能够就近访问CDN的缓存代理

image.png

2. 缓存代理

  • 缓存系统是 CDN的另一个关键组成部分,缓存系统会有选择地缓存那些最常用的那些资源
  • 其中有两个衡量CDN服务质量的指标:
  • 命中率:用户访问的资源恰好在缓存系统里,可以直接返回给用户,命中次数与所有访问次数之比
  • 回源率:缓存里没有,必须用代理的方式回源站取,回源次数与所有访问次数之比
  • 缓存系统也可以划分出层次,分成一级缓存节点和二级缓存节点。
  • 一级缓存配置高一些,直连源站,二级缓存配置低一些,直连用户
  • 回源的时候二级缓存只找一级缓存,一级缓存没有才回源站,可以有效地减少真正的回源
  • 现在的商业 CDN命中率都在 90% 以上,相当于把源站的服务能力放大了 10 倍以上

三、总结

  • CDN 目的是为了改善互联网的服务质量,通俗一点说其实就是提高访问速度
  • CDN 构建了全国、全球级别的专网,让用户就近访问专网里的边缘节点,降低了传输延迟,实现了网站加速
  • 通过CDN的负载均衡系统,智能调度边缘节点提供服务,相当于CDN服务的大脑,
  • 而缓存系统相当于CDN的心脏,缓存命中直接返回给用户,否则回源
  • CDN的优势很明显:
  • (1)CDN节点解决了跨运营商和跨地域访问的问题,访问延时大大降低;
  • (2)大部分请求在CDN边缘节点完成,CDN起到了分流作用,减轻了源站的负载。

9.HTTP状态码,301和302有什么具体区别,200和304 的区别

  • 状态码可以按照第一个数字分类,1表示信息,2表示成功,3表示重定向,4表示客户端错误,5表示服务器错误
  • 常见的状态码有101切换协议,200成功,301永久重定向,302临时重定向,304未修改
  1. 301和302的区别:
  • 301:永久移动,请求的网页已永久移动到新的位置,服务器返回此响应,会自动将请求者转到新位置
  • 302:历史移动,服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来继续以后的请求
  1. 200和304:
  • 200表示成功,服务器已成功处理了请求,通常表示为服务器提供了请求的网页,
  • 304表示未修改,自从上次请求后,请求的网页未修改过,服务器返回此响应时不会返回网页内容

10.三种保持会话的方式

(一)session机制保持会话

  1. 存在的问题
  • 高并发情况下,会占用服务器大量内存
  • 分布式(一个业务分成几个子业务,部署在多个服务器)或者集群(一个业务部署在多个服务器)的时候,session不能共享。
  1. 解决方案
  • 高并发的时候可以将session存储到redis,如果用户长时间没有访问,将session存储到redis,就减少了服务器的压力。
  • 分布式或者集群的时候,先通过redis来判断用户状态也可以实现session共享.

(二)cookie机制保持会话

  1. 使用的方法
  • 登录验证后,创建登录凭证(比如:用户id+登录时间+过期时间),
  • 将登录凭证进行加密(为了避免暴露信息),加密后写到浏览器的cookie,
  • 以后,每次请求都发送cookie,服务器根据对应的解密算法对其进行验证
  • (或者将加密过的cookie内容存储到数据库,请求服务器的时候,服务器在数据库进行查找)。
  1. 存在的问题
  • 每次访问都提交cookie,增加请求量
  • 其他访问可能需要cookie(比如说购物车的信息存放在cookie),
  • 浏览器对每个域存储的cookie的大小有限制,那么需要控制加密后的凭证。

(三)token机制保持会话

  1. 使用方法
  • cookie 和session依赖于浏览器,如果客户端不是浏览器,那么需要手动添加token
  • (和cookie类似,也是登录凭证),将token添加到http header或者做为参数添加到url。
  1. 存在的问题
  • 每次访问的时候手动添加token
  • 和cookie 的方式一样增加了请求量

总结

  1. 不同的方式适合不同的应用场景,视情况使用。
  2. 相同点
  • 所有的方式目的都是为了验证用户状态。
  • 都需要在客户端存储凭证。
  1. 不同点
  • 第一种是通过是通过空间换时间,消耗内存存储session对象,但是判断用户状态不用复杂的逻辑。
  • 第二种第三种用时间换空间,在服务器端逻辑处理进行判断用户状态。

11.TCP三次握手原因、过程、失败以及不采用三次握手的后果

  • 如果第三次握手的ACK传输失败,导致服务端迟迟没有收到ACK,就会释放资源,
  • 这时候客户端认为自己已经连接好了,就会给服务端发送数据,
  • 服务端由于没有收到第三次握手,就会以RST包对客户端响应。
  • 但是实际上服务端会因为没有收到客户端的ACK多次发送SYN+ACK,次数是可以设置的,
  • 如果最后还是没有收到客户端的ACK,则释放资源。

12.Cookie和Session的区别

相同点:cookie和session都是用来跟踪浏览器用户身份的会话方式。

二、工作原理:
1.Cookie的工作原理
(1)浏览器端第一次发送请求到服务器端
(2)服务器端创建Cookie,该Cookie中包含用户的信息,然后将该Cookie发送到浏览器端
(3)浏览器端再次访问服务器端时会携带服务器端创建的Cookie
(4)服务器端通过Cookie中携带的数据区分不同的用户

image.png

一、session的概念及特点

  • session概念:在计算机中,尤其是在网络应用中,称为“会话控制”。
  • Session 对象存储特定用户会话所需的属性及配置信息。
  • 说白了session就是一种可以维持服务器端的数据存储技术。

session主要有以下的这些特点:

  • session保存的位置是在服务端
  • session一般来说要配合cookie使用,如果用户浏览器禁用了cookie,
  • 那么只能使用URL重写来实现session的存储功能
  • 单纯的使用session来存储用户回话信息,那么当用户量较多时,session文件数量会很多,会存在session查询慢的问题

本质上:session技术就是一种基于后端有别于数据库的临时存储技术

二、为什么要使用session

  • 我们目前使用的互联网应用层协议基本上都是基于 HTTP 和 HTTPS 的,它们的本身是无状态的,只负责请求和响应。
  • 我告诉服务器我需要什么,服务器返回给我相应的资源。
  • 如果没有额外处理的话,服务器是不知道你是谁,更无法根据你是谁给你展现和你相关的内容了。
  • HTTP 协议一开始被设计成这样还是有一些历史原因的,当时的互联网多用于学术交流,
  • 只用于文章信息的展现之类的事情,远没有现在这么丰富多彩。
  • 所以在当时的背景下 HTTP 协议被设计成这样其实也是很符合它的场景的。
  • 但随着互联网应用越来越广泛,应用的形式也变得越来越多,
  • 我们的 Web 应用不只限于提供简单的信息展现了,还需要用户能够登录,可以在论坛发帖子,在购物网站买东西等等。
  • 这就需要 HTTP 协议能够记录用户的状态。也就是我们现在熟悉的 Session 由来。

四、session的生命周期
Session何时生效:

  • Sessinon在用户访问第一次访问服务器时创建,需要注意只有访问JSP、Servlet等程序时才会创建
  • Session,只访问HTML、IMAGE等静态资源并不会创建Session,可调request.getSession(true)强制生成Session。

Session何时失效:

  • 1.服务器会把长时间没有活动的Session从服务器内存中清除,此时Session便失效。
  • Tomcat中Session的默认失效时间为20分钟。
  • 从session不活动的时候开始计算,如果session一直活动,session就总不会过期。
  • 从该Session未被访问,开始计时; 一旦Session被访问,计时清0;
  • 关闭浏览器,session就会失效

五、session的性能瓶颈

  • 另外一个要聊聊的就是 Session数据的存储。
  • 通常情况下,如果你不明确的设置,大多数 Web 框架会把 Session数据存放到内存中。如果你的 Web 应用用户量不大的话,这也不成问题。 但如果你的用户数比较大的话,就可能发生一个事情 — 内存不够用了。
  • 这很正常,内存容量是非常宝贵的,假设每个用户的 Session 数据是 100K, 1万个用户就会大概占用 1G 的存储空间,如果你的 Session 数据清理机制也恰巧比较慢的话,内存非常容易被占满。这就需要你在设计比较大并发量的站点时,要考虑 Session 的存储方式,比如把它们保存到硬盘文件系统中,或者数据库中。
  • 所以你在开发一个 Web 应用的时候,如果你的用户量很大,你需要有这个意识。另外 Session 放到内存中还有一个弊端,如果你的 Web 服务器发生重启,那么所有的 Session 状态都会被情况,会在一定程度上影响用户体验。

六、session实现登录状态的控制

  • 假设浏览器第一次请求服务器需要输入用户名与密码验证身份,服务器拿到用户名密码去数据库比对,正确的话说明当前持有这个会话的用户是合法用户,应该将这个会话标记为“已授权”或者“已登录”等等之类的状态,既然是会话的状态,自然要保存在会话对象中,tomcat在会话对象中设置登录状态如下:
  • 用户再次访问时,tomcat在会话对象中查看登录状态。
  • 每次请求受保护资源时都会检查会话对象中的登录状态,
  • 只有 isLogin=true 的会话才能访问,登录机制因此而实现。

四、区别对比:
(1)cookie数据存放在客户的浏览器上,session数据放在服务器上
(2)cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,如果主要考虑到安全应当使用session
(3)session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用COOKIE
(4)单个cookie在客户端的限制是4K,就是说一个站点在客户端存放的COOKIE不能超过4K。
(5)所以:将登陆信息等重要信息存放为SESSION;其他信息如果需要保留,可以放在COOKIE中

13.ajax请求,和普通的http url请求,有什么不一样?

ajax的请求,多了一个 “X-Requested-With” 属性。

image.png

14.TCP和UDP的区别

  • TCP是面向连接的,而UDP是无连接的
  • TCP是可靠的,它确保数据完整无误地按序到达,而UDP是不可靠的,它不会去备份数据,也不关心对方是否接收到数据。
  • UDP没有拥塞控制,一直以恒定的速率发送数据,即使网络条件不好,也不进行速率调整,因此在网络条件不好的情况下可能会造成丢包
  • TCP是一对一的,而UDP可以一对一,一对多,多对一,多对多。

14.计算机网络的五层模型

image.png

1. 物理层
物理层是有关于光纤,电缆,双绞线的物理实现部分,单纯负责0,1传送。
2. 数据链路层
数据链路层工作在物理层之上,负责给这些0,1制定传送的规则,然后另一方再按照相应的规则来进行解读。
2.1 以太网协议
以太网协议规定,一组电信号构成一个数据包,把这个数据包称之为“桢”。每一个桢由标头(Head)数据(Data) 两部分组成。如下:

image.png
这个桢的最大长度是1518个字节,最小长度为64字节。假如需要传送的数据很大的话,就分成多个桢来进行传送。
表头部分:主要是一些说明数据,例如发送者,接收者等信息。固定长度18字节。
数据部分:是这个数据包具体的,想给接受的内容。

2.2 MAC地址
计算机与计算机之间的唯一标识:MAC地址
连入网络的每一个计算机都会有网卡接口,每一个网卡都会一个地址,这个地址就叫做MAC地址。计算机之间的数据传送,就是通过MAC地址来唯一寻找、传送的。MAC地址在网卡生产是就被唯一标识了。\

2.3 广播与ARP协议

image.png

广播:计算机A是通过广播的方式把数据发送给计算机B。在同一个子网中,计算机A要向计算机B发送一个数据包,这个数据包包含接收者的MAC地址。这个时候同一个子网中的计算机C,D也会收到这个数据包的,然后收到这个数据包的计算机,会把数据包的MAC地址取出来,与自身的MAC地址对比,如果两者相同,则接受这个数据包,否则就丢弃这个数据包。这种发送方式我们称之为广播。\

ARP协议:通过它我们可以知道子网中其他计算机的MAC地址。\

3.网络层
网络层:区分MAC地址是否处于同一个子网中。
子网:假如是同一个子网,那我们就用广播的形式把数据传送给对方,如果不是同一个子网的,我们就会把数据发给网关,让网关进行转发。\

3.1 IP协议
IP协议有两种版本,一种是IPv4,另一种是IPv6。不过我们目前大多数用的还是IPv4,我们现在也只讨论IPv4这个版本的协议。
这个IP地址由32为的二进制数组成,我们一般把它分成4段的十进制表示,地址范围为0.0.0.0~255.255.255.255
这个IP地址被分为两部分,前面一部分代表网络部分,后面一部分代表主机部分。并且网络部分和主机部分的二进制位数是不固定的。
假如两台计算机的网络部分是一模一样的,我们就说这两台计算机是处于同一个子网中。

子网掩码:子码掩码和IP地址一样也是32位二进制数,不过它的网络部分规定全部为1,主机部分规定全部为0。
知道了子码掩码,相当于我们知道了网络部分是几位,主机部分是几位。我们只需要把IP地址与它的子码掩码做与(and)运算,然后把各自的结果进行比较就行了,如果比较的结果相同,则代表是同一个子网,否则不是同一个子网。\

3.2 ARP协议
有了两台计算机的IP地址,我们就可以判断出它们是否处于同一个子网之中。 假如他们处于同一个子网之中,计算机A要给计算机B发送数据时。我们可以通过ARP协议来得到计算机B的MAC地址。
ARP协议也是通过广播的形式给同一个子网中的每台电脑发送一个数据包(当然,这个数据包会包含接收方的IP地址)。对方收到这个数据包之后,会取出IP地址与自身的对比,如果相同,则把自己的MAC地址回复给对方,否则就丢弃这个数据包。这样,计算机A就能知道计算机B的MAC地址了。

3.3 DNS服务器
DNS服务器——解析ip地址

4. 传输层
传输层:传输层的功能就是建立端口到端口的通信。相比网络层的功能是建立主机到主机的通信。
将数据成功传输给接收方时,只是将数据从一个主机传送给了另一个主机,还要判断是接收方的哪个应用接收了数据。此时通过端口来判断。也就是说,我们在从计算机A传数据给计算表B的时候,还得指定一个端口,以供特定的应用程序来接受处理。

也就是说,有了IP和端口,我们就可以进行通信了。这个时候可能有人会说,我输入IP地址的时候并没有指定一个端口啊。其实呢,对于有些传输协议,已经有设定了一些默认端口了。例如http的传输默认端口是80,这些端口信息也会包含在数据包里的。

  1. 应用层 应用层:用来规定应用程序的数据格式,将各种各样的数据格式(html,MP4等)转化为我们能够解读的格式。

资料参考:聊一聊计算机网络的五层模型 - 简书 (jianshu.com)

15.

16.

17.

18.

19.

20.