计网-基础篇-面试

339 阅读18分钟

基础篇

1.1 TCP/IP网络模型有哪几层?

在同一设备上的进程间通信是多样的,如管道,共享内存,信号,消息队列等,对于不同设备进程间通信就需要网络通信,而设备多样,为了兼容多种设备,就需要一个通用的网络协议。

网络协议是分层的,每一层都有各自的职责,作用。

1.2应用层

应用层的实现有软件。它只关注于为用户提供应用功能,如HTTP,FTP,DNS,SMTP。

但是它并不关心数据的传输过程。他只是“码农”,并不知道底层实现。

应用层是在用户态下实现的,应用层以下都是在内核态工作的。

1.3传输层

传输层是为应用层提供网络支持的。

在传输层会有俩协议:TCP和UDP。

TCP是应用最广的(transmission control protocal ),HTTP应用层协议正是用了TCP的传输协议,它相比于UDP有很多特性,比如流量控制,超时重传,拥塞控制等,为了将消息可靠传给对方

UDP简单,它只发送数据包,但不保证数据是否抵达对方,实时性好,传输效率高。但是UDP也可以实现可靠传输,把TCP的特性在应用层上实现就行。

当TCP传输的数据过大时候,超过MSS,会超过最大TCP报文长度,因此我们需要将这个数据进行分块,这样如果途中有一个TCP块丢失了,重发那个分块即可。在TCP协议中,我们将每个分块称为TCP段(TCP Segment)

对于接收方的设备,如果有很多应用需要接收数据,我们需要通过编号来区分接受的东西,这就是端口。比如nginx的80端口,https的443端口等。

1.4网络层

传输层的作用主要是为了服务应用,作为应用数据间传输的媒介。实际真正传输的功能交给网络层。

网络层常用IP协议(Internet Protocal),IP协议会将传输层的报文作为数据部分,在头部加上IP包头组成IP报文,有点像接龙。如果超过最大长度MTU,就再次分包即可。

我们给IP地址给设备编号,对于IPV4协议,ip地址共32位,分成了四段(如192.168.100.1),每段是8位。

然而世界上那么多设备如果任意两台需要互相连接,难道需要都搜索一遍?

因此,我们需要把ip地址分成2种意义。

  • 网络号。负责标识ip地址哪个子网。
  • 主机号。负责标识同一子网的不同主机

举例:10.100.122.0/24 前面是ip,后面就是子网掩码,由于是24个1,可以写成

「11111111-11111111-11111111-00000000」,就是255.255.255.0

我们将ip地址和子网掩码进行按位与运算。之后就能得到网络号了

我们将ip地址和取反后的子网掩码进行按位与运算,就能得到主机号了。

在寻址的过程中,只有先得到网络号才会去找对应的主机。

除了寻址,ip协议同样可以路由,两台设备由路由器交换机,网管等多个网络设备连接,当数据包到达一个网络节点,需要通过路由算法决定下一步走哪条路径。

ip地址的寻址作用告诉我们的目标地点。路由作用是根据目标地点来选择路径

1.5网络接口层

生成IP头部之后,接下来要交给网络接口层(Link Layer)在IP头部前面加上MAC头部,并封装成数据帧(Data frame)发送到网络上。

IP 头部中的接收方 IP 地址表示网络包的目的地,通过这个地址我们就可以判断要将包发到哪里,但在以太网的世界中,这个思路是行不通的。

什么是以太网?电脑上的以太网接口,Wi-Fi接口,以太网交换机,网线等,都是以太网的组成部分,以太网就是一种在局域网内,把附近的设备连接在一起,使它们之间能进行通讯的技术

以太网在判断网络包目的地和IP的方式不同,必须采用相匹配的方式才能将以太网将包发往目的地,而Mac头部就是干这个用的,所以在以太网通信需要用到MAC地址。

MAC头部就是以太网使用的头部,它包含了接收方和发送方的MAC地址信息,通过ARP协议获取对方的MAC地址

因此,网络接口层为网络层提供链路级别传输的服务,负责在以太网,WIFI这样的底层网络上发送原始数据包,工作在网卡层次,适用MAC地址来标识网络上的设备

1.6总结

网络接口层传的是帧(frame),IP层传的是包(packet),TCP层传输的是segment(段),HTTP传输的单位是报文。这些都可统称为数据包

2.键入网址到网页显示,期间发生了什么?

HTTP做了啥?

浏览器第一步就是对URL进行解析。

将一个URL分成了协议,域名,资源路径名。

