在这一篇我主要给大家梳理一下在计算机网络这门知识体系中我们需要掌握的一些基础知识,并且给大家列举了一些常见问题的答案。

如果你们时间有空闲的话,我建议大家看一下谢希仁的《计算机网络》,这本书比较系统的讲解了相关的知识。

前言

在计算机网络这门课程中大家要明白其核心内容:它是解决信息传输的一种分层机制。举个简单的例子就是,学习了这门知识之后你会明白,你在浏览器上输入一个url之后,底层都发生了那些信息交换,使得你最终能够在浏览器上看到你想要的信息。这也是为什么这个问题是面试的时候高频考察的问题之一。

计算机网络的分层

信息在网络中的传输链路非常复杂,为了能更加方便地管理,在计算机网络上需要对信息进行分层管理,这也是最常考察的题目之一:“请说说计算机网络的五层模型”或者是“计算机网络的七层模型”。

在五层模型中,会分为:物理层、数据链路层、网络层、传输层、应用层。在七层模型中,包含了:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。在这两个模型,现在比较统一的是五层网络模型,关于七层网络模型的详细介绍,大家可参考博文:https://www.cnblogs.com/lemo-/p/6391095.html。

大家应该能够理解各个层次所对应的主要作用,同时面试过程中常见的一题也是围绕着这5个层次来展开的。我们按照从底层到高层的顺序一步一步的展开。

物理层

这一层主要解决的是在网络设施上如何传送二进制数据以及如何解析出相应的二进制数据的,是最底层的部分,我们只要知道这一层的主要作用即可。

数据链路层

如果体现在报文的封装上,那就是在数据链路层的报文中携带的有mac地址,这个mac地址是用来识别接入网络的硬件设备的,每一台PC设备或者手机设备都有自己独特的mac地址。这一层内容,面试的时候考察的比较少,我这里主要分享两个内容。

Mac地址和IP地址的区别

Mac地址(以太网地址,48bit)和IP地址(ipv4、ipv6)的区别是什么,为什么两者均需要存在。这是一个我之前一直不理解的问题,也是思考了很久之后才想明白的问题,所以我觉得应该分享给大家。mac地址是硬件地址,每一个设备仅有一个mac地址,我之前一直有疑问在于既然ip地址可以标识一个上网设备,为什么还需要使用mac地址。这个问题的关键在于以太网的驱动程序或者说是网络适配器,是一个像单品机一样的东西,如果我们要进行功能上的更改就要将改动后的程序重新烧进板子里面,因此在出厂安装在主机上之后就不能再更改里面的程序了,故而mac地址对于每一个硬件来说是位于的,而如果你在不同的网络上,你的ip地址是不同,而网卡是不能识别变化的,故而mac地址和ip地址对于网络来说都是必须的,ip地址将各地网络进行分层,能够方便我们进行路由。网卡在处理接收到的数据包时,会先监测其mac地址,如果与自己相同,或者是广播的内容则接受,否则就丢弃。在局域网或者以太网中是通过mac地址来寻找主机的。

交换机和路由器的区别

  • 交换机,用于同一网络内部数据的快速传输,工作在TCP/IP协议的二层,数据链路层,工作简单,直接使用硬件处理;
  • 路由器,用于不同网络间数据的跨网络传输,工作在TCP/IP协议的三层——网络层,工作复杂,使用软件处理。

网络层

如果体现在报文的封装上,那就是在网络层的报文中携带的有ip地址。有了这一层使得位于世界各地的各个主机上的信息能够得以交换。关于这一层,我准备了如下几个常见的面试问题。

域名解析的过程

hosts->本地DNS解析器缓存->本地DNS服务器(在TCP/IP参数配置,不权威,因为可能改了)->根DNS服务器->迭代/递归查找,递归和迭代查找的过程如下:

IP地址分类

  • A类地址的表示范围为:0.0.0.0 ~ 127.255.255.255,默认网络掩码为:255.0.0.0,共有16777216个IP.
  • B类地址的表示范围为:128.0.0.0 ~ 191.255.255.255,默认网络掩码为:255.255.0.0,共有65536个IP.
  • C类地址的表示范围为:192.0.0.0 ~ 223.255.255.255,默认网络掩码为:255.255.255.0,共有256个IP.
  • D类IP:从224.0.0.0 – 239.255.255.255,D类地址称为广播地址,供特殊协议向选定的节点发送信息时用.
  • E类IP:从2240.0.0.0–255.255.255.255,E类地址保留给将来使用.

    其中127.0.0.1是一个特殊的本地地址,通常开发本地调试的过程中进程用。然后还有几个只在局域网中使用地址:10.0.0.0 ~ 10.255.255.255(A类),172.16.0.0 ~ 172.31.255.255(B类),192.168.0.0~192.168.255.255(C类)。

IPV6

