一、笔记知识点
1、OSI、TCP/IP
● OSI:概念性模型,它是一个标准,有国际组织ISO制定。主要将网络划分为:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
● TCP/IP:是OSI的一种实现,是一种主流的网络通讯协议实现标准。主要将网络划分为:物理层、数据链路层、网络层、传输层、应用层。
2、TCP的三次握手
2.1 过程
● SYN报文段:不能携带数据,但要消耗掉一个序号;
● ACK报文段:可以携带数据,如果不携带数据则不消耗序号。
TCP三次握手涉及到客户端、服务器双方。假设客户端是主动发起连接的一方,服务端是被动接受连接的一方。
(1) 服务器首先创建一个TCB传输控制块(连接的数据结构,存储连接的状态、传输数据的信息、错误控制的信息……),来准备接收客户端的连接请求。初始时,服务端的连接状态为“CLOSED”。
(2) 客户端打算发起请求,也会创建一个TCB,初始时,客户端的连接状态也为“CLOSED”。然后客户端给服务端发送一个请求连接的TCP报文。里面携带了SYN=1的标志字段,同时给出了自己的初始sequence number序列号,假设为x。然后客户端进入“SYN-SEND”同步已发送状态。
(3) 服务器接收到该连接请求后,如果允许建立连接,会回送一个ACK报文。里面,携带了ACK=1的字段,表明这是一个回复报文,并且ack序列号为x+1,表明已经知道了客户端的序列号。此外,该条报文同时还携带了SYN=1的标志字段,并给出了自己的初始序列号,假设为y。此时,服务器进入了“SYN-RCVD”同步已接受状态。
(4) 客户端接收到来自服务器的ACK报文后,发出一个ACK回复报文给服务器,报文携带的信息中存在ACK=1的标志字段,该信息的序列号为x+1,并且ack序列号为y+1,表明客户端已经知道了服务器的序列号。此后,客户端的连接进入“ESTABLISHED”状态。
(5) 服务器接收到来自客户端的最后一个ACK报文,此时服务器的连接状态也进入“ESTABLISHED”状态。
至此,三次握手后,TCP连接已成功建立。
2.2 为什么需要三次握手才能将连接建立起来?
(1) 为了初始化双方的sequence number序列号;
(2) 并且还要通知对方已经接收到了你的sequence number了
理解:也可以看成是四次握手。双方各自一次的告知sequence number,对方各自的ack回复报文。只不过其中一方将ack报文和告知sequnence number的报文合并成一次。这也就变成了我们熟知的三次握手了。
(3) 防止已经失效的报文段再次到达服务器,而被服务器误以为客户端请求连接,如果没有三次握手,那么服务器回送ack报文(但是由于报文已经在客户端失效,客户端并不理会),此时连接已经建立起来了,服务器一直等待客户端发送数据,导致白白浪费了服务器的许多资源。
2.3 SYN攻击
● 问题背景
基于三次握手。当服务器收到客户端发送的第一个SYN报文,并回送了一个ACK报文后,迟迟未收到第三次握手的ACK确认(e.g 客户端掉线)。这个时候,服务器会不断重新发送SYN-ACK报文,直至超时。
(linux会默认等待63s才断开连接:默认情况下重试次数为5次,第一次间隔时间1s,每次翻倍。第5次重试之后,还要等待32s才会判定超时。)
【区分TCP keep alive机制,它是在连接已经建立起来之后,默认情况下2个小时没有任何数据传输,进行心跳包检测/保活的机制,默认重试次数9次。】
● 可能造成的后果
可能会使服务器遭受到SYN-Flood泛洪攻击。
恶意程序可能会给服务器发送大量的SYN报文,并且不对服务器回送的SYN-ACK报文作出ACK报文回应,重复以往,就会使得服务器的半开连接队列资源耗尽,导致正常的请求被踢出队列,无法正常建立连接。
● 解决的方案
(1) SYN Cache
构造一个全局的Hash Table,用来缓存系统当前所有的半开连接信息。连接成功则从表中清除相关信息;Hash Table中的每个桶的容量有限,如果当桶“满”了,就要进行淘汰操作。当服务器收到一个SYN消息后,会将半开连接信息加入到Hash Table中,其中key的生成很关键,既要用到SYN消息中包含的信息(如:Source IP、Port等),又要做到很难被攻击者猜到,一般会用一个秘密函数生成,使得半开连接信息能够随机并均衡的分配到各个桶中。这样一来,可以使得攻击的难度大幅提升,因为攻击者不仅要把每个桶填满,并且还要以足够快的速度填桶,才能达到攻击的目的。
(2) SYN Cookie
着眼于消除半开连接对服务器资源的消耗,原理和HTTP Cookie技术类似。服务器将半开连接信息编码成“Cookie”,用作初始序列号,随着SYN-ACK报文一起返回给客户端。这样一来,服务器这一边不需要保存任何信息。如果客户端是正常用户,则会在最后一次握手的ACK报文中携带之前保存的Cookie信息,这样服务器收到后验证内容,并建立连接;如果客户端是恶意用户,它就不会给服务器反馈ACK报文,这样服务器也没有任何损失。
但是这种方式有一定的缺点:服务器如果不保存半开连接的信息,就会导致它丧失重发SYN-ACK报文的能力。这一方面会降低正常用户连接的成功率,另一方面可能会造成通信双方对连接是否成功产生误解,意思是当正常用户发送了最后一次ACK报文后,客户端已经认为连接建立起来了,而这个ACK报文半路遗失了,服务器没有收到ACK报文,则认为连接没成功。
2.4 建立连接后,其中一方出现了故障怎么办?
使用保活机制。
利用保活计时器,如果在一段保活时间keep alive time内,连接处于非活动状态,其中一方发送保活探测报文,如果发送端在这之后没有收到响应报文,那就经过保活计时器规定的时间keey alive time internal,继续发送保活探测报文(当然如果收到了对方的响应报文,就重置保活计时器),直到次数达到保活探测数keep alive count。这时,对方主机被确认为不可达,连接也将被中断。
3、TCP四次挥手
3.1 过程
● FIN报文:可以携带数据,但即使不携带数据,也要消耗一个序号。
假定客户端、服务器已经建立了TCP连接,连接状态都是“ESTABLISHED”。客户端现在要主动断开连接。
(1) 客户端发送一个FIN报文给服务器,里面携带了自己的序列号,假设为u。此时客户端进入了“FIN-WAIT1”状态。
(2) 服务器收到FIN报文之后,通知上层的应用程序,从客户端到服务器这个方向的连接已经释放了,客户端不会再发送数据了。但是从服务器到客户端这个方向的连接还未释放,服务器还可以继续向客户端发送数据。此时处于“半关闭”状态。服务器向客户端发送一个ACK报文,其中ack序列号为u+1,并携带上需要发送给客户端的数据,假设自己的序列号为v。服务器进入了“CLOSE-WAIT状态”。
(3) 客户端收到了服务器的ACK报文后,进入“FIN-WAIT2”状态,在这个阶段,接收服务器发送过来的数据。
(4) 服务器发送最后一个数据报文,假定现在的序列号为w,会携带上FIN=1的标志字段,表明之后不会再发送新的数据了。此外还会重复确认之前客户端的报文,即携带上ACK字段,以及ack确认序号u+1。此后服务器进入了“LAST-ACK”状态。
(5) 客户端接收到服务器的FIN报文后,会回送一个ACK报文,ack确认的序列号为w+1,并且携带自己的序列号u+1,此后进入“TIME-WAIT”状态。
(6) 服务器收到ACK报文后,进入“CLOSED”状态。
(7) 客户端还要等待2MSL时间(最长报文段寿命,这是时间等待计时器设置的时间)才会进入“CLOSED”状态,如果在这期间又收到服务器发送的FIN报文,说明服务器并没有收到客户端回送的ACK报文,因此要重新发送ACK报文,并重置时间等待计时器2MSL的时间。
至此,TCP连接释放完毕。
3.2 为什么会有TIME-WAIT状态?
(1) 保证服务器有足够的时间收到客户端发送的ACK报文,能够将连接正常关闭。假定服务器没有收到最后的ACK报文,那么它就会重传FIN报文,客户端收到后,会再次发送一个ACK报文,一来一回的时间最长是2MSL。
(2) 有足够多的时间可以使本连接中产生的所有报文段从网络中消失,避免下一个新的连接出现旧的已失效的报文段。
3.3 为什么需要四次挥手才能断开连接?
TCP是全双工的,发送方和接收方都要发送FIN报文和ACK确认报文。
3.4 服务器频繁出现大量的CLOSE-WAIT状态的原因?
客户端主动断开连接,但是服务器这边忙于读写,没有及时关闭连接。
(可能是代码有bug,例如资源没有正常释放和关闭,或者是配置的不合理,例如线程池中的数目,使得在一段时间内有大量的连接关闭,导致服务器忙于发送数据,而忽略了连接的关闭。)
必须要有处理客户端异常断开的逻辑,不然服务器在积攒大量“CLOSED WAIT”的TCP连接的情况下,会占用大量的资源,最后报出“too many open files”的致命错误(在linux系统中,设备、套接字等一切皆文件,如果异常客户端的连接没有即使断开,新的客户端又源源不断的加入进来,产生新的文件,到达上限值之后,就会抛出打开文件太多的错误)。
4、TCP和UDP的区别
4.1 TCP报文和UDP数据报
● 头部重要字段
(1) 源端口、目的端口(各占2个字节)
(2) 序列号(占4个字节)
(3) 确认号(占4个字节)
(4) 控制字段:URG、ACK、FIN、SYN等
(5) 数据偏移量(其实就是首部的长度)
(6) 可选项(如MSS,最长报文段长度,不包括首部,只考虑数据段)
分组会发生在运输层和网络层。运输层的TCP会分段,网络层的IP会分片。IP层的分片更多的是为运输层的UDP服务的,因为TCP自己会避免IP的分片。
(7) 扩展(以4个字节为单位,可扩展4n个字节,最高可40个字节,固定首部大小为20个字节)
● 头部重要字段
(1) 源端口、目的端口(各占2个字节)
(3) UDP整个数据报的长度(最小是首部的长度,8个字节)
(4) 检验和(在实际做校验的时候:会计算校验和的时候会临时加上虚拟首部,包括源IP、目的IP、长度、协议等等来计算)
4.2 TCP、UDP的不同点
(1) TCP是面向连接的;UDP是无连接的;
(2) TCP保证可靠交付,即无差错、不丢失、不重复、并且按需到达;UDP是尽最大努力交付,不保证可靠传输;
(3) TCP连接是点对点的;而UDP可以一对一、一对多、多对一、多对多;
(4) TCP是面向字节流的,它把数据看成是一串无结构的字节流;UDP是面向报文的,对于应用层交付下来的报文,不进行合并和拆分,而是直接封装发送;
(5) TCP的速度慢,因为想要实现可靠交付,有额外的机制来保证;UDP没有类似TCP的拥塞控制等机制,速度快,适合于速度敏感型应用,比如在线视频、多人游戏等;
(6) TCP是全双工通信,也就是说双方都可以发送数据、接收数据,它的首部长度较长;而UDP的首部长度较短,只有8个字节。
5、TCP的滑窗:面向字节流
5.1 发送(接收)窗口的构成:主要受限于接收窗口的大小(不能比接收窗口要大),和网络的拥塞程度
● 发送窗口
假设有3个指针,分别为p1、p2、p3。
p1:指向已发送但未收到确认的数据;
p2:指向允许发送但还没有发送的数据;
p3:指向不允许发送的数据。
其中,p1-p3是发送窗口,p2-p3是有效窗口。p3是发送窗口的前沿,它的前面是将来发送的数据;p1是发送窗口的后沿,它的后面是已经发送并且收到了ack报文的数据。发送窗口中的数据均可以被发送到网络中,如果发送后迟迟收不到接收方发来的ACK报文,那么p2指针就会和p3指针合并,此时整个发送窗口都是已发送未确认的数据。超时重传器到达规定的时间,就会对这部分数据进行重传,并重置超时时间,直到接收方发来ACK报文为止。
● RTT(Round-Trip Time):发送一个数据包到收到对应的ACK所花费的时间;
● RTO(Retranslation Timeout):超时重传时间(重传的时间间隔),是通过自适应算法基于RTT计算出来的。
● 接收窗口
接收窗口内都是准备接受的数据,前沿的前面是将来准备接收的数据,后沿的后面是已经接收并发送ack的数据。
5.2 发送(接收)窗口的移动
● 发送窗口
当发送方收到一个ACK报文后,会向前滑动若干个单位,直到移动到还没有接收到ACK的序号就停下;
发送窗口的前沿:不动(未收到ACK报文)、向前移动(收到了ACK报文)、不允许向后缩(尽管接收窗口可能变小,但是TCP强烈不建议这样做,可能会引发错误)
发送窗口的后沿:不动(还未收到数据)、向前移动(已收到数据)
● 接收窗口
接收方会发送连续收到的最后一个序列的ACK报文,并向前滑动若干个单位,直到移动到没有接收到数据的序号就停下;(实现乱序重排)
5.3 窗口和缓存的关系
发送窗口是发送缓存的一部分,接收窗口是接收缓存的一部分。
发送缓存 = 发送应用程序传送给发送方TCP准备发送的数据 + 发送窗口;
接收缓存 = 接收窗口 + 按序到达但接受应用程序还未读取的数据
(当接受应用程序来不及读取接收缓存,导致接收缓存中的数据不断积压,最终填满,此时接收窗口就会缩小为0)
6、流量控制和拥塞控制
6.1 两者的区别
● 流量控制:接收方通过接口窗口的大小控制发送方的发送速率,使得接收方总是来得及处理发送方发送过来的数据。这是一个点对点的控制。(即接收方对发送方的控制)
● 拥塞控制:拥塞指的是网络拥塞。当系统需要的资源数量大于系统可用资源数量,就会发生网络拥塞。缓解网络拥塞需要对系统的各个部分资源进行均衡,而不是光靠控制某一部分资源或者某个节点就能完成。这是一个全局观层面上的控制。
有一些拥塞控制算法是通过控制发送方的发送速率来缓解网络拥塞的,即通知发送方,网络当前遇到了一点麻烦,需要降低发送速率,这和流量控制中接收方控制发送方的发送速率类似,所以常常会有人把这两者弄混。
6.2 拥塞控制算法
拥塞控制的常见算法:慢开始、拥塞避免、快重传、快恢复。
(这里讨论的拥塞窗口可以暂且等价于发送窗口,一般来说发送窗口的上限值=Min(接收窗口的大小, 拥塞窗口的大小))
(1) 慢开始(指数增长):每收到一个新的报文段的确认N,就把拥塞窗口增加一个新的被确认报文的长度,若此长度超过一个SMSS,则增加一个SMSS。
每经过一个传输轮次(时间就是一个RTT时间,这之中可能有多个报文段的确认),拥塞窗口cwnd就加倍。
● 慢开始的“慢”并不是指增长速度慢,而是指从小到大逐渐增大发送窗口这个试探过程,比起一次性注入许多报文到网络中相比当然“慢”的多。
(2) 拥塞避免(加法增大,IA):拥塞窗口缓慢增大,即每经过一个往返时间RTT就把发送方的拥塞窗口增加一个MSS。
(具体的过程是这样的:假设拥塞窗口的大小为n,只要收到一个新的确认,那么拥塞窗口的大小就会增加1/n。一个传输轮次之后,如果收到n个确认报文,那么就增加1/n * n = 1个MSS长度。)
● 网络超时:
发送方如何知道网络发生了拥塞?——当出现网络超时,就猜想可能出现了网络拥塞。因此将网络超时作为拥塞的依据。
在执行慢开始算法的情况下,如果当前窗口大小超过规定的慢开始门限值之后,就认为网络可能快要拥塞了,不能再增长的那么快了,转而执行拥塞避免算法(等于的时候既可以使用慢开始,也可以使用拥塞避免)。一旦出现丢包,则认为网络出现了拥塞,此时将门限值减为当前窗口大小的一半,窗口值重新设置为慢开始初始窗口大小,重新进入慢开始阶段。
但有时候,超时并不意味着出现了网络拥塞,可能只是个别报文的丢失。但这会让发送方误以为出现了网络拥塞,导致错误的开启慢开始算法,降低了传输效率。——因此我们引入快重传和快恢复算法。
(3) 快重传:接受方一旦接收到了数据报,就要立即发送确认,即使收到了失序的报文段也要立即发出对已收到的连续报文段的重复确认。以确保让发送方尽早的知道发生了个别报文段的丢失。当发送方一连收到3个重复确认,就应当立即重传(而不是等到超过了重传计时器规定的时间,才开始重传)。
(4) 快恢复(乘法减小,MD):当发送方知道只是丢失了个别的报文段时,不会启动慢开始算法,而是启动快恢复算法。发送方调整门限值为当前拥塞窗口的一半,并把拥塞窗口置为阈值大小,此后开始执行拥塞避免算法。
7、HTTP
HTTP协议是基于请求与响应的无状态应用层协议。(常基于TCP的连接方式)
7.1 超文本传输协议HTTP主要特点
① 支持客户/服务器模式。
② 简单快速。客户端向服务器请求,只需传送请求方法和路径。常用请求方法:get post等
③ 灵活。允许传输任意类型的数据对象。用content-type加以标记。
④ 无连接。每次请求+响应都是独立的。服务器处理完客户的一次请求,就断开连接。对于一些只需要短暂请求和响应的应用很有用,可以节省连接的资源。但是对于需要大量交互的应用来说,频繁的连接和断开会增加通信的开销,降低通信的效率,因此,
HTTP 1.1起 默认给出一种长连接的方式,即keep alive,服务器等待一段时间后才断开连接,也就是说一个连接中可以处理多个请求(和响应),减少了连接的建立和断开的开销。
但这些都是属于HTTP请求之外的,在每个HTTP请求中,是无法知道当前HTTP是否处于长连接状态,始终都要认为连接在HTTP请求结束后就会关闭,这是HTTP的特性。至于下层实现(例如 TCP 协议)是否在结束请求后立即关闭连接,HTTP 协议并不关心,也不会对下层实现做出任何要求。长连接被理解为下层实现对上层透明。
⑤ 无状态。服务器不会保存客户端的状态信息,也就是说,每个请求都是相互独立的,服务器无法知道当前请求和前面的请求是否有关联,这使得服务器不需要考虑上下文信息,简化了设计和实现。但是对于一些需要跨请求保持状态的应用,比如登录状态等,需要使用一些额外的技术手段来保存客户端的状态信息,比如使用Cookie 或者 Session等机制。
7.2 HTTP请求和响应的结构
● 注意:头部部分的格式为“键:值”,并且字段名不区分大小写!请求正文没内容情况下也要有空行!
7.3 简述请求/响应步骤
(1) 客户端建立和服务器连接。一般来说,客户端是浏览器,Web服务器的默认端口号为80,在底层会先建立一个TCP连接;
(2) 连接建立完毕之后,客户端向服务器发送HTTP请求报文;
(3) 服务器接收到请求报文后,解析报文并定位资源,然后将资源拷贝一份到TCP连接中,并回送一个HTTP响应报文给客户端;
(4) 释放TCP连接。
如果该连接是“Connection:closed”,说明是短连接。此时服务器会主动断开连接,客户端被动断开连接;
如果该连接是“Connection:keep alive”,说明是长连接。此时TCP连接不会在本次请求结束后立马断开,而是等待一段时间后,才释放。
(5) 客户端收到响应报文后,检查响应码,如果是200,表示请求成功,此时解析响应头的各种信息,比如字符集信息等等……然后获取响应体内容,将HTML根据语法解析,渲染并显示到服务器中。
7.4 在浏览器地址栏键入URL,按下回车之后经历的流程?
(1) 浏览器在键入URL之后,会逐层寻找DNS服务器缓存,解析Web服务器域名对应的目标ip地址。DNS服务器缓存从近到远依次是:浏览器缓存、系统缓存、本地域名服务器、根域名服务器、顶级域名服务器、权限域名服务器。可以通过迭代法和递归法进行缓存的搜索,如果找到了就马上返回,不会继续往后搜索;
(2) 获得了目标IP地址后,就定位到了目标主机。此时解析目标端口号(一般是80端口),会在运输层建立一个TCP连接;
(3) 基于TCP连接,将HTTP请求报文发送给Web服务器;
(4) Web服务器解析HTTP请求报文,并且回送一个HTTP响应报文给客户端;
(5) 释放TCP连接;
(6) 客户端获取了HTTP响应报文之后,进行解析,并将HTTP内容渲染显示在浏览器。
● 注意:(5)、(6)可以同时进行,没有一定的先后顺序。
7.5 常见的HTTP响应码
● 常见的响应码:
(1) 200(OK):请求成功;
(2) 206(Partial Content):范围请求的响应码【HTTP /1.1新增】
(2) 301(Moved Permanently):资源被永久重定向,比如网站地址更改;
(3) 302(Found):资源被临时重定向了,比如网站某些资源暂时被移到另一个地址;
(4) 400(Bad Request):客户端请求有语法错误,不能被服务器所理解;
(5) 401(Unauthorized):请求未经授权,一般要进行用户的身份验证;
(6) 403(Forbidden):服务器收到了请求,但是拒绝提供服务;
(7) 404(Not Found):请求资源不存在,比如说输入了错误的URL;
(8) 500(Internal Server Error):服务器发生不可预期的错误;
(9) 503(Server Unavailable):服务器当前不能处理客户端的请求,一段时间后可能恢复正常,一般是服务器过载或者正在维护中。
7.6 GET、POST请求的区别
(1) 在HTTP报文层面
● GET:请求的数据会通过“?”和“&”拼接到URL后面;
● POST:请求的数据会放在请求报文的正文中,需要被服务器解析后才能知道,安全性较高。
但他们都是明文传输。
(2) 在数据库层面
● GET:满足幂等性和安全性;
● POST:不满足幂等性和安全性。
● 幂等性:对数据库的多次操纵获得的结果是一致的;
● 安全性:对数据库的操作没有改变数据库的数据。
(3) 在其他方面
由于GET的幂等性,可以将GET请求缓存下来,如Java Web中的静态页面的缓存;但是POST请求,由于会破坏数据,在Java Web中要考虑重复提交的问题。
7.7 Cookie、Session的区别
由于HTTP是无状态的,有一些应用需要在多个请求之间进行信息的交互共享,就需要用到Cookie、Session机制。
(1) Cookie——客户端的解决方案,即将状态信息保存在客户端
● 一般是服务器将需要保存的信息以Cookie键值对的形式,写入响应报文的头部的Set-Cookie 字段中;
● 以后每次浏览器请求服务器,都会在请求头部带上这些Cookie信息;
● 服务器收到浏览器的HTTP请求,会去查看请求头中的 Set-Cookie 字段,并解析利用。
优点:减轻服务器的负担;缺点:不安全。
(2) Session——服务器的解决方案,即将状态信息保存在服务器
基本思想:服务器通过JSESSIONID字段,在服务器内部找到对应的会话,该会话保存了状态信息。
① 和Cookie搭配使用,将JSESSIONID保存在浏览器;
● 当浏览器第一次请求服务器的时候,服务器会为它创建一个会话,并将JSESSIONID写入到响应头的SET-COOKIE字段;
● 以后每次浏览器访问服务器,都会自动在HTTP请求头中携带上该JSESSIONID的Cookie;
● 浏览器就可以通过该JSESSIONID找到对应的会话,并在里面存入或者读取状态信息。
② 服务器的每次处理,都重写URL,在后面携带上JSESSIONID参数。如果当用户手动键入URL,那么这个状态信息就无法被获取了。
优点:安全性高,状态信息被保存在服务器内部;缺点:给服务器加重了负担。
8、HTTP、HTTPS的区别
8.1 为什么要有HTTPS?
(1) HTTP中的客户端和服务器没有任何身份验证机制,这就导致了黑客可以任意冒充;
(2) HTTP中的数据都是明文传输,裸奔在网络中,这就导致了黑客可以任意篡改数据。
8.2 HTTPS
HTTPS:超文本传输安全协议,它是安全版的HTTP,主要功能是保障网络通讯的安全性和数据的一致性。
在网络协议栈中,HTTPS通过在TCP传输层和HTTP应用层之间,新增一个安全协议层,它主要做身份验证+数据加密的工作,由操作系统的API对外提供。
● SSL(Socket Security Layer),后面更名为TCL(Transport Lyer Security)。
8.3 常见的加密方式
在下面说的对称加密、非对称加密中涉及到两个概念:
● 算法:可以分成加密算法、解密算法。这些算法都是公开的。
● 密钥:一般来说具有隐蔽性,它是在加密明文的时候,用于算法过程中的关键元素。在解密时,将密钥和密文作为输入,解密算法解析密文。
(1) 对称加密
加密和解密用的是同一个密钥(效率高,但安全性差)
(2) 非对称加密
加密的密钥和解密的密钥不同。其中分为公钥和私钥。(效率没那么高,但是安全性高)
用私钥加密的数据,只有对应的公钥才能解密,用公钥加密的数据, 只有对应的私钥才能解密。
● 公钥加密 + 私钥解密 → 常常基于数据的安全性考虑,因为只有持有私钥的用户才能解析数据;
● 私钥加密 + 公钥解密 → 常常基于数据的完整性,用于身份验证,数字签名使用到了它。
(3) 哈希算法
将任意长度的信息通过哈希函数映射到固定长度的加密信息,该算法是不可逆的,好的哈希函数可以防碰撞。
(4) 数组证书 / 数组签名(里面使用到了非对称加密、哈希算法)
● 生成步骤:
a) 将要传输的个人信息和公钥(可能还有其它信息)打包成消息体;
b) 然后将消息体使用哈希算法加密成不可逆的消息摘要;
c) 将该消息摘要使用私钥进一步加密,形成数字签名;
d) 将携带了数据和公钥的消息体,以及数字签名一同【构成数字证书】发送到网络,给服务器。
● 验证步骤:
a) 利用公钥对数字签名解密,形成消息摘要A;
b) 将消息体也是用同一个哈希算法进行不可逆加密,形成消息摘要B;
c) 如果A和B相同,则验证通过,否则验证失败。
8.4 HTTPS数据传输流程
● 对称密钥效率高,但是双方要使用同一个密钥,在网络中传输不安全;
● 非对称密钥效率低,但是私钥-公钥机制,比较安全
● HTTPS采用的策略是:结合两者的优点,通过非对称机密的方法,获取对称加密的密钥!(仅使用一次非对称加密,此后用对称密钥进行数据加密)
基本的流程:
(1) 服务器将自己的公钥给客户端,途径:使用数字证书,里面包含了服务器的公钥、服务器的信息、数字签名(使用哈希算法生成的数字摘要,而后用服务器的私钥加密)
● 中间人想要篡改:
a) 篡改里面的公钥(改成自己的公钥),所有者还是保留服务器,然后使用同一哈希函数生成消息摘要,然后使用自己的私钥生成数字签名。
客户端验证的时候,先通过预置的CA列表,查看公钥和所有人是否一致,发现公钥和所有者不一致,证书被篡改,验证不通过。
b) 直接替换掉整个数字证书,里面的个人信息是攻击者的个人信息。
客户端验证的时候,先通过预置的CA列表,查看公钥和所有人是否一致,尽管验证后发现一致,但是发现证书对应的所有者并不是和自己通讯的一方,验证不通过。
(2) 基于非对称加密获取对称密钥
客户端随机生成一个密钥,作为后续通讯的对称密钥,然后通过服务器的公钥加密后,发送给服务器。
服务器收到后,使用自己的私钥解密,获得对称密钥。
(3) 使用对称密钥进行安全通讯
参考链接:一个故事讲完https (qq.com),里面讲到为什么会有对称加密、非对称加密、以及可能出现的中间人攻击、引出的数字证书的身份认证机制(还有要信任的CA机构,它可以帮助客户端验证该公钥是否是某个所有者的)
8.5 HTTPS、HTTP的区别
(1) HTTPS是安全传输,它的数据都是经过加密的;HTTP不是安全传输,它的数据是明文传输,裸奔在网络中;(HTTPS = HTTP + 身份认证 + 数据加密)
(2) HTTPS需要到CA机构申请证书;而HTTP不需要;
(3) 连接方式不一样。HTTPS的端口号默认是443;HTTP的端口号默认是80。
8.6 HTTPS可以保证绝对的安全吗?
倒也未必。如果浏览器默认填充的是HTTP,那么请求会在(http → https)进行跳转,在这个期间,就有可能被中间人劫持的风险。
因此,有些网站会使用HSTS(HTTP Strict Transport Security)协议,它会告诉浏览器,无论用户输入的是HTTP还是HTTPS,都应该直接请求HTTPS。
8.7 HTTP/1.1、HTTP/2.0
● HTTP/1.1
(1) 长连接
默认开启了Connection:keep-alive字段。它允许请求完成后,连接还保持一段时间,在这段时间可以发起新的请求。而HTTP/1.0的短连接,每次请求都要重新建立连接。
(2) 引入管道化技术
得益于HTTP/1.1的长连接。它可以在一次连接中,发送多个HTTP请求。而HTTP/1.0中,下一个请求只能能上一个响应到达之后才能发出,这种局限性被叫做队头阻塞。但是HTTP/1.1这种技术会引起新的队头阻塞,它体现在响应也必须按照请求的顺序发回,不然无法识别,这就导致了下一个响应必须要等到上一个响应完成之后才能接收。
(3) 新增了请求方法:PUT、DELETE
(4) 范围传输
HTTP/1.1之后开始支持部分传输,这样一来,当客户端想要请求资源的一部分,服务器不用把整个资源传输过来,而是只用传输部分。具体实现可以使用请求头部的Range字段和响应头部的Content-Range字段。这为断点续传(有提供其他的支持字段)提供了技术基础。
(5) 强制请求携带HOST字段,否则报400错误
每台物理服务器绑定了唯一的一个IP。在HTTP/1.0中认为每个物理服务器仅对应一个主机,因此请求的URL可以不传递主机名。但随着虚拟主机技术的发展,在一台物理服务器上可以同时存在多个虚拟主机,它们共享一个IP地址,拥有不同的分配资源。为了区分不同的虚拟主机,HTTP/1.1要求请求头必须带上HOST字段。
● HTTP/2.0
(1) 二进制分帧
HTTP/1.x中头部和正文都可以是字符,而在HTTP/2.0中将传输的信息视作二进制流,并把信息分割成一个个二进制帧。首部信息会被封装到Header Frame中,请求体会被封装到Data Frame中。通信双方可以基于一个连接进行多个数据帧的通信。
(2) 多路复用
请求和响应都不会有队头阻塞的问题,可以在一个连接中发送多个请求和多个响应。这得益于二进制分帧,由于是流的形式,因此客户端和服务器看到的不再是一个个完整的HTTP报文,而是一堆乱序的二进制帧,也就可以将几个请求或响应同时发送出去。在接收的时候,不同的请求或者响应的帧是乱序的,但是同一个请求或者响应的帧是有序的,依次接收就可形成完整的报文。
(3) 服务器推送
能把客户端所需要的其他资源一起发送回客户端。比如,请求一个HTML文件时,会将引用的其他的静态资源一并返回回去。这样就省去了客户端重复请求的步骤。
(4) 头部压缩
① 服务器和客户端之间建立一张动态的哈希表,将用到的字段存放在这张表中,那么在传输的时候对于之前出现过的值,只需要把它的索引传给对方即可,对方拿到索引查表就行了;
② 将出现的字符串和整数使用哈夫曼编码,建立索引表。让出现次数多的对应更短的索引,传输的时候只需要传输索引。
9、网络层
⭕ 路由器和交换机的区别?
● 交换机(Switch):构建局域网的设备,它负责在局域网内部传输数据。它会根据目标设备的物理地址(MAC)地址来决定将数据包发送到哪个接口,以实现设备之间的直接通信。
● 路由器(Router):构建广域网或者互联网的设备,他负责在不同的网络之间传输数据。它会根据网络层的IP地址来决定将数据包发送到哪个网络,以实现不同网络之间的通信。
9.1 地址解析协议ARP、逆地址解析协议RARP
● APR:地址解析协议,已知主机/路由器的IP地址(32位),要求它对应的硬件MAC地址(48位)。
● 原理:每一台主机/路由器都有一个ARP高速缓存,里面有本局域网上各主机和路由器的IP地址到硬件地址的映射表。(ARP高速缓存中的每一项会有生存时间,若超过生存时间,该项就会从高速缓存中删除,以维持动态更新)
● ARP高速缓存的学习过程:
假设:主机A向本局域网的主机B发送IP数据报。
查看ARP高速缓存中是否有目标主机B的IP地址。
a) 若有,则查看对应的MAC地址,把硬件地址写入MAC帧的目标MAC地址中,发送MAC帧(包含源MAC)到主机B。
b) 若无。在本局域网中发送一个ARP请求分组(独立的一个IP数据报)广播,同时将自己的IP地址、MAC地址写入到该分组中(可能不久之后,主机B还要向A发送数据报),而将原本要发送的IP数据报先缓存起来。
所有在这个局域网的主机/路由器都会收到这个分组,并检查目标IP是否和自己的IP一致:
若一致,则查看帧中的源IP和源MAC地址,缓存项没有则新增,存在且不一样的话就更新,并发送一个ARP响应报文,里面携带了自己的MAC硬件地址。主机A在收到这个响应报文之后,会将主机B对应的IP和MAC硬件地址新增到自己的ARP高速缓存中。【响应ARP报文是单播的】
不一致,不会给响应报文。如果自己的ARP高速缓存中已经有源IP这一项了,则会检查源MAC是否和自己映射的一致,如果不一致,则更新。另外,如果在开启ARP学习的情况下(默认开启),如果没有源IP这一项,则会新增一个缓存项。
——在【ARP缓存中没有记录】的情况下,会发送ARP请求分组广播,此时,对应4种情况去寻找主机B的MAC地址:
情况1:主机H1发送IP数据报给主机H2,此时两个主机在同一个局域网内。H1会发送一个ARP请求分组广播,H2会收到这个分组,并将H1的IP和MAC地址新增/更新到自己的ARP缓存中,然后发送一个ARP响应报文给H1,里面携带了H2的MAC地址,H1收到后,会将H2的IP和MAC地址新增到ARP缓存中。然后将原本的IP数据报封装成帧发给主机H2,其中源MAC为H1的MAC地址,目的MAC为H2的MAC地址。
情况2:主机H1发送IP数据报给主机H3,此时两个主机在不同的局域网内。H1会发送一个ARP请求分组广播,R1路由器会收到这个分组,并将H1的IP和MAC地址新增/更新到自己的ARP缓存中,然后发送一个ARP响应报文给H1,里面包含了R1的IP和MAC地址,H1收到后,会将R1的IP和MAC地址新增到ARP缓存中。然后将原本的IP数据报封装成帧发给R1,其中源MAC为H1的MAC地址,目的MAC为R1的MAC地址。(此后由路由器R1接管该IP数据报……变成情况3)
情况3:路由器R1发送IP数据报给主机H3,此时它们都在同一个网络中。R1发送ARP请求分组广播,H3会受到这个分组,并将R1的IP和MAC地址新增/更新到自己的ARP缓存中,然后发送一个ARP响应报文给R1,里面包含了H3的MAC地址,R1收到后,会将H3的IP和MAC地址新增到ARP缓存中。然后将原本的IP数据报封装成帧发给主机H3,其中源MAC为R1的MAC地址,目的MAC为H3的MAC地址。
情况4:路由器R1发送IP数据报给主机H4,此时它们不在同一个网络中。R1发送ARP请求分组广播,R2会受到这个分组,并将R1的IP和MAC地址新增/更新到自己的ARP缓存中,然后发送一个ARP响应报文给R1,里面包含了R2的MAC地址,R1收到后,会将R2的IP和MAC地址新增到ARP缓存中。然后将原本的IP数据报封装成帧发给R2,其中源MAC为R1的MAC地址,目的MAC为R2的MAC地址。(此后由路由器R2接管该IP数据报……变成情况3或者情况4)
⭕ 注意:
(1) 原本的IP数据报和ARP请求分组是两个独立的IP数据报;
(2) 原本的IP数据报从始至终都没有改变过源IP、目的IP。但是MAC帧的源MAC地址、目的MAC地址总是在变化。
● RAPR:逆地址解析协议,将硬件MAC地址转换成IP地址。(这是一个旧的协议,现在的DHCP动态主机配置协议会包含RAPR协议)
9.2 IP数据报格式
● 头部重要字段
(1) 源IP地址、目标IP地址;
(2) 协议,指明使用的是ipv4、ipv6;
(3) 首部长度(和TCP首部长度类似,固定20个字节,最大可扩展为60个字节)
(4) 数据报总长度:包括首部+数据部分
注意:不同的数据链路层协议规定有不同的最大传输单元MTU大小(例如:最常用的以太网规定MTU值为1500字节),这个大小指的MAC帧的数据部分的最大长度,对应整个IP数据报,如果IP数据报大小超出了限制,那么就要对其进行切片。
(5) 标识。
相当于一个计数器,每新增一个IP数据报就+1,目的是为了唯一标识一个IP数据报。要和TCP中的序号区分开来,IP数据报的传输是无连接的,它的作用在于:一旦出现IP数据报被切片,那么这些切片应该要有一个标识指明它属于哪个原始IP数据报的切片。
(6) 标志位。
● MF(More Fragment):是否还有切片,为1时表明后面还有切片。
● DF(Don't Fragment):不允许切片,为1时表示该IP数据报不能被切片。
(7) 片偏移量。
当IP数据报被切片时,指明它起始于原始数据报的哪个位置(从0开始)。单位为:8字节,这也就意味着 IP报文的数据部分必须切片时以8字节为单位。
(8) 生存时间TTL。
指明它可以经过多少跳路由器。每经过一个路由器,都应该-1,如果生存时间被缩小为0,那么就应该在网络中丢弃这个IP报文。
9.3 IP层分组转发的流程(即路由器转发分组的算法)
(1) 从IP数据报中得到目标主机的IP地址D、目的网络地址N。
(2) 如果目标网络地址N就是当前的路由器所直连的某个网络地址,说明不需要经过其他的路由器转发,可以进行直接交付,把数据报交付给目标主机(还包括使用ARP协议获取目标MAC地址,并将数据报封装成MAC帧,再发送给目标主机);否则就是间接交付,转(3)。
(3) 如果当前的路由表中存在目的IP地址为D的特定主机路由,那么就将IP数据报转发给路由表中指明的下一条路由器;否则,转(4)。
(4) 如果当前的路由表中存在目的网络地址为N的路由,那么就将IP数据报转发给路由表中指明的下一条路由器;否则,转(5)。
(5) 如果当前的路由表中存在默认路由,那么就将IP数据报转发给默认路由器**;否则,转(6)。
(6) 报告转发分组出错。
● 注意:路由表并没有给出分组转发的完整路径。它仅仅指出当前数据报应该前往的下一跳路由器,而后怎么转发,就是下一跳路由器的事情了。这样一步一步查找下去,直到最后到达指定的目标主机。
9.4 路由选择协议
● 自治系统(Autonomous System, AS):在单一技术管理下的一组路由器。
网络可以被划分成若干个自治系统,每一个自治系统下的路由器都会一致的选择一种路由选择协议和共同的度量标准。此外,每一个自治系统下都会有一个或者多个路由器不仅要运行本自治系统内部的路由选择协议,还要运行自治系统之间的路由选择协议。
1、内部网关协议(IGP):在一个自治系统内部使用
(1) RIP(Routing Information Protocal)——基于距离向量的路由选择协议
网络中的每一个路由器都维护从它到其他每一个目的网络的距离记录。(每一个路由表项:目的网络、距离、下一跳路由器)
规定:
从当前路由器到直接连接的网络,距离定义为1;
从当前路由器到非直接相连的网络,距离定义为经过的路由器数量+1。
RIP允许一条路径中最多包含15个路由器、因此当距离为“16”相当于不可达。
● 特点
a) 每一个路由器只和自己的邻居路由器交换信息。邻居路由器被定义为两个路由器的通信不需要经过另一个路由器。
b) 交换的信息内容是本路由器知道的全部路由信息,即路由表。路由表记载了从当前路由器到达其他每一个目标网络的最短距离,以及下一跳路由器。
c) 每隔一段时间,或者是每次网络拓扑结构发生变化,进行信息交换。
● 算法流程
注意:每一个路由器都给它的所有邻居路由器设定了一个计时器,一旦超时,就认为邻居路由器已经失效,即不可达(对应上述算法说的3分钟),这时就把路由表中与这个失效路由器相关的表项(一般是下一跳路由器为这个失效的路由)的距离设置为16。
● 缺点:只适用于小型的网络;坏消息传递的慢。
(2) OSFP(Open Shortest Path First)——开放最短路径优先
它是一个链路状态协议。
● 最终平衡状态:所有路由器最终都能建立一个链路状态数据库,这个数据库实际上就是全网的拓扑结构图,这个拓扑结构图在全网的范围内是一致的,被称为链路状态数据库的同步。(即每一个路由器都知道全网共有多少个路由器,以及哪些路由器是相连的,其代价是多少等等)
● 特点
另外:
a) OSPF每隔一定时间会给相邻的邻居路由器发送问候分组,确认对应的邻居路由器仍可达。
b) 度量信息相同的链路,可以在分组转发的时候起到负载均衡的作用。
为了可应用到规模更大的网络:OSPF将一个自治系统再划分为若干个更小的范围,叫做区域。这样可以把链路状态信息的范围局限于每一个区域,而不是整个自治系统,减少了整个网络的通信量。区域之间的信息由区域边界路由器进行概括。而专门和本自治系统外的其他自治系统交换路由信息的路由器是自治系统边界路由器。
注意:每个自治系统被划分成若干区域时,会有一个主干区域,它连接了本自治系统的其他区域。在主干区域的路由器被称作主干路由器,R3-R7均是主干路由器。其中R3、R4、R7同时也是区域边界路由器。R6同时也是自治系统边界路由器。
2、外部网关协议(EGP):当源主机和目的主机不在同一个自治系统中(这两个自治系统可能使用不同的IGP)
BGP:边界网关路由器。
它会在每个自治系统中选取“BGP”发言人(可以是一个也可以是多个,往往是自治系统边界路由器,但也可以不是),该发言人代表了这个自治系统的路由信息,进行自治系统间的信息交换(交换的并不是“代价”信息,因为每个自治系统的度量标准不同,而是可达信息)。
3、转发和路由选择的区别
● “转发”:它是指路由器将IP数据报按照转发表从合适的端口转发出去,这只涉及到一个路由器;
● “路由选择”:它涉及到多个路由器,它是多个路由器协同工作的结果(根据复杂的路由选择算法,获得网络的拓扑变化情况,动态的改变特定的路由,从而构造出整个路由表)。
转发表是从路由表中获得的。转发表和路由表两者数据结构分离,各有侧重:转发表致力于查找过程最优,而路由表致力于网络拓扑变化时的计算最优。
9.5 虚拟专用网VPN、网络地址转换NAT
● 背景:IP地址紧缺,一个机构能够申请的IP地址数远小于所拥有的主机数。
● 全球地址:向互联网的管理机构申请全球唯一的IP地址;
● 本地地址:使用仅在本机构有效的IP地址。又为避免本地地址和全球地址重合,产生地址二义性。引入专用地址(只能被用于一个机构的内部通信,而不能用于全球地址,又称可重用地址):
规定:在【互联网】中的所有路由器,对目的地址是专用地址的数据报一律不进行转发。
(专用内部网也是可以有路由器的,它也支持专用网的IP数据报转发,这种路由器叫做内部路由器)
(1) 虚拟专用网
当一个很大的机构的部门分布的范围很广(世界各地),这些部门经常要交换信息。
方式一:通过租用电信公司的通信线路,价格昂贵。
方式二:利用公用的互联网作为中间的通信载体,这种专用网被称为虚拟专用网VPN。需要对通过互联网传送的数据进行加密。(一个机构要构建自己的VPN就必须为他的每一个场所购买专门的硬件和软件,并进行配置,使每一个场所的VPN系统都知道其他场所的地址(至少一个场所要有一个全球地址))另外,对于在外地工作的员工需要和本机构保持联系,就需要用到远程接入VPN。通过拨号接入互联网,驻留在员工个人电脑中的VPN软件可以在员工个人电脑和公司主机之间建立VPN隧道。
(2) NAT网络地址转换
● NAT路由器:专用网连接到互联网的路由器上安装NAT软件。至少要有一个全球IP地址。
通过NAT路由器的通信必须由专用网内的主机发起。因为如果从外部向内部发起请求,NAT路由器不知道应当把目的IP地址转换成专用网内哪一个本地IP(即专用网内部的主机不能充当服务器用)。但是发出请求后,对方仍然可以按照NAT路由器的地址作为目的地址,发送响应IP报文,此时NAT路由器会将刚刚记录转换项进行【逆序转换】,然后得到专用网地址,进行IP数据报的派发。
——因此,这决定了:NAT路由器上如果有n个全球IP地址,专用网内最多可以同时有n台专用网的主机接入互联网!也就是说,为了避免转换表项的冲突,同一时刻一个全球IP只能为一台专用网的主机服务。
(3) NAPT网络地址端口转换:可以使多个拥有本地地址的主机,共用一个NAT路由器上的全球IP地址,提高全球IP地址的利用率。
NAPT的特殊性:
1)普通路由器转发IP数据报,不改变源IP和目的IP。而对于NAPT来说,要进行专用地址和全球地址的转换。【当然这也是NAT的特点】
2)NAPT涉及端口号,本该属于运输层的范畴,因此受到一些业内的争议,认为NAPT的操作没有严格按照层次关系。
10、心跳包
指客户端服务器定时通知对方自己还正常运行的通讯包,每隔一段时间定时发送,类似于心跳,所以称作心跳包。
● 发送方:服务器、客户端都可以,看哪边实现方便。一般处于效率的考虑,往往由客户端发送心跳包。如果在规定时间内没有收到对方的响应,那么就认为连接失效,断开连接。
(1) 应用场景
● 保活
情形一:一个客户端连接服务器以后,如果长期没有和服务器有数据来往,可能会被防火墙程序关闭连接,有时候我们并不想要被关闭连接。例如,对于一个即时通讯软件,如果服务器没有消息时,我们确实不会和服务器有任何数据交换,但是如果连接被关闭了,有新消息来时,我们再也没法收到了,这就违背了“即时通讯”的设计要求。
情形一中的应用场景要求必须保持客户端与服务器之间的连接正常,就是我们通常所说的“保活“。如上文所述,当服务器与客户端一定时间内没有有效业务数据来往时,我们只需要给对端发送心跳包即可实现保活。
● 检测死链(心跳检测)
情形二:通常情况下,服务器与某个客户端一般不是位于同一个网络,其之间可能经过数个路由器和交换机,如果其中某个必经路由器或者交换器出现了故障,并且一段时间内没有恢复,导致这之间的链路不再畅通,而此时服务器与客户端之间也没有数据进行交换,对于这种情况,无论是客户端或者服务器都无法感知与对方的连接是否正常,这类连接我们一般称之为“死链”。
情形二中的死链,只要我们此时任意一端给对端发送一个数据包即可检测链路是否正常,这类数据包我们也称之为”心跳包”,这种操作我们称之为“心跳检测”。一个连接长时间没有正常数据来往,也没有心跳包来往,就可以认为这个连接已经不存在,为了节约服务器连接资源,我们可以通过关闭 socket,回收连接资源。
(2) 具体实现
● 由应用程序实现
上层应用程序的服务器每隔一段时间发送一个短小精悍的数据包,并且开启一个独立的线程去监听来自客户端的响应,如果在规定的时间内没有收到客户端的响应,那么我们就认为这个连接已经失效了,断开连接,并释放资源。同样,如果客户端在一定时间内没有收到服务器的心跳包,则认为连接不可用。
当然,如果通信双方不断有正常的业务数据包来往,这些数据包本身就可以起到保活作用,就不需要在这段时间发送心跳包。具体做法是:设置一个上次包时间,每次收数据和发数据时,都更新一下这个包时间,而心跳检测计时器每次检测时,将这个包时间与当前系统时间做一个对比,如果时间间隔大于允许的最大时间间隔,则发送一次心跳包。总而言之,就是在与对端之间,没有数据来往达到一定时间间隔时才发送一次心跳包。
● 由TCP自带的keep alive保活机制。
TCP/IP自带一个保活计时器,不论是服务端还是客户端,一方开启KeepAlive功能后,就会自动在规定时间内向对方发送心跳包, 而另一方在收到心跳包后就会自动回复,以告诉对方我仍然在线。 如果在规定时间内没有收到回应,会不断重试,直到到达最大的keep alive count次数,就会将连接释放。
因为开启KeepAlive功能需要消耗额外的宽带和流量,所以TCP协议层默认并不开启KeepAlive功能;另一方面,KeepAlive设置不合理时可能会因为短暂的网络波动而断开健康的TCP连接。很多情况下,我们需要手工开启KeepAlive功能并设置合理的KeepAlive参数。
二、八股文链接
1、计算机网络常见面试题总结(上) | JavaGuide(Java面试 + 学习指南)
● OSI每一层的作用:
应用层:为用户提供服务;
表示层:提供编解码、加密解密、数据解压缩;
会话层:管理(创建、维持、重连)端到端的会话;
运输层:为双方建立一个通用的数据传输方式;
网络层:IP数据报的路由和转发;
数据链路层:帧编码、纠错控制;
物理层:透明的进行比特流传输
● TCP/IP四层模型:应用层、运输层、网络层、网络接口层(链路层);
也有的叫五层模型:应用层、运输层、网络层、数据链路层、物理层(《计算机网络》谢希仁)
● 为什么需要分层?
a) 高内聚,低耦合。使得各层之间相互独立,不会修改某一处,导致牵一发而动全身。
b) 各司其职,分工明确。每一层只享受下一层提供的服务,不在乎它的实现细节,仅仅专注于做自己的功能,选择最合适的算法。
c) 将复杂的系统拆解成多个模块,即大问题分解成若干个小问题,更容易解决。
● 应用层的常见协议
(1) HTTP(Hypertext Transfer Protocol):超文本传输协议【基于TCP】
(2) DNS(Domain Name System):将域名解析为IP地址【基于UDP,端口号为53】
解析是由专门的程序来完成,运行这些程序的服务器被称为“域名服务器”。
具体来说:当某一个应用程序需要将域名解析为IP地址,就需要调用这个解析程序,此时这个应用程序就成为了DNS的一个客户。然后将域名放入DNS请求报文中(一般是以UDP数据报的形式发送给本地域名服务器),本地域名服务器在查找域名后,将对应的IP地址放到DNS响应报文中返回。如果本地域名服务器不能回答该请求,那么该域名服务器就暂时成为DNS系统中的另一个客户,并向其他域名服务器发送查询请求。这个过程直到找到能够回答该请求的域名服务器为止。
区分:“域”和“区”。一个单位拥有一个域名之后,他就可以决定自己是否要进一步划分子域,无需上级机构批准,它属于域名体系的抽象概念;一个DNS服务器所管辖的范围叫作区,它要求区中所有主机都是连通的,管辖指的是保存区中所有主机的域名到IP地址的映射。区有几个,权限域名服务器就有几个。——DNS服务器的管辖范围不是以“域”为单位的,而是以“区”为单位的。区可以小于等于域,但是绝对不能大于域。(因为区要求里面的设备都是连通的,一个机构下可能有一个或多个区,一个区对应着一个权限域名服务器;一个机构下可以划分成多个子域,这是逻辑概念)
权限域名服务器:对应了划分的区的数量;
顶级域名服务器:可能给出最后的查询结果,也可能是下一步应该查找的域名服务器的IP地址;
根域名服务器:所有根域名服务器都知道所有的顶级域名服务器的域名和IP地址。它非常的重要,因为不管哪一个本地域名服务器,要对互联网上的任意一个域名进行解析,在自己查不到的情况下,都会求助根域名服务器。通常情况下,根域名服务器并不直接把待查询的域名直接转换成IP(根域名服务器也没有存放这种信息),而是告诉本地域名服务器下一步应该找哪一个顶级域名服务器。(当前中国境内并没有根域名服务器)
本地域名服务器:每一个互联网服务器的提供者ISP,或一个大学,甚至一个大学里的系,都可以拥有一个本地域名服务器。本地域名服务器离用户近,一般不超过几个路由器。当要查询的主机在本地域名服务器有缓存的IP时,该本地域名服务器立即就能返回查询结果,而不需要再去查询其他域名服务器。【本地域名服务器严格意义上并不属于DNS服务器结构层次,它起到缓存和用户代理的作用,它也可以缓存不属于当前网络的IP地址】
ISP(Internet Service Provider,互联网服务提供者):
它可以申向互联网管理机构申请批量的IP地址,同时拥有通信线路(大的公司可以自己建造,小的公司可以向电信公司租用),以及路由器等联网设备。每个想要联网的主机,必须要有IP地址,它必须缴纳一定的费用给ISP,才能获得某个或某些IP地址的使用权。
(3) FTP(File Transfer Protocol):文件传输协议【基于TCP】
是一种用于在计算机之间传输文件的协议,它可以屏蔽操作系统和文件存储方式的不同。FTP是客户端-服务器模式,通常来说客户端作为主动发起FTP的一方,会主动和服务器的21端口建立控制连接,同时在客户端随机选择一个端口号作为数据传输端口,并向服务器的20端口发起数据传输连接请求(主动模式下,服务器的20端口只能与一个客户端建立数据传输连接);而如果是FTP被动模式下,服务器会在端口范围内随机选择一个可用端口,并将该端口告知客户端,客户端再和该端口建立数据传输连接。但注意,它是明文传输,因此不安全。建议使用更安全的SFTP协议(它是SSH的一部分,SSH协议的端口号为22)。
(4) SSH(Secure Shell Protocol):安全的网络传输协议【基于TCP】
通过加密和认证机制来实现安全的访问、文件传输等业务。
(5) Telnet:远程登录协议【基于TCP】
用于通过一个终端登录到其他的服务器。它能够将用户的击键传到远地主机,同时也能将远地主机的输出通过TCP连接回到用户屏幕,这样一来用户感觉好像直接在远程主机上操作一样。但是它的缺点之一是所有数据(包括用户名、密码)用明文传输,有潜在安全风险问题。如今通常使用SSH进行安全的网络传输。
邮件服务器必须能够同时充当客户端和服务器,邮件服务器中可以存在SMTP发送协议,也要存在POP3/IMAP等接收协议。
(6) SMTP(Simple Mail Transfer Protocol):简单邮件发送协议【基于TCP】
用于发送邮件的协议,即用户代理向发送方邮件服务器发送邮件,以及发送方邮件服务器向接收方邮件服务器发送邮件。但是一定要注意,它只是负责邮件的发送,并不负责邮件的接收。要从邮件服务器接收邮件,需要使用POP3获IMAP协议。
(7) POP3/IMAP:邮件接收协议【基于TCP】
两者都是负责邮件的接收协议,它是从接收方的邮件服务器中读取邮件。IMAP是比POP3更新的协议,它的功能和性能也更加强大,比如搜索、标记、分类、同步多个设备的邮件信息等,几乎现代电子邮件客户端和服务器都支持IMAP。
(8) DHCP(Dynamic Host Configuration Protocol):动态主机配置协议【基于UDP】
它提供了一种机制:即插即用连网,可以在一台主机加入新的网络时,自动配置一个IP地址,而无需手动干预。
一般流程:
① 主机先发出DHCP DISCOVER报文,这是一个广播报文(源地址为0.0.0.0,目的地址为255.255.255.255),用来寻找DHCP服务器在哪里。
② 现在的网络中一般会配备至少一台DHCP中继代理(一般是路由器),它配置了DHCP服务器的IP地址,一旦它收到这个广播报文后,就会以单播的形式转发给DHCP服务器。(如果没有中继代理的情况下,会将广播的报文直接给DHCP服务器)
③ DHCP服务器回送DHCP OFFER报文给中继代理,如果没有中继代理,就直接回送给客户端。然后中继代理再转发给客户端。
④ 客户端可能会收到多个DHCP服务器给它的提供报文,那么它就要从中选择一个,并向选择的DHCP服务器发送DHCP REQUEST报文。
⑤ DHCP服务器收到请求报文后,回送DHCP ACK报文给客户端。至此,主机就可以使用这个IP了。
⑥ 主机可以向DHCP服务器发送DHCP RELEASE报文,就可以释放当前这个临时IP地址,将它归还给DHCP服务器。
另外,分配释放的IP一般是临时的,主机只能在有限的时间内使用这个IP,这个时间被称作租用期。而主机在使用这个临时IP的时候会维持两个时间点的计时器,每次到了指定时间,就要向服务器延长租用期,如果失败,则要重新申请。
● 运输层的常见协议
(1) TCP(Trasmission Control Protocol):传输控制协议,可靠交付,做到无差错、不丢失,不重复,并且按序到达
(2) UDP(User Datagram Protocol):用户数据报协议:尽最大可能交付,不保证可靠交付
● 网络层的常见协议
(1) IP(Internal Protocol):网际协议
TCP/IP最重要的协议之一,主要作用是定义数据报的格式,并且对数据报进行路由和寻址,以便它们能够跨网络传播,并到达正确的目的地。目前IP协议一般分成两种:一种是过去的IPV4(点分十进制,共 4 * 8 = 32 位),另一种是较新的IPV6(冒分十六进制,共 16 * 8 = 128 位),两种都在使用,但是后者已经被提议用来代替前者。
(2) ARP(Address Resolution Protocol):地址解析协议
ARP解决的是网络层地址和链路层地址的转换问题,它可以将IP地址转换成物理MAC地址。IP数据报在传输的过程中,总要知道下一跳该去往何处,而IP地址属于逻辑地址,实际传输依靠的是物理MAC地址。
(3) RIP(Routing Information Protocol):路由信息协议【IGP内部网关协议的一种】
一种基于距离向量的动态路由协议,它使用路由器的跳数作为度量标准,选择跳数最少的路径作为最佳路径。此外,在进行信息交换的时候,仅仅与邻居路由器交换。
(4) OSPF(Open Shortest Path First):开放最短路径优先【IGP内部网关协议的一种】
一种基于链路协议的动态路由算法,它没有固定的度量标准。在某一时刻到达平衡态时,每个路由器都维持了整个网络的链路状态数据库,即全网的拓扑结构信息(有多少路由器,以及这些路由器分别和哪些相连,链路的代价……)。基于洪泛法和所有的路由器进行信息交换。
(5) BGP(Border Gateway Protocol):边界网关协议【EGP外部网关协议的一种】
一种在自治系统之间交换可达性信息的路由选择协议。
(6) NAT(Network Address Translation):网络地址转换协议
应用于将内部专用网IP地址转换为外部互联网的全球IP地址。在专用网发起对外部主机的请求时,需要经过一个NAT路由器,该路由器至少具备一个全球IP地址,里面保存有转换表,记录转换前后的IP地址,以处理后续的IP数据报的转发。值得注意的是,专用网内的主机无法作为服务器(这里不包括由专用内部主机发起的主动请求而收到的响应报文),因为NAT路由器没办法识别要交给本地哪一个主机。
(7) ICMP(Internet Control Message Protocol):网际控制报文协议:允许路由器和主机发送差错报告和异常情况的报文。
● HTTP常见的头部字段
(1) Accept-Charset
(2) Content-Type
(3) Content-Length
(4) Host
(5) User-Agent
(6) Cookie
(7) Range
(8) Connection
……
● HTTP/3.0
HTTP/2.0存在的问题:
① HTTP/2.0的队头阻塞问题。多路复用会产生新的问题,多路复用中多个请求是跑在一个TCP连接中的,那么只要有一个数据报丢失,就会阻塞该TCP连接的所有请求。
② 连接的延迟。HTTP/1.x和HTTP/2.x都是建立在TCP协议之上的,TCP要经历三次握手(耗费1.5RTT),而如果使用HTTPS安全传输的话,TLS也要建立连接,因为版本不同,所花费的RTT时间不同(大概也是耗费1.5RTT),这样一来总的RTT时间为3,RTT时间受到物理服务器距离的影响,如果一旦客户端和服务器相距甚远,那么用户就很明显的感觉的到速度变慢。
上面两个限制都是TCP连接带来的,因此HTTP/3.0致力于甩掉TCP的包袱(因为TCP协议僵化,即很多中间设备、操作系统的设计都是依靠TCP,所以TCP不能轻易改动),构建高效安全的网络。
HTTP/3.0新增了QUIC(Quick UDP Internet Connection)协议来实现可靠传输,可以看作是UDP的升级版。
① 它仿照TCP协议,设计了类似的流量控制、拥塞控制、丢失重传等可靠传输手段(虽然UDP不保证可靠传输,但可以在它之上增加一些方法手段保证可靠传输)。
② 它设计了快速握手功能,搭配上TLS优化的版本,可以使得可以用最快的速度建立连接,很大程度上缓解了早期HTTP的连接延迟问题。
③ 它也实现了HTTP/2.0的多路复用功能,但是它在同一条TCP连接中,设计了逻辑连接的概念,每一个逻辑连接彼此独立,解决TCP的队头阻塞问题。
● URI、URL的区别
URI(Uniform Resource Identifier):统一资源标识符
它的作用:唯一标识资源。可以通过位置路径唯一标识、也可以通过名字唯一标识(URN)。
URL(Uniform Resource Locator):统一资源定位符
是一种URI,它通过描述资源的位置来标识资源。URL保存有资源的:协议、服务器IP地址、端口号、资源路径、资源名称等信息。
● IP地址过滤
限制或组织特定IP地址或IP地址范围的访问。例如,如果之前服务器资源被某一个IP攻击过,那么就可以禁止这个IP地址访问服务器。
● 《计算机网络》(谢希仁)内容总结
● 物理层
(1) 数据(data):运送消息的实体;
(2) 信号(Signal):数据的电气或电磁的表现,它可以分为模拟信号(连续)和数字信号(离散)。可以理解为信号是适合在传输介质上传输的对象;
(3) 码元(Code):在使用时间域(或简称为时域)的波形来表示数字信号时,代表不同离散值的基本波形;
(4) 双方信息交互的方式:单工(只允许一方发送,另一方接收)、半双工(不可同时发送,不可同时接收)、全双工(可同时发送、接收);
(5) 可能导致失真的因素:码元的传输速率、信号传输距离、噪声干扰、传输媒体质量;
(6) 码间串扰:由于失真,导致接收端收到的信号波形失去了码元之间清晰的界限。
(7) 信道比:信号的平均功率和噪声的平均功率之比,常记为S/N,并用分贝(dB)作为度量单位。
(8) 奈氏准则:他给出了假定理想条件下,为了避免码间串扰,码元的传输速率的上限值。我们需要知道的就是:在任何信道中,码元传输的速率是有上限的,传输速率超过这个上限,就会出现严重的码间串扰,使接收端对码元的判决(即识别)变成不可能;
(9) 香农定理:信道的带宽或信道中的信噪比越大,信息的极限传输速率就越高。(它进告诉我们理论情况下的信道最大传输速率,没有告诉我们具体怎么做)
(10) 基带信号(基本频带信号):来自信源的信号。比如计算机输出的各种文字或者图像文件的数据信号都属于基带信号、它往往包含较多的低频成分,甚至有直流成分;
(11) 调制:由于很多信道不能传输基带信号中包含的低频分量或直流分量,因此需要额外的变换,这种变换称为调制;它可以分为基带调制和带通调制。基带调制是通过波形变换,使它能和信道特性相适应,变换后的信号仍然是基带信号,我们往往称这种过程叫“编码”。而带通调制则需要载波进行调制,需要将基带信号的频率范围搬移到更高的频段,并转换为模拟信号,转换后的信号称作带通信号。
(12) 信道复用:指多个用户共享同一个信道,技术包括:频分复用(光的频分复用称为“波分复用”)、时分复用、码分复用(不同用户拥有不同的码片序列,这些码片序列相互正交,码片序列可以用来计算出某一个用户传输的0/1(计算结果为"+1"/"-1",而其他的用户传输比特计算出来是"0"),而且由于不同用户的码片不同,因此他们可以使用同一个信道进行传输)
● 数据链路层
(1) 链路:从一个节点到相邻节点的一段物理链路;数据链路:在链路的基础上增加了一些必要的硬件(交换机等)和软件(协议)。
(2) 数据链路层使用的两种信道类型:① 点对点信道;② 广播信道。以及这两种信道所使用的协议PPP点对点协议、具有碰撞检测的载波监听多点接入CSMA/CD协议。
(3) 数据链路层的三个基本问题:封装成帧、透明传输和差错检测。
(4) 适配器、集线器、网桥、交换机的区别
三、《计算机网络》知识点
1、ICMP(Internet Control Message Protocol):网际控制报文协议
ICMP允许主机或路由器报告差错情况和提供有关异常情况的报告。ICMP报文是装在IP层数据报的数据部分,因此它看起来好像是高层协议,但是它确实属于IP层协议。
(1) 报文格式
● 其中ICMP的首部占有8个字节。
● 校验和:验证ICMP报文是否有差错。(由于IP数据报的校验和只验证首部,不会验证数据部分,所以不能保证传输过程中ICMP报文不出现差错)
(2) 报文类型
● ICMP差错报告报文
4种类型:
a) 终点不可达:当路由器或者主机不能交付数据报时,向源点发送终点不可达报文。
b) 超过时间: 当路由器收到生存时间为零的数据报时,除了丢弃它,还要向源点发送时间超过报文。此外,当终点在预定时间之内不能收到一个数据报的全部数据报片时,就把已收到的数据报片都丢弃,并向源点发送时间超过报文。
c) 参数问题:当路由器或者主机收到的数据报的首部中有的字段值不正确时(无法被正常解析),就丢弃该数据报,并向源点发送参数问题报文。
d) 改变路由(重定向):路由器把改变路由报文发送给主机,让主机知道下次应该将数据报发送给另外的路由器(可通过更好的路由)。通常情况下,主机在刚开始工作时,一般在转发表都有一个默认路由,而默认路由器会在网络中通过路由选择协议动态的学习和改变路由信息,它如果发现主机发往某个目的地址的数据报存在更好的路由路径,就会通过这个报文告诉主机,主机收到后就会更新自己的转发表。
以下几种情况,不应该发送ICMP差错报告报文:
a) 对ICMP差错报告报文,不再发送ICMP差错报告报文;
b) 对第一个分片的数据报片的所有后续数据报片,都不发送ICMP差错报告报文;
c) 对具有多播地址的数据报,都不发送ICMP差错报告报文;
d) 对具有特殊地址的数据报(如:127.0.0.0 或 0.0.0.0),不发送ICMP差错报告报文。
● ICMP询问报文
2种类型:
a) 回送请求和回答:ICMP回送请求报文是由主机或者路由器向一个特定的目的主机发出的询问。收到此报文的主机必须要给源主机或路由器发送一个ICMP回送回答报文。这样一来就可以测试目的站是否可达,以及了解其有关状态。
b) 时间戳请求和回答:ICMP时间戳请求报文是请某台主机或者路由器回答当前的日期时间。它可以用于时钟同步和时间测量。
(3) 应用
● PING(Packet InterNet Groper):分组网间探测,用来测试两台主机之间的连通性。【ICMP询问报文:回送请求与回送应答】
该应用是应用层直接使用网络层ICMP的一个例子。它没有通过运输层的TCP或者UDP。
● traceroute/tracert(Unix/Windows):【ICMP差错报告报文:时间超过、终点不可达】
该应用程序会从源主机向目的主机发送一连串的IP数据报,数据包中装的是无法交付的UDP用户数据报(端口号非法):
第一个数据报的TTL时间被设置为1,当该数据报到达第一跳路由器后,路由器收下它,并将TTL时间减1,此后的路由器收到后发现TTL时间为0,就会丢弃它,并向源点发送一个ICMP时间超过报文。
第二个数据报的TTL时间被设置为2,那么该数据报就会在经过两个路由器后,被接下来的路由器丢弃,然后同样的向源点发送一个ICMP超过时间报文。
……(以此类推)
直到第n个数据报正确的到达了目的主机,此时TTL还剩下1,目的主机不会丢弃它。但是由于里面装的是不可交付的UDP数据报,因此目的主机会向源点发送一个ICMP终点不可达数据报。
至此,完成路径的追踪。