计算机网络面试整理

本文经过借鉴书籍资料、他人博客总结出的知识点,欢迎提问

一. 一些概念:
  • 封装:在应用程序数据发送到物理网络之前,将沿着协议栈从上往下传递,每一层协议都在上层数据的基础上加上自己的头部信息(尾部信息),来实现该层功能。
    封装
    经过数据链路层封装的数据,传输媒介不同,帧的类型也不同,上述图用的是最常见的以太网帧。
二. TCP/IP 协议簇的部分常见协议及其默认端口
  • 超文本传输协议:HTTP:万维网的基本协议 端口:80
  • HTTPS:HTTPS是身披 SSL 外壳的 HTTP 端口:443
  • 文件传输:ftp 端口:20,21
  • 简单文件传输协议:TFTP(Trivial File Transfer Protocol):搭建无人值守安装服务器 端口:69
  • 远程登陆:Telnet 端口:23
  • 网络管理:SNMP:简单网络管理协议 端口:161

  • 传输控制协议:TCP(transmission control protocol)
  • 用户数据报协议:UTP(user data protocol)
  • Internet 协议(IP)
  • Internet 控制信息协议:ICMP
  • 地址解析协议:ARP
  • 反向地址解析协议:RARP
  • 域名解析服务:DNS

三. 一些常见的面试问题:
1 TCP/IP 四层体系结构:

答: TCP/IP 协议族是一个四层的协议系统, 从上到下依次是:应用层,传输层,网络层,网络访问层。
应用层:它支持网络应用,提供与本地操作环境相交互的接口。
传输层:提供错误控制和确认功能,并充当网络应用程序的接口。
网际层:提供逻辑寻址和路由选择。
网络访问层:提供与物理网络连接的接口。


2 OSI 七层模型:
  • 从上到下依次是:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层。

3. 传输层协议:TCP 与 UDP 区别

