计算机网络的一些术语:
- 速率:传送比特的速率,也称为比特率或者数据率。在计算机网络中,表示单位时间内从网络中的某一点到另一点所能通过的"最高数据率"(单位是比特每秒,记作b/s)、
- 带宽:网络的通信线路所能传送数据的能力。单位:Hz
- 吞吐量:表示单位时间内通过某个网络/信道/接口的数据量。
- 网络按传输介质分类,可分为有线网络和无线网络。
- 链路:是一个节点到相邻节点的一段物理线路。
- 数据链路层传送的数据单元是帧。
- 单工:只能有一个方向的通信而没有反方向的交互。
- 半双工:通信的双方都可以发送信息,但不能双方同时发送或同时接收
- 全双工:通信的双方可以同时发送和接收信息。
- 网络应用是当前的主流,对于网络开发来说,需要考虑到不同协议所带来的问题。
- 对于Java网络开发来讲,长期以来都是依靠中间件的技术进行的程序开发,所有的代码都保存在中间件上,而后通过中间件进行所谓的各类的性能调优以及网络服务的构建。
- 网络应用之中最为重要的核心概念就是通信协议,而协议常见的就是TCP/UDP这样的基础协议,在这之上可以扩展出其它的协议,例如:HTTP协议,网络协议确定了,就可以进行网络应用的开发,而应用的开发就可以通过编程语言来实现的。
- 不同的编程语言都有不同的"语法糖",对于技术来讲关键是看落地。
- Java NIO技术的封装 - Netty开发框架
- 网络应用基本上都会按照"C/S"模式(B/S也是C/S一种延续而已), 客户端通过特定的IP地址和端口号与指定的服务器进行连接,随后与服务器在建立的网络通道上进行通讯。
此时需要思考到两项性能优化的方案:
优化方案一:网络连接上的有效管理(占着茅坑不拉屎)
优化方案二:减少通信数据的体积(搬东西太多了,跑不快)
- "世界上计算机没有100%的优化方案,但是可以对"蠢材"写出的代码进行优化"。
- NIO的核心本质就在于多路复用。
话题:Go现在很火,我要放弃Java转Go了?
- "这个话题我已经听了20年了..."
- Go的生态很火,火的原因是在于其有大量的Go云组件,最著名的就是Docker、Kubernates、ETCD、CoreDNS、MinIO,但是使用Go构建的业务代码多吗?
- Nginx基本上是每个公司都会使用的,使用C语言开发的,难道C不比Go厉害?为什么你不学C?所有的运行环境都有Linux操作系统,Linux使用C写的,你怎么不学C?
Linux下使用的是Epoll模型。
- IP地址有两个部分组成,分别是网络号和主机号。
- 子网掩码是为了划分网络号和主机号的。
计算机网络的重点:
- 计算机网络的整体结构
- HTTP
- TCP
- DNS
- 网络安全
整体结构以及HTTP部分一些问题:
- OSI七层模型的每一层分别是什么?对应的协议有哪些?
- TCP/IP模型的每一层分别是什么?为什么TCP/IP模型更常用?
- HTTP协议的特点?
- HTTP协议中常见的状态码有哪些?301和302有什么区别?
- GET和POST方法有什么区别?除了这两个之外还了解过什么请求?
- HTTP 1.1相对于1.0版本多了哪些新特性?
- Cookie,Session和Token分别是什么?
- Session在分布式场景下有什么缺点?如何解决?
- 服务器接收到一个HTTP报文之后是如何解析的?
- HTTP和HTTPS有什么区别?
- 对称加密和非对称加密有什么区别?
- TLS连接过程?
- HTTPS发起请求的过程?
- HTTP的缓存机制?HTTP的强缓存和弱缓存了解吗?
- HTTPS怎么保证安全性的?
- HTTP和IP在哪层?有什么区别?TCP在哪层?ICMP是哪一层的协议?
- 长链接和短连接?
- 什么是对头阻塞?
TCP以及UDP相关的问题:
- TCP协议的特点?
- 三次握手和四次挥手的流程(重要)
- 为什么需要三次握手?两次不行吗?为什么?为什么需要四次挥手?三次不行吗?
- 三次握手的过程中可以携带数据吗?
- TCP三次握手中可以携带应用层数据吗?
- ACK数据包,消耗TCP的序号吗?
- 有了解过SYN攻击吗?具体是怎么样的?如何解决?
- TCP如何保证可靠传输的?
- UDP有什么特点?一般在哪些场景下会考虑使用UDP协议?
- TCP的拥塞控制?TCP的滑动窗口、流量控制,拥塞控制和连接管理?
DNS以及网络安全相关的问题:
- 简单说一下DNS协议的作用?
- DNS整个执行的过程是怎么样的?DNS是基于TCP还是UDP的?
- 跨域是什么概念?
- 有没有了解过常见的网络攻击手段?
- XSS攻击是什么?CSRF攻击是什么?DDos攻击???
- 在浏览器输入网址到打开网站页面整个过程中发生了什么?
- 为了可以通过MAC地址对不同设备进行数据的传输,就出现了交换机。
- TCP允许应用把字节流变成多份段,而不是整个字节数据完整的发送出去。
1. OSI七层模型的每一层分别是什么?对应的协议有哪些?
- 应用层、表示层和会话层的数据统称为应用数据,或者应用负载,也可以叫做上层数据,同时也是教科书上说的报文。
处于最中间的 - 传输层
OSI七层模型:就是把整个计算机网络划分成了七层的结构,每一层都有自己负责的一个任务。OSI网络参考模型的出现是为了解决主机之间的网络通讯。
- 应用层:负责为应用程序提供交互服务,对应的是HTTP协议(超文本传输协议) ,可以理解为应用层定义了一些比较高级的API,应用层是最接近用户的一层,请求的发送直接对应到用户上,用户可以直接在浏览器中直观的看到应用层的一些东西,比如我们的整个页面:其实都是一个HTTP请求发送返回的一个结果,只不过浏览器把它解析成了我们所看到的页面供我们去查看。还有FTP(文件传输协议)、DNS(域名解析系统/域名解析协议):将域名转换为对应的IP地址。
- 表示层:不同计算机内部的各自表达方式可能不太相同,表示层就来负责这样的一个转换,也就是编码和解码。数据往往还需要进行加密,比如: HTTPS(SSL/TLS)就会对我们的数据进行加密和解密。说白了主要做数据格式的一个转换,比如通常情况下我们希望数据的格式是文本格式或者说字符,因为这样的话我们用户可以比较直观的去查看,但是有些情况我们可能希望传输或者接收数据的格式是二进制类型的,因为计算机解析二进制肯定要比解析文本更快一点,对于这种情况,我们就需要在表示层去做一些处理。另外我们可能还需要进行文件瘦身,压缩也是表示层负责的。
- 会话层:用来负责建立和管理会话(客户端跟服务端之间的一次连接)。会话层没有特定的协议。 比如你登录了一个网站,网站服务可以保持你的登录状态,不用每次都输入账号和密码。另外会话层还负责同步服务: 比如你上次看到电影高潮的时候突然停电了,再次登录账号的时候,就可以自动同步到上次看到的时间段,
- 传输层:段就是传输层里面数据的名字,负责提供端到端之间,或者说主机到主机之间一个连接,实现了服务进程到服务进程的传输,两台主机之间的通信都是由传输层来进行控制的。 比如我们去百度上搜索东西,我们的主机肯定是要跟百度的服务器建立一个Connection连接,建立连接之后,我们要通过在连接上传输数据,我们在连接上发送请求,然后百度服务器在连接上返回一个响应,那我们整个操作其实都是在连接上进行的,这个时候比如我们的数据如何传输,然后传输的速率怎么样,安全性有没有得到保障,可靠性怎么样,会不会丢失,这些都是由传输层来进行一个控制的,所以传输层是非常重要的,它会控制你跟服务器之间的一个通信情况。传输层管理两个节点之间数据的传输,负责可靠传输和不可靠传输,传输层主要协议有TCP(传输控制协议)、UDP(用户数据报协议)。TCP允许应用把字节流变成多份段,而不是整个字节数据完整的发送出去。传输层通过流量控制来确保传输速度,再加上错误控制来进行数据完整的接收。 端口号!!!报文来到传输层,加上端口号,封装成段。
- 网络层:网络层里数据的名字对应的是包,网络层负责数据的路由和转发,相当于是在传输层的基础上又多了一层封装,传输层我们只需要知道一个端口就可以进行传递了,但是网络层我们还需要知道一个****IP地址 。网络层主要协议是IP协议(互联网协议),IP协议负责将数据分割成小的数据包,并通过路由将这些数据包从源主机发送到目标主机,使得数据包可以在网络中进行正确的传输。路由器也是网络层的核心。IP地址是用来唯一标识网络上的设备的地址。IP地址是IP协议的一部分。ICMP(互联网控制报文协议):是一种用于在Internet上发送控制消息的协议,排除网络故障、网络可达性测试,例如,我们常用的ping命令就是基于ICMP协议实现的。ARP(地址解析协议):解析网络层中的IP地址与数据链路层的MAC地址之间的映射关系的协议,是一种很用于将IP地址解析成MAC地址的协议。段来到网络层,加上IP地址,封装成包。
- 数据链路层:对应的是帧,它也是网络层再向下的一层封装,它的话就需要我们知道MAC地址,也就是物理地址。数据链路层的数据传输其实就要通过MAC地址来定位的,网卡出厂的时候就有全部唯一的****MAC地址 。数据链路层除了说在MAC地址上传输之外,它还有一个作用就是做一个简单的流量错误控制,就比如说我们的数据在传输的时候出现了一些丢失或者说受到一些损坏,那我们数据链路层是可以感知到这个情况的。
- 物理层:物理层就比较直观一点,说白了就是网络设备,网络设备在整个结构之中传输所有的二进制数据文件(也就是比特,0和1就叫做比特),比如我们的网线:或者是光纤,或者是双绞线,这其实都是物理层的一个东西。物理层为数据链路层屏蔽了各种传输媒体的差异。
传输层协议和网络层协议有什么区别?
- 网络层协议负责提供主机间的逻辑通信;传输层协议负责提供进程间的逻辑通信。
2. TCP/IP模型的每一层分别是什么?为什么TCP/IP模型更常用?
OSI七层模型是官方比较标准的一个计算机网络的模型划分, OIS模型它是一个理论模型,我们在实现的时候,或者说在实际应用中,TCP/IP模型才是一个实际应用的模型,因为OSI七层参考模型划分的太过繁琐,包括我们的Linux系统,它在构建网络模型的时候也采用的是TCP/IP模型。
TCP/IP四层网络模型是对OSI七层网络模型的一个简化。
TCP/IP模型本身是一个四层的网络协议模型,它把原本的应用层、表示层、会话层统一的用一个应用层来进行了一个代替,合并为应用层,因为表示层、会话层我们很少接触到,这样有助于我们做网络设计,将数据链路层和物理层合并为网络接口层(数据链路层)。简化之后流程变得简单了,也大大减少了资源的消耗。
- 应用层:负责处理特定应用程序的通信,例如:HTTP(超文本传输协议)、FTP(文件传输协议)、DNS(域名解析协议)=>将域名转换为对应的IP地址。
- 传输层:负责提供端到端的可靠数据传输服务。主要通过TCP(传输控制协议)和UDP(用户数据报协议)来完成。
- 网络层:负责进行数据包的路由和转发,将数据包从源主机发送到目标主机,使用IP协议进行寻址和路由选择。IP协议(互联网协议)、ICMP(互联网控制报文协议):排除网络故障、ping网络可达性测试、ARP(地址解析协议):解析网络层中的IP地址与数据链路层的MAC地址之间的映射关系的协议。
- 数据链路层(网络接口层):负责将数据包封装成帧,并通过物理介质进行传输,例如以太网。
3. HTTP协议的特点?
- HTTP协议-超文本传输协议。
- HTTP运行在应用层,如果从操作系统层面来看,应用层算作操作系统的用户态。
- 什么是文本,就是带有文字的文档;什么是超文本,说白了就是带有超链接的文档。
- 超文本:超越了普通文本的限制,比普通文本刚强大,除了文字信息,还可以定义图片、音频、视频等内容。
HTTP协议的三大特点:
- 基于TCP协议:面向连接,安全
- 基于请求-响应模型:一次请求对应一次响应(先请求后响应)
- HTTP协议是无状态协议:对于数据/事务处理没有记忆能力,每次请求-响应都是独立的,第一次请求传输的数据并不会携带到第二次请求里。导致引申出来的问题:多次请求间不能进行共享数据。 比如我们做了一个购物网站:有一个购买的功能,有一个浏览的功能,而浏览的功能它一般都是完全放开的,不管你是登录也好还是未登录也好,都允许去浏览商品;但是购买我们只允许已经登录的用户才去购买,比如我们用户已经登录了,但是登录这次请求处理完毕之后,再到购买这次请求的时候,我们是不知道用户是否已经登录了,就导致购买功能无法正常完成,因为HTTP协议是无状态协议,在两次请求之间是无法进行数据的共享的。解决方案:Web会话技术(Cookie、Session、Token),Cookie和Seesion的思想:额外存储一些信息,让HTTP协议知道状态。Token的思想:不存储数据,时间换空间,本质就是一个加密的字符串。
HTTP / 1.1相对于HTTP / 1.0版本多了哪写新特性?
HTTP的几个版本:HTTP / 0.9、HTTP / 1.0、HTTP / 1.1、HTTP / 2.0、HTTP / 3.0
HTTP / 0.9: 第一个公开发布的版本,有了Get请求,有了POST请求,相当于做了一个最基础的一个定义。
HTTP / 1.0: 多了一些请求方式,比如:多了PUT请求、多了DELETE请求、多了HEAD 请求,同时对Cookie长度也做了一个比较严格的限制。HTTP / 1.0的时候全部都是短链接,用户发送完请求,并且服务端进行响应之后这个链接就断开了,在HTTP / 1.0中,默认情况下,每次请求和响应都使用短链接,即每次传输结束后都会断开连接。 但是你不要忘记了一个Web页面上还会存在有大量的资源,每一次断开连接之后,再次下载资源的时候再建立一次连接,这样的话连接的建立的性能很差(建立的时候三次握手,离开的时候四次挥手)。HTTP / 1.0协议可以实现长链接,但是需要客户端和服务端共同完成,通过一个非标准的"Connection:keep-alive"头信息来实现,该字段主要是告诉Web服务器先别关闭,我还来找你要资源呢,但是这个机制可能对一些服务器无效,于是在HTTP / 1.1协议里面就将其作为了标准支持。
HTTP / 1.1: HTTP / 1.1版本解决了数据展示的问题(解决了长连接的设计问题,底层依靠的是TCP协议)。HTTP / 1.0默认每个请求-响应都要建立一个新的连接,而HTTP / 1.1允许多个请求-响应共享同一个连接,减少了连接建立和断开的开销。 HTTP / 1.1支持并发连接,这指的是客户端可以同时服务器之间建立多个并行的网络连接,以在单个会话当中发送多个请求和接收多个响应,通过并发链接,客户端可以在单个时间点上发起多个请求,而不必等待之前的请求完成,一次来提高整体的效率和性能,有效的利用了资源,然而并发连接也受到了一些限制,例如服务器的带宽还有客户端同时打开的连接数,过多的并发链接可能会导致服务器过载。
HTTP / 2.0: 开始进行底层协议上的改进(TCP转为UDP的过渡阶段)。HTTP / 2.0引入了更先进的多路复用技术,允许多个请求和响应在单个TCP连接上同时交错传输,进一步提高了网络性能。HTTP / 2.0支持流量控制,流量控制的目的是限制发送方和接受方发送的数据量,以防止过载。HTTP / 2.0还引入了服务器推送机制,它允许服务器在客户端请求之前,主动将相关资源推送给客户端:常见的HTTP请求都是客户端发送请求,服务器收到请求之后返回数据,除了WebSocket之外,HTTP / 2.0也能实现这个功能。
HTTP / 3.0: 开始正式引入了修改后的UDP协议(QUIC协议登场)
- 短链接知识普及:用户 / 客户端发送完请求,并且服务端进行响应之后这个链接就断开了。
- 长链接(持久链接)是指在客户端和服务器之间建立一次连接,然后保持该连接的状态,使得客户端和服务器之间可以进行多次的数据交换,避免了频繁的建立和断开连接的开销,提高性能和效率。
HTTP 1.1和TCP协议有什么弊端?
- 在进行HTTP / 1.1协议处理的时候,由于使用的是TCP协议作为其底层的实现,因此每一个HTTP客户端都需要独占一个TCP连接(一般来讲服务器上的连接数量是有限的,是不可能无限制的扩充,服务器上支持的连接句柄的数量,只是理论上的可能性,实际之中可能会更少,毕竟做服务端是需要处理业务的),同时所有的数据都采用非压缩的方式传输,头信息的内容是无法进行压缩处理的,而且每次请求-响应都需要携带这些头信息,这样也就意味着每一次请求和响应的时候都需要携带有大量的重复内容(带宽占有率极高)
- HTTP / 1.1解决了长链接的设计问题,但是HTTP / 1.1是构建在TCP协议上的,于是这里面就会存在一个新的问题:所有的请求是放在一个队列里面去进行处理的,所有的数据通信是按照次序依次进行的,服务器只有在处理完一个响应后,才允许处理下一个响应,如果说某一个响应处理很慢就会导致后续响应的排队,这种情况被称为"对头阻塞"。
- HTTP / 2.0的出现就是为了解决HTTP对头阻塞的问题, HTTP / 2.0引入了更先进的多路复用技术,允许多个请求和响应在单个TCP连接上同时交错传输,即使某个流的响应受到延迟或阻塞,其它流的请求和响应仍然可以继续允许,这样就避免了对头阻塞的问题,进一步提高了网络性能,提高了整体的性能和吞吐量。同时为了提高传输性能,HTTP / 2.0协议里面还支持有头部数据压缩的机制。
- HTTP / 3.0通过使用索引表来减少重复内容的传输,提高性能和效率。
总结: TCP协议会出现对头阻塞的情况,而HTTP / 1.1版本里面头信息无法压缩,会造成无用的带宽资源浪费。
- HTTP / 1.1协议中数据报文使用文本结构进行数据的传输,这样的处理机制可以直观的查看数据包中的数据内容(于是这个时候就需要进行SSL数据加密传输),但是为了解决数据泄露的安全漏洞,使用HTTPS进行改进(这个时候属于改进,而不是必须),而HTTP / 2.0的时候数据包文采用二进制(流)的传输模式(文本数据的体积很大,但是二进制数据的体积相对较小),计算机处理二进制一定比处理文本速度更快,虽然提高了传输的性能,但是却无法进行数据的直观获取(安全了)。
HTTP / 2.0为什么不用UDP?
HTTP / 2.0选择使用TCP而不是UDP作为传输层协议的主要原始是因为:
为了保证数据的可靠性,TCP提供可靠的数据传输,它使用确认机制、序列号和重传机制来确保数据的可靠性,而UDP则不提供这些机制。在HTTP / 2.0的应用场景中,可靠性是至关重要的,因为它通常用于传输重要数据和敏感信息。
顺序保证:TCP确保数据以发送的顺序按序到底接收端,而UDP则没有此保证。在HTTP / 2.0中,保持数据传输的顺序是很重要的,因为它涉及到请求和响应之间的对应关系,确保正确处理和解析响应。
流量控制和拥塞控制:TCP具有流量控制和拥塞控制的机制,这意味着它可以根据网络状况进行适应性调整,避免网络拥塞和数据丢失。对于HTTP / 2.0这样的高效传输协议,流量控制和拥塞控制的特性非常重要。
- 虽然UDP相对于TCP具有较低的延迟和头部开销,但它在可靠性和顺序保证方面的弱点使其不太适合作为HTTP / 2.0的传输协议。HTTP / 2.0主要关注性能、多路复用和减少延迟等方面的优化,而这些特性在TCP协议上可以更好的实现。
HTTP有加密方式吗?
- HTTP有加密方式,HTTP默认是明文传输,它是不太安全的,为了我们确保安全,我们可以采用加密,就是把我们的内容进行一个加密,收到之后再解密。
- 常见的两种加密算法:对称加密和非对称加密。
对称加密: 就是发送方和接收方使用相同的密钥来进行加密和解密,发送方使用密钥将明文数据转换为密文数据,接收方使用同样的密钥将密文数据解密为明文数据。
- 此时对称加密有个缺点就是说我们接收方想要知道这个密钥,发送方肯定是要先经过一次无加密的请求把该密钥传输过去,因为一开始接收方是不知道密钥的。因此,对称加密的一个重要问题是在通信双方之间如何安全的共享密钥,如果密钥在传输过程中被攻击者截获,导致密钥被泄露,那么加密的数据将无法保护。
- 还有一个就是我们客户端比较多的时候,那我们服务器对每个客户端都维护一个密钥,那么服务器要维护特别特别多的密钥,牵扯到一个维护成本的问题。
非对称加密:也称为公钥加密。
- 非对称加密算法由两个密钥组成:公钥和私钥。
- 公钥加密过的数据只有私钥能解开,私钥解密过的数据只有公钥能解开。
- 公钥可以公开发布,任何人都可以使用它来加密数据,而私钥必须保密,只有持有私钥的人才能解密数据,这样即使公钥在传输过程中被截获,也不会影响加密的安全性,但是对称加密比非对称加密慢的多。
- 服务器把公钥发送给客户端,客户端发送的数据都通过公钥加密,服务器收到公钥加密过的数据后,通过自己的私钥进行一个解密。非对称加密的一个重要特点是:公钥可以在不保密的情况下共享给任何人,而私钥必须始终保持私密。
总结:
- 对称加密:快速,效率高,但需要安全的共享密钥;
- 非对称加密:通过公钥和私钥配对,无需共享私钥,但计算复杂度较高。
HTTPS是怎么保证安全性的?
- HTTPS采用对称和非对称加密混合的一个算法来保证在网络上传输的数据的安全性(因为单纯用非对称加密会非常耗时) => TLS四次握手、CA机构和安全证书、公私钥、对称加密、非对称加密。
- HTTPS并不是一个单独的协议,只不过在HTTP的基础上用TLS/SSL安全协议进行加密,使得报文能够加密传输,这样通信就容易受到拦截和攻击。
- SSL是TLS的前身,它们两都是加密安全协议,现在绝大部分浏览器都不支持SSL,而是支持TLS。
- TLS加密,对称和非对称加密这两种都有用上,HTTPS规定服务端需要申请SSL证书,SSL证书其实就是保存在源服务器的数据文件,要让SSL证书生效就需要HTTPS协议向CA机构申请数字证书,来确保服务器的身份是可信的,CA指的就是Certificate Authority证书授权中心,是第三方的一个机构,这个证书除了表明域名是属于谁的,日期等等信息以外,重要的这个证书还包括了特定的公钥和私钥,私钥由服务端自己保存,不可泄漏。公钥则是附带在证书的信息中,可以公开的。证书本身也附带一个证书电子签名, 这个签名用来验证证书的完整性和真实性,可以防止证书被篡改。
- 简单来说服务器安装了SSL证书以后,用户就可以通过HTTPS来访问服务器了,当然浏览器也会把HTTP的默认端口改为HTTPS的默认端口443。
- 服务器响应客户端请求,将证书传递给客户端,证书包含公钥和大量其他信息,比如证书颁发机构信息,公司信息和证书有效期等。
HTTPS 主要工作流程:
- 客户端发起 HTTPS 请求,连接到服务端的 443 端口。
- 服务端有一套数字证书(证书内容有公钥、证书颁发机构、失效日期等)。
- 服务端将自己的数字证书发送给客户端(公钥在证书里面,私钥由服务器持有)。
- 客户端收到数字证书之后,会验证证书的合法性。如果证书验证通过,就会生成一个随机的对称密钥,用证书的公钥加密。
- 客户端将公钥加密后的密钥发送到服务器。
- 服务器接收到客户端发来的密文密钥之后,用自己之前保留的私钥对其进行非对称解密,解密之后就得到客户端的密钥,然后用客户端密钥对返回数据进行对称加密,这样子传输的数据都是密文啦。
- 服务器将加密后的密文返回到客户端。
- 客户端收到后