面试八股文-计算机网络

网络模型

七层网络模型

  1. 物理层:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。
  2. 数据链路层
  3. 网络层 IP
  4. 传输层 TCP、UDP
  5. 会话层
  6. 表示层 对底层命令和数据进行解释
  7. 应用层 应用层协议:DNS、HTTP、SMTP等,用户在这一层与网络进行交互

TCP/IP四层

  1. 网络接口层
  2. 网际层 IP
  3. 运输层 TCP、UDP
  4. 应用层 HTTP、SMTP、FTP等

五层协议

  1. 物理层 实现相邻计算机之间比特流的透明传递
  2. 数据链路层 将IP数据报组装成帧,控制信息在相邻两节点的链路上进行传输
  3. 网络层 IP,为不同主机分组交换信息服务
  4. 运输层 TCP、UDP,为两台主机之间的通信提供通用的数据传输服务
  5. 应用层 HTTP、SMTP、FTP等

HTTP

HTTP和HTTPS的区别

  • https需要到ca申请证书,因而需要一定费用
  • http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议,成本较高
  • http的连接很简单,是无状态的,https协议是由ssl+http协议构建的可进行加密串苏,身份验证的网络协议
  • http用的端口是80,https用的端口是443

HTTP请求报文的内容

  • 请求行包括请求方法(GET、POST…),URL,HTTP协议版本
  • 请求头。格式为,头部字段:值。
  • 请求正文

HTTP头部有哪些主要字段

  • Host:接受请求的服务器地址,可以是IP或者是域名

  • User-Agent:发送请求的应用名称

  • Connection:指定与连接相关的属性,例如(Keep_Alive,长连接)

  • Accept-Charset:通知服务器端可以发送的编码格式

  • Accept-Encoding:通知服务器端可以发送的数据压缩格式

  • Accept-Language:通知服务器端可以发送的语言

HTTP响应报文

  • 状态行:协议版本,状态码,状态码描述
  • 响应头
  • 响应正文

HTTP响应头主要字段

  • Server:服务器应用软件的名称和版本
  • Content-Type:响应正文的类型
  • Content-Length:响应正文的长度
  • Content-Charset:响应正文所使用的编码
  • Content-Encoding:响应正文使用的数据压缩格式
  • Content-Language:响应正文使用的语言

HTTP状态码

1xx 服务器收到请求,需要请求者继续执行操作

2xx ok,请求成功

3xx 重定向,资源已经重新分配

4xx 客户端请求错误,403 forbidden请求资源被拒绝,404 not found找不到请求资源

5xx 服务器错误,500 服务器故障,503 服务器超载或停机维护

200,请求成功

「301 Moved Permanently」表示永久重定向,说明请求的资源已经不存在了,需改用新的 URL 再次访问。

「302 Found」表示临时重定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问。

301 和 302 都会在响应头里使用字段 Location,指明后续要跳转的 URL,浏览器会自动重定向新的 URL。

「304 Not Modified」不具有跳转的含义,表示资源未修改,重定向已存在的缓冲文件,也称缓存重定向,也就是告诉客户端可以继续使用缓存资源,用于缓存控制。

「400 Bad Request」表示客户端请求的报文有错误,但只是个笼统的错误。

「403 Forbidden」表示服务器禁止访问资源,并不是客户端的请求出错。

「404 Not Found」表示请求的资源在服务器上不存在或未找到,所以无法提供给客户端。

「500 Internal Server Error」与 400 类型,是个笼统通用的错误码,服务器发生了什么错误,我们并不知道。
「501 Not Implemented」表示客户端请求的功能还不支持,类似“即将开业,敬请期待”的意思。
「502 Bad Gateway」通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生了错误。
「503 Service Unavailable」表示服务器当前很忙,暂时无法响应客户端,类似“网络服务正忙,请稍后重试”的意思。

HTTP劫持

在正常的数据流中插入特定的网络数据报文,让客户端解释错误的数据,并以弹出新窗口的形式向使用者展示小广告或网页内容

步骤:

在TCP连接中标识HTTP协议链接;

改HTTP响应体;

将篡改后的数据包抢先回发到用户,这样后面的数据包在到达后会被直接丢弃。而客户端显示改后的网页

防范:

事前加密:HTTPS,防止明文传输被挟持,(但防不了DNS挟持)

事中加密:拆分HTTP请求数据包,运营商的旁路设备没有完整的TCP/IP协议栈,不能标记,web服务器有完整的TCP/IP协议栈,能把接收到的数据包拼成完整的HTTP请求,不影响服务

事后屏蔽:前端显示HTTP时对内容进行检测,在DOM结构发生变化时触发回调

DNS劫持:通过劫持DNS服务器,获得某域名的解析记录控制权,修改此域名的解析结果。把原来对A域名的访问转入B域名,返回错误的查询结果。可能是一些产品的持续的推广