答:

  • TCP 是传输控制协议,提供的是面向连接的,可靠的字节流服务。实际数据传输之前服务器和客户端要进行三次握手,会话结束后四次挥手结束连接。
  • UDP 是用户数据报协议,是无连接的。因为无连接,而且没有超时重发机制,所以 UDP 传输速度很快。主要用于视频传输 (网页视频用的是tcp,因为网页用 HTTP 或者 HTTPS 协议,而 HTTP/HTTPS 都是基于 TCP,而对于实时视频,比如视频聊天,出现一些画面质量的损失也可以被接受,所以用 UDP。
  • TCP 保证数据按序到达,提供流量控制和拥塞控制,在网络拥堵的时候会减慢发送字节数,而 UDP 不管网络是否拥堵。
  • TCP 是连接的,所以服务是一对一服务,而 UDP 可以 1 对 1,也可以 1 对多(多播),也可以多对多。

4. TCP窗口机制

  • 滑动窗口协议是传输层进行流量控制的一种措施,接收方通过通知发送方自己的窗口大小,从而控制发送方的发送速度,从而达到防止发送方发送速度过快而导致自己被淹没的目的,并且滑动窗口分为接收窗口和发送窗口。TCP 的滑动窗口的可靠性是建立在“确认重传”基础上的。发送窗口只有收到对方对于本段发送窗口内字节的 ACK 确认,才会移动发送窗口的左边界。接受窗口只有在前面所有的段都确认的情况下才会移动左边界。当在前面还有字节未接受但收到后面字节的情况下,窗口不会移动,并不对后续字节确认。以此确保对方会对这些数据重传。
  • TCP 中窗口大小是指 tcp 协议一次传输多少数据。
  • TCP 窗口机制有两种,一种是固定窗口大小,另一种是滑动窗口。
  • 因为 TCP 是顺序发送的,操作系统将这些数据包一批一批的发送给对方,就像一个窗口,不停地往后移动,所以,我们称之为 TCP 滑动窗口协议。
  • 在 TCP中,窗口的大小是在 TCP 三次握手后协定的,并且窗口的大小并不是固定的,而是会随着网络的情况以及自身处理能力的变化进行调整。
  • 对于发送端来说,即将要发送的数据包排成一个队列,对于发送者来说,数据包总共分成四类。分别是在窗口前的,已经发送给接收方,并且收到了接收方的答复,我们称之为已发送。在窗口中的,有两种状态,一个是已经发送给接收方,但是接收方还没确认送达,我们称之为已发送未确认,另外一个是可以发送了,但是还没有发送,我们称之为允许发送未发送。最后的是在窗口外面的,我们称之为不可发送,除非窗口滑到此处,否则不会进行发送。一旦前面的数据已经得到服务端确认了,这个窗口就会慢慢地往后滑。

5. 什么是面向连接 & 面向无连接:

答:

  • 面向连接:是指通信双方在通信时,要事先建立一条通信线路。其有三个过程:建立连接、使用连接和释放连接。
  • 面向无连接:与面向连接相对,面向无连接是指通信双方不需要事先建立通信线路,而是把每个带有目的地址的报文分组送到线路上,由系统自主选定线路进行传输。由于面向无连接不需要在通信双方进行数据传输前建立虚拟连接线路,而维护连接的过程正是影响面向连接网络的瓶颈所在,因此面向无连接的服务能做到高效率和实时性,但可靠性相对面向连接服务较低一些。
  • TCP 协议就是一种面向连接的协议。双方进行通信之前首先要建立一个会话(三次握手),确保消息的准确到达,如果有什么问题能够相互通知然后解决。举个栗子:打电话;
    面向无连接:是指通信双方不需要事先建立一条通信线路,而是把每个带有目的地址的包(报文分组)送到线路上,由系统自主选定路线进行传输。IP、UDP 协议就是一种无连接协议。举个栗子,邮政系统是一个无连接的模式,写信人写好对方的地址和自己的姓名地址然后就交给邮递公司了,至于到没到达也不能即使确认,所以是不可靠的。

6. 三次握手

引用dreamispossible的原文链接:我觉得写得不错,略加修改改成符合自己思维的版本:

  • 刚开始客户端处于 closed 的状态,服务端处于 listen 状态。然后:
  • 第一次握手:客户端给服务端发一个 SYN 报文(即同步序列号报文),并指明客户端的初始化序列号 ISN© 。此时客户端处于 SYN_Send 状态。
  • 第二次握手:服务器收到客户端的 SYN 报文之后,会以自己的 SYN 报文作为应答,并且也是指定了自己的初始化序列号 ISN(s),同时会把客户端的 ISN + 1 作为 ACK 的值,表示自己已经收到了客户端的 SYN 报文,此时服务器处于 SYN_REVD 的状态。
  • 第三次握手:客户端收到 SYN 报文之后,会发送一个 ACK 报文,当然,也是一样把服务器的 ISN + 1 作为 ACK 的值,表示已经收到了服务端的 SYN 报文,此时客户端处于 establised 状态。
  • 服务器收到 ACK 报文之后,也处于 establised 状态,此时,双方以建立起了链接。
  • 在 socket 编程中,客户端执行 connect() 时,将触发三次握手。

7. 为什么需要三次握手,两次不行吗?

hellomyshadow原文链接

  • 弄清楚这个问题,首先需要搞明白三次握手的目的是什么,能不能只用两次握手来达到同样的目的。
  • 第一次握手:客户端发送网络包,服务端收到了。这样服务器就能得出结论:客户端的发送能力、服务器端的接收能力是正常的。
  • 第二次握手:服务端发包,客户端收到了。这样客户的就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。不过,此时的服务器并不能确认客户端的接收能力是否正常。
  • 第三次握手:客户端发包,服务器收到了。这样服务端就能得到结论:客户端的接收、发送能力正常,自己的发送、接收能力也正常。
  • 故:需要三次握手才能确认双方的接收与发送能力是否正常!
  • 试想一下,如果是用两次握手,则会出现以下情况: 客户端发送连接请求,但因连接请求报文丢失而未收到确认,于是客户端再次发送一次连接请求。后来收到了确认,建立了连接。数据传输完毕后,就释放了连接,客户端共发出了两个连接请求报文,其中第一个丢失,第二个到达了服务端,但第一个丢失的报文段只是在某些网络结点长时间滞留了,延误到连接释放以后的某个时间才到达服务端,此时服务端误认为客户端又发来了一次新的连接请求,于是就向客户端发出确认报文段,同意建立连接,不采用三次握手,只要服务端发出确认,新的连接就已经建立了。而此时客户端忽略了服务端发来的确认包,也不发送数据,则服务端一直等待客户端发送数据,浪费服务器资源。
  • 三次握手的作用除了确认双方的接受能力、发送能力是否正常之外,还有:
  • 指定自己的初始化序列号,为后面的可靠传送做准备。
  • 如果是 https 协议的话,三次握手这个过程,还会进行数字证书的验证以及加密密钥的生成

8. 半连接队列与全连接队列:

hellomyshadow原文链接

  • 服务器第一次收到客户端的 SYN 之后,就会处于 SYN_RCVD 状态,此时双方还没有完全建立起连接,服务器会把此种状态下的请求连接放入一个队列中,此队列称之为半连接队列。
  • 与之对应,全连接队列,就是已经完成了三次握手,建立起的连接被放入的队列。如果队列满了,就可能会出现丢包现象。
  • 服务器发送完 SYN_ACK 后,如果未收到客户端确认包,服务端进行首次重传;等待一段时间仍未收到确认包,则进行第二次重传;如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。
    注意:每次重传所等待的时间不一定相同,一般会是指数增长,如1s、2s、4s、8s …

9. 关于 ISN (Initial Sequence Number)是否是固定的:

hellomyshadow原文链接

  • ISN 不是固定的。当一端为建立连接而发送它的 SYN 报文时,它为连接选择一个初始序号。ISN 随时间而变化,因此每个连接都将具有不同的 ISN。
  • ISN 可以看作是一个 32bit 的计数器,每 4ms 加 1。这样选择序号的目的在于防止在网络中被延迟的分组在以后又被传送,而导致某个连接的一方对它做错误的解释。
  • 三次握手中的一个重要功能是客户端和服务端交换 ISN(Initial Sequence Number),以便让对方知道接下来接收数据时如何按序列号组装数据。如果 ISN 是固定的,攻击者很容易猜出后续的确认号,因此 ISN 是动态生成的。

10. 三次握手过程中可以携带数据吗?

hellomyshadow原文链接

  • 第三次握手可以携带数据。但前两次是不可以的。
  • 试想一下,假如第一次可以携带数据,如果有人要恶意攻击服务器,那他每次都在第一次握手中的 SYN 报文中放入大量的数据。因为攻击者根本不关心服务器的接收、发送能力是否正常,然后疯狂重发 SYN 报文,这会让服务器花费大量时间和内容空间来接收报文。
  • 也就是说,第一次握手不可以放数据,其中一个最简单的原因就是会让服务器更容易收到攻击。而第三次握手时,客户端已经处于 ESTABLISHED 状态,对客户端来说,连接已经建立了,也确认服务端的接收、发送能力正常,所以能携带数据。

11. SYN攻击是什么?

hellomyshadow原文链接

  • 服务器端的资源分配是在二次握手时分配的,而客户端的资源是在完成三次握手时分配的,所以服务器容易受到 SYN 泛洪攻击
  • SYN 攻击就是客户端在短时间内伪造大量不存在的 IP 地址,并向服务器不断地发送 SYN 包,服务端则回复确认包,并等待客户端确认。由于源地址不存在,因此服务端需要不断重发直至超时,这些伪造的 SYN 包将长时间占用未连接队列,导致正常的 SYN 请求因为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪。
  • SYN 攻击是一种典型 DoS/DDoS 的攻击。
  • 检测 SYN 攻击非常方便,当你在服务器上看到大量的半连接状态时,特别是源 IP 地址是随机的,基本上可以断定这是一次 SYN 攻击。在 Linux/Unix 上可以使用系统自带的 netstats 命令来检测 SYN 攻击:netstats -n -p TCP | grep SYN_RECV

12. 四次挥手
  • TCP 连接的拆除需要发送四个包,因此称为四次挥手,客户端或服务器均可主动发起挥手动作。
  • 刚开始双方都处于 ESTABLISHED 状态,假如是客户端先发起关闭请求,四次挥手的过程如下:
  • 第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个序列号。此时客户端处于 FIN_WAIT1 状态;
  • 即发出连接释放报文段(FIN=1,序号seq=u),并停止再发送数据,主动关闭 TCP 连接,进入 FIN_WAIT1 (终止等待1)状态,等待服务端的确认。
  • 第二次挥手:服务端收到FIN包之后,会发送ACK报文,且把客户端的序列号值+1 作为ACK报文序列号值,表明已经收到客户端的报文了,此时服务端处于CLOSE_WAIT状态;
  • 即服务端收到连接释放的报文段后,立即发出确认报文段(ACK=1,确认号ack=u+1,序号seq=v),服务端进入 CLOSE_WAIT(关闭等待)状态,此时的 TCP 处于半关闭状态,客户端到服务端的连接释放。客户端收到服务端的确认后,进入 FIN_WAIT2(终止等待2)状态,等待服务端发出的连接释放报文段;
  • 第三次挥手:如果服务端也想断开连接,和客户端的第一次挥手一样,发送 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 状态。
  • 即服务端没有要向客户端发送的数据,服务端发出连接释放的报文段(FIN=1,ACK=1,序号seq=w,确认号ack=u+1),服务端进入 LAST_ACK(最后确认)状态,等待客户端确认。
  • 第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值+1 作为自己的 ACK 报文的序列号值,此时客户端处于 TIME_WAIT 状态,需要过一阵子才会进入 CLOSED 状态,为了确保服务端收到自己的 ACK 报文。服务端收到 ACK 报文之后,就会关闭连接,也进入 CLOSED 状态。
  • 即客户端收到服务端的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),客户端进入 TIME_WAIT(时间等待)状态。此时 TCP 未释放掉,需要经过时间等待计数器设置的时间 2MSL(报文最大生存时间)后,客户端才会进入 CLOSED 状态。
  • 在 socket 编程中,任何一方执行 close() 操作即可产生挥手操作。

