计算机网络八股(极简速成、为了秋招没办法版


不是完整版也不是非常深入,属于是极简速成为了秋招没办法的版本,背完了考到就皆大欢喜,考到不会的就拉倒自认倒霉。

网络体系结构

TCP/IP 与 ISO/OSI 网络模型

在这里插入图片描述

OSI:应用 表示 会 传输 网络 数据 哩

TCP/IP网络模型

在这里插入图片描述

· 应用层

专注于为用户提供应用功能。

· 传输层

在传输层会有两个传输协议,分别是 TCP 和 UDP。

· 网络层

在各种各样的路径和节点进行选择。最常使用的是 IP 协议(Internet Protocol

· 网络接口层

在 IP 头部的前面加上 MAC 头部,并封装成数据帧(Data frame)发送到网络上。

键入url网址到网页显示,期间发生了什么?
  1. URL 进行解析,从而生成发送给 Web 服务器的请求信息。
  2. 检查浏览器缓存里面是否缓存了该资源,有则返回,没有则准备发送网络请求。
  3. DNS解析,查询域名对应的 IP 地址。
  4. 浏览器与服务器建立TCP连接
  5. 消息封装TCP头部、IP头部和Mac头部,在交换机和路由器的转发下,抵达服务器
  6. 服务器接受请求信息,生成响应数据
  7. 浏览器解析返回数据

HTTP

HTTP 是超文本传输协议,也就是HyperText Transfer Protocol。

HTTP 常见的状态码

  • 1xx 类状态码属于提示信息,是协议处理中的一种中间状态,实际用到的比较少。
  • 2xx 类状态码表示服务器成功处理了客户端的请求,也是我们最愿意看到的状态。
  • 3xx 类状态码表示客户端请求的资源发生了变动,需要客户端用新的 URL 重新发送请求获取资源,也就是重定向
    • 301 Moved Permanently」表示永久重定向,说明请求的资源已经不存在了,需改用新的 URL 再次访问。
    • 302 Found」表示临时重定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问。
    • 304 Not Modified」表示自最近一次访问该页面以来,浏览器中存储(缓存)的资源没有被修改。
  • 4xx 类状态码表示客户端发送的报文有误,服务器无法处理,也就是错误码的含义。
    • 400 Bad Request」表示客户端请求的报文有错误,但只是个笼统的错误。
    • 403 Forbidden」表示服务器禁止访问资源,并不是客户端的请求出错。
    • 404 Not Found」表示请求的资源在服务器上不存在或未找到,所以无法提供给客户端。
  • 5xx 类状态码表示客户端请求报文正确,但是服务器处理时内部发生了错误,属于服务器端的错误码。
    • 500 Internal Server Error」与 400 类型,是个笼统通用的错误码,服务器发生了什么错误,我们并不知道。
    • 501 Not Implemented」表示客户端请求的功能暂不支持,类似“即将开业,敬请期待”的意思。
    • 502 Bad Gateway」通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生了错误。
    • 503 Service Unavailable」表示服务器当前很忙,暂时无法响应客户端,类似“网络服务正忙,请稍后重试”的意思。

GET 与 POST

安全和幂等
  • 「安全」是指请求方法**不会「破坏」**服务器上的资源。
  • 「幂等」是多次执行相同的操作,**结果都是「相同」**的。
区别
  1. 作用

    • GET 的语义是从服务器获取指定的资源

    • POST 的语义是根据请求负荷(报文body)对指定的资源做出处理或提交数据

  2. 安全性

    • GET 方法就是安全且幂等的,因为它-是「只读」操作,无论操作多少次,服务器上的数据都是安全的,且每次的结果都是相同的。所以,可以对 GET 请求的数据做缓存,这个缓存可以做到浏览器本身上(彻底避免浏览器发请求),也可以做到代理上(如nginx),而且在浏览器中 GET 请求可以保存为书签

    • POST 因为是「新增或提交数据」的操作,会修改服务器上的资源,所以是不安全的,且多次提交数据就会创建多个资源,所以不是幂等的。所以,浏览器一般不会缓存 POST 请求,也不能把 POST 请求保存为书签

  3. 参数

    • GET参数放在URL中,数据量较小

    • POST参数放在请求体中,不限制数据量

强制缓存与协商缓存

对于一些具有重复性的 HTTP 请求,把这对「请求-响应」的数据都缓存在本地

· 强制缓存

强缓存指的是只要浏览器判断缓存没有过期,则直接使用浏览器的本地缓存,决定是否使用缓存的主动性在于浏览器这边。

过期判断的两个 HTTP 响应头部(Response Header)字段:

  • Cache-Control, 是一个相对时间;
  • Expires,是一个绝对时间;
· 协商缓存

协商缓存就是与服务端协商之后,通过协商结果来判断是否使用本地缓存。

协商缓存可以基于两种头部来实现。

  • 请求头部中的 If-Modified-Since 字段与响应头部中的 Last-Modified 字段实现:

Last-Modified:资源的最后修改时间;

If-Modified-Since:服务器收到If-Modified-Since则与被请求资源的最后修改时间进行对比(Last-Modified),资源又被改过,则返回最新资源,HTTP 200 OK;资源无新修改,响应 HTTP 304 走缓存

  • 请求头部中的 If-None-Match 字段与响应头部中的 ETag 字段,这两个字段的意思是:

​ 响应头部中 Etag:唯一标识响应资源;

​ 请求头部中的 If-None-Match:比较第一次请求资源的Etag与再次向服务器发起请求时资源的Etag 的值。服务器收到请求后进行比对,如果资源没有变化返回 304,如果资源变化了返回 200。

HTTP/1.0与HTTP/1.1

  1. 长连接

    TCP长连接减少通信开销。

  2. 缓存

    HTTP/1.0用 Last-Modified 字段实现; HTTP/1.1用ETag 字段实现

  3. 管道

    管道(pipeline)网络传输,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间

  4. 状态码

​ 新增了错误状态码。

HTTP/1.1与HTTP/2.0

  1. 二进制分帧

    头信息和数据体都是二进制,并且统称为帧(frame):头信息帧(Headers Frame)和数据帧(Data Frame),改进传输性能

  2. 多路复用

    针对不同的 HTTP 请求用独一无二的 Stream ID 来区分,可以支持多重请求-响应消息。

  3. 首部压缩

    HPACK 算法:在客户端和服务器同时维护一张头信息表,用表中索引号代替头部字段

  4. 服务器推送

    服务端可以主动向客户端推送的资源。

HTTPS

HTTP 与 HTTPS 有哪些区别?
  1. HTTP 简单无状态、明文传输;HTTPS 加入了 SSL/TLS 安全协议,使得报文能够加密传输,增加安全性。
  2. HTTPS 在 TCP 三次握手之后,还需进行 SSL/TLS 的握手过程,才可进入加密报文传输。
  3. HTTP 默认端口号是 80,HTTPS 默认端口号是 443
  4. HTTPS 协议需要向 CA(证书权威机构)申请数字证书。
公钥与私钥
  • 公钥和私钥成对出现
  • 公开的密钥叫公钥,只有自己知道的叫私钥
  • 用公钥加密的数据只有对应的私钥可以解密;用私钥加密的数据只有对应的公钥可以解密
  • 如果可以用公钥解密,则必然是对应的私钥加的密;如果可以用私钥解密,则必然是对应的公钥加的密

**“数字签名”**是用来验证发送方的身份并帮助保护数据的完整性。
例如:一个发送者 A 想要传些资料给大家,用自己的私钥对资料加密,即签名。这样一来,所有收到资料的人都可以用发送者的公钥进行验证,便可确认资料是由 A 发出来的了。(因为只有A使用私钥签名得到的信息,才能用这个公钥来解) 。

HTTPS工作原理
  1. 客户端生成随机数,向服务器发送请求报文,请求建立链接
  2. 服务器生成一对公钥和私钥,并把公钥发送给CACA使用自己的私钥对服务器的公钥进行加密,产生一个数字证书,服务器将生成的数字证书发送给客户端,并再附加一个随机数
  3. 客户端取出服务端的数字证书,使用 CA 的公钥解密 数字证书,验证是否合法,合法则取出服务器的公钥
  4. 客户端使用公钥生成一个随机数发送给服务器、服务器使用私钥解密获得随机数,这三个随机数生成会话密钥
  5. 使用会话密钥进行通信

DNS

域名解析系统(Domain Name System),将域名和IP地址相互映射。

查询过程
  1. 用户输入url后,在浏览器本地缓存中查询域名是否有对应的IP地址
  2. 浏览器缓存中没有,则查看本地Host文件中是否有缓存对应的IP地址
  3. Host文件中没有,则向本地 DNS 服务器查询对应的IP地址
  4. 若本地 DNS 服务器没有,则向根域名服务器查询对应的IP地址
  5. 根域名服务器指路去哪一个DNS服务器查询
  6. 直到权威 DNS 服务器查询到以后将对应的 IP 地址返回本地DNS服务器
  7. 本地DNS服务器缓存下url对应的IP地址,并将结果返回浏览器

TCP与UDP

三次握手

三次握手流程
  1. 客户端向服务器发送SYN请求连接,客户端进入SYN-SENT状态
  2. 服务器收到SYN请求,回复ACK并同时发送一个SYN,服务器进入SYN-RCVD状态
  3. 客户端回复对于ACK报文的ACK,客户端进入ESTABLISHED状态
  4. 服务器收到ACK报文后,也进入ESTABLISHED状态
为什么要进行三次握手而不是四次、两次?

普通版:保证双方都具有接受和发送的能力

专业版:

两次:防止旧的重复连接初始化造成混乱。如果是两次连接,在第二次服务器回复ACK以后就会建立连接,但是这个回复有可能是历史连接的回复不是现有连接的回复,三次握手的时候发现服务器发送的是历史连接的回复就会发送RST报文终止连接,两次握手则无法避免这种情况。

两次:**避免资源浪费。**由于没有第三次握手,服务端不清楚客户端是否收到了自己回复的 ACK 报文,所以服务端每收到一个 SYN 就只能先主动建立一个连接,建立多个冗余的无效链接,造成不必要的资源浪费。

四次:三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数

四次挥手

四次挥手流程
  1. 客户端向服务器发送FIN报文,客户端进入 FIN_WAIT_1 状态

  2. 向客户端发送 ACK 应答报文,服务端进入 CLOSE_WAIT 状态

  3. 客户端收到服务端的 ACK 应答报文后,之后进入 FIN_WAIT_2 状态

    服务器处理数据……

  4. 服务器处理完数据后,向客户端发送FIN报文,服务器进入 LAST_ACK 状态

  5. 客户端收到FIN报文后,向客户端发送 ACK 应答报文,进入 TIME_WAIT 状态

  6. 服务端收到了 ACK 应答报文后,就进入了 CLOSE 状态

  7. 客户端在经过 **2MSL** 一段时间后,自动进入 CLOSE 状态

为什么 TIME_WAIT 等待的时间是 2MSL?

MSL 是 Maximum Segment Lifetime,报文最大生存时间。为了保证客户端最后一次ACK到达服务器,服务器顺利closed。因为如果最后一次ACK丢失了,服务器会重传一次FIN,如果少于2MSL的话,客户端收到重传的FIN会返回RST报文而不是ACK报文使服务器正常关闭。

为什么是四次挥手?

客户端发送FIN表示自己不再发送数据。

服务器收到FIN以后会把现有的数据处理完成才会发送 FIN 报文给客户端来表示同意现在关闭连接。

服务端通常需要等待完成数据的发送和处理,所以服务端的 ACKFIN 一般都会分开发送,因此是需要四次挥手。

TCP与UDP

面向连接否?连接形式是什么?连接以后开始传输、传输方式、传输效率、传输开销怎么样?可靠吗?

三个关键词:连接、传输、可靠

  1. 面向连接

    • TCP是面向连接的的协议

    • UDP不需要连接

  2. 连接方式

    • TCP是点对点的协议
    • UDP支持一对一、一对多、多对多的通信
  3. 传输形式

    • TCP是面向字节流的
    • UDP是面向报文的
  4. 传输效率

    • TCP连接因为要经过三次握手,以及重传机制,效率比UDP低
  5. 首部开销

    TCP首部开销至少20字节,UDP只有八个字节

  6. 可靠性

  • TCP 是可靠交付数据的,有三次握手建立连接、有重传机制拥塞控制、流量控制保证数据可以无差错、不丢失、不重复、按序到达
  • UDP 是不保证可靠交付数据。数据传输不需要任何确认,可能会丢包和乱序。可以基于 UDP 传输协议实现QUIC 协议,可靠的传输协议。

重传机制

针对数据包丢失的策略。

  • 超时重传

    发送一条数据以后,在一定的时间内没有收到对方的 ACK 确认应答报文,会默认该数据丢失而重新发送一份。

  • 快速重传

    当收到三个相同的 ACK 报文时,会在定时器过期之前,重传丢失的报文段。

  • SACK

    可以将已收到的数据的信息发送给「发送方」,这样发送方就可以知道哪些数据收到了,哪些数据没收到,知道了这些信息,就可以只重传丢失的数据

  • D-SACK

    使用了 SACK 来告诉「发送方」有哪些数据被重复接收了

滑动窗口

窗口大小就是指无需等待确认应答,而可以继续发送数据的最大值

窗口的大小是由接收方的窗口大小来决定的。发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来。

累计确认或者累计应答:发送方收到了 ACK 700 确认应答,就意味着 700 之前的所有数据「接收方」都收到了。

流量控制

通过调整滑动窗口大小来进行流量控制。

拥塞控制

拥塞控制,目的就是避免「发送方」的数据填满整个网络。

拥塞窗口 cwnd发送方维护的一个的状态变量,它会根据网络的拥塞程度动态变化的

发送窗口 swnd 和接收窗口 rwnd 是约等于的关系,那么由于加入了拥塞窗口的概念后,此时发送窗口的值是
swnd = min(cwnd, rwnd),也就是拥塞窗口和接收窗口中的最小值。

拥塞的确认:发生了超时重传,就会认为网络出现了拥塞

四个算法:
· 慢启动与拥塞避免

有一个叫慢启动门限 ssthresh (slow start threshold)状态变量。

  • cwnd < ssthresh 时,使用慢启动算法。
    • 当发送方每收到一个 ACK,拥塞窗口 cwnd 的大小就会加 1
  • cwnd >= ssthresh 时,就会使用「拥塞避免算法」。
    • 每当收到一个 ACK 时,cwnd 增加 1/cwnd
· 拥塞发生
  • 发生超时重传的拥塞发生算法

    • ssthresh 设为 cwnd/2

    • cwnd 重置为 1 (是恢复为 cwnd 初始化值,我这里假定 cwnd 初始化值 1)

  • 发生快速重传的拥塞发生算法

    • cwnd = cwnd/2 ,也就是设置为原来的一半;
    • ssthresh = cwnd
    • 进入快速恢复算法
· 快速恢复
  • 拥塞窗口 cwnd = ssthresh + 3 ( 3 的意思是确认有 3 个数据包被收到了);
  • 重传丢失的数据包;
  • 如果再收到重复的 ACK,那么 cwnd 增加 1;
  • 如果收到新数据的 ACK 后,把 cwnd 设置为第一步中的 ssthresh 的值,原因是该 ACK 确认了新的数据,说明从 duplicated ACK 时的数据都已收到,该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进入拥塞避免状态;

IP

IP 地址的分类

IP 地址分类成了 5 种类型,分别是 A 类、B 类、C 类、D 类、E 类。
在这里插入图片描述

  • 主机号全为 1 指定某个网络下的所有主机,用于广播
  • 主机号全为 0 指定某个网络

D 类和 E 类地址是没有主机号的,所以不可用于主机 IP,D 类常被用于多播,E 类是预留的分类,暂时未使用。

IP 分类的缺点

缺少地址的灵活性、不能很好的与现实网络匹配

IPv4 与 IPv6

IPv4 地址长度共 32 位,是以每 8 位作为一组,并用点分十进制的表示方式。

IPv6 地址长度是 128 位,是以每 16 位作为一组,每组用冒号 「:」 隔开。

IPv6 相比 IPv4 的首部改进:

  • 取消了首部校验和字段。 因为在数据链路层和传输层都会校验,因此 IPv6 直接取消了 IP 的校验。
  • 取消了分片/重新组装相关字段。 分片与重组是耗时的过程,IPv6 不允许在中间路由器进行分片与重组,这种操作只能在源与目标主机,这将大大提高了路由器转发的速度。
  • 取消选项字段。 选项字段不再是标准 IP 首部的一部分了,但它并没有消失,而是可能出现在 IPv6 首部中的「下一个首部」指出的位置上。删除该选项字段使的 IPv6 的首部成为固定长度的 40 字节。

无分类地址 CIDR

表示形式 a.b.c.d/x,其中 /x 表示前 x 位属于网络号,剩余的是主机号。

子网掩码及子网划分

将子网掩码和 IP 地址按位计算 AND,就可得到网络号。

在这里插入图片描述

  • 未做子网划分的 ip 地址:网络地址+主机地址
  • 做子网划分后的 ip 地址:网络地址+(子网网络地址+子网主机地址)

IP 地址与路由控制

路由控制表中记录着网络地址下一步应该发送至路由器的地址。在主机和路由器上都会有各自的路由器控制表。

在发送 IP 包时,首先要确定 IP 包首部中的目标地址,再从路由控制表中找到与该地址具有相同网络地址的记录,根据该记录将 IP 包转发给相应的下一个路由器。如果路由控制表中存在多条相同网络地址的记录,就选择相同位数最多的网络地址,也就是最长匹配

计算机网络相关协议

应用层

HTTP(超文本传输协议)

HTTPS(安全套接层超文本传输协议):HTTP的安全版本

FTP(文件传输协议):用于在网络上传输文件,使用户可以上传或下载文件到远程服务器。

SMTP与POP3:用于电子邮件的发送

DNS:将域名转换为IP地址的协议

Telnet:用于在网络上远程登录到其他计算机

SSH(安全外壳协议):用于安全远程登录到服务器或网络设备,以加密数据传输和身份验证。

SNMP(简单网络管理协议):用于网络设备之间的监控和管理,例如路由器、交换机等。

传输层

TCP/UDP

网络层

IP

ARP/RARP:从IP地址定位MAC地址的一种协议;从MAC地址定位IP地址的一种协议

DHCP:动态获取 IP 地址

NAT:网络地址转换 NAT 的方法,缓解了 IPv4 地址耗尽的问题

ICMP:互联网控制报文协议,确认 IP 包是否成功送达目标地址,或者报错原因

ICGP:因特网组管理协议,管理组播的

数据链路层

PPP:一种点到点(一根链路两端只有两个接口)链路层协议

物理层:IEEE802

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值