区别:DNS劫持倾向于持续性,访问一个界面时强行推送广告,HTTP劫持频率多变,劫持过程也非常快,一般多出现于网站小尾巴

HTTPS挟持:伪造证书来进行挟持….

跨域

跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器施加的安全限制。

同源:域名,协议,端口均相同

即浏览器只能执行相同协议、相同域名、相同端口下的网站脚本,执行的时候如果网站的脚本不属于现在这个界面,就不会执行

HTTP请求响应中断原因

网断了,网络阻塞,请求超时,浏览器出问题,服务器出问题

如何检查
检查网络,检查本地…

HTTP有几种请求方式

HTTP1.0 定义了三种请求方法: GET, POST 和HEAD方法。

HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和CONNECT 方法。

GET和POST的区别

GET的参数放在url中,返回服务器拿数据;POST在request body里自带一个参数去服务器拿指定的数据;

因为GET的参数暴露在url上,所以安全性不能保证,也有长度的限制

应用场景
GET用来查询数据,POST用来修改数据,以及其他更需要安全性的场景如密码

cookie和session

什么是Cookie?
Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端会把Cookie保存起来。

当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。

什么是Session?
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。

Session和Cookie的区别?
1、数据存储位置:cookie数据存放在客户的浏览器上,session数据放在服务器上。

2、安全性:cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。

3、服务器性能:session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。

4、数据大小:单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

5、信息重要程度:可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。

DNS的查找过程(应用层)

用于将用户提供的主机名解析为ip地址

  1. 浏览器从接收到的url中抽取出域名地址,将域名传给DNS应用的客户端
  2. 检查浏览器缓存、本地hosts文件是否有这个网址的映射,如果有,就调用这个IP地址映射
  3. 如果没有,则查找本地DNS解析器缓存是否有这个网址的映射,如果有,返回映射
  4. 如果没有,则向DNS服务器提出查询请求
  5. 服务器接收到查询时,查询本地配置区域资源,查到就返回结果
  6. 如果查不到,但服务器缓存了此网址映射关系,返回查找结果
  7. 如果没有缓存,就继续间请求转发至上一级DNS服务器进行查询。最终将解析结果依次返回本地DNS服务器,本地DNS服务器在返回给客户端,并把这个映射存到服务器的缓存中

长链接&短链接

  • 在HTTP/1.0中,默认使用的是短连接。也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。如果客户端浏览器访问的某个HTML或其他类型的
    Web页中包含有其他的Web资源,如JavaScript文件、图像文件、CSS文件等;当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话。
  • 但从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头有加入这行代码:Connection:keep-alive
  • 在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的
    TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接要客户端和服务端都支持长连接。

搜索敏感词汇时,页面被重置的原理

根据TCP协议的规定,用户和服务器建立连接需要三次握手:第一次握手用户向服务器发送SYN数据包发出请求(SYN, x:0),第二次握手服务器向用户发送SYN/ACK数据包发出回应(SYN/ACK, y:x+1),第三次握手用户向服务器发送ACK数据包发出确认(ACK, x+1:y+1),至此一个TCP连接建立成功。其中x为用户向服务器发送的序列号,y为服务器向用户发送的序列号。
关键字检测,针对明文或者base64等弱加密通讯内容,与准备好的敏感词库进行匹配,当发现敏感词时,将服务器发回的SYN/ACK包改成SYN/ACK, Y:0,这代表TCP连接被重置,用户便主动放弃了连接,提示连接失败。让用户误认为服务器拒绝连接,而主动放弃继续与服务器连接,自动阻断记录含有敏感词的网页

IP

IP地址分类

A类:1字节(8位)网络号,3字节(24位)主机号。网络号第一位固定为0,剩下7位随便用。保留地址0(00000000)表示“本文网络”,127(01111111)表示本地环回软件测试

B类:2字节(16位)网络号,2字节(16位)主机号。网络号前两位固定为10,剩下16位随便用。保留地址

C类:3字节(24位)网络号,1字节(8位)主机号。前三位固定为110,剩下21位可用。

D类:

E类:

主机号全是0的IP地址表示是“本主机”所连接到的单个网络。

主机号全是1的IP地址表示是该网络上的所有主机。

A类地址的表示范围是:0.0.0.0-126.255.255.255,默认网络掩码为:255.0.0.0,A类地址分配给规模特别大的网络使用,

B类地址表示范围是:128.0.0.0-191.255.255.255,默认网络掩码为:255.255.0.0,B类地址分配给一般的中型网络

C类地址的表示范围是192.0.0.0-223.255.255.255,默认网络掩码是:255.255.255.0,C类地址分配给小型网络,如局域网

D类地址称为广播地址,共特殊协议向选定的节点发送信息使用。