长长的URL 本质就是请求服务器的文件资源。

在确认了要请求的东西和地址之后,就可以根据这些生成请求信息了。

它会根据请求的url,方法,请求头,请求体等生成一个请求报文

同理,他也会生成一个响应报文。

根据状态码,响应头,消息体,版本等生成

image-20230104161725204

HTTP数据包被生成后,它表示,我就是个信息体,需要载体载我!

DNS做了啥?

由于在发送前,我们只知道域名,并不知道他的IP地址,因此我们需要有东西将域名解析成ip地址。

这就是DNS服务器。它保存了web服务器域名和ip的对应关系。

在域名中,约往后层级越高,如www.baidu.com .com是最高的。

域名的层级关系是一个树状结构:

  • 根域名服务器(.)
  • 顶级域DNS服务区(.com)
  • 权威DNS服务器(server.com)

这样一来,任何DNS服务器都可以找到并访问根域DNS服务器了。

域名解析的工作流程:

  1. 客户端会发送一个DNS请求,问这个域名(ceshi.server.cn)的ip是啥,并发给本地DNS服务器(本地客户端TCP/IP设置中填写的DNS服务器地址)
  2. 本地域名服务器收到客户端请求后,如果能在缓存表格中找到这个域名的ip地址,那么就直接返回。如果没有,本地DNS服务器地址会去问它的根域名服务器。
  3. 根域名服务器收到本地DNS请求时候,发现他的后置是.cn,那么此时就会让本地DNS服务器去请求.cn服务器。
  4. ,cn服务器重复根域名的操作,知道找到 ceshi.server.cn 区域的权威DNS服务器的地址 —— server.cn
  5. 本地DNS向权威DNS服务器询问ip,由于权威DNS服务器server.cn是域名解析的源出处,它的域名它做主。
  6. 权威DNS服务器查询后将对应的ip地址告诉本地DNS
  7. 本地DNS服务器将ip返回给客户端,客户端和目标建立连接

image-20230104170733856

难道每次解析域名都要经过那么多的步骤吗?

其实不是,还有缓存。

浏览器会看看自身有没有对这个域名的缓存,如果有就直接返回,没有就问操作系统,操作系统会去看看自己的缓存,如果有,就直接返回,如果没有就去hosts文件里面看。也没有,才会去问本地DNS服务器。

这也是为什么我们访问github会去该hosts文件,就是减少询问时间。

HTTP数据包表示:DNS真牛,找到目的地喽。

协议栈做了啥?

在DNS获取到IP之后,就把HTTP传输的工作交给了操作系统的协议栈。

image-20230108134240683

浏览器通过调用socket库,去委托协议栈工作。协议栈的上部分有两块,负责首发UDP和TCP的协议,这俩传输协议会接收应用层的委托执行收发数据的操作。

协议的下半部分是用IP协议控制网络包的手法操作,在上传数据的时候,数据会被切分成一个个的网络包,将网络包发送给对方就是IP负责的。

Ip中包括ICMP协议和ARP 协议。

ICMP协议告知网络包传送过程产生的错误以及各种控制信息

ARP用于根据IP地址查询相应的以太网MAC地址

在IP协议下面一层则是网卡驱动程序,负责控制网卡硬件实现信号的发送和接收。

协议栈里的TCP做了啥?

HTTP是基于TCP 传输的。那么TCP报文的格式长啥样呢?

image-20230108142930187

  1. 第一行是源端口号和目的端口号,负责控制发收目的地
  2. 第二号是包的序号,负责解决包乱序问题,相当于id
  3. 第三行是确认序列,为了确认发出对方是否收到,如果没收到就重新发送,直到送达,这是为了解决包丢失问题
  4. 第四行左边是状态位。SYN是发起连接的状态,ACK是回复的状态,RST是重新连接的状态,FIN是结束连接状态,接收发送双方都需要维护连接的状态,这些带状态位的包的发送,会引起双方状态的变更。
  5. 第四行右边是窗口大小。通信双方都会声明一个窗口(缓存大小),表示能处理的大小,这也是流量控制的体现。

在TCP传输数据之前,他会先根据报文三次握手连接

image-20230108223041078

