计算机网络八股文

OSI七层模型和TCP五层模型

  • 应用层:为应用程序提供网络服务;
  • 表示层:数据格式转换、数据压缩和数据加密;
  • 会话层:建立、断开和维护通信链接;
  • 传输层:为上层协议提供端到端的可靠传输;
  • 网络层:寻址和路由;
  • 数据链路层:定义通过通信媒介互连的设备之间传输的规范;
  • 物理层:利用物理传输介质为数据链路层提供物理连接。

TCP五层模型相比OSI七层模型,将OSI的应用层、表示层和会话层合为一层:应用层,其他不变。

什么是UDP和TCP?UDP和TCP的区别是什么?

UDP和TCP都是传输层的协议,用来建立可靠的通信传输链接的。

UDP仅提供了最基本的数据传输功能,至于传输时连接的建立和断开、传输可靠性的保证这些UDP统统不关心,而是把这些问题抛给了UDP上层的应用层程序去处理,自己仅提供传输层协议的最基本功能。

TCP作为一种面向有连接的协议,只有在确认通信对端存在时才会发送数据,会在传输开始前建立连接,传输结束后断开连接,此外,TCP还采取了多种措施保障传输的可靠性。

TCP和UDP的区别如下:

  • TCP是面向有连接型,UDP是面向无连接型;
  • TCP是一对一传输,UDP支持一对一、一对多、多对一和多对多的交互通信;
  • TCP是面向字节流的,即把应用层传来的报文看成字节流,将字节流拆分成大小不等的数据块,并添加TCP首部;UDP是面向报文的,对应用层传下来的报文不拆分也不合并,仅添加UDP首部;
  • TCP支持传输可靠性的多种措施,包括保证包的传输顺序、重发机制、流量控制和拥塞控制;UDP仅提供最基本的数据传输能力。

TCP的流量控制?

流量控制是为了控制发送端发送数据的速率,保证接收端能将本应接收的所有报文分组接收成功,否则会触发自动重传机制造成网络流量的浪费。

流量控制的具体操作是:接收端会通知发送端自己能接收的数据大小,于是发送端会发送不超过这个数据量的数据,这个大小被称为“窗口”的大小,在TCP首部中专门有一个字段表示“窗口”的大小,该值越大代表网络的吞吐量越高。

TCP的拥塞控制?

计算机网络都处在一个共享的环境,在通信开始时如果立即把大量数据注入到网络,可能会引起网络阻塞,甚至带来网络瘫痪。TCP为了防止该问题的出现,采用了拥塞控制的策略,常见的拥塞控制策略有慢启动、拥塞避免、快重传与快恢复,这里以慢启动为例做简单介绍。

在通信开始时,定义一个“拥塞窗口”,窗口大小为1,意思是开始时只发送一个分组,之后每收到一个确认回执(ACK),拥塞窗口的大小就加1(即逐渐增大窗口大小),发送端在发送数据时,将拥塞窗口的大小与接收端流量控制窗口的大小作比较,取二者中较小的值,然后实际发送的数据量比这个最小值还要小。

 

 

 快重传

快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方)而不要等到自己发送数据时才进行捎带确认。

接收方收到了M1和M2后都分别发出了确认。现在假定接收方没有收到M3但接着收到了M4。显然,接收方不能确认M4,因为M4是收到的失序报文段。根据 可靠传输原理,接收方可以什么都不做,也可以在适当时机发送一次对M2的确认。但按照快重传算法的规定,接收方应及时发送对M2的重复确认,这样做可以让 发送方及早知道报文段M3没有到达接收方。发送方接着发送了M5和M6。接收方收到这两个报文后,也还要再次发出对M2的重复确认。这样,发送方共收到了 接收方的四个对M2的确认,其中后三个都是重复确认。快重传算法还规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段M3,而不必 继续等待M3设置的重传计时器到期。由于发送方尽早重传未被确认的报文段,因此采用快重传后可以使整个网络吞吐量提高约20%。

    与快重传配合使用的还有快恢复算法,其过程有以下两个要点:

    <1>. 当发送方连续收到三个重复确认,就执行“乘法减小”算法,把慢开始门限ssthresh减半。这是为了预防网络发生拥塞。请注意:接下去不执行慢开始算法。

    <2>. 由于发送方现在认为网络很可能没有发生拥塞,因此与慢开始不同之处是现在不执行慢开始算法(即拥塞窗口cwnd现在不设置为1),而是把cwnd值设置为 慢开始门限ssthresh减半后的数值,然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大。

TCP粘包?

如果客户端连续不断的向服务端发送数据包时,服务端接收的数据会出现两个数据包粘在一起的情况。

1. TCP 是基于字节流的,虽然应用层和 TCP 传输层之间的数据交互是大小不等的数据块,但是 TCP 把这些数据块仅仅看成一连串无结构的字节流,没有边界;

