!> 计算机网络 面试题以及答案整理
参考列表
看上面
!> 只是在7层协议上去掉会话层与表示层,其中应用层对应 OSI 的上三层,下四层和 OSI 相同
注意:
!> 同一个网络中的主机可以直接进行通信,属于直接交付 !> 不同网络中的主机进行通信,需要通过路由器中转,属于间接交付。
问题:源主机如何判断目的主机与自己在同一个网络中呢? 源主机的ip地址与自己的子网掩码相与就可以得到源主机所在网络的网络地址,目的主机的ip地址与源主机的子网掩码相与就可以得到目的主机所在网络的网络地址,判断两个是否相同,相同就在同一个网络
对于不在同一个网络中的主机,主机C如何知道应该交给哪个路由器进行转发呢:实际上,用户为了让本网络中的主机与其他网络中的主机进行通信,需要为本网络指定路由器由该路由器进行转发,称作默认网关,我们可以将路由器的其中一个接口的Ip地址指定到该网络中所有主机的默认网关,这样当本网络中的主机与其他网络中的主机进行通信的时候本网络中的主机会将ip数据报栓送给默认网关,由默认网关帮主机将ip数据报转发出去,
假设本例中的主机a要将数据转发给主机d,首先主机a将数据报发送给本网络中的默认网关,也就是图中的路由器,那么路由器收到数据报后如何转发呢?
!> 注意:主机a给本网络中的所有主机发送广播,路由器收到后并不会进行转发。也就是说路由器是隔离广播域的,避免所有的路由器都进行广播造成广播风暴严重浪费因特网资源。当主机a给另一个网络发送广播时,路由器收到判断是广播之后并不会转发
!> 有点类似于分治 分层可以将庞大而复杂的问题转化为若干较小的局部问题,而这些较小的局部问题就便于研究和处理
在发送主机端,一个应用层报文被传送到运输层。在最简单的情况下,运输层收取到报文并附上附加信息,该首部将被接收端的运输层使用。应用层报文和运输层首部信息一道构成了运输层报文段。附加的信息可能包括:允许接收端运输层向上向适当的应用程序交付报文的信息以及差错检测位信息。该信息让接收端能够判断报文中的比特是否在途中已被改变。运输层则向网络层传递该报文段,网络层增加了如源和目的端系统地址等网络层首部信息,生成了网络层数据报。该数据报接下来被传递给链路层,在数据链路层数据包添加发送端 MAC 地址和接收端 MAC 地址后被封装成数据帧,在物理层数据帧被封装成比特流,之后通过传输介质传送到对端。
类似问题:数据如何在各层之间传输【数据的封装过程】
对 server 端,通过增加内存、修改最大文件描述符个数等参数,单机最大并发 TCP 连接数超过 10 万 是没问题的
UDP(User Datagram Protocol) | TCP(Transmission Control Protocol) |
---|---|
无连接 | 面向连接 |
支持一对一,一对多,多对一,多对多通信 | 因为双方需要提前建立连接,因此只能一对一进行通信(全双工:双方随时都可以发送和接收数据) |
面向报文段(对应用层发送的报文段直接添加首部并传送到IP) | 面向字节流 |
不保证可靠交付:尽最大努力交付,不使用流量控制和拥塞控制 | 可靠传输,使用确认序号,滑动窗口,流量控制以及拥塞控制等来实现可靠传输 |
首部只有8字节 | 首部最小有20自己,最大有60字节 |
!> TCP 是通过序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输的。
为什么是三次握手,不是两次和四次?
两次握手无法放置历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方序列号 四次握手:三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数
为什么挥手需要四次:
!> 看小林图解网络
慢启动:每次翻倍增加,涨到慢启动门限为止。 拥塞避免:当超过慢启动门限之后就开始拥塞避免算法,每次都是线性增长 拥塞发生:(如何判断拥塞何时发生:出现超时重传(重传计时器超时)以及快速重传(收到3个重复的ACK)), 快速恢复:
快速重传:快速重传的工作方式是当收到三个相同的 ACK 报文时,会在定时器过期之前,重传丢失的报文段。
流程看图:
几种重传的方式: 超时重传 快速重传:快速重传的工作方式是当收到三个相同的 ACK 报文时,会在定时器过期之前,重传丢失的报文 段。 SACK:为了解决不知道快速重传该重传哪些 TCP 报文,于是就有 SACK 方法。SACK ( Selective Acknowledgment 选择性确认)。需要在 TCP 头部「选项」字段里加一个 SACK 的东西,接收方将缓存的地图发送给发送方,这样发送方就可以知道哪些数据收到了,哪些数据没收到,知道了这些信息,就可以只重传丢失的 数据。 DSACK:使用了 SACK 来告诉「发送方」有哪些数据被重复接收了。作用如下:
类似问题:TCP 协议了解吗,你给我讲一下三次握手的过程吧 参考视频 2个点:
TCP一个重要特性便是可靠性,必须对方告诉说收到消息才算收到消息,不然就会一直重发,互相发的时候如何确定消息发过去呢?给消息进行一个编号叫序列号,序列号不能从0开始,相对随机,需要通过握手同步序列号确定双方都收到消息。
正常是4次,但这里是3次为什么呢?因为建立连接的时候不允许连接处于半打开状态就发送消息,这是TCP所不允许的,其次使用3次连接可以节省一次连接建立的过程。
关连接为什么需要4次?因为关闭一方的连接需要2次握手,并且关闭一方之后另一方仍然可以长时间发送消息,例如server说要关闭之后,client依然可以发送消息。
双工:双方都可以发送接收,比如tcp中的client以及server
单工:只有一方可以发送,比如浏览器服务器
!> 参考视频:自己之前在bilibili看到的极客时间一个老师讲解的视频
time_wait是主动断开连接的一方
类似问题:time_wait
四元组是:
源IP地址、目的IP地址、源端口、目的端口
五元组是: 源IP地址、目的IP地址、协议号、源端口、目的端口
七元组是:
源IP地址、目的IP地址、协议号、源端口、目的端口,服务类型以及接口索引
协议号:IP是网络层协议,IP头中的协议号用来说明IP报文中承载的是哪种协议,协议号标识上层是什么协议(一般是传输层协议,比如6 TCP,17 UDP;但也可能是网络层协议,比如1 ICMP;也可能是应用层协议,比如89 OSPF)。 TCP/UDP是传输层协议,TCP/UDP的端口号用来说明是哪种上层应用,比如TCP 80代表WWW,TCP 23代表Telnet,UDP 69代表TFTP。 目的主机收到IP包后,根据IP协议号确定送给哪个模块(TCP/UDP/ICMP...)处理,送给TCP/UDP模块的报文根据端口号确定送给哪个应用程序处理。
前面总结过
tcp需要进行三次握手,建立会话需要时间,tcp在网络拥塞的情况下会进行tcp全局同步,根据网络带宽调整tcp滑动窗口大小,引起tcp传输速度下降,甚至有可能会导致tcp报文没有带宽可用,导致tcp饿死,而视频传输对带宽的需求比较大,对时延要求比较高,对丢包率要求不是那么高,udp是面向无连接的传输协议,不需要进行三次握手,也没有tcp的滑动窗口,报文也比tcp小,正好满足了对视频传输的要求。(纯手打)
答案参考:参考
引申出quic,可以参考:参考腾讯技术工程知乎文章
类似问题:
!> 类似问题: HTTP 协议的头部有哪些属性?
通用信息头 Request URL 请求的地址 域名 Request Method 请求的方法类型 GET / POST Status Code 响应状态码 200 OK / 404 NOT-FOUND Remote Address 表示远程服务器地址 IP地址 响应头 Content-Length 响应体的长度 Content-type 返回的响应MIME类型与编码:告诉浏览器它发送的数据属于什么文件类型 Cache-control 指定请求和响应遵循的缓存机制 public 响应可被任何缓存区缓存 private 对于单个用户的整个或部分响应消息,不能被共享缓存处理 no-cache 表示请求或响应消息不能缓存 请求头 Accept 告诉服务器可以接受的文件格式。 Accept-Encoding gzip等指定浏览器可以支持的web服务器返回的内容压缩编码类型。 Accept-Language 浏览器支持的语言。 Cache-Control 指定请求和响应遵循的缓存机制。 Connection keep-alive 表示是否需要持久连接。 Cookie HTTP请求发送时,会把保存在该请求域名下的所有 cookie 值一起发送给web服务器。 Host 指定请求的服务器的域名和端口号。 Referer 告诉服务器是从哪个网站链接过来的。 User-Agent 简称UA。内容包含发出请求的用户信息。 Authorization 当客户端访问受口令保护时,服务器端会发送401状态码和 www-authenticate 响应头,要求客户机使用 Authorization 来应答。 详细属性见文后附表。 一开始答的时候我竟然报了半天状态码还浑然不知,然后看见面试官一脸诧异的看着我才反应过来Orz。重新听了问题后还是没有答出来Orz。
Header 解释 示例 Accept-Ranges 表明服务器是否支持指定范围请求及哪种类型的分段请求 Accept-Ranges: bytes Age 从原始服务器到代理缓存形成的估算时间(以秒计,非负) Age: 12 Allow 对某网络资源的有效的请求行为,不允许则返回405 Allow: GET, HEAD Cache-Control 告诉所有的缓存机制是否可以缓存及哪种类型 Cache-Control: no-cache Content-Encoding web服务器支持的返回内容压缩编码类型。 Content-Encoding: gzip Content-Language 响应体的语言 Content-Language: en,zh Content-Length 响应体的长度 Content-Length: 348 Content-Location 请求资源可替代的备用的另一地址 Content-Location: /index.htm Content-MD5 返回资源的MD5校验值 Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ== Content-Range 在整个返回体中本部分的字节位置 Content-Range: bytes 21010-47021/47022 Content-Type 返回内容的MIME类型 Content-Type: text/html; charset=utf-8 Date 原始服务器消息发出的时间 Date: Tue, 01 Nov 2020 08:12:31 GMT ETag 请求变量的实体标签的当前值 ETag: “737060cd8c284d8af7ad3082f209582d” Expires 响应过期的日期和时间 Expires: Thu, 01 Dec 2010 16:00:00 GMT Last-Modified 请求资源的最后修改时间 Last-Modified: Tue, 01 Nov 2020 12:00:00 GMT Location 用来重定向接收方到非请求URL的位置来完成请求或标识新的资源 Location: http://www.xxx.com/xxx.html Pragma 包括实现特定的指令,它可应用到响应链上的任何接收方 Pragma: no-cache Proxy-Authenticate 它指出认证方案和可应用到代理的该URL上的参数 Proxy-Authenticate: Basic refresh 应用于重定向或一个新的资源被创造,在5秒之后重定向(由网景提出,被大部分浏览器支持) Refresh: 5; url=http://www.xxx.com/xxx.html Retry-After 如果实体暂时不可取,通知客户端在指定时间之后再次尝试 Retry-After: 120 Server web服务器软件名称 Server: Apache/1.3.27 (Unix) (Red-Hat/Linux) Set-Cookie 设置Http Cookie Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1 Trailer 指出头域在分块传输编码的尾部存在 Trailer: Max-Forwards Transfer-Encoding 文件传输编码 Transfer-Encoding:chunked Vary 告诉下游代理是使用缓存响应还是从原始服务器请求 Vary: * Via 告知代理客户端响应是通过哪里发送的 Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1) Warning 警告实体可能存在的问题 Warning: 199 Miscellaneous warning WWW-Authenticate 表明客户端请求实体应该使用的授权方案 WWW-Authenticate: Basic
参考cyc2018
通过http header中的connection字段,如果字段的值是一个closed表明是一个短链接,所有的服务器都会决定,短连接将会在发完response就会关闭连接了。
如果是长连接将会是connection: keep-alive
http1.1 长连接的好处:
队头阻塞:http是基于tcp的,tcp是字符流协议(就是传文件,必须要从头传到尾,但是不能乱),如果一个长连接上传输一个文件是没有问题的,但是一个长连接上传输多个请求,这些请求就会出现串行请求,也就是第一个请求没有传输完成无法开始传输第二个,串行的情况下tcp有一个问题叫队头阻塞(如果这道题回答道对头阻塞应该就不会延展了),只要有一个报文丢包了,后面的即使你传输过去了对方的应用层也不可以接收。
参考 参考小林图解网络
存在的问题:
长连接:HTTP1.1增加Connection字段,通过设置Keep-Alive保持HTTP连接不断卡。避免每次客户端与服务器请求都要重复建立释放建立TCP连接。提高了网络的利用率。如果客户端想关闭HTTP连接,可以在请求头中携带Connection:false来告知服务器关闭请求。
管道传输:通过一个队列将所有请求加入进去,如果某个请求没有收到响应则会阻塞。造成队头阻塞。
性能瓶颈:
改进:
http1.1的主要问题在于,管道中的某一个请求被阻塞了,后面的都会被阻塞,造成队头阻塞。 http2主要问题在于多个请求复用,一旦某个请求发生丢包,所有的http请求都必须等待这个丢了的包重传回来。
因此http3.0将下面的传输层从tcp改成了udp,因为udp是不可靠的,但是基于udp的quic协议可以实现类似tcp的可靠传输 改进:
类似问题: 输入url发生了什么 或者 用户在浏览器输入网址后到呈现页面的详细步骤
具体参考小林图解网络
!> 关于为什么不一直用非对称加密?
对称密钥加密:加密和解密使用同一密钥 非对称密钥加密:有一个私有密钥和公有密钥,有两个作用:加密和签名 1. 加密:发送方使用公有密钥将消息进行加密,之后发送给接收方,接收方使用私有密钥进行解密 2. 签名:因为私有密钥无法被其他人获取,通信发送方使用私有密钥进行签名,之后发送给接收方,接收方使用公有密钥解密验证签名是否正确。
对称密钥加密:运算效率高,但是不安全 非对称密钥:可以安全的传输对称密钥,但是运算效率低 Https采用混合的加密机制,使用非对称密钥加密用于传输对称密钥来保证传输过程的安全性,之后用对称密钥加密进行通信保证通信过程的效率
面经上的答案: 首先客户端通过URL访问服务器并建立SSL连接 服务器收到客户端请求后,会将网站支持的证书信息(证书中包含公钥)传送一份给客户端 客户端的服务端开始协商SSL连接的安全等级,也就是信息加密的等级 客户端的浏览器根据双方同意的安全等级,建立会话秘钥,然后利用网站的公钥将会话秘钥加密并传送给网站 服务器利用自己的私钥解密出会话秘钥 服务器利用会话秘钥加密与客户端之间的通信
HTTP 是超文本传输协议,基于 TCP 协议。
当时问到这个回答的很简略,一直准备了 HTTPS 的回答,没想到忽略了基础的 HTTP 协议。
同时参考自己看Bilibili陶辉老师讲解的视频之后自己总结的笔记
https://juejin.cn/post/6844903763665240072#heading-0 https://www.cnblogs.com/tugenhua0707/p/10807289.html https://www.bilibili.com/video/BV11a4y1H7WF?from=search&seid=84378165225275780
协议://用户名:密码@子域名.域名.顶级域名:端口号/目录/文件名.文件后缀?参数=值#标志
1. get方法是从服务器获取资源,而post则是向URI指定的资源提交数据,数据就存放在报文的body里面
2. get方法是安全和幂等的,而post方法不是安全和幂等的。(安全是指请求方法不会破坏服务器上的资源,幂等是指多次执行相同的操作结果都是相同的。因为post方法每次新增或提交数据的操作都会修改服务器上的资源,所以是不安全的,且多次提交之后就会新建多个资源,所以不是幂等的)
参考cyc2018基础知识面试中的cookie
我说使用一个代理保存所有session,然后任意session连接服务器, 面试官问还有没有办法,我说能不能把数据库主从复制一样同步一下session 他说这样破坏了服务器无状态啥的设计原则
我回答的是cookie和session,他说不是这意思,就是从客户端发回来的字节中怎么区分?
后面的问题:域名解析~呜呜
同自己上面整理的。
ip地址,子网掩码,网关地址 进阶问题:说说子网掩码以及网关的作用
1. 参考:https://blog.csdn.net/baidu_37964071/article/details/80514340
2. 自己总结的笔记
面经上的回答: DNS 是域名系统,通常用来解析域名为 IP 地址。 本地解析 通过本地缓存进行解析。 直接解析 向客户机所设定的局部 DNS 服务器发一个查询请求。 递归解析 局部 DNS 服务器向该域名的根域服务器查询,再由根域名服务器一级级向下查询。 迭代解析 局部 DNS 服务器把请求转发至上一级 DNS 服务器,再请求上上级直到查询到该域名。 当时只回答了递归解析和迭代解析,其实还有 Host 文件、本地和直接解析
类似问题:
视频面用的是 TCP 还是 UDP,为什么?
UDP 有什么缺点?怎么解决?
Http 请求头有什么内容?
拥塞控制及对应方法的使用场景
7、session 和 cookie 的区别
TCP 流量控制和拥塞控制?
据失序的辨识)
如何改进 UDP 的不可靠传输,保证数据有序性?
TCP 握手和挥手,UDP 和 TCP,如果要用 udp 发送一个比较大的文件该如何操作,如 何确定文件是否发送完成,是否有丢失,如何对接收到的数据包进行组装,编号如何存 放,用什么数据结构。
RESTful 简介与优点(优点记不得了呀,就随便说了一下……)
TCP 和 UDP 的优缺点,TCP 滑动窗口
4.tcp 的四次握手,timewait2 的状态是什么情况,为什么会出现大量的 timewait2?
如何处理 get 和 post
tcp 接收窗口和拥塞窗口
什么时候会向对端传窗口大小
假设 rtt(数据从两端一来一回) 100ms,那么从输入一个 http://url 到得到网页要多少时间
https 呢?
连续发送两次 http 请求,会得到两次结果吗?可能第二次比第一次快吗?
是否了解 TCP 包头阻塞?
服务器状态 502 503 504 什么问题,怎么排查
netstat 具体查看什么问题
ack 什么时候发送,丢失了会怎么样?
sack 了解吗?
重传 ack 的时机只有 ack 超时吗?
重复报文被接收会发生什么?
拥塞窗口要不要把自己的大小发给接收方,意义何在?(这个问题一面也问了,没有答出 来)
延迟 ACK 的意义在哪?
为什么不能每次都直接发大的窗口?
http 了解多少?
http 缓存机制了解吗?
长连接讲一下
如何实现长连接(保活)
带外数据如何使用?
http 传入的 Request 和返回的 Response
503 和 500 区别。301 和 302 区别
http close-wait 状态
滑动窗口和 TCP 流量控制
如果滑动窗口为 0,则怎么办
TCP 连接为啥不能 2 次握手,找个 bug cases
tcp 标头有什么东西
子网掩码有什么用
mac 寻址等
tcp 的连接,怎么用 udp 模拟 tcp
4.了解过拥塞控制吗,我说不太记得了,只知道有个到阈值降一半然后线性增长
Http/断点续传
什么场景下使用 UDP?为什么?
linux下如何查看一个服务的连接数目
了解quic 了解DNS 了解ping
了解ICMP