计算机网络&&操作系统面经

计算机网络

网络七层架构

OSI模型: 七层
TCP/IP模型: 应用层,传输层,网络层,数据链路层,物理层 五层
在这里插入图片描述

简述
物理层 将上层信息编码成电流脉冲信号用于网上传输,不处理错误
数据链路层 确定网络数据包的形式,加入了物理编码,网络拓扑,错误校验,流量控制等特征
网络层 源和终点之间建立链接,需要路由确定计算机位置,IP协议
传输层 向高层提供端对端的网络数据流服务,端口-端口TCP/UDP协议
会话层 建立、管理和终止表示层与实体之间的通信会话,建立一个连接
表示层 用于应用层数据编码和转化,确保一个系统应用层发送的信息,可以被另一个系统应用层识别
应用层 规定数据的传输协议:HTTP-80/HTTPS-443

TCP与UDP

TCP/IP原理

TCP:Transmission Control Protocol,传输控制协议,面向连接,安全可靠的运输层协议

UDP:User Data Protocol,用户数据报协议,不建立连接,可以一对多,尽最大努力交付,不保证。比如ping命令测试

区别

TCP UDP
基于连接 无连接
要求系统资源多
结构复杂 结构简单
流模式 数据报模式,多为短消息
保证数据正确性,可靠 可能丢包,不可靠
保证数据顺序 不保证

TCP和UDP的使用场景

如何让UDP实现可靠传输

TCP建立连接: 三次握手【阿里,字节】

TCP报文首部

  • 源端口和目的端口
  • 序号Sequence:TCP传输的字符流中每个字节按顺序标号,保证有序
  • 确认号ack: 下一个期望收到的报文第一个字节序号
  • 确认ACK: 仅当ACK=1时,确认号字段才有效,规定当建立连接后所有报文传输ACK=1
  • 同步SYN: 建立连接时同步序号,当SYN=1,ACK=0表明连接请求报文,若对方同意,则响应报文SYN=1,ACK=1
  • 终止FIN: 释放连接,FIN=1表示报文发送方数据发送完毕,要求释放

三次握手过程

在这里插入图片描述

目的:使数据包的发送和接受同步
特点: SYN同步位只有在TCP连接时才置1,连接成功后置0

四次挥手过程【阿里】

在这里插入图片描述
数据传输完毕后,双方都可释放连接。最开始的时候,客户端和服务器都是处于ESTABLISHED状态,然后客户端主动关闭,服务器被动关闭。

Q1: TCP连接的特点,如何保证连接的安全可靠【阿里4】

TCP是面向连接安全可靠的传输层协议。

TCP的安全可靠是通过确认重传机制实现的,在滑动窗口协议中,接收窗口会在连续收到的包序列中的最后一个包向接收端发送一个ACK,当网络拥堵的时候,发送端的数据包和接收端的ACK包都有可能丢失。TCP为了保证数据可靠传输,就规定在重传的“时间片”到了以后,如果还没有收到对方的ACK,就重发此包,以避免陷入无限等待中。

Q2:为什么建立TCP连接需要三次握手,两次不可以吗?为什么客户端还要发一次确认呢

两次不可以,一是为了初始化Sequence的初始值,sequence值标识的是两端传输的报文的序号,保证其不会乱序。
二主要防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。

如果使用的是两次握手建立连接,假设有这样一种场景,客户端发送了第一个请求连接并且没有丢失,只是因为在网络结点中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时此前滞留的那一次请求连接,网络通畅了到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费。

如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文并且回复了确认报文,但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。

Q3:如果已经建立了连接,但是客户端突然出现故障了怎么办?

TCP设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接

Q4:为什么客户端最后还要等待2MSL?

MSL(Maximum Segment Lifetime)
第一,保证客户端发送的最后一个ACK报文能够到达服务器, 因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。

第二,防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中不会出现旧连接的请求报文。