2. 从 TCP 的帧结构也可以看出,在 TCP 的首部没有表示数据长度的字段。

基于上面两点,在使用 TCP 传输数据时,才有粘包或者拆包现象发生的可能。一个数据包中包含了发送端发送的两个数据包的信息,这种现象即为粘包

粘包是如何产生的?

(1)发送方产生粘包

采用 TCP 协议传输数据的客户端与服务器经常是保持一个长连接的状态(一次连接发一次数据不存在粘包),双方在连接不断开的情况下,可以一直传输数据。但当发送的数据包过于的小时,那么 TCP 协议默认的会启用 Nagle 算法,将这些较小的数据包进行合并发送(缓冲区数据发送是一个堆压的过程);这个合并过程就是在发送缓冲区中进行的,也就是说数据发送出来它已经是粘包的状态了。

一句话:要发送的数据小于 TCP 发送缓冲区的大小,TCP 将多次写入缓冲区的数据一次发送出去,将会发生粘包。

(2)接收方产生粘包

接收方采用 TCP 协议接收数据时的过程是这样的:数据到接收方,从网络模型的下方传递至传输层,传输层的 TCP 协议处理是将其放置接收缓冲区,然后由应用层来主动获取(C 语言用 recv、read 等函数);这时会出现一个问题,就是我们在程序中调用的读取数据函数不能及时的把缓冲区中的数据拿出来,而下一个数据又到来并有一部分放入的缓冲区末尾,等我们读取数据时就是一个粘包。(放数据的速度 > 应用层拿数据速度)。

一句话:接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包。

如何避免粘包?

有以下两个措施:

  • 在每个包的末尾加上特殊字符,用以区分连续的两个包;
  • 在报文首部添加包的长度。

什么是http协议?http和https的区别?

http协议是应用层的协议,中文名称是超文本传输协议,是客户端和服务端相互通信时将信息以http报文的形式传输。

https可以简单的理解为:https = http + 加密 + 认证 + 完整性保护。

http协议的缺点:

  1. 通信使用明文,内容可能被窃听。
  2. 通信双方的身份无法得到认证,身份可能遭遇伪装。
  3. 无法验证报文的完整性。

针对以上问题,https的改进措施:

  1. 加密。https协议通过SSL或者TLS协议将报文内容进行加密,client端进行加密,server端进行解密。
  2. 认证。通过值得信赖的第三方机构颁布证书,即可确认通信双方的身份。客户端持有证书即可完成客户端身份的确认,客户端通信前会查看服务端的证书。
  3. 完整性保护。可以通过MD5等散列码进行通信内容的校验。

为什么说http协议是无状态协议?怎么解决Http协议无状态协议?

http协议是一种无状态协议,协议自身不对请求和响应之间的通信状态进行保存,即对发送过来的请求和响应都不做持久化处理,把http协议设计的如此简单是为了更快地处理大量事务。

为了解决http协议不能保存通信状态的问题,引入了Cookie状态管理。Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端的状态。Cookie会根据从服务端发送的响应报文的一个叫Set-Cookie的首部字段,通知客户端保存Cookie。当下次客户端再往该服务端发送请求时,客户端会自动在请求报文中加入Cookie值发送出去,服务端发现客户端发来的Cookie后,会检查是哪一个客户端发来的连接请求,对比服务器上的记录,最后得到之前的状态信息。

URI和URL的区别?

URI: Uniform Resource Identifier,统一资源标识符,用来唯一标识互联网中的一份资源。

URL: Uniform Resource Locator,统一资源定位符,我们访问网站的网址就是URL。

URL是URI的子集。

URI的目的就是唯一标识互联网中的一份资源,具体可以用资源名称、资源地址等,但是资源地址是目前使用最广泛的,因此URL就容易和URI混淆。URI相当于抽象类,URL就是这个抽象类的具体实现类。

常见的http动词有哪些?

GET: 从服务器获取资源
POST: 在服务器新建资源
PUT: 在服务器更新资源
DELETE: 在服务器删除资源
HEAD: 获取资源的元数据
OPTIONAL: 查询对指定的资源支持的方法

put和post的区别?

put是幂等的,post不是。

幂等是数学的一个用语,对于单个输入或者无输入的运算方法,如果每次都是同样的结果,则称其是幂等的。也就是说,如果一个网络重复执行多次,产生的效果是一样的,那就是幂等(idempotent)。

post在发请求的时候,服务器会每次都创建一个文件,而put发请求的时候,是更新文件而不是创建文件,因此put是幂等的。

DNS的工作流程