所谓的连接,其实是双方在维护一个状态机。

  1. 首先,客户端处于CLOSE状态,服务端也处于CLOSE状态,但是服务端主动监听某个端口,处于LISTEN状态
  2. 然后客户端主动发起连接,将报文中的状态位改为SYN(Sychronized Number同步序列号),并且处于SYN-SENT状态。
  3. 服务端收到发起的连接,返回SYN和ACK(Ackownledge Number)。之后就处于SYN-RCVD状态
  4. 客户端收到SYN和ACK之后,发送对SYN确认的ACK,之后处于ESTABLISHED状态。因为他一发一收成功了
  5. 服务端收到ACK的ack之后,也处于ESTABLISHED状态,因为它也一发一收了。

三次握手的目的是保证双方都有发送接收的能力

TCP分割数据

如果HTTP请求消息比较长,超过了MSS的长度,这时候TCP就会把HTTP的数据分包发送。

MSS:发送的数据的最大长度

MTU:包含了IP头部,TCP头部,发送的数据的网络包的最大长度

大数据会被分成多份MSS,被放入MTU中进行传输。

image-20230110155736504

TCP和HTTP组装后成了这样:

image-20230110160032506

这就形成了网络报文

ip远程定位做了啥?

image-20230110161648051

这是IP报文头部的格式

  • 源地址是客户端的ip
  • 目标地址是DNS域名解析得到的服务器ip

如果客户端有多个网卡,就有多个IP地址,那么IP头部的源地址选哪个呢?

其实很简单,哪个网卡发的填哪个网卡的IP呗。

我们需要根据路由表的规则进行查找。

image-20230110162425964

如果我们要发送到 192.168.10.200

那么系统会根据三个条目的genmask进行于运算,得到destination,如果和各个条目的destination相同,那么就代表是它发送的。

第三条代表默认网关,如果其它条目军无法匹配就匹配他。之后他会把包发送给路由器,第三条的gamteway则是路由器的ip地址。

image-20230110162905255

IP报文就这样生成了。

现在我们有数据,TCP头,IP头了!加上IP头之后,我们有了远程定位的能力!

MAC头部做了啥?

MAC包头格式

image-20230110163437919

MAC头部是以太网使用的头部,包含了接收方和发送方的MAC地址等信息。

它用于两点传输。

MAC发送方和接收方如何确认?

发送方的MAC的获取是聪网卡的ROM(只读存储器里面获取的),这个生产的时候就已经被厂商写入了。

那接收方的MAC地址呢?

我们可以先查一下路由表,找到相应匹配的条目,找到要发送的ip(上述已说明)

然后我们将这个ip,配合ARP协议广播在以太网上,对所有的设备喊出:"这个ip是谁的?报上你的MAC地址!!"

然后就会有MAC地址返回了。

每次广播获取MAC地址,这不是很麻烦吗?

其实在发包前,机器会先查询ARP缓存,如果已经保存了对方的ARP地址,那么就直接用缓存中的地址即可。

如果不存在才会发送广播。

查看ARP缓存

arp -a

image-20230110164638619

image-20230110164751903

繁重的头部加上了新的成员。

数据包终于可以在以太网中传输了!

网卡干了什么?

网络包说到底也只是放在内存中的一串二进制数字信息,无法直接发送给对方。因此我们需要将数字信息转换为电信号。才能在网线上传输。这才是真正的数据发送过程。

负责执行这一个操作的就是网卡,负责操控网卡的是网卡驱动程序。

网卡在获取网络包之后,会在开头加上包头和起始帧分界符,在末尾加上用于检测错误的帧校验序列FCS

  • 起始帧分界符是标记包起始位置的标记
  • 帧校验序列是用于检测包传输过程是否有损坏

之后,网卡会将包转化为电信号,通过网线发出去。

交换机干了什么

交换机的作用是将网络包原样转发到目的地。交换机工作在MAC层,也称二层网络设备。

电信号到达了网线接口后,交换机里的模块就负责接受了。

交换机会判断末尾的校验码FCS,是否错误。没错就放进缓冲区。交换机端口和网卡不同,不会核对包的接收方MAC地址是不是自己的,而是将所有包都填入缓冲区。交换机的端口不具有MAC地址

进入缓冲区之后,需要在交换机的MAC地址表中查询这个包的接收方是否已经在表里面了

image-20230110170929474

交换机的MAC地址表主要包含两个信息

  • 设备的MAC地址
  • 该设备连接在交换机的哪个端口上

查完之后,交换机就会将信号发送到相应的端口了

如果MAC地址表中也找不到怎么办?

说明该地址的设备还没有向交换机发送过包或者这个设备一段时间没有共从导致地址被移除了

这种情况只能把端口除了源端口都发一遍了。

这样依赖就会发送到整个网络上,它并不会产生什么问题,因为只有相应的接收者才能接收到包,其它设备则会忽略这个包。