13. MSL (报文最大生存时间)Maximum Segment Lifetime
  • MSL:最长报文段寿命,它是任何报文在网络上存在的最长时间,超过这个时间的报文将被丢弃。
  • 这里特别需要主要的就是 TIME_WAIT 这个状态了,这个是面试的高频考点,就是要理解,为什么客户端发送 ACK 之后不直接关闭,而是要等一阵子才关闭。这其中的原因就是,要确保服务器是否已经收到了我们的 ACK 报文,如果没有收到的话,服务器会重新发 FIN 报文给客户端,客户端再次收到 ACK 报文之后,就知道之前的 ACK 报文丢失了,然后再次发送 ACK 报文。
  • 至于 TIME_WAIT 持续的时间至少是一个报文的来回时间。一般会设置一个计时,如果过了这个计时没有再次收到 FIN 报文,则代表对方成功就是 ACK 报文,此时处于 CLOSED 状态。

14. 挥手为什么需要四次?
  • 前两次挥手是为了断开 client 至 server 的连接,后两次挥手是为了断开 server 至 client 的连接,如果没有第四次挥手,会出现如下状况:
  • server 发送 FIN 数据包并携带 ACK 至 client 之后直接断开连接,如果 client 没有收到这个 FIN 数据包,那么 client 会一直处于等待关闭状态,这是为了确保 TCP 协议是面向连接安全有保证的。
  • 上面解释了为什么不是三次挥手,同理,两次挥手也是不安全的。不能保证 server 与 client 都能正确关闭连接释放资源,而不会造成资源浪费。