Q5:为什么建立连接是三次握手,关闭连接确是四次挥手呢?

建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。
而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以服务器可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,服务器ACK和FIN一般都会分开发送,从而导致多了一次。


Http原理

http:超文本传输协议,是一个基于请求-响应协议,无状态的,应用层协议,基于TCP/IP协议传输数据,定义web Browerserver之间交换数据的通讯格式

  • 请求-响应:客户端请求,服务端响应
  • 无状态: 断开之后不保存彼此信息,下次重新建立连接(改进:cookie)

HTTP请求报文

在这里插入图片描述

请求报文包括:请求行,多个信息头(请求头),请求体(实体内容)

  • 请求行:客户端请求方式Get/Post, 请求资源名称(URL地址),和报文的Hosts属性组成完整的请求URL,使用的HTTP版本号
    • 请求方式:Get,Post,Delete,Head,Option
  • 请求头(Header) :HTTP的报文头,包括若干个属性(属性名:属性值),用来描述客户端的信息:请求那个主机以及客户端的环境信息,与缓存相关的规则信息等,服务器根据报文头获取客户端信息
    • Accept:客户端 接收的响应类型(文本,图片,视频,音频等)
    • Accept-language,Accept-Encoding:客户端接收的语言类型以及编码方式:支持什么压缩
    • Host:请求资源的主机和端口号,从URL中提取
    • User-Agent:客户端使用的操作系统和浏览器版本和名称
    • Connection:Keep-alive表示网页打开完成后,用于传输Http的TCP连接不会关闭,Close:请求完成后关闭连接
    • Referer:上文服务器,告诉服务器是从哪个服务器跳转过来的
    • cookie:传客户端的Cookie给服务器端,让服务器知道请求是属于哪个会话
    • Cache-Control:控制缓存,比如一个请求希望响应返回的内容在客户端的缓存机制:public,private,no-cathe
      • If-Modify-Since:浏览器记录的缓存页面最后修改时间,发送给服务器和服务器文件的实际最后修改时间进行比对,一致返回304,客户端使用本地缓存页面,不一致返回200和新的文件内容。客户端收到丢弃旧文件,保存新文件,断点续传
      • If-None-Match:和ETag字段一起工作,当用户再一次请求某个资源时,在Http请求中加入If-None-Match信息,放入ETag的值,如果服务器验证资源ETag 没改变,说明资源没更新,就返回304告诉客户端使用本地缓存文件,否则发送200和新的资源以及Etag,来提高网站性能
  • 请求体:报文体,包含多个请求参数,比如Post请求中的数据

HTTP响应报文

在这里插入图片描述
响应报文包括:状态行,响应头,实体内容

  • 状态行: Http协议版本号,状态码,状态消息组成,用来描述服务器对请求的处理结果
  • 响应头: 描述服务器基本信息,以及对数据的描述,告诉客户端如何处理它回传的数据
    • Cache-control: 告诉客户端如何控制响应内容的缓存:private,public,no-cache
    • ETag: 访问资源的标记,如果服务器端资源发生改变,ETag值也会变化,与客户端的If-None-Match一起工作,决定客户端什么时候从缓存中取资源,什么时候从服务器端回新的资源
    • Last-Modified: 指示资源最后修改时间
    • Location: 重定向的资源URL
    • Set-Cookie: 设置客户端的Cookie
    • 响应对象类型,实体长度,压缩方式等
  • 实体内容: 回传的数据

HTTP请求方法【阿里1】

请求方式:POST,GET(默认),HEAD,OPTIONS,DELETE等,可通过更改表单的提交方式实现修改请求方式
Put请求:如果两个请求相同,后一个请求会把第一个请求覆盖掉。(用来资源)
Post请求:后一个请求不会把第一个请求覆盖掉。(所以Post用来增资源)
Get请求: 在请求的URL后以?带上上交给Server的数据,数据间以&分隔