ipv4和ipv6的转换。ipv4到ipv6的过渡手段

ipv4和ipv6的过渡是一个循序渐进的过程,在用户体验IPv6带来的好处的同时仍能与网络中其余的IPv4用户通信。

主流技术:

  1. 双栈策略:(最直接方式)在IPv6结点中加入IPv4协议栈。这种具有双协议栈的结点称作“IPv6/v4结点”,这些结点可以使用IPv4与IPv4结点互通,也可以直接使用IPv6与IPv6结点互通。
  2. 隧道技术:(为解决局部纯IPv6网络与IPv4骨干隔离形成的孤岛问题,用隧道技术的方式解决)利用穿越现存IPv4互联网的隧道技术将孤岛连接起来,逐步扩大IPv6的实现范围。在隧道的入口处,路由器将IPv6的数组分组封装进入IPv4中,IPV4分组的源地址和目的地址分别是隧道入口和出口的IPV4地址。在隧道的出口处再将IPV6分组取出转发给目的节点。
    隧道技术在实践中有四种具体形式:构造隧道、自动配置隧道、组播隧道以及6to4。
  3. 隧道代理TB,Tunnel Broker。(目的是简化隧道的配置,提供自动的配置手段),TB可以看作是一个虚拟的IPv6 ISP,它为已经连接到IPv4网络上的用户提供连接到IPv6网络的手段,而连接到IPv4网络上的用户就是TB的客户。
  4. 协议转换技术。其主要思想是在V6节点与V4节点的通信时需借助于中间的协议转换服务器,此协议转换服务器的主要功能是把网络层协议头进行V6/V4间的转换,以适应对端的协议类型。
  5. SOCKS64。

在客户端里引入SOCKS库,它处于应用层和socket之间,对应用层的socket API和DNS域名解析API进行替换。

另一种是SOCKS网关。

  1. 传输层中继

与SOCKS64的工作机理相似,只不过是在传输层中继器进行传输层的“协议翻译”

  1. 应用层代理网关(ALG)

类似。在应用层进行协议翻译。

ARP协议

Address Resolution Protocol,即地址解析协议, 用于实现从 IP 地址到 MAC 地址的映射,即询问目标IP对应的MAC地址

  1. 查主机缓存里(的ARP列表里)有没有记录这个IP和MAC地址的对应  
    
  2. 有就直接发送,没有就向本网段所有主机发送广播,发送自己的IP地址和MAC地址,询问谁是这个IP地址,这个地址的MAC地址是什么  
    
  3. 网络中的其他主机收到之后对照被询问的地址和自己能不能对上,是的话就从数据包中提取源主机的IP和mac地址写入自己的ARP列表,并将自己的MAC地址写入响应包,回复源主机  
    
  4. 源主机收到ARP响应包之后,就可以用这些信息发送数据  
    

为什么要用ARP协议:OSI把网络分成7层,每层之间不直接交流,只有特定接口有交流。IP在第三层网络层,MAC地址工作在第二层数据链路层。协议发包时需要封装IP地址和MAC地址,但只知道IP,又不能跨层直接找,所以得用ARP协议的服务帮助获取目的节点的MAC地址

浏览器中输入一个URL后,按下回车后发生了什么

URL,统一资源定位符,l简单点就是网址=ip或域名 + 端口号 + 资源位置 + 参数 + 锚点

1.输入一个网址之后,首先浏览器通过查询DNS,查找这个URL的IP地址,(通过层层向上级DNS服务器查找直到找到对应URL的IP地址)

2.得到目标服务器的IP地址及端口号(http 80端口,https 443端口),会调用系统库函数socket,请求一个TCP流套接字。客户端向服务器发送HTTP请求报文

(1)应用层:客户端发送HTTP请求报文。

(2)传输层:(加入源端口、目的端口)建立连接。实际发送数据之前,三次握手客户端和服务器建立起一个TCP连接。

(3)网络层:(加入IP头)路由寻址。

(4)数据链路层:(加入frame头)传输数据。

(5)物理层:物理传输bit。

3.服务器端经过物理层→数据链路层→网络层→传输层→应用层,解析请求报文,发送HTTP响应报文。

4.关闭连接,TCP四次挥手。

5.客户端解析HTTP响应报文,浏览器开始显示HTML

网页卡顿原因

网速慢、带宽不足、硬件配置低、内存被占满。

JS脚本过大,阻塞了页面的加载。

网页资源过多、接受数据时间长、加载某个资源慢。

DNS解析速度。

一般怎么检查

硬件问题:检查网线或者无限网卡有没有插好,有没有连上路由器,就是底层是不是联通状态;

软件问题:查看是否有对应的驱动,服务器好不好,DNS对不对,或者可能是代理没关

当网页加载很慢的时候,应如何分析其原因并解决问题?