15. 控制拥塞:

拥塞控制与流量控制的区别:

  • 拥塞控制是防止过多的数据注入到网络中,可以使网络中的路由器或链路不致过载,是一个全局性的过程。流量控制是点对点通信量的控制,是一个端到端的问题,主要就是抑制发送端发送数据的速率,以便接收端来得及接收。

拥塞的标志:

  • ①:重传计时器超时;
  • ②:接收到三个重复确认.

拥塞控制算法:

  • 拥塞窗口的大小取决于网络的拥塞程度,并且在动态地变化,发送方让自己的发送窗口等于拥塞窗口。发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就可以再增大一些,以便把更多的分组发送出去,这样就可以提高网络的利用率,但只要网络出现拥塞或可能出现拥塞,就必须把窗口减小一些,以减少注入到网络中的分组数,以便缓解网络出现的拥塞。
  • 慢开始算法思想:当主机开始发送数据时,由于并不清楚网络的负荷情况,如果立即把大量数据字节注入到网络,那么就有可能引起网络发生拥塞,所以由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口数值,试探一下网络的拥塞情况。慢开始规定,在发送方每收到一个新的报文段的确认后,拥塞窗口的值就增大 1,刚开始我们先设置拥塞窗口值为 1,发送方收到一个新的确认报文之后,cwnd 变为 2,发送方接收到两个新的确认报文之后 cwnd 加 2 变成 4。即拥塞窗口的增长每次都是收到确认报文段数量的 2 倍。为了防止拥塞窗口增长多大引起网络阻塞,为其设置了一个慢启动门限,当到达门限时,就进入到拥塞避免阶段。
  • 拥塞避免算法的思路:不再以指数形式增长拥塞窗口,而是每经过一个往返时间 RTT 就将发送方的拥塞窗口 + 1,使其增长缓慢,按照线性方式增长,如果发生网络拥塞,比如丢包时,就将慢启动门限设为原来的一半,然后将拥塞窗口设置为 1,开始执行慢启动算法。
  • 快速重传算法思想:快速重传要求接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认,即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认。快速重传规定,发送方只要一连接收到 3 个重复确认,就知道接收方确实没有收到该报文段,因而应当立即进行重传,这样就不会出现超时,发送方也就不会误认为出现了网络拥塞。使用快速重传可以使整个网络的吞吐量提高约 20%。快速重传后进入快速恢复。
  • 快速恢复的思想:将慢启动门限值设置为原来的一半,然后将拥塞窗口设置为现在的慢启动的门限值,不再执行慢启动而是直接进入拥塞避免阶段。使发送窗口成线性方式增长。+ + 也有的快速恢复实现是把快速恢复时的拥塞窗口 cwnd 值再增大一些(即 3 个报文段长度),即等于新的门限值 + 3 个报文段长度。这样做的理由是,既然发送方收到 3 个重复的确认,就表明 3 个分组已经离开了网络。这 3 个分组不再消耗网络的资源,而是停留在接收方的缓冲区种(接收方发送出了 3 个重复确认就证明了这个事实)。可见现在网络中并不是堆积了分组,而是减少了 3 个分组。因此可以适当的把拥塞窗口扩大些。