Get和Post区别:

  1. GET参数通过URL明文传递,不安全. POST放在Request body中。
  2. GET请求会被浏览器主动cache,而POST不会,除非手动设置。
  3. GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
  4. Get 请求中有非 ASCII字符,会在请求之前进行转码,POST不用,因为POST在Request body中,通过 MIME,也就可以传输非 ASCII 字符。
  5. 一般我们在浏览器输入一个网址访问网站都是GET请求

Cookie和Session区别

HTTP状态码【阿里2】

状态码 说明
200 响应成功
302 重定向,跳转地址通过响应头的Location指向
304 Not Modified:上次文档已缓存,还可以使用
400 客户端请求有语法错误,服务器不能识别
403 服务器收到请求,拒绝提供服务(认证失败)
404 请求资源不存在
500 服务器内部错误

HTTP传输过程【字节1】

先通过三次握手建立TCP连接,客户端向服务器端发送HTTP请求,服务器端查找资源后发出HTTP响应,数据传输完成后TCP四次挥手断开连接
img

HTTP1.0 、1.1 、2.0区别[字节1]

  • HTTP1.0:Client和server连接后只能获得一个web资源,不支持断点续传

  • HTTP1.1:在一个连接上获取多个web资源,可以传送多个HTTP响应和请求,支持持久化连接,断点续传,引入更多缓存策略,FIFO处理请求-响应

  • HTTP2.0:进行了二进制分帧,封装了HTTP消息,这些帧对应着逻辑流中的消息,很多流可以并行地在同一个TCP连接上交换消息,支持多向请求与响应:客户端和服务器可以把HTTP消息分解为互不依赖的帧,然后乱序发送,最后再在另一端把它们重新组合起来。

1.0与1.1区别:

  1. 带宽优化及网络连接的使用,HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,允许只请求资源的某个部分
  2. Host头处理,在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。
  3. 长连接,HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。

HTTP 和HTTPS的区别

HTTPS:更加安全

  • HTTP协议运行在TCP之上,所有传输的内容都是明文,HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密
  • HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443
  • HTTPS有效防止运营商劫持

HTTP断点续传【字节1】

http1.1协议支持获取文件的部分内容,为并行下载和断点续传提供了技术支持,通过在Header 里两个参数实现的,客户端发请求时对应的是 Range ,服务器端响应时对应的是 Content-Range

增强校验

发起续传请求时,所对应的文件内容变化,此时需要定义一个标记文件唯一性的方法,服务器端用Last-Modified 来标识文件的最后修改时间,同时还定义一个 ETag 头,可以使用 ETag 头来放置文件的唯一标识(标记文件是否被修改)。

客户端在发起续传请求时在HTTP头中申明If-Match 或者If-Modified-Since 字段,帮助服务端判别文件变化。

HTTP还定义有一个If-Range头,终端如果在续传是使用If-Range。If-Range中的内容可以为最初收到的ETag头或者是Last-Modfied中的最后修改时候。服务端在收到续传请求时,通过If-Range中的内容进行校验,校验一致时返回206的续传回应,不一致时服务端则返回200回应,回应的内容为新的文件的全部数据。


DNS域名解析【字节1】

产生原因

DNS是应用层协议:网络通信使用TCP/IP,基于IP地址,只能识别ip地址,不认识域名,因此通过DNS服务器解析域名,DNS包括域名解析器和域名服务器

DNS过程

  1. 客户端运行DNS客户端,当访问URL时,浏览器将域名抽出来发给DNS客户端

  2. DNS客户端(也就是DNS解析器)向DNS服务器端发起查询报文(UDP),收到回答报文里包含主机名对应的IP地址

  3. 浏览器用IP地址定位的HTTP服务器发起TCP连接
    在这里插入图片描述

DNS服务器为什么使用分布式

集中式简单,但会出现单点故障,有延迟,维护开销大,因此使用分布式的层次数据库模式以及缓存方法来解决单点集中式的问题。