发送完以后,就会获得相应,交换机就会将它的地址写入MAC地址表。

这样一来,数据包通过交换机转发抵达了路由器,准备离开土生土长的子网了。

路由器干了啥

路由器的工作目标是将这个网络包转发到下一个路由器或者目标设备。

转发的工作原理和交换机相似,都是通过查表转发目标。

但是具体操作不同

  • 路由器是基于IP设计的,俗称三层网络设备,路由器各个端口都有MAC地址和IP地址
  • 交换机是基于以太网设计的,也叫二层网络设备。

路由器的基本原理

路由器的端口有MAC地址,因此它能成为以太网的发送方和接收方,同时具有IP地址,从这个意义上来说,他和计算机网卡相同。

当转发包时,首先路由器端口会接收发给自己的以太网包,然后路由表查询转发目标,再由相应的端口作为发送方将以太网包发送出去。

路由器的包接收操作

首先,电信号到达网线接口部分,路由器会将电信号转化为数字信号,通过包末尾的FCS进行错误校验。

如果没问题就检查MAC头部中的接收方MAC地址,看看是不是发送给自己的包,如果是就直接放到接收缓冲区中,否则就丢弃这个包

总之,路由器的端口都有MAC地址,并且只接收与自身地址匹配的包,不匹配就直接丢弃。

路由器查询路由表确定输出端口

完成包接收操作之后,路由器就会去掉包开头的MAC头部。因为MAC头部的作用就只是将包送到路由器而已

接下来,路由器会对IP头部的内容进行包的转发作用。

image-20230110234805537

具体的工作流程根据上图,举个例子。

假设地址为 10.10.1.101 的计算机要向地址为 192.168.1.100 的服务器发送一个包,这个包先到达图中的路由器。

判断转发目标的第一步,就是根据包的接收方 IP 地址查询路由表中的目标地址栏,以找到相匹配的记录。

路由匹配和前面讲的一样,每个条目的子网掩码和 192.168.1.100 IP 做 & 与运算后,得到的结果与对应条目的目标地址进行匹配,如果匹配就会作为候选转发目标,如果不匹配就继续与下个条目进行路由匹配。

如第二条目的子网掩码 255.255.255.0192.168.1.100 IP 做 & 与运算后,得到结果是 192.168.1.0 ,这与第二条目的目标地址 192.168.1.0 匹配,该第二条目记录就会被作为转发目标。

实在找不到匹配路由时,就会选择默认路由,路由表中子网掩码为 0.0.0.0 的记录表示「默认路由」。

路由器的发送

首先,或根据路由表的网关列判断对方地址

如果网关是一个IP地址,那么这个IP地址就是我们要转发的地址,还未到达终点,需要继续转发

如果网关为空,那么就说明接收方ip就是要转发的目标地址,说明已经到达了。

知道对方的IP地址后,同样需要通过ARP 协议根据IP地址找MAC地址,并将查询结果作为接收方MAC地址。

接下来是发送方 MAC 地址字段,这里填写输出端口的 MAC 地址。还有一个以太类型字段,填写 0800 (十六进制)表示 IP 协议。

网络包完成后,接下来会将其转换成电信号并通过端口发送出去。这一步的工作过程和计算机也是相同的。

发送出去的网络包会通过交换机到达下一个路由器。由于接收方 MAC 地址就是下一个路由器的地址,所以交换机会根据这一地址将包传输到下一个路由器。

接下来,下一个路由器会将包转发给再下一个路由器,经过层层转发之后,网络包就到达了最终的目的地。

不知你发现了没有,在网络包传输的过程中,源 IP 和目标 IP 始终是不会变的,一直变化的是 MAC 地址,因为需要 MAC 地址在以太网内进行两个设备之间的包传输。

服务端接收

服务端接收数据包后,会先剥开Mac头部,如果和自己的MAC地址符合就包起来。

继续看IP头,发现符合

再看上层是TCP协议,看看协议里面的序列号,如果是就放入缓存,返回ACK,不是就丢弃。TCP头部有端口号,服务器监听它。

然后服务器就将这个包给HTTP进程。

HTTP进程看到这个请求是要访问页面,就把网页封装在HTTP相应里面返回客户端。流程和上述一致。

于是客户端又开始剥皮。将数据渲染

最后客户端离开了,向服务器发起了TCP四次回收,双方连接断开。

参考文献:

xiaolincoding.com/network/1_b…

javaguide.cn/cs-basics/n…