16. 什么是网络套接字(Socket)
  • TCP 用主机的 IP 地址加上主机上的端口号作为 TCP 连接的端点,这种端点就叫做套接字 (socket) 或插口。
  • 套接字用(IP 地址:端口号)表示。
  • 它是网络通信过程中端点的抽象表示,包含进行网络通信必需的五种信息:连接使用的协议,本地主机的 IP 地址,本地进程的协议端口,远地主机的 IP 地址,远地进程的协议端口。

17. 访问一个网页的过程

孤独烟的天龙八步
①:DNS 域名系统解析域名得到 IP

  • 正常情况下,浏览器会缓存 DNS 一段时间,一般 2 分钟到 30 分钟不等。如果有缓存,直接返回 IP。
  • 缓存中如果没有查到 IP,浏览器会做系统调用,读取主机的 hosts 文件,如果找到,直接返回 IP。
  • hosts 文件里面还是没有找到,则直接去路由器中寻找 DNS 缓存,一般这个时候都能找到对应的 IP。
  • 如果还是没有找到,ISP (网络运营服务商)的 DNS 服务器就开始从根域名服务器开始递归搜索,从 .com 顶级域名服务器开始,一直到 baidu 的域名服务器。
  • 这个时候,浏览器就获取到了对应的 IP。在解析的过程中,常常会解析出不同的 IP,这是根据不同的用户,不同的网络供应商,所在的地域,等等等等进行计算给出的最优的 IP 地址。