主机向本地域名服务器的查询一般是采用递归查询,而本地域名服务器向根域名的查询一般是采用迭代查询。
递归查询主机向本地域名发送查询请求报文,而本地域名服务器不知道该域名对应的IP地址时,本地域名会继续向根域名发送查询请求报文,不是通知主机自己向根域名发送查询请求报文。迭代查询是,本地域名服务器向根域名发出查询请求报文后,根域名不会继续向顶级域名服务器发送查询请求报文,而是通知本地域名服务器向顶级域名发送查询请求报文。
简单来说,递归查询就是,小明问了小红一个问题,小红不知道,但小红是个热心肠,小红就去问小王了,小王把答案告诉小红后,小红又去把答案告诉了小明。迭代查询就是,小明问了小红一个问题,小红也不知道,然后小红让小明去问小王,小明又去问小王了,小王把答案告诉了小明。

在浏览器中输入域名,操作系统会先检查自己本地的hosts文件是否有这个域名的映射关系,如果有,就先调用这个IP地址映射,完成域名解析。

如果hosts文件中没有,则查询本地DNS解析器缓存,如果有,则完成地址解析。

如果本地DNS解析器缓存中没有,则去查找本地DNS服务器,如果查到,完成解析。

如果没有,则本地服务器会向根域名服务器发起查询请求。根域名服务器会告诉本地域名服务器去查询哪个顶级域名服务器。

本地域名服务器向顶级域名服务器发起查询请求,顶级域名服务器会告诉本地域名服务器去查找哪个权限域名服务器。

本地域名服务器向权限域名服务器发起查询请求,权限域名服务器告诉本地域名服务器所对应的IP地址。

本地域名服务器告诉主机所对应的IP地址

ARP的工作流程(面试时问ARP协议主要说这个就可以了):

  1. 在局域网内,主机A要向主机B发送IP数据报时,首先会在主机A的ARP缓存表中查找是否有IP地址及其对应的MAC地址,如果有,则将MAC地址写入到MAC帧的首部,并通过局域网将该MAC帧发送到MAC地址所在的主机B。
  2. 如果主机A的ARP缓存表中没有主机B的IP地址及所对应的MAC地址,主机A会在局域网内广播发送一个ARP请求分组。局域网内的所有主机都会收到这个ARP请求分组。
  3. 主机B在看到主机A发送的ARP请求分组中有自己的IP地址,会像主机A以单播的方式发送一个带有自己MAC地址的响应分组。
  4. 主机A收到主机B的ARP响应分组后,会在ARP缓存表中写入主机B的IP地址及其IP地址对应的MAC地址。
  5. 如果主机A和主机B不在同一个局域网内,即使知道主机B的MAC地址也是不能直接通信的,必须通过路由器转发到主机B的局域网才可以通过主机B的MAC地址找到主机B。并且主机A和主机B已经可以通信的情况下,主机A的ARP缓存表中寸的并不是主机B的IP地址及主机B的MAC地址,而是主机B的IP地址及该通信链路上的下一跳路由器的MAC地址。这就是上图中的源IP地址和目的IP地址一直不变,而MAC地址却随着链路的不同而改变。
  6. 如果主机A和主机B不在同一个局域网,参考上图中的主机H1和主机H2,这时主机H1需要先广播找到路由器R1的MAC地址,再由R1广播找到路由器R2的MAC地址,最后R2广播找到主机H2的MAC地址,建立起通信链路。

有了IP地址,为什么还要用MAC地址?

简单来说,标识网络中的一台计算机,比较常用的就是IP地址和MAC地址,但计算机的IP地址可由用户自行更改,管理起来相对困难,而MAC地址不可更改,所以一般会把IP地址和MAC地址组合起来使用。具体是如何组合使用的在上面的ARP协议中已经讲的很清楚了。
那只用MAC地址不用IP地址可不可以呢?其实也是不行的,因为在最早就是MAC地址先出现的,并且当时并不用IP地址,只用MAC地址,后来随着网络中的设备越来越多,整个路由过程越来越复杂,便出现了子网的概念。对于目的地址在其他子网的数据包,路由只需要将数据包送到那个子网即可,这个过程就是上面说的ARP协议。
那为什么要用IP地址呢?是因为IP地址是和地域相关的,对于同一个子网上的设备,IP地址的前缀都是一样的,这样路由器通过IP地址的前缀就知道设备在在哪个子网上了,而只用MAC地址的话,路由器则需要记住每个MAC地址在哪个子网,这需要路由器有极大的存储空间,是无法实现的。
IP地址可以比作为地址,MAC地址为收件人,在一次通信过程中,两者是缺一不可的。

TCP 是如何保证可靠性的

  • 首先,TCP 的连接是基于三次握手,而断开则是四次挥手。确保连接和断开的可靠性。
  • 其次,TCP 的可靠性,还体现在有状态;TCP 会记录哪些数据发送了,哪些数据被接受了,哪些没有被接受,并且保证数据包按序到达,保证数据传输不出差错。
  • 再次,TCP 的可靠性,还体现在可控制。它有数据包校验、ACK 应答、超时重传(发送方)、失序数据重传(接收方)、丢弃重复数据、流量控制(滑动窗口)和拥塞控制等机制。

 

posted on   4小旧  阅读(521)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示