为了解决ip地址不够用的问题,对ip对范围进行了扩充,因此提出了ipv6,ipv4是由32位的bit构成的,而ipv6则扩充至128位。

传输层

传输层位于网络层的下一层,主要是为了解决报文之间的先后顺序问题。通过ip层我们能得到位于其他主机上的信息资源,因为一个报文的最大长度是有限制的(受限于网络汇总各个设备的处理能力),当一次传输的数据超过最大限制的时候,就需要对报文进行切片,这些切片在网络上传输的路径并不是完全相同的,因此为了当这些切片到达目的地时能拼出有效的完整信息,我们需要按序来整理这些报文,而传输层就是为了帮助我们解决这一问题而增加的分层处理机制。关于传输层,常见的面试题目主要有:

TCP与UDP的区别

其实主要的一个区别就是:TCP是为了解决可靠传输而设立的一个传输机制。而UDP则不会保证传输的可靠性。为了实现可靠传输,TCP需要在发送数据之前和对方建立可靠的连接,一个可靠的TCP连接必须通过三次“会话”才能建立,因此才有了我们经常听到的TCP是面向连接的协议,而UDP是面向无连接的.同时为了优化网络中的数据传输,TCP提供了流量控制和拥塞控制机制,在TCP的网络传输中会存在大量的ACK包和SYN包,而UDP不需要。这也导致了TCP对系统资源的要求高于UDP,TCP慢,UDP快,TCP报文头部是20字节,UDP是8字节。所以说在应用方面:如果强调数据的完整性、可靠性的话用TCP,当要求性能的时候,比如看手机直播的时候,UDP显然是更好的选择。
TCP面向字节流,UDP面向报文.

三次握手

(1)客户端发送SYN信号,表示告诉服务器,我要建立连接; (2)服务器返回ACK=1和SYN=1给客户端,表示我已经接收到了客户端的请求,并接收了请求. (3)客户端收到来自服务端响应后,知道服务端已经接受连接请求,再次发送ACK给服务器,确认服务端的SYN,其实也就是一个确认的再确认. 对应的报文结构为: - 客户端:SYN=1,SEQ=x; - 服务器端:SYN=1,ACK=1,ACK=x+1,SEQ=y; - 客户端:ACK=1,ACK=y+1,SEQ=x+1
图中的名次解释如下: - SYN:同步位,SYN=1表示这是一个连接请求或者连接接收报文.SYN=1,ACK=0表示连接请求,若对方同意建立连接,则响应SYN=1,ACK=1; - SEQ:序号字段,代表本报文段数据的第一个字节的序号; - ACK:确认号字段,表示期待接收对方下一个报文段的数据的第一个字节的序号,ACK=x表示到序号x-1为止的数据都已经正确接收;(第一次序号x,y随机生成) - ACK:确认位,ACK=1时,ACK才有效.

连接是三次的原因?三次握手的缺陷?如何解决缺陷

攻击原理:攻击者通过发送大量伪造的SYN请求给服务器,然后服务器会给真正的客户端返回ACK+SYN信息,而真正的客户端没给服务器发送过SYN请求,所以它会忽略,而服务端默认重试五次,消耗大量的资源,使得正常用户无法访问

四次挥手

终止的四次挥手:客户端和服务端均主动发起挥手操作终止连接,其中包含的过程如下:
(1)主动方A发送一个FIN(终止信号)给被动方B,表示要终结主动方A到被动方B的连接;
(2)被动方B收到了FIN信号,返回ACK信号给主动方,表示从主动方到被动方的连接关闭了,也就是主动方不能再发送数据给被动方.
(3)被动方B在发送完数据后,给主动方A发送一个FIN信号,请求要终结被动方B到主动方A的连接;
(4)主动方A收到了FIN信号,返回ACK信号给被动方B,表示从被动方B到主动方A的连接关闭了,也就是被动方不能再发送数据给主动方.
对应的报文结构:
(1)A端:FIN=1,SEQ=u;
(2)B端:ACK=1,ACK=u+1,SEQ=v;此时A->B方向连接关闭,但是B->A方向仍能传送数据.
(3)B端:FIN=1,ACK=1,ACK=u+1,SEQ=w;
(4)A端:ACK=1,ACK=w+1,SEQ=u+1.

断开时四次的原因?

这是由于TCP的半关闭造成的,由于TCP是全双工的,表示可以同时在两个方向上即可以接收数据也可以发送数据.所以我们关闭连接必须在每个方向上面单独关闭,这个单方向的关闭就叫半关闭.所以挥手时其实就是2次断开连接,所以是四次.而关闭连接时,收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送.

为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

避免主动方回复的确认关闭报文丢失,可以在这段时间内再次接收到被动方FIN=1的释放连接请求.
A发送的确认释放连接信息B没有收到,这时候B会再次发