计算机网络面试问题
常见状态码
1开头表示请求已接受,继续处理。
2开头表示成功。
3开头表示浏览器需要进行特殊的处理来正常处理请求。
4开头表示客户端错误。
5开头表示服务器端错误。
200请求成功,201请求成功并创建了新的资源,204表示请求成功但是没有数据,301永久重定向,302临时重定向,303应该用get获取,304表示未修改,即命中协商缓存。400客户端可能有语法错误,401未授权,403请求的资源被服务器拒绝(也可能是权限问题),404页面不存在,405服务器禁止使用该方法,500服务器请求错误,502错误网关,503服务器超负载或正在停机维护,504网关超时。
HTTP缓存
浏览器对请求过的文件缓存,降低服务器压力。
网络方面的缓存分为三块:DNS缓存、HTTP缓存、CDN缓存,也有人把这里的 HTTP 缓存称为浏览器缓存。
HTTP缓存分为强缓存和协商缓存。
强缓存是客服端不会向服务器发请求,先检查浏览器本地是否有可以用的缓存,如果有则使用,返回200;没有则向服务器发请求,看是否命中协商缓存,命中则更新缓存时间,返回304,没有命中则向服务器请求信息。
强缓存响应头中相关字段为Expires/Cache-Control 前者http1.0是使用的绝对时间,客户端服务器时间不一致可能引起错乱,后者http1.1是使用的相对时间,有个max-age表示在这个请求正确返回时间的多少秒内缓存有效。后者会覆盖前者。
协商缓存相关头字段是Last-Modified/If-Modified-Since() Etag/If-None-Match(http1. 1)
Last-Modified是浏览器向服务器发送资源最后的修改时间。If-Modified-Since表示请求时间。服务器收到请求将请求时间和最后修改时间做对比,如果修改时间较新说明被改过,返回最新的资源。
1.1允许使用etag,Etag的值是由服务器返回给前端,是对文件的索引节点、大小和最后修改时间进行Hash后得到的,只要文件修改了,Etag就会变更。当资源过期,浏览器发现响应头有Etag,再次向服务器请求就会带上If-None-Match,值是Etag的值,服务器收到后进行比对,决定是都命中协商缓存。
connection:keep-alive
用于建立长连接,用于页面需要多次发送请求的情况。告诉客户端本次HTTP请求结束后不需要关闭TCP连接,可以使下次HTTP请求使用相同的TCP通道,节省TCP连接时间。避免多次请求频繁建立和断开连接,造成资源浪费。
http1.0默认connection:close,http1.1默认connection:keep-alive,
浏览器通过content-Length知道当前请求是否已经完成,表示实体内容的长度,如果是动态资源则要用到transfer-encoding表示传输编码。transfer-encoding:chunked告知浏览器当前编码是数据分成块传输的。当浏览器接到chunked为0时,说明没有请求内容了。
DNS域名系统
DNS协议基于UDP。
DNS可以说是一个应用层协议,也可以说是一个分布式数据库,DNS作用是将域名解析成IP地址。整个DNS系统由世界各地的多台DNS服务器构成,每台只负责因特网上一部分主机的映射。
而且DNS服务器是有层次的,根DNS服务器、顶级域DNS服务器(com)、权威DNS服务器(返回主机到IP的最终映射)。
DNS解析一般是递归+迭代的过程。本机发出DNS请求后,请求被发往本地DNS服务器,本地DNS服务器起着代理的作用,本地DNS缓存先通过递归查询DNS缓存,如果没查到,就将该请求转发到DNS服务器层次结构中迭代查询。
在查询过程中,当一台DNS服务器收到一个主机到IP地址的映射,就能将映射缓存到本地,下次查询直接用缓存的内容。缓存是有生存时间的。实际上有了缓存,大多数DNS查询都绕过了根DNS服务器,需要向DNS服务器发请求的情况很少。(也叫DNS高速缓存,查找浏览器缓存-)系统hosts缓存->路由器缓存->ISP缓存)
TCP协议
TCP:面向连接的、可靠的、基于字节流的网络层协议。
TCP三次握手:TCP建立连接需要服务器和客户端进行三次握手,保证双方都能够接收和发送数据。
第一次:客户端发送SYN包,初始化一个随机的序列号,状态变为syn_sent;
第二次:服务器端接收到SYN包,回应一个ACK+SYN包,同样初始化一个随机的序列号作为SYN的值,客户端的序列号加一作为ACK的值,状态变为syn_rcvd;
第三次:客户端收到ACK+SYN包,回应ACK包,然后进入established状态,服务器端收到后,状态变为established。
TCP四次挥手:(假如客户端发起)
第一次:客户端发送FIN包,状态变为fin_wait_1;
第二次:服务器端收到后回应ACK包,状态变为close-wait,客户端收到ACK包,状态变为fin_wait_2,等待服务器端发起结束请求;
第三次:服务器端处理完资源,发送FIN包,状态变为last_ask;
第四次:客户端收到后状态变为time-wait,发送ACK包,服务器端收到后状态变成close,经过2MSL的时间后,(MSL是报文最长寿命,状态变为close
TCP如何实现可靠传输?序列号(用来解决包乱序的问题)、确认应答号(解决丢包问题,发送端收到确认应答号可以认为序号以前的数据都被正常接收)、重传机制(超时重传、快速重传、sack方法、d-sack方法)、滑动窗口:解决数据包往返时间长通信效率低的缺点,窗口大小就是指无需等待确认应答,而可以继续发送数据的最大值,实现实际上就是操作系统开辟的一个缓存空间,发送方在等待确认应答返回之前必须在缓存区中保留已发送的数据,收到应答就可以把数据从缓存区中清除、流量控制:一种机制让发送方根据接收方实际接收能力来控制发送的数据量、拥塞控制:(慢启动、拥塞避免算法、拥塞发生、快速恢复)根据网络拥塞程度定义拥塞窗口,发送窗口发送的数据量必须小于拥塞窗口可以接收的数据量。
为什么需要TCP?
IP协议是不可靠的,不保证网络包的交付、按序交付以及完整交付
为什么TCP握手是三次?
保证双方都具有接收和发送数据的能力,也就是保证双方同步初始化序列号,数据包能够按序传输;
避免历史连接,接收方收到SYN包后会建立连接,如果是三次握手,可以根据接收方ACK包的序列号判断是否是历史连接,如果是历史连接,发送方会发送RST来中止连接,避免资源的浪费;
减少双方不必要的资源开销。
Time_wait作用:
防止历史连接中的数据被下一个相同的四元组接收,tcp的序号和初始化序列号是可以绕回初始值的,如果一方发送的数据包被延迟,然后之后相同端口号的tcp连接被重用,序列号的值正好处于接收窗口,那么这个历史数据就会被错误的接收,而timewait的2MSL时间足以让两个方向的数据包都被丢弃,使原来的连接再网络中自然消失;保证被动关闭的一方能正常关闭:如果主动关闭方发出的ACK包丢失,被动关闭方迟迟收不到回应,就会重传FIN包,如果没有timewait而是直接关闭,主动关闭方在收到FIN包会回传RST报文,这样的中止方式不太优雅。
什么是拥塞窗口?
一个TCP连接总是以1KB的最大段长发送TCP段,发送方有足够多的数据要发送。当拥塞窗口为16KB时发生了超时,如果接下来的4个RTT(往返时间)时间内的TCP段的传输都是成功的,那么当第4个RTT时间内发送的所有TCP段都得到肯定应答时,拥塞窗口大小是(9KB)。
在发生超时后,慢开始门限ssthresh变为16KB/2=8KB,拥塞窗口变为1KB。在接下来的3个RTT内,执行慢开始算法,拥塞窗口大小依次为2KB、4KB、8KB,由于慢开始门限ssthresh为8KB,因此之后转而执行拥塞避免算法,即拥塞窗口开始“加法增大”。因此第4个RTT结束后,拥塞窗口的大小为9KB。
网络模型-TCP/IP模型和OSI模型的区别
OSI模型, 是国际标准化组织(ISO)制定的一个用于计算机或通信系统的标准体系,将计算机网络通信划分为七个不同的层级,每个层级都负责特定的功能。
OSI七层网络结构:从上到下依次是应用层、表示层、会话层、传输层、网络层、数据链路层、物理层;
OSI模型在理论上更全面,但在实际网络通信中,TCP/IP模型更为实用。 TCP/IP模型分为四个层级,每个层级负责特定的网络功能。
TCP/IP模型:应用层、传输层、网络层、网络接口层
应用层:该层与OSI模型的应用层和表示层以及会话层类似,提供直接与用户应用程序交互的接口。它为网络上的各种应用程序提供服务,如电子邮件(SMTP)、网页浏览(HTTP)、文件传输(FTP)等。
传输层:该层对应OSI模型的传输层。它负责端到端的数据传输,提供可靠的、无连接的数据传输服务。主要的传输层协议有TCP和UDP。TCP提供可靠的数据传输,确保数据的正确性和完整性;而UDP则是无连接的,适用于不要求可靠性的传输,如实时音频和视频流。
网络层:该层对应OSI模型的网络层。主要协议是IP,它负责数据包的路由和转发,选择最佳路径将数据从源主机传输到目标主机。IP协议使用IP地址来标识主机和网络,并进行逻辑地址寻址。
网络接口层:该层对应OSI模型的数据链路层和物理层。它负责物理传输媒介的传输,例如以太网、Wi-Fi等,并提供错误检测和纠正的功能。此外,网络接口层还包含硬件地址(MAC地址)的管理。
各层代表协议:
应用层:FTP 文件传输协议<端口号21>:减少或消除不同操作系统下处理文件的不兼容性。HTTP SMTP
RPC (Remote Procedure Call Protocol )(RFC- 1831)远程过程调用协议
TLS (Transport Layer Security Protocol )安全传输层协议
传输层:TCP、UDP
网络层:IP、ARP
SMTP (Simple Mail Transfer Protocol )简单邮件传输协议 <端口号25> 用于发送邮件
ICMP (Internet Control Message Protocol )Internet 控制报文协议。它是TCP/IP 协议族的一个子协议,用于在IP 主机、路由器之间传递控制消息。
ARP (Address Resolution Protocol) 即地址解析协议,实现通过IP 地址得 知其mac物理地址。
RARP (Reverse Address Resolution Protocol)反向地址转换协议允许局域 网的物理机器从网关服务器的 ARP 表或者缓存上请求其 IP地址。
TCP和UDP的区别
TCP特点:面向连接、字节流传输、可靠的全双工的协议。
UDP特点:面向无连接、数据报文传输、不可靠的协议。
二者区别:
TCP的可以保证信息无丢失、无错乱的到达目的地址,UDP不行;
UDP的头部开销小于TCP,且更适合实时通信,TCP适合要求和靠传输的应用比如文件传输;
TCP只支持一对一通信,UDP可以支持一对多、多对一、多对多交互通信。
其他区别见下表:
HTTPS的原理
是以安全为目标的HTTP通道,即HTTP下加入SSL层进行加密。
HTTPS在传输数据前需要客户端和服务器进行一个握手(证书认证阶段),握手过程中将确立双方加密传输的密码信息。TLS/SSL使用了非对称加密,对称加密以及hash。
握手步骤:
第一步,客户端给出支持的协议版本号和加密算法,生成一个客户端随机数,发送给服务器端;
第二步,服务器端确认双方使用的加密方法,给出数字证书(包含服务器公钥、证书有效期、证书相关信息等),以及一个服务器随机数;
第三步,客户端确认数字证书有效,生成一个新的随机数(也叫预主密钥),并用数字证书中的公钥加密这个预主密钥,发送给服务器端;
第四步,服务器端使用自己的私钥获取预主密钥;
第五步,双方根据约定的加密方法,使用前面三个随机数,计算出相同的会话密钥。会话密钥包含用于对称加密的密钥和用于数据完整性校验的消息认证码密钥,客户端和服务器使用会话密钥对要传输的数据进行加密和解密,消息认证码则用于验证数据是否被篡改。
整个过程需要生成三次随机数,握手之后的对话使用对话密钥加密(对称加密),服务器的公钥和私钥只用于加密和解密对话密钥(非对称加密)
DH算法,第三步和第四步由传递Premaster secret变成了传递DH算法所需的参数,然后双方各自算出Premaster secret。断连后通过session ID 和session ticktet重新使用已经有的对话密钥。
HTTPS协议加解密的过程
HTTPS为了兼顾安全与效率,同时使用了对称加密和非对称加密。
对数据进行对称加密,对对称加密需要的密钥通过非对称加密传输
HTTPS和HTTP的区别:
信息安全性不同:HTTP是超文本传输协议,信息明文传输,HTTPS在HTTP下加入SSL层,比HTTP安全,是一种加密传输协议;
默认端口不同:HTTP默认端口80,HTTPS默认端口443;
连接方式不同:HTTP连接简单,是无状态的(指每次请求都是独立的,前面的请求结果不会影响到后面的),HTTPS握手阶段比较耗时,会延长加载时间和增加耗电。
证书申请方式不同:http协议是免费申请,而https需要到ca申请证书,一般免费证书很少,需要付费。
http协议报文格式
请求报文结构:请求行{请求方法(get/post)、url、协议版本号}+头部+包体
响应报文结构:状态行{协议版本号+状态码+状态码说明}+头部+包体
HTTP1.0和HTTP1.1的区别
持久连接:HTTP/1.1 默认支持持久连接,允许在一个TCP连接上发送多个HTTP请求和响应,减少了连接建立和关闭的开销。而HTTP/1.0 默认为短连接,每次请求都需要建立一个TCP连接,并通过Connection: keep-alive头来实现持久连接。
管道化:HTTP/1.1 支持管道化(不是默认开启),允许客户端在第一个请求的响应到达之前发送多个请求,这可以减少等待时间,提高效率。HTTP/1.0不支持管道化。
缓存控制:HTTP1.0主要使用Expires / Last-modified来做为缓存判断的标准,而HTTP1.1则引入了更多的缓存控制策略例如cache-control / Etag等更多可供选择的缓存头来控制缓存策略。
另外的做了解:
错误处理:HTTP/1.1 增加了一些新的HTTP状态码,如100 Continue,用于增强错误处理和请求的中间响应。
Host 头:HTTP/1.1 引入了Host头,允许客户端指定请求的主机名,这使得在同一台服务器上托管多个域名成为可能。HTTP/1.0没有这个头字段。
带宽优化 :HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能, 而HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content)
HTTP1.0和HTTP1.1的区别
二进制协议:HTTP/2.0 采用二进制格式传输数据,而非HTTP/1.1 的文本格式,使得解析更高效,减少了解析时间。
多路复用:HTTP/2.0 支持多路复用,允许在单个TCP连接上并行交错发送多个请求和响应,解决了HTTP/1.1 中的队头阻塞问题。
头部压缩:HTTP/2.0 引入了HPACK 压缩算法,对请求和响应的头部信息进行压缩,减少了冗余头部信息的传输,提高了传输效率。
服务器推送:HTTP/2.0 允许服务器主动推送资源给客户端,而不需要客户端明确请求,这可以减少页面加载时间。
优先级和依赖:HTTP/2.0 允许客户端为请求设置优先级,并表达请求之间的依赖关系,资源加载更加有序。
每日任务 3
HTTP3.0有了解过吗?
无队头阻塞: QUIC 使用UDP协议来传输数据。一个连接上的多个stream之间没有依赖, 如果一个stream丢了一个UDP包,不会影响后面的stream,不存在 队头阻塞问题。
零 RTT 连接建立:首次连接肯定是需要1 RTT的,0 RTT的优势是在连接的后续建立的 ,从而减少了连接延迟,加快了页面加载速度。
连接迁移:QUIC 允许在网络切换(如从 Wi-Fi 到移动网络)时,将连接迁移到新的 IP 地址,从而减少连接的中断时间。
向前纠错机制:一个数据包里除了自身还会有其他包的数据,当一个包丢失时可以去拿到其他包的冗余数据,大大减少了丢包带来的负面影响。
安全性:HTTP/3默认使用TLS加密,确保了数据传输的安全性。
HTTP1/2/3的区别
HTTP1.x
HTTP1.x相对于HTTP1,1默认使用的时短连接,每次请求都要重新建立一次连接,1.1默认使用长连接,默认开启connection:keep-alive,就不用每次请求都要连接了。
HTTP1.x延迟较高;无状态特性带来巨大的HTTP头部;明文传输带来的不安全性(纯文本形式报文传输);不支持服务器推送消息。
。而报文体长度没有限制
get将数据放在url后面,信息并不安全,post方法将数据放在报文体中,更安全。
HTTP有哪些请求方式?
GET:请求指定的资源。
POST:向指定资源提交数据进行处理请求(例如表单提交)。
PUT:更新指定资源。
DELETE:删除指定资源。
HEAD:获取报文首部,不返回报文主体。
OPTIONS:查询服务器支持的请求方法。
PATCH:对资源进行部分更新。
HTTP请求报文和响应报文是怎样的,有哪些常见的字段?
HTTP报文分为请求报文和响应报文。
(1) 请求报文 请求报文主要由请求行、请求头、空行、请求体构成。 请求行包括如下字段:
方法(Method):指定要执行的操作,如 GET、POST、PUT、DELETE 等。
资源路径(Resource Path):请求的资源的URI(统一资源标识符)。
HTTP版本(HTTP Version):使用的HTTP协议版本,如 HTTP/1.1 或 HTTP/2.0。
请求头的字段较多,常使用的包含以下几个:
Host:请求的服务器的域名。
Accept:客户端能够处理的媒体类型。
Accept-Encoding:客户端能够解码的内容编码。
Authorization:用于认证的凭证信息,比如token数据。
Content-Length:请求体的长度。
Content-Type:请求体的媒体类型。
Cookie:存储在客户端的cookie数据。
If-None-Match:资源的ETag值,用于缓存控制。
Connection:管理连接的选项,如 keep-alive。
空行是请求头部和请求主体之间的空行,用于分隔请求头部和请求主体。而请求体通常用于 POST 和 PUT 请求,包含发送给服务器的数据。
(2) 响应报文
HTTP响应报文是服务器向客户端返回的数据格式,用于传达服务器对客户端请求的处理结果以及相关的数据。一个标准的HTTP响应报文通常包含状态行、响应头、空行、响应体。
状态行包含HTTP版本、状态码和状态消息。例如:HTTP/1.1 200 OK
响应头部也是以键值对的形式提供的额外信息,类似于请求头部,用于告知客户端有关响应的详细信息。一些常见的响应头部字段包括:
Content-Type:指定响应主体的媒体类型。
Content-Length:指定响应主体的长度(字节数)。
Server:指定服务器的信息。
Expires: 响应的过期时间,之后内容被认为是过时的。
ETag: 响应体的实体标签,用于缓存和条件请求。
Last-Modified: 资源最后被修改的日期和时间。
Location:在重定向时指定新的资源位置。
Set-Cookie:在响应中设置Cookie。
Access-Control-Allow-Origin: 跨源资源共享(CORS)策略,指示哪些域可以访问资源。
空行(Empty Line)在响应头和响应体之间,表示响应头的结束。而响应体是服务端实际传输的数据,可以是文本、HTML页面、图片、视频等,也可能为空。
CDN内容分发网络
跟DNS负载均衡有关。DNS根据每台机器的负载量,该机器离用户的距离来返回一个合适的机器IP给用户,这个过程就是DNS负载均衡,也就DNS重定向。CDN正是利用了DNS的重定向技术。DNS返回一个跟用户最近的IP地址给用户,CDN节点的服务器负责响应用户的请求,可以减少加载时间。CDN会根据用户的网络情况,挑选最近的一个具有缓存内容的节点来提供资源,可以减少加载时间。
进程和线程
进程是系统资源分配的最小单位。线程是CPU调度的最小单位。
线程是属于进程的,共享进程的内存地址空间。
进程之间相互隔离,互相通过IPC进行通信。系统由一个个进程(程序)组成 一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。进程通过抢占式的夺取CPU运行自身,CPU单核情况下就相当于同一时间只能执行一个进程的代码,多进程实现规则是通过CPU飞快切换不同的进程,看上去就像多个进程在同时运行。
