1. TCP超时重传机制是为了解决什么问题
因为TCP是一种面向连接的协议,需要保证数据可靠传输。而在数据传输过程中,由于网络阻塞、链路错误等原因,数据包可能会丢失或者延迟到达目的地。因此,若未在指定时间内收到对方的确认应答(ACK),则认为数据包可能丢失,此时,会触发超时重传机制,重新发送该数据包,以确保数据的可靠到达。
扩展:
1. TCP ACK确认号
TCP的可靠性是靠确认号的,比如我发给你1、2、3、4这4个包,你告诉我现在要5那说明前面4个包都收到了。不过,这里要注意、SeqNum和ACK都是以字节数为单位的。也就是说假设收到了1、2、4但是3没有收到,此时不能ack 5,如果回了5那么发送方就以为5之前的都收到了。所以,只能回复确认最大连续收到的包,也就是3.
2. 超时重传的时间RTO
RTO是指TCP数据报文段发出去后,经过一定时间没有收到其确认报文,就会重新发送该报文段的时间阈值。TCP协议通过采样RTT(往返时延)的时间和波动范围,不断更新,动态调整RTO的值。
2. TCP有超时重传为什么还需要快速重传机制
因为超时重传局限性,他是按时间来驱动的,如果是网络状况真的不好的情况下,超时重传没问题,但是,如果网络状况好的时候,只是恰巧丢包了,那么等长时间就没必要。
所以,引入了数据驱动的重传叫快速重传,他的设计初衷是为了在检索到丢包的情况下,尽快重传丢失的数据包,而不必等待超时计时器的触发。
他通过检测三个或者更多的重复的ACK,认为数据包丢失 ,从而触发立即重传。
通过快速重传,TCP能够更快的恢复丢失的数据包,减少重传等待时间。提升数据传输的整体效率,特别是在网络条件良好的情况下。
3. TCP的SACK的引入是为了解决什么问题
传统的TCP使用累计确认(ACK)机制,只能确认到达的连续数据段,无法有效告知发送方中间某些数据段的丢失或者乱序。结果是发送方只能依赖超时或者重复ACK来重传数据。这可能导致不必要的重传,浪费带宽、降低效率。
SACK(选择性确认),他的引入是为了解决发送方不知道该重传哪些数据的问题。使接收方能够告知发送方已收到的非连续数据段。这样,发送方只需重传确实丢失的数据段,而不是整个发送窗口,从而提高传输效率。
SACK就是接收方会回传他已经收到的数据,这样发送方就知道哪些数据对方已经收到了,所以就可以选择性的发送丢失的数据。如上图,通过ACK告知我接下来要5500开始的数据,并一直更新SACK,6000-6500收到了,6000-7000收到了。6000-7500收到了,发送方很明确的知道5500-5999的那一波数据丢失了,应该重传。
4. TCP滑动窗口的作用是什么
TCP滑动窗口机制的主要作用是实现流量控制,即协调发送方和接收方的数据传输速率。确保发送方不会发送超出接收方处理能力的数据量,防止接收端缓冲区溢出。
滑动窗口允许发送方在未收到前一个数据包的确认前继续发送多个数据包,从而提高网络吞吐量,减少等待时间,实现高效的数据流传输。
扩展
滑动窗口详细分析
网络是复杂多变的,有时候就会阻塞住,有时候又很通畅。需要根据情况来控制一下发送速率。发送方需要知道接收方的情况,好控制一下发送的速率。不至于蒙着头一个劲的发然后接收方都接受不过来。因此,TCP有个滑动窗口来做流量控制,就是接收方告诉发送方我还能接受多少数据,然后发送方就可以根据这个信息来进行数据的发送。
已经有滑动窗口了为什么还要拥塞控制
滑动窗口仅根据接收方的处理能力进行调节,主要防止接收端因处理不及时导致的数据丢失或者拥塞。而拥塞控制是为了防止网络本身的拥塞情况,即在网络中出现过载时,网络中途路由器和链路的负载仍可能造成数据丢失或者延迟,因此,需要拥塞控制机制来应对。
5. 说说TCP拥塞控制的步骤
- 慢启动:发送方在连接建立初期,缓慢增加数据发送速率。初始的拥塞窗口(cwnd)通常为一个MSS(最大报文段大小),然后在每次收到ACK后成倍的增加cwnd,直到达到慢启动阈值或者监测到网络拥塞。
- 拥塞避免:当cwnd达到阈值后,tcp进入拥塞避免阶段,拥塞窗口的增长速度从指数变为线性增长,即每个RTT(往返时间)增加一个MSS。这一阶段旨在避免激烈的拥塞反应,保持网络稳定性。
- 快速重传:发送方在收到三个重复的ACK后,立即重传被认为丢失的报文段,而无需等待超时。这减少了重传的延迟,迅速应对数据丢失。
- 快速恢复:在快速重传后,TCP不进入慢启动,而是减小cwnd到阈值的一般,然后开始线性增长cwnd,以快速恢复到丢包前的传输速率。
6. ARP和RARP分别是什么?有什么区别?
ARP将IP地址转换为MAC地址,工作在网络层和数据链路层之间,主要 用于在局域网中确定一个特定IP地址对应的物理地址。
因为最终需要找到MAC地址才能跟具体的设备通信。
RARP用于将MAC地址转换为IP地址,比如一些设备启动的时候,需要根据RARO得知分配给他的ip是什么。
7. TCP/IP四层模型是什么
TCP/IP四层模型是一个分层网络通信模型,将网络通信过程分为四个层次,这四个层次分别是:网络接口层、网络层、传输层和应用层。
- 网络接口层负责在计算机和网络硬件之间传输数据,负责在物理网络上发送和接受数据帧,包括以太网,wifi等协议。
- 网络层通过ip协议提供数据包的路由和转发
- 传输层:负责在两个主机之间提供端到端的通信服务,常见的有tcp、udp
- 应用层通过各种协议提供网络应用程序的功能,如http、ftp等
8. OSI七层模型是什么
- 应用层:用户交互界面,提供网络服务,如http、ftp、smtp
- 表示层:数据格式转换,加密、解密,如jpeg、ssl/tls等
- 会话层:建立、管理、终止会话
- 传输层:可靠传输,流量控制,错误检测,如TCP、UDP等
- 网络层:路径选择和逻辑地址管理,如ip、icmp等
- 数据链路层:物理地址(MAC)寻址,错误检测与纠正。
- 物理层:比特流传输。
9. Cookie、Session、Token之间有什么区别
- Cookie
Cookie是存储在用户浏览器的一个小型数据文件,用于跟踪和保存用户的状态信息。主要用于保持用户登录状态、跟踪用户行为、存储用户偏好等。
保存在浏览器端。
- Session
Session是服务端保存用户状态的机制,每个用户会话都有一个唯一的session id。主要用于跟踪用户在服务器上的状态信息,例如登录状态和购物车内容。
存储在服务器端,然后对应的sessionId通过Cookie保存在客户端浏览器中。
- Token
Token本质上是一种加密的字符串,用于身份验证和授权,可以包含用户信息和权限,用于验证用户身份或者授权访问资源。认证后,后端服务会返回token,存储在客户端,后续客户端访问服务端需要带上这个token。
使用场景区别
- Cookie:主要用于客户端状态的简单存储和追踪
- Session:用于服务器端的复杂状态管理,特别是在需要存储大量会话数据时
- Token:用于无状态的认证和授权,特别是在分布式和跨域环境下。
10. JWT Token
JWT是一种用于在各方之间传递安全信息的紧凑,URL安全的令牌格式。在用户登录后,服务器生成JWT并返回给客户端。客户端在后续请求中通过HTTP头部(通常是Authorization头)发送该JWT,服务器验证JWT的有效性以进行用户身份验证。
因为他的无状态性,常用于分布式系统和微服务架构中。
其结构主要包括三个部分:Header、Payload和Signature。
JWT的工作原理可以总结为以下几个步骤:
- Header:描述令牌的元数据,通常包含令牌的类型(JWT)和所使用的签名算法(如HMAC).
- Payload:包含声明,即传递的数据。这些数据通常包含用户信息和其他相关数据。
- Signature:将Header和Payload用指定的算法进行签名,以验证JWT的真实性和完整性。签名确保了令牌内容在传输过程中未被篡改。
JWT的优点
- 自包含:JWT中包含了所有必要的信息,因此,在验证时不需要查询数据库,提升了性能
- 跨语言:JWT是基于JSON的,几乎所有编程语言都支持他的生成和解析。
1. 如何废除一个过期的JWT
因为JWT是无状态的,一般服务器并不保存已签发的JWT,所以服务器无法主动撤销一个已经签发的。不过可以通过其他方式来实现。
使用黑名单
实现思路:在服务器端维护一个黑名单,该列表包含所有已经被废除的JWT标识符,每次服务器验证JWT时,除了验证签名和其他标准信息外,还需要检查该JWT是否在黑名单中。
优点:可以精确废除特定的JWT,不影响其他合法的JWT。
缺点:需要在服务器端存储和管理黑名单,违背了JWT的无状态特性,增加了系统复杂度。使用版本控制
实现思路: 在用户信息中引入一个“Token版本号”的字段,每次生成JWT时,将这个版本号作为JWT的一部分。当需要废除某个用户的JWT时,只需要将用户的版本号递增,在服务器验证JWT时,检查JWT中的版本号和用户当前的版本号是否匹配。结合状态信息
实现思路:在某些场景下, 可以在服务器端结合一些状态信息来决定JWT是否有效。例如,在用户注销或者更改密码时,更新服务器上的某些状态。当用户发出请求时,除了验证JWT外,服务器还检查这些状态是否符合要求。
2. JWT和Session的对比
无状态认证:JWT通常用于无状态认证,即服务器不存储会话数据。
扩展性:由于JWT不依赖服务器存储,因此在分布式系统中更具扩展性。
11. 什么是DNS
DNS(域名系统)是一个用于将域名转换为IP地址的互联网基础服务。当用户输入一个域名时,DNS服务器会查询该域名对应的IP地址,并将结果返回给用户。这样,用户就可以通过易记的域名访问网站,而不需要记录复杂的IP地址。
除此之外,DNS还有负载均衡能力,通过将域名解析到多个IP地址,DNS可以帮助分散流量,进行负载均衡,提高服务的可靠性和性能。
互联网中的域名地址,分为多级结构:最顶级是根域,然后是顶级域,如 .com、.org 接着是二级域(taobao.com),以及子域(www.taobao.com)。
DNS服务器和客户端会缓存DNS查询结果,以减少查询时间和降低对DNS服务器的负载。缓存的内容会在一定时间后过期,具体取决于DNS记录的生成时间(TTL)设置。
1. DNS的工作流程
- 域名解析请求:用户在浏览器输入一个域名,浏览器首先检查本地缓存是否有该域名的IP地址。
- 递归DNS解析:如果本地缓存中没有所需的IP地址,浏览器会向配置的递归DNS服务器发送请求。
- 查询根域名服务器:递归DNS服务器会查询根域名服务器以获取顶级域的DNS服务器地址,跟域名服务器负责将请求转发到对应的顶级域服务器。
- 查询顶级域服务器:跟域名服务器将请求转发到对应的顶级域服务器(如.com、.net) ,这些服务器负责处理特定顶级域的请求。
- 查询权威DNS服务器:顶级域名服务器将请求转发到域名对应的权威DNS服务器(如taobao.com),权威DNS服务器拥有该域名的最终DNS记录。
- 返回IP地址:权威DNS服务器返回与域名对应的IP地址给递归DNS服务器,然后递归DNS服务器将该IP地址返回给用户的浏览器。
- 缓存和访问:浏览器缓存该IP地址以供后续请求使用,并通过IP地址连接到目标服务器以访问网站。
2. DNS记录类型
- A记录:将域名映射到IPv4地址。
- AAAA记录:将域名映射到IPv6地址。
- CNAME记录:将一个域名别名指向另一个域名
- MX记录:定义邮件服务器的地址,用于电子邮件的传输。
- TXT记录:存储任意文本信息,通常用于验证和安全设置
- NS记录:定义域名的权威DNS服务器。
12. 什么是CDN
CDN是一个由多个地理位置分散的服务器节点组成的分布式网络架构,用于加速互联网内容的分发。
当用户请求内容时,CDN会根据用户的地理位置,将请求转发到最近的缓存服务器上,这样可以减少数据传输的延迟,提高用户访问速度,同时减轻服务器的负载。
CDN通常用于加速静态内容的访问,提高网络的性能和用户体验。
- CDN的通俗理解
如果网站服务器部署在北京,香港的用户访问该网站,由于物理距离的缘故,时延相对而言会比较大,导致体验上并不是很好。并且当用户量比较大的时候,全国各地所有请求都涌向北京的服务器,网络的主干道就会被阻塞。这其实就是所谓的“热点”问题,可以采用分流
的操作解决这个问题。
主服务器部署在北京不变,但是全国各地都建立一些缓存站,这些缓存站可以缓存一些主服务器上变化不频繁的资源,比如css/js/图片等静态资源。当用户访问网站的时候,根据就近原则,选择一个距离他最近的缓存站。
如果缓存站找不到,那么就回源到源站,也就是缓存站回去北京的服务器要数据,然后将这些数据缓存到本地且返回给用户。
当然,一些热点的数据也可以让源站主动推送给缓存站,进行缓存预热
。这样,就减少了回源的操作,使得高峰时期服务器更加平稳。
动态数据怎么办
静态的按照上面说的路子走,动态的则是根据内部的一些调度算法,智能的选择最优回源路径去请求源站
,节省请求的时间。
2.CDN基础结构
所谓CDN缓存节点就是上面说的缓存站,然后还是一个很重要的GSLB(全局负载均衡器)
这个GSLB实现的主要功能就是:根据就近原则,选择一个距离他最近的缓存站。简单来说,就是请求转发,转发到最近的站。GSLB转发机制有三种实现
- 基于DNS解析
- 基于HTTP重定向
- 基于IP路由
业界实现转发的主流技术是DNS解析,因为DNS有缓存以及负载均衡能力。
13. 从网络角度看,用户从输入网址到网页显示,期间发生了什么
- 浏览器解析URL:浏览器会解析URL,根据请求信息生成对应的HTTP请求报文。
- DNS解析:请求需要知晓服务器域名对应的IP地址才能通信,浏览器会检查本地缓存、操作系统缓存、甚至路由器缓存,如果未命中缓存,浏览器向配置的DNS服务器发送查询请求。DNS服务器递归查询最终返回IP地址。
- TCP或者UDP:接着浏览器会调用socket库委托协议栈工作,根据指定的情况选择TCP或者UDP。如果使用TCP,需要通过三次握手建立连接,需要在数据发送前通过三次握手和服务端建立连接。此时得到了封装了HTTP数据的TCP数据包。
- IP:在TCP数据包的基础上,在封装源地址IP和目标地址IP等信息,得到网络包。有了IP就能在多个网络节点中确定数据包的传输路径,最终找到目标服务器。
- MAC:得到网络包后,需要在IP头部的前面加上mac头部,封装发送方MAC地址和接收方MAC地址。MAC用来确保子网内设备两点之间的通信寻址。
- 网卡:这个时候,网络包还是存储在内存中的二进制数据,需要网卡把二进制数据转换为电信号,通过网线进行传输。
- 交换机:通过网线会连接到交换机,交换机是二层网络设备。工作在mac层,他会根据数据包的mac头找到另一个设备连接在交换机的哪个端口,然后传输。如果找不到对应的端口,则会向交换机上的所有端口广播。
- 路由器:路由器也是进行转发,他是三层网络设备,包含IP层,利用路由器,数据在不同网络节点之间转发,最后到达服务器。
- 层层验证:服务器确认MAC地址匹配、IP地址匹配,如果是TCP协议则看看序列号是否匹配,若匹配,根据对应的端口号找到监听进程,此时服务器上对应的应用就接收到数据了。
- 服务器处理:服务器收到请求后,处理相应的业务逻辑,生成HTTP响应,这期间可能涉及到读取数据库、访问文件系统等。最终会生成响应给客户端(又是一层层的封装TCP、IP、MAC等头部数据,得到最终的数据包),从网卡到交换机到路由器。。。。
- 浏览器接收响应并渲染页面:经过多个路由器转发后,浏览器最终会接收到服务器返回的响应,进行页面渲染展示。