②:发起 TCP 连接:

  • 拿到域名对应的 IP 地址之后,浏览器会以一个随机端口(1024 < 端口 < 65535)向服务器的 WEB 程序(常用的有httpd,nginx等)80 端口发起 TCP 的连接请求。这个连接请求到达服务器端后(这中间通过各种路由设备,局域网内除外),进入到网卡,然后是进入到内核的 TCP/IP 协议栈(用于识别该连接请求,解封包,一层一层的剥开),还有可能要经过 Netfilter 防火墙(属于内核的模块)的过滤,最终到达 WEB 程序,最终建立了 TCP/IP 的连接。

③:向 IP 地址发送HTTP请求
④:服务器处理请求
⑤:返回响应结果
⑥:关闭TCP连接
⑦:浏览器解析HTML
⑧:浏览器布局渲染


18. HTTP 和 HTTPS 的区别
  • HTTP 是协议时超文本传输协议,HTTPS 是安全的超文本传输协议,是安全版的 HTTP 协议,使用安全套接字层 (SSL) 进行信息交换。
  • HTTPS 协议主要针对解决 HTTP 协议以下不足:
    ①:通信使用明文(不加密),内容可能会被窃听
    ②:不验证通信方身份,应此可能遭遇伪装
    ③:无法证明报文的完整性(即准确性),所以可能已遭篡改
    即: HTTP + 加密 + 认证 + 完整性保护 = HTTPS
  • HTTP 端口 80,HTTPS 端口 443
  • HTTPS 采用对称加密
  • SSL位于应用层于传输层 TCP 之间,原本数据由应用层直接交由传输层处理,现在会经过 SSL 加密再进行传输。
  • HTTPS 也不是绝对安全的,针对 SSL 的中间人攻击方式主要有两类,分别是 SSL 劫持攻击和 SSL 剥离攻击。SSL 劫持攻击就是 SSL 证书欺骗攻击,将自己接入到客户端和目标网站之间; 在传输过程中伪造服务器的证书,将服务器的公钥替换成自己的公钥。

19. 交换机与路由器的区别


4. 常用的 http 有哪些方法

答:

  • GET: 用于请求访问已经被 URI(统一资源标识符)识别的资源,可以通过 URL 传参给服务器。
  • POST:用于传输信息给服务器,主要功能与 GET 方法类似,但一般推荐使用 POST 方式。
  • PUT: 传输文件,报文主体中包含文件内容,保存到对应 URI 位置。
  • HEAD: 获得报文首部,与 GET 方法类似,只是不返回报文主体,一般用于验证 URI 是否有效。
  • DELETE:删除文件,与 PUT 方法相反,删除对应 URI 位置的文件。
  • OPTIONS:查询相应 URI 支持的 HTTP 方法。

5. get 与 post 区别

答:


6. http 协议及特点

答:


7. http 状态码

答:


8. http2.0 (与 http1.1 有什么区别)

答:


9. https (结构,为什么安全?)

答:



11. 缓存 (expires/cache-control/…)

答:


12. 持久连接 (keep-alive)

答:


13. cookies

答:


14. web 安全 (jsonp/xss 原理与防御)

答:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值