DNS服务器层次结构

13个根DNS服务器,顶级DNS服务器,权威DNS服务器

为什么DNS用UDP传输?

  • 一次UDP交换可以短到两个包:一个查询包、一个响应包。一次TCP交换则至少包含9个包:三次握手初始化TCP会话、一个查询包、一个响应包以及四次分手的包交换。
  • 效率:TCP连接的开销大,故采用UDP作为DNS的运输层协议,这也将导致只有13个根域名服务器的结果。

URL网址加载过程

DNS解析->TCP连接->HTTP请求-响应–>url浏览器渲染
在这里插入图片描述


Socket通信过程

两个主机的程序之间通过套接字进行通信

https://zhuanlan.zhihu.com/p/29814861

https://blog.csdn.net/HEYUTAO007/article/details/6588302

  • Socket是对TCP/IP协议族的封装,是应用层和TCP/IP协议族通讯的中间软件抽象层,把复杂的TCP/IP隐藏在Socket接口后面,用户通过简单的调用socket接口让socket组织数据,已符合指定的协议
  • Socket还是一种网络间不同计算机上进程通讯的方法,网络中使用三元组**[ip地址,协议,端口]**唯一标识网络的进程,(本地使用PID标识进程 )进程通信使用这个标志和其他进程通信

ARP在哪一层


拥塞控制和快重传


滑动窗口


UDP和TCP区别,怎么让UDP实现可靠连接


CDN


端口

TCP/IP协议中的端口含义
TCP/IP协议族中的主要端口号
测试端口联通的方法

Http常用命令

  1. wget: wget从网络下载资源, 支持HTTP,HTTPS和FTP协议
  2. telnet:不安全的协议,可以测试连接有效性
  3. ssh: 连接远程服务器
  4. curl: 是一个使用URL语法来传输数据的工具。比Telnet强大的点是:cURL可以创建HTTP Request(即可以指定GET, POST, HEAD等方法)
curl -l --request GET www.nowcoder/discuss/879/资源

在这里插入图片描述

HTTP禁用缓存操作

response.setHeader("Pragma", "no-cache"); 
response.setDateHeader("Expires", 0);
response.setHeader("Cache-Control", "no-cache,no-store");

HTTP1.0和HTTP1.1和HTTP2.0的区别

TCD、UDP区别及应用场景


操作系统

并发和并行区别

并行(parallel):指在同一时刻,有多条指令在个处理器上同时执行。所以无论从微观还是从宏观来看,二者都是一起执行的。
**并发(concurrency):**指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。

进程和程序的区别

程序:由若干条具有一定功能的指令所组成的解题顺序和步骤, 静态的,没有生命周期
进程:程序的一次动态执行过程,是操作系统进行资源分配和保护的基本单位, 有生命周期, 比如:就绪态,运行态,阻塞态. 进程是一种数据结构,目的在于有效调度和管理进入计算机主存运行的程序

  • 一个程序可以对应多个进程,但是一个进程只能对应一个程序;
  • 进程是一个能够独立运行的单位,可以和其他进程并发执行

线程,进程,协程的理解

协程和子例程一样,是一种程序组件,更加一般和灵活.
一个程序可以包含多个协程,可以对比与一个进程包含多个线程,
协程和线程区别: 多个线程相对独立,有自己的上下文,切换受系统控制;而协程也相对独立,有自己的上下文,但是其切换由自己控制,由当前协程切换到其他协程由当前协程来控制。

协程和线程区别:协程避免了无意义的调度,由此可以提高性能,但也因此,程序员必须自己承担调度的责任,同时,协程也失去了标准线程使用多CPU的能力。

死锁的条件、原因,死锁的必备条件

互斥锁 互斥量 信号量 自旋锁

猜你喜欢

转载自blog.csdn.net/qq_38879305/article/details/107201234