计算机网络面试问题
常见状态码
1开头表示请求已接受,继续处理。
2开头表示成功。
3开头表示浏览器需要进行特殊的处理来正常处理请求。
4开头表示客户端错误。
5开头表示服务器端错误。
200
请求成功,204
表示请求成功但是没有数据,301
永久重定向,302
临时重定向,303
应该用get获取,304
表示未修改,即命中协商缓存。400
客户端可能有语法错误,401
未授权,403
请求的资源被服务器拒绝(也可能是权限问题),404
页面不存在,405
服务器禁止使用该方法,500
服务器请求错误,503
服务器超负载或正在停机维护。
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/2/3的区别
HTTP1.x
HTTP1.x相对于HTTP1,1默认使用的时短连接,每次请求都要重新建立一次连接,1.1默认使用长连接,默认开启connection:keep-alive,就不用每次请求都要连接了。
HTTP1.x延迟较高;无状态特性带来巨大的HTTP头部;明文传输带来的不安全性(纯文本形式报文传输);不支持服务器推送消息。

二进制传输:数据打散成二进制的帧,分帧后header+body的报文结构就消失了,协议看到的只是一个一个的碎片。多个帧可以乱序发送,根据帧首部的流标识重新组装成流。请求中可以带优先值,0表示最高,这样客户端和服务器就可以有策略性的处理不同的流。
header压缩:使用了HPACK算法压缩头部。在服务器端和客户端建立字典,用索引号表示重复的字符串,用哈夫曼编码压缩整数和字符串,达到很高的压缩率,再次发送请求时只需要发送差异数据,而每个新的首部键值对要么追加到表的末尾,要么替换表中之前的值。
多路复用:同个域名只需要占用1个tcp连接,并行发送多个请求和响应,这样整个页面资源下载过程只需要一个慢启动,同时避免了多个TCP连接竞争宽带带来的问题。

支持服务器推送。可以在客户端发请求时,服务器端就将JS.CSS这些资源文件发送给客户端,而不需要客户端解析HTML时再发送这些请求,减少等待的延迟。
安全性:HTTP2延续了1的明文特点,不强制使用加密通信,但是主流的浏览器都宣布只支持加密的HTTP2,所以基本上网站使用的HTTP2都是使用HTTPS协议名。
缺点:仍会有队头阻塞问题。多路复用导致服务器压力上升;因1个连接1个TCP,丢包时表现反倒不如HTTP1;使用TLS协议也需要握手过程,建立连接会延时。
HTTP3
谷歌在推SPDY时就注意到存在的一些问题,于是另外搞了一个基于UDP协议的QUIC协议
,让HTTP跑在QUIC上而不是TCP上。
QUIC因为是基于UDP,不需要握手和挥手,但是也实现了类似TCP的流量控制、传输可靠性的功能。引入了流和多路复用,单个留堵塞不会影响其他流,同一物理连接上有多个独立的逻辑数据流,彻底解决了TCP队头阻塞的问题。

GET和POST的区别?
POST是客户端向服务器传递数据,Get是客户端向服务器获取数据。
get将数据放在url后面,post将数据放在报文体
url长度会受到特定的浏览器及服务器的限制,如IE对URL长度的限制是2083字节(2K+35)。而报文体长度没有限制
get将数据放在url后面,信息并不安全,post方法将数据放在报文体中,更安全。
CDN内容分发网络
跟DNS负载均衡
有关。DNS根据每台机器的负载量,该机器离用户的距离来返回一个合适的机器IP给用户,这个过程就是DNS负载均衡,也就DNS重定向。CDN正是利用了DNS的重定向技术。DNS返回一个跟用户最近的IP地址给用户,CDN节点的服务器负责响应用户的请求,可以减少加载时间。CDN会根据用户的网络情况,挑选最近的一个具有缓存内容的节点来提供资源,可以减少加载时间。
进程和线程
进程是系统资源分配的最小单位
。线程是CPU调度的最小单位
。
线程是属于进程的,共享进程的内存地址空间。
进程之间相互隔离,互相通过IPC进行通信。系统由一个个进程(程序)组成 一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。进程通过抢占式的夺取CPU运行自身,CPU单核情况下就相当于同一时间只能执行一个进程的代码,多进程实现规则是通过CPU飞快切换不同的进程,看上去就像多个进程在同时运行。