http请求次数太多

资源过大,资源过多

JS脚本过大

网速慢

给一个网址先解析什么后解析什么(域名解析顺序)?

域名分层:从右到左分别为顶级域名、二级域名…最左为主机名(服务器名)。比如www.baidu.com的com为顶级域名,email.tsinghua.edu.cn中cn为顶级域名,为中国国家域名,edu为教育科研部门域名,email为服务器名。

域名解析时,优先查找匹配的子域名,如果子域名存在,则从子域名的配置文件查询解析结果,如果子域名不存在,就从上一级的配置文件查询结果

TCP、UDP

TCP连接三次握手的过程

初始状态客户端CLOSED,服务器LISTEN

  1. 客户端A向服务器B发送SYN数据包(SYN, x:0)请求连接。此时状态为SYN_SENT,表示客户端已发送SYN报文。
  2. 服务器B收到,发送SYN/ACK数据包(SYN/ACK,
    y:x+1)回应。此时服务器状态由LISTEN(服务器socket处于监听状态,可以接受连接)变为SYN_RECV,表示收到SYN报文
  3. 客户端A收到并发出确认ACK(ACK, x+1:y+1),连接成功。双方状态ESTABLISHED

TCP四次挥手的过程

初始状态双方ESTABLISHED

  1. 客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。客户端FIN_WAIT_1。表示主动关闭连接,向对方发送了FIN,进入FIN_WAIT_1,等待对方的确认

  2. 服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。客户端FIN_WAIT_2,表示半连接,而服务器可能还有数据要发,这边稍后关闭。服务器CLOSE_WAIT。

  3. 服务器B关闭与客户端A的连接,发送一个FIN给客户端A。服务器LAST_ACK,等待对面的ACK报文

  4. 客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。客户端进入TIME_WAIT,表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。

为何TIME_WAIT:

防止服务器在处于LAST_ACK状态下未收到ACK报文而重发FIN报文,这个TIME_WAIT 状态的作用就是用来重发可能丢失的ACK报文。

TCP和UDP的特点

TCP面向连接,UDP无连接

TCP可靠,保证安全,UDP尽最大努力交付,不保证安全

TCP是点对点的,UDP可以一对一 一对多 多对多 多对一

TCP面向字节流,UDP无拥塞控制

TCP开销较大,UDP开销小

TCP、UDP的应用场景

UDP使用场景 DNS协议(因为用UDP快),看视频、发语音、QQ聊天、多媒体教室屏幕广播

TCP使用场景 HTTP协议,QQ传文件,邮件,登陆

TCP怎么实现可靠传输

确认和重传机制:建立连接、发送包时的确认,运输过程中校验失败、丢包或延时发送端重传

数据排序:把数据分成很多包,按顺序进行传输

流量控制:滑动窗口和计时器

拥塞控制:慢启动、拥塞避免、快速重传、快速恢复

流量控制

作用于接收方,控制发送者的发送速度从而使接收者来得及接收,防止分组丢失的。

由滑动窗口实现

滑动窗口

TCP进行流量控制的方式,接收方通过告诉对方自己的窗口大小,从而控制发送方的发送速度,以防止由于发送方发送速度过快而导致自己被淹没的现象

计时器

发送端收到为0的窗口后开启一个计时器,时间到了之后发包询问现在的滑动窗口,防止死锁(接收端发回的不为0的窗口的包丢失,双方相互等待)

拥塞控制

作用于网络,防止过多的数据注入到网络中,避免出现网络负载过大的情况。

拥塞:对网络中某一资源的需求超过了该资源所能提供的可用部分,影响到网络性能

拥塞控制:防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。

拥塞窗口
发送方使用的流量控制,另外考虑到接受方的接收能力,发送窗口可能小于拥塞窗口。

慢启动和拥塞避免

慢启动:不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小。

拥塞窗口一开始设为1 ,每收到一次确认,就让拥塞窗口变为原来的两倍,当窗口值为16时(慢启动门限),改为加法增大,每次+1,直到网络拥塞。拥塞时让新的慢启动门限设为拥塞时的一半,并把拥塞窗口置为1,再让他重复,这时一瞬间会将网络数据量大量降低。

拥塞避免:拥塞避免算法让拥塞窗口缓慢增长,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。

快重传和快恢复

快重传:接收方每收到一个失序的报文段(收完2后就收到了4说明3丢了)就立即发出包2的重复确认,这样可以让发送方尽早知道丢包了。

发送端连续收到三个重复确认就立即重传3

快恢复:发送方收到3个连续确认时,把慢开始门限减半,把拥塞窗口的值置为慢开始门限的一半,实行拥塞避免算法,每次确认收到后+1

猜你喜欢

转载自blog.csdn.net/weixin_44200259/article/details/128079248