计算机网络&操作系统

目录

一、计算机网络基础问题

1.计算机网络模型

 2.OSI七层模型

2.TCP和UDP的区别?

3.TCP三次握手

3.1三次握手过程

3.2为什么是三次握手而不是两次?

3.3三次握手过程中可以携带数据吗?

3.4 什么是半连接队列?

3.5 TCP初始序列号ISN(Initial Sequence Number)是固定的吗?

3.6 SYN(洪泛)攻击是什么?

3.7三次握手连接阶段,最后一次ACK包丢失,会发生什么?

4.四次挥手

4.1四次挥手过程

4.2挥手为什么需要四次?

4.3 2MSL等待状态

4.4 为什么TIME_WAIT状态需要经过2MSL才能返回到CLOSE状态?

4.5TIME_WAIT 是服务器端的状态?还是客户端的状态?

5.TCP如何保证可靠性?

5.1检验和

 5.2确认应答与序列号

5.3超时重传

5.4滑动窗口-TCP可靠传输的实现

        糊涂窗口?

5.5拥塞控制

        什么是拥塞控制?

        拥塞控制执行流程:       

5.6流量控制

6.HTTP、HTTPS

6.1什么是http?

6.2解释一下HTTP长连接和短连接?

6.3HTTP1.0和HTTP2.0的区别?

6.4HTTP安全吗?        

6.5HTTP和HTTPS的区别?

6.6HTTPS原理?

7.HTTP常见的状态码有哪些?

7.1状态码301和302有什么区别?

8.HTTP常见的请求方式?

9.GET请求和POST请求的区别?

10.在浏览器输入www.baidu.com后执行的全部过程?

二、操作系统

1.操作系统是四个特性

2.什么是进程?什么是线程?区别?

3.进程间通信的几种方式?

4.进程间同步的几种方式?


一、计算机网络基础问题

1.计算机网络模型

        TCP/IP 与 OSI 都是为了使网络中的两台计算机能够互相连接并实现通信与回应,但他们最大的不同在于,OSI 是一个理论上的网络通信模型,而 TCP/IP 则是实际上的网络通信标准。

 2.OSI七层模型

功能
应用层
为应用程序提供交互服务。在互联网中的应用层协议很多,如域名系统 DNS ,支持万维网
应用的 HTTP 协议,支持电子邮件的 SMTP 协议等。
表示层
主要负责数据格式的转换,如加密解密、转换翻译、压缩解压缩等。
会话层
负责在网络中的两节点之间建立、维持和终止通信,如服务器验证用户登录便是由会话层完成的
传输层
向主机进程提供通用的数据传输服务。该层主要有以下两种协议:TCP、UDP
网络层
选择合适的路由和交换结点,确保数据及时传送。主要包括 IP 协议
数据链路层
数据链路层通常简称为链路层。将网络层传下来的 IP 数据包组装成帧,并再相邻节点的链路上传送帧。
物理层
实现相邻节点间比特流的透明传输,尽可能屏蔽传输介质和通信手段的差异

2.TCP和UDP的区别?

TCP 是传输控制协议的英文缩写词,UDP 是用户数据报协议的英文缩写词

区别TCP(协议)UDP(协议)
是否面向连接面向连接(逻辑连接—三次握手、四次挥手无连接,两台主机之间可以随时发送数据
从连接个数来看由于需要可靠的通道进行通信,每一条TCP连接只能有两个端点,只能一对一的通信支持一对一,一对多,多对一和多对多交互通信
从对应用报文的处理来看TCP是面向字节流的

UDP是面向应用报文的。

应用层报文交给UPD,UDP添加一个UDP首部,使之成为UDP用户数据报,然后进行发送。接收方的UDP收到该UDP用户数据报后,去掉UDP首部,将应用层报文交付给应用进程。

从其向上层提供的传输服务来看

可靠传输,使用流量控制和拥塞控制

TCP适用于要求可靠传输的应用,例如文件传输。

尽最大努力交付,也就是不可靠;不适用流量控制和拥塞控制

UDP适用于实时应用例如IP电话、视频会议等。

首部格式首部最小20字节,最大60字节。这是因为TCP要实现可靠传输、流量控制控制等服务,其首部自然会比较复杂,首部中的字段比较多,首部长度也比较长。首部开销小,仅8字节。由于UDP不提供可靠传输服务,它仅仅在网际层的基础上添加了用于区分应用进程的端口,因此他的首部非常简单,仅有8个字节。

tcp面向字节流过程如下:

发送方:1、发送方的TCP把应用进程交付下来的数据块仅仅看作是一连串的无结构的字节流,TCP并不知道这些带传送的字节流的含义。2、发送方将他们编号并存储在自己的发送缓存中。3、TCP根据发送策略,从发送缓存中提取一定数量的字节构建TCP报文段并发送。
接收方:1、接收方的TCP一方面从所接收到的TCP报文段中取出数据载荷部分,并存储在接收缓存中,一方面将接收缓存中的一些字节交付给应用进程。2、TCP不保证接收方应用进程所收到的数据块与发送方应用进程所发出的数据块具有对应大小的关系(例如,发送方应用进程交给发送方的TCP共10个数据块,但接收方的TCP可能只用了4个数据块,就把收到的字节流交付给了上层的应用进程,但接收方收到的字节流必须和发送方应用进程发出的字节流完全一样。)当然,接收方的应用进程必须有能力识别收到的字节流,并把它还原成有意义的应用层数据。
 

3.TCP三次握手

3.1三次握手过程

第一次握手:客户端请求建立连接,向服务端发送一个同步报文SYN=1),同时选择一个随机 数 seq = x 作为初始序列号,并进入SYN_SENT(同步已发送)状态,等待服务器确认。

第二次握手:服务端收到连接请求报文后,如果同意建立连接,则向客户端发送同步确认报文 (SYN=1ACK=1),确认号为 ack = x + 1,同时选择一个随机数 seq = y 作为初始序列号,此时服务器进入SYN_RECV(同步收到)状态。

第三次握手:客户端收到服务端的确认后,向服务端发送一个确认报文ACK=1),确认号为 ack = y + 1,序列号为 seq = x + 1,客户端和服务器进入ESTABLISHED(建立连接)状态,完成三次握手。

理想状态下, TCP 连接一旦建立,在通信双方中的任何一方主动关闭连接之前, TCP 连接都将被一直保持下去。

3.2为什么是三次握手而不是两次?

        对于这个问题,我们需要先弄明白三次握手的目的是什么,能不能只用两次握手来达到同样的目的。
        <1>第一次握手:客户端发送网络包,服务端收到了。这样服务端就能得出结论:客户端发送能力、服务端接收能力正常;
        <2>第二次握手:服务端发包,客户端收到了。这样就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常。
        <2>第三次握手:客户端发包,服务端收到了。这样服务端就能得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常。
因此,需要三次握手才能确认双方的接收与发送能力是否正常。
试想如果是用两次握手,则会出现下面这种情况:
如客户端发出连接请求,但因连接请求报文丢失而未收到确认,于是客户端再重传一次连接请求。后来收到了确认,建立了连接。数据传输完毕后,就释放了连接,客户端共发出了两个连接请求报文段,其中第一个丢失,第二个到达了服务端,但是第一个丢失的报文段只是在某些网络结点长时间滞留了,延误到连接释放以后的某个时间才到达服务端,此时服务端误认为客户端又发出一次新的连接请求,于是就向客户端发出确认报文段,同意建立连接,不采用三次握手,只要服务端发出确认,就建立新的连接了,此时客户端忽略服务端发来的确认,也不发送数据,则服务端一致等待客户端发送数据,浪费资源。
 

3.3三次握手过程中可以携带数据吗?

其实第三次握手的时候,是可以携带数据的。但是,第一次、第二次握手不可以携带数据

为什么这样呢?大家可以想一个问题,假如第一次握手可以携带数据的话,如果有人要恶意攻击服务器,那他每次都在第一次握手中的 SYN 报文中放入大量的数据。因为攻击者根本就不理服务器的接收、发送能力是否正常,然后疯狂着重复发 SYN 报文的话,这会让服务器花费很多时间、内存空间来接收这些报文。

也就是说,第一次握手不可以放数据,其中一个简单的原因就是会让服务器更加容易受到攻击了。而对于第三次的话,对于客户端来说,他已经建立起连接了,并且也已经知道服务器的接收、发送能力是正常的了,所以能携带数据也没啥问题。

3.4 什么是半连接队列?

        服务器第一次收到客户端的 SYN 之后,就会处于 SYN_RCVD 状态,此时双方还没有完全建立起连接,服务器会把此种状态下请求连接放在一个队列里,我们把这种队列称之为半连接队列

        当然还有一个全连接队列,就是已经完成三次握手,建立起连接的就会放在全连接队列中。如果队列满了就有可能会出现丢包现象。

        这里在补充一点关于SYN-ACK 重传次数的问题:服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传。如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。
注意,每次重传等待的时间不一定相同,一般会是指数增长,例如间隔时间为 1s,2s,4s,8s…

3.5 TCP初始序列号ISN(Initial Sequence Number)是固定的吗?

       时,它为连接选择一个初始序号。ISN随时间而变化,因此每个连接都将具有不同的ISN。ISN可以当一端为建立连接而发送它的SYN看作是一个32比特的计数器,每4ms加1 。这样选择序号的目的在于防止在网络中被延迟的分组在以后又被传送,而导致某个连接的一方对它做错误的解释。

        三次握手的其中一个重要功能是客户端和服务端交换 ISN(Initial Sequence Number),以便让对方知道接下来接收数据的时候如何按序列号组装数据。如果 ISN 是固定的,攻击者很容易猜出后续的确认号,因此 ISN 是动态生成的。

3.6 SYN洪泛)攻击是什么?

        服务器端的资源分配是在二次握手时分配的,而客户端的资源是在完成三次握手时分配的,所以服务器容易受到SYN洪泛攻击。SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server则回复确认包,并等待Client确认,由于源地址不存在,因此Server需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪。SYN 攻击是一种典型的 DoS/DDoS 攻击。

        检测 SYN 攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击。在 Linux/Unix 上可以使用系统自带的 netstat 命令来检测 SYN 攻击。

netstat -n -p TCP | grep SYN_RECV

常见的防御 SYN 攻击的方法有如下几种:

  • 缩短超时(SYN Timeout)时间
  • 增加最大半连接数
  • 过滤网关防护
  • SYN cookies技术

3.7三次握手连接阶段,最后一次ACK包丢失,会发生什么?

(1)服务端: <1>第三次的ACK 在网络中丢失,那么服务端该 TCP 连接的状态为 SYN_RECV, 并且会根据 TCP 超时重传机制,会等待3 秒、 6 秒、 12 秒后重新发送 SYN+ACK 包,以便客户端重新发送 ACK 包。
<2>如果重发指定次数之后,仍然未收到客户端的 ACK 应答,那么一段时间后,服务端自动关闭这个连接。
(2)客户端: 客户端认为这个连接已经建立,如果客户端向服务端发送数据,服务端将以RST 包(Reset ,标示复位,用于异常的关闭连接)响应。此时,客户端知道第三次握手失败。

4.四次挥手

4.1四次挥手过程

        建立一个连接需要三次握手,而终止一个连接要经过四次挥手。这由TCP的半关闭(half-close)造成的。所谓的半关闭,其实就是TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。

        TCP 连接的断开需要发送四个包,因此称为四次挥手(Four-way handshake),客户端或服务端均可主动发起挥手动作。

刚开始双方都处于ESTABLISHED 状态,假如是客户端先发起关闭请求。四次挥手的过程如下:

<1>第一次挥手:客户端发送一个 FIN 报文,即发出连接释放报文段(FIN=1,序列号seq=m),并停止再发送数据,主动关闭TCP连接,进入FIN_WAIT1(终止等待1)状态,等待服务端的确认。


<2>第二次挥手:即服务端收到连接释放报文段后即发出确认报文段(ACK=1,确认号ack=m+1,序列号seq=n),服务端进入CLOSE_WAIT(关闭等待)状态,此时的TCP处于半关闭状态,客户端到服务端的连接释放。客户端收到服务端的确认后,进入FIN_WAIT2(终止等待2)状态,等待服务端发出的连接释放报文段。


<3>第三次挥手:服务端没有要向客户端发出的数据,服务端发出连接释放报文段(FIN=1,ACK=1,序号seq=p,确认号ack=m+1),服务端进入LAST_ACK(最后确认)状态,等待客户端的确认。


<4>第四次挥手:客户端收到服务端的连接释放报文段后,对此发出确认报文段(ACK=1,seq=m+1,ack=p+1),客户端进入TIME_WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,客户端才进入CLOSED状态。服务端收到 ACK 报文之后,就处于关闭连接了,处于 CLOSED 状态。

4.2挥手为什么需要四次?

        因为当服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端,“你发的FIN报文我收到了”。只有等到我服务端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四次挥手。

4.3 2MSL等待状态

        TIME_WAIT状态也称为2MSL等待状态。每个具体TCP实现必须选择一个报文段最大生存时间MSL(Maximum Segment Lifetime),它是任何报文段被丢弃前在网络内的最长时间。这个时间是有限的,因为TCP报文段以IP数据报在网络内传输,而IP数据报则有限制其生存时间的TTL字段。

        对一个具体实现所给定的MSL值,处理的原则是:当TCP执行一个主动关闭,并发回最后一个ACK,该连接必须在TIME_WAIT状态停留的时间为2倍的MSL。这样可让TCP再次发送最后的ACK以防这个ACK丢失(另一端超时并重发最后的FIN)。

       并且这个连接口只能在2MSL结束后才能再被使用。

4.4 为什么TIME_WAIT状态需要经过2MSL才能返回到CLOSE状态?

        理论上,四个报文都发送完毕,就可以直接进入CLOSE状态了,但是可能网络是不可靠的,有可能最后一个ACK丢失。所以TIME_WAIT状态就是用来预防可能重发可能丢失的ACK报文

4.5TIME_WAIT 是服务器端的状态?还是客户端的状态?

        TIME_WAIT 是主动断开连接的一方会进入的状态,一般情况下,都是客户端所处的状态;服务器端一般设置不主动关闭连接。TIME_WAIT 需要等待 2MSL,在大量短连接的情况下,TIME_WAIT会太多,这也会消耗很多系统资源。 对于服务器来说,在 HTTP 协议里指定 KeepAlive(浏览器重用一个 TCP 连接来处理多个 HTTP 请求),由浏览器来主动断开连接,可以一定程度上减少服务器的这个问题。

5.TCP如何保证可靠性?

        首先,TCP通过三次握手、四次挥手确保连接和断开的可靠性。其次TCP提供了检验和、序列号 / 确认应答、超时重传、滑动窗口、拥塞控制和 流量控制等方法实现了可靠性传输。
方案描述
检验和    通过检验和的方法,接收方可以检验出数据是否有差错和异常,假如有差错就会直接丢弃TCP段,重新发送
序列号/确认应答

    序列号的作用不仅仅是应答的作用,有了序列号能够将接收到的数据根据序列号排序,并且去掉重复序列号的数据。

TCP传输过程中,每次接收方接收数据后,都会对传输方进行确认应答。也就是发送ACK报文,这个ACK报文当中带有对应的确认序列号,告诉发送方,接收到了哪些数据,下一次的数据从哪里发送

滑动窗口     滑动窗口既提高了报文后传输的效率,也避免了发送方发送过多的数据而导致接收方无法正常处理的异常
超时重传    超时重传是指法案送出去的数据包到接收到确认包之间的时间,如果超过了这个时间会被认为丢包了,需要重传。最大超时时间是动态计算的。
拥塞控制
在数据传输过程中,可能由于网络状态的问题,造成网络拥堵,此时引入拥塞控制机制,在保证TCP 可靠性的同时,提高性能。
流量控制
    如果主机 A 一直向主机 B 发送数据,不考虑主机 B 的接受能力,则可能导致主机 B 的接收缓冲区满了而无法再接受数据,从而会导致大量的数据丢包,引发重传机制。而在重传的过程中,若主机B的接收缓冲区情况仍未好转,则会将大量的时间浪费在重传数据上,降低传送数据的效率。所以引入流量控制机制,主机B 通过告诉主机 A 自己接收缓冲区的大小,来使主机 A 控制发送的数据量。流量控制与TCP 协议报头中的窗口大小有关 。         TCP通过滑动窗口来进行流量控制。

5.1检验和

        TCP检验和的计算与UDP一样,在计算时要加上12byte的伪首部,检验和总共计算3部分:TCP首部、TCP数据、TCP伪首部。计算方法为:在发送方将整个报文段分为多个16位的段,然后将所有段进行反码相加,将结果存放在检验和字段中,接收方用相同的方法进行计算,如最终结果为检验字段所有位是全1则正确,否则存在错误。

在这里插入图片描述

 5.2确认应答与序列号

TCP将每个数据包都进行了编号,这就是序列号。序列号的作用:
       a、保证可靠性(当接收到的数据总少了某个序号的数据时,能马上知道)
       b、保证数据的按序到达
       c、提高效率,可实现多次发送,一次确认
       d、去除重复数据
数据传输过程中的确认应答处理、重发控制以及重复控制等功能都可以通过序列号来实现。

        TCP通过确认应答机制实现可靠的数据传输。在TCP的首部中有一个标志位—ACK,此标志位表示确认后是否有效。接收方对于按序列号到达的数据会进行确认,当标志位ACK=1时,确认首部的确认字段有效。进行确认时,确认字段值表示这个值之前的数据都已经按序到达了。而发送方如果收到了已发送的数据的确认报文,则继续传输下一部分数据;而如果等待了一定时间还没有收到确认报文就会启动重传机制。

5.3超时重传

        当报文发出后在一定的时间内未收到接收方的确认,发送方就会进行重传(通常是在发出报文段后设定一个闹钟,到店了还没有收到应答则进行重传)。

一种情况是发送方包丢失了,其基本过程如下:

发送包丢失导致的超时

另一种情况是ACK丢失,过程如下: 

 ACK丢包导致的超时

 当接收方接收到重复的的数据就会将其丢掉,重新发送ACK。而要识别出重复的数据,前面提到的序列号就起作用了。

重传时间去确定:

        报文段发出到接收应答中间有一个报文段的往返时间RTT,显然超时重传时间RTP会略大于这个RTT,TCP会根据网络情况动态的计算RTT,即RTO是不断变化的。在Linux中,超时以500ms为单位进行控制,每次判定超时重发的超时时间都是500ms的整数倍。其规律为:如果重发一次仍得不到应答,就等待2500ms后再进行重传,如果仍然得不到应答就等待4500ms后重传,依次类推,以指数形式递增,重传次数累计到一定次数后,TCP认为网络或对端主机出现异常,就会强行关闭连接。

5.4滑动窗口-TCP可靠传输的实现

        窗口滑动协议是TCP使用的一种流量控制方法。该协议允许发送方在停止并等待接收确认报文前可以连续发送多个分组。由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输。只有在接收窗口向前滑动时(与此同时也发送了确认),发送窗口才有可能向前滑动。收发两端的窗口按照以上规律不断地向前滑动。本质上是一个循环数组的实现。利用若干指针来维护相关的区域。

        在进行数据传输时,如果传输的数据比较大,就需要拆分为多个数据包进行发送。TCP 协议需要对数据进行确认后,才可以发送下一个数据包,如图←所示。发送端每发送一个数据包,都需要得到接收端的确认应答以后,才可以发送下一个数据包。这样一来,就会在等待确认应答包环节浪费时间。为了避免这种情况,TCP引入了窗口概念。窗口大小指的是不需要等待确认应答包而可以继续发送数据包的最大值。

         TCP的滑动窗口以字节为单位。接收方发送的确认报文段,报文段首部中的窗口字段值为20,这相当于表明接收窗口为20字节,确认号为31表示已经收到序列号为30的数据。根据这两个字段的值就可以构造出发送窗口。发送窗口大小就是接收方返送的窗口字段值。主机A在没有收到确认情况下可以连续把发送窗口中的数据发送出去。凡是已经发送过的数据在未收到确认之前都必须保留,以便超时重传使用。

        以这种方式发送,就可以省去多个数据包(第1、2、4、5、7、8个)的确认应答包时间,从而避免了网络的吞吐量的降低。

        5.4.1糊涂窗口?

糊涂窗口描述
问题概述  这个问题可以归结为小包的问题,就是由于发送端和接收端的处理不一致,导致网络上出现了很多小包。滑动窗口发送这些小数据不值当。
解决

【发送方】使用Nagle算法,指的是当发送端发送的数据很少时,进行延迟发送的一种机制;具体来说,当要发送的数据大小 >= 内核缓冲区大小的一般时,才可以进行发送数据。

【接收方】窗口大小设置为0或者延迟确认应答机制;

方案1:只要窗口大小 < 内核缓冲区的一半时,就直接将窗口的大小设置为0,并通告发送端。待等到窗口大小 > 内核缓冲区一半时,再打开窗口,通告发送端可以发送数据。这样就防止发送小报文了。

方案2:延迟确认应答机制。延迟确认应答基于以下思想,如果接收报文后立即回复ACK,此时滑窗大小可能依然很小,发送方收到ACK后还会发送小报文。如果接收方延迟一段时间后再请确认应答,此时滑窗大小可能就变大了,这样发送给发就能发送多的数据了。

        这个问题可以归结为小包的问题,就是由于发送端和接收端的处理不一致,导致网络上出现了很多小包。滑动窗口发送这些小数据不值当。对于解决这个为题,两方面入手:

        对于接收端,值要窗口大小<某个值(内核缓冲区大小的一半)的时候,就将接收窗口大小设置为0,方式发送方发送小数据。然后等到窗口大小>=缓冲区一般的时候,才打开窗口,通知发送发,可以发送数据。

5.5拥塞控制

        什么是拥塞控制?

        在某段时间内,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏。这种情况就叫做拥塞。 (计算机中的链路容量(即带宽)、交换节点中的缓存和处理及等,都是网络的资源)。若出现拥塞而不进行控制,整个网络的吞吐量将随输入负荷的增大而下降。这种情况下需要控制发送方的发送速率需要被控制,这种控制被称为拥塞控制。

        解决由于网络本身拥堵发送方不得不采取拥塞控制对流量进行控制。

        拥塞控制主要依靠四种算法实现。慢开始、拥塞避免、快重传、快恢复。

        “慢开始”指的是一开始网络注入的报文 段少,并不是说拥塞窗口cwnd增长速度慢。

        “拥塞避免”并非指完全能够避免拥塞,而是指在拥塞避免阶段拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。

        “快重传出现”:有时,个别报文段在网络中丢失,实际上不是由于网络拥塞引起的,这将导致发送方超时重传,并误认为网络发生了拥塞。发送方错误地启动慢开始算法,并把拥塞窗口cwnd又设置为最小值1,因而降低了传输效率。所谓快重传,就是使发送方尽快进行重传,而不是等超时重传计时器超时时再重传。

        采用快重传可以让发送方尽早知道发生了个别报文段的丢失。所谓快重传,就是使发送方尽快进行重传,而不是等超时重传计时器超时时再重传。 因此:要求接收方不要等待自己发送数据时才捎带进行确认,而是要立即发送确认;即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认;发送方一旦收到3个连续的重复确认,就将相应的报文段立即重传,而不是等该报文段的超时重传计时器超时再重传;对于个别丢失的报文段,发送方不会出现超时重传,也就不会认为出现了拥塞(进而降低拥塞窗口cwnd为1)。使用快重传可以使整个网络的吞吐量提高约30%。

        “快恢复”:发送方一旦收到3个重复确认,就知道现在只是丢失了个别的报文段。于是不启动慢开始算法,而执行快恢复算法;(1)发送发将慢开始门限ssthresh值和拥塞窗口值调整为当前窗口的一半,开始执行拥塞避免算法。(2)也有的快恢复实现是把恢复开始时的拥塞窗口cwnd值再增大一些,即等于新的ssthresh+3。这是因为发送方既然收到了3个重复的确认,就表明有3个数据已经离开了网络。这3个报文段不再消耗网络资源而是停留在接收方的缓存区。可见网络中不是堆积了报文段而是减少了3个报文段。因此可以适当把拥塞窗口cwnd扩大些。


        拥塞控制执行流程:       

        规定:发送窗口大小swnd,发送窗口拥塞窗口cwnd,慢开始门限初始值ssthresh。

       首先拥塞窗口cwnd的值设置为1 ,设置慢开始门限初始值,假如设置为16。在开始慢开始算法时,发送方每收到一个对新报文段的确认,就把拥塞窗口cwnd的值指数增长。当拥塞窗口的值cwnd增长到慢开始门限时,就改为执行拥塞避免算法。cwnd每次加1。发送超时重传时(重传计时器超时),判断网络可能出现了拥塞。因此会首先把慢开始门限值ssthresh更新为开始拥塞时的cwnd值的一半,然后将cwnd的值减少为1,重新开始慢开始算法。增长到新的慢开始门限的时候再切换为拥塞避免算法。

        但是有时候可能出现的情况是数据包在网络中丢失,而不是由于网络拥塞造成的。这个时候就需要用到快重传和快恢复算法。所谓快重传,就是使发送方尽快进行重传,而不是等超时重传计时器超时时再重传。也就可以避免直接转换为慢开始算法的可能。因此:要求接收方不要等待自己发送数据时才捎带进行确认,而是要立即发送确认;即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认;发送方一旦收到3个连续的重复确认,就将相应的报文段立即重传,而不是等该报文段的超时重传计时器超时再重传;发送方一旦收到3个重复确认,就知道现在只是丢失了个别的报文段。于是不启动慢开始算法,而执行快恢复算法快恢复算法有两种:(1)发送发将慢开始门限ssthresh值和拥塞窗口值调整为当前窗口的一半,开始执行拥塞避免算法。(2)也有的快恢复实现是把恢复开始时的拥塞窗口cwnd值再增大一些,即等于新的ssthresh+3。这是因为发送方既然收到了3个重复的确认,就表明有3个数据已经离开了网络。这3个报文段不再消耗网络资源而是停留在接收方的缓存区。可见网络中不是堆积了报文段而是减少了3个报文段。因此可以适当把拥塞窗口cwnd扩大些。


 

5.6流量控制

为什么需要流量控制?什么是流量控制?流量控制方式?

        一般来说我们都希望数据传输的越快越好,但是如果发送方把数据发送得过快,可能会导致接收方缓存溢出,造成数据的丢失。所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。常见的流量控制有两种,一种是停止-等待流量控制,另一种是滑动窗口流量控制。

停止-等待流量控制就是发送方每发送一帧,都必须停止发送,等待接收方发回的帧对该帧的确认,之后才能发送下一帧;接收方每接收一帧,都要给发送方发回一个确认,表示可以接收下一帧。这种方式每次智能发送一帧,因此传输效率很低。

滑动窗口流量控制的话是首先

        发送方维护一个发送窗口。发送窗口的大小表示在未收到接收方发来确认的情况下,最多可以发送多少个帧;只有接收窗口向前滑动时(并且接收方收到了确认),发送窗口才有可能(因为可能存在丢包)向前滑动。  

        接收方维护一个接收窗口。只有当接收到的帧的序号落入接收窗口内才手下该帧,将接收窗口向前滑动一个位置,并给发送方发回确认;若接收到的帧的序号落在接收窗口之外,则一律将其丢弃。

6.HTTP、HTTPS

6.1什么是http?

        HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于万维网服务器传输超文本到本地浏览器的传送协议;协议就是双方约定好的格式,确保双方都能理解这种格式。特点的话:(1)Http允许传输任意类型是数据。传输的类型由Content-Type加以标记。(2)它是无状态的。对于客户端每次发送的请求,服务端都认为是一个新的请求,上一次会话和下一次会话之间没有联系;(3)支持客户端/服务器模式。

6.2解释一下HTTP长连接和短连接?

        HTTP长连接,指的是复用TCP连接。多个HTTP请求可以复用同一个TCP连接,这几节省TCP连接建立和断开的消耗。 HTTP1.0默认使用的是短链接。也就是说浏览器和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。  HTTP1.1起,默认使用长连接。要使用长连接,客户端和服务端的HTTP首部的Connection都要设置为Keep-alive,才能支持长连接。 

6.3HTTP1.0和HTTP2.0的区别?

        HTTP2.0相比于HTTP1.1支持的特性如下:(1)新的二进制格式:HTTP1.1基于文本格式传输数据;HTTP2.0采用二进制格式传输数据,解析更高效。(2)多路复用:在一个连接里面,允许同时发送多个请求或响应,并且这些氢气球和响应能够并行的传输而不被阻塞。(3)头部压缩,HTTP1.1的header带有大量信息,每次都要重复发送;HTTP2.0把header从数据中分离,并封装成头帧和数据帧,使用特定算法压缩头枕,有效减少头信息的大小。并且HTTP2.0在客户端和服务端记录了之前发送的键值对,对于相同的数据,不会重复发送。比如请求A发送了所有的头信息字段,请求B则只需要发送差异数据,这样可以减少荣誉数据,降低开销。(4)服务推送:HTTP2.0允许服务器向客户端推送资源,无序客户端发送请求到服务器获取。

6.4HTTP安全吗?        

        HTTP是明文传输,容易被黑客窃听或篡改,不安全。可以使用HTTPS来解决HTTP明文协议的缺陷,在HTTP的基础上加入SSL/TLS协议,依靠SSL证书来验证服务器身份,为客户端和服务端之间建立SSL通道,确保数据传输安全。

6.5HTTP和HTTPS的区别?

        Http传输的数据是未经加密的,也就是明文的,因此使用http协议传输隐私的信息是非常不安全的,为了保证这些数据能够加密传输,就诞生了https。简单来说Https就是由ssl+http协议构建的,可以进行加密传输,身份认证的网络协议,要比http更安全。https主要有两个作用,第一是建立一个信息安全通道,用来保证数据传输的安全性,第二就是确认网站的真实性。总的来说http和https的区别主要是:首先,Http是不需要证书,而Https需要申请CA认证,而免费的证书很少,因此还需要一定的费用成本;其次是Http是的数据是明文传输的,不安全,而http是协议是有ssl加http协议构建的,可以进行加密传输, 身份认证的网络协议,可以防止传输内容被窃取篡改,比http协议更加的安全;最后http和https使用的是完全不同的连接方式,所以他们的端口也不一样,前者是80端口,后者是443端口。

6.6HTTPS原理?

        首先TCP三次握手,然后客户端发起一个HTTPS连接建立请求,客户端先发一个‘Client Hello’的包,然后服务端响应‘Server Hello’,接着再给客户端发送它的证书,然后双方经过密钥交换,最后使用交换的密钥进行解密数据。具体过程如下:

        (1)首先是协商加密算法。在‘Client Hello’里面客户端会告知服务端自己当前的一些信息,包括客户端要使用的TLS版本,支持的加密算法,要访问的域名,生成一个随机数(Nonce)给服务端。    (2)服务端响应‘Server Hello’,告诉客户端服务端确认支持的TLS版本以及选中的加密算法,并且生成一个随机数发给客户端。        接着服务端再发一个响应给客户端,出示自己的证书,这样浏览器就可以根据对照自己的证书信任列表来确认这个服务器是否可信,随后服务器把公钥发给客户端。 服务器发送‘Server  Hello Done’告诉客户端发送完了。            (3)客户端生成第三个随机数“预主密钥”,这个随机数会使用刚刚收到的公钥进行加密,并且将加密后的随机数发送给服务器。然后客户端这边的TLS协商以及没问题了,加密开始

        服务端收到加密后的预主密钥之后,会用自己的私钥进行解密,这样服务器就指定预主密钥了。而且只有客户端和服务端指定这预主密钥什么,因为没有进行直接传输。  最后客户端使用预主密钥、第一随机数和第二随机数计算出会话密钥,服务端也用预主密钥、第一随机数和第二随机数计算出会话密钥,各自得到的会话密钥是相同的。这时使用对称加密减小开销。

客户端使用证书的认证机构CA公开发布的RSA公钥对该证书进行验证。通过验证之后,浏览器和服务器通过密钥交换算法产生共享的对称密钥。 接下来开始传输数据,使用同一个对称密钥来加解密。

ps:数据经过公钥加密只能被私钥解密;数据经过私钥加密只能被公钥解密。

7.HTTP常见的状态码有哪些?

状态码
200服务器已成功处理了请求。通常,这表示服务器提供了请求的网页
301永久重定向。
请求的网页已永久移动到新位置。 服务器返回此响应 ( GET HEAD 请求的响
) 时,会自动将请求者转到新位置
302

暂时重定向。

服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以
后的请求
400客户端请求有语法错误,不能被服务器所理解
403服务器收到请求,但是拒绝提供服务
404(未找到)服务器找不到请求的网页
500(服务器内部错误)服务器遇到错误,无法完成请求

状态码开头代表类型:

类别原因短语
1XXInformational(信息性状态码)接收的请求正在处理
2XXSuccess(成功状态码)请求正常处理完毕
3XXRedirection(重定向状态码)需要进行附加操作以完成请求
4XXClient Error(客户端错误状态码)服务器无法处理请求
5XXServer Error(服务端错误状态码)服务器处理请求出错

7.1状态码301和302有什么区别?

        共同点:都是重定向,就是说浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从相应的Location首部中获取(用户看到的效果就是他输入的地址A瞬间变成另一个地址B)。

        不同点:301表示旧地址A的资源已经被永久移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址;302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从地址A跳到地址B,搜素引擎会抓取新的内容而保存旧的地址。SEO中302好于301.

重定向的原因有: (1)网站调整(如改变网页目录结构);

                                (2)网页被移到一个新地址;

                                (3)网页扩展名改变(如应用需要把.php改成.Html或.shtml)。

8.HTTP常见的请求方式?

方法作用
GET获取资源
POST传输实体主体
PUT上传文件
DELETE删除文件
HEAD和GET方法类似,但只返回报文首部,不反悔报文实体主体部分
PATCH对资源进行部分修改
OPTIONS查询指定的URL支持的方法
CONNECT要求用隧道协议连接代理
TRACE服务器会将通信路径返回给客户端

为了方便,可以将PUT、DELETE、POST、GET理解为客户端对服务端的增删改查。

9.GET请求和POST请求的区别?

      使用上的区别:

        (1)get使用URL或Cookie传参,而POST将数据放在Body中,这是因为HTTP协议用法的约定;

        (2)get提交的数据有长度限制,而POST的数据可以非常大,这个是因为它们使用的操作系统和浏览器设置的不同引起的;

        (3)POST比GET安全,因为数据在地址栏上不可见。这个说法没毛病,但是依然部署GET和post本质的区别。

       本质区别:      get和post最大的区别主要是get请求是幂等性的,post请求不是。这是它们本质的区别。       

        幂等性就是用户对于同一操作发起的一次请求或者多次请求结果是一致的,不会因为多次点击而产生了副作用。

10.在浏览器输入www.baidu.com后执行的全部过程?

        (1)首先进行域名解析(域名www.baidu.com变为ip地址)。 浏览器搜索自己的DNS缓存(维护一张域名与IP的对应表);若没有,则搜索操作系统的DNS缓存(维护一张域名与IP的对应表);

        若没有,搜索操作系统的hosts文件(维护一张域名与IP的对应表)。 若没有,则找tcp/ip参数中设置的首选dns服务器,即本地dns服务器(递归查询),本地域名服务器查询自己的dns缓存,如果没有,则进行迭代查询。将本地dns服务器将IP返回给才操作系统,同时缓存IP。

        (2)发起tcp的三次握手,建立tcp连接。浏览器会以一个随机端口(1024-65535)向服务端的web程序80端口发起http请求。

        (3)建立 tcp 连接后发起 http 请求。请求包括请求行、请求头部、空行和请求数据。

        (4)服务器响应http请求,客户端得到html代码。服务器web应用程序收到http请求后,就开始处理请求,处理之后就返回给浏览器html文件。

        (5)浏览器加载html代码,并请求html中的资源。

        (6)浏览器对页面进行渲染,并呈现给用户。

二、操作系统

1.操作系统是四个特性

特性描述
并发同一时间段内多个程序执行(注意区别并行和并发,并行是同一时刻多个事件,并发是同一时间段多个事件)
共享系统中的资源可以被内存中多个并发执行的进程线程共同使用
虚拟通过时分复用(如分时系统)以及空分复用(虚拟内存)技术实现把一个物理实体虚拟为多个
异步系统中的进程是以走走停停的方式执行的,且以一种不可预知的速度推进

2.什么是进程?什么是线程?区别?

        进程:是对程序的封装;是系统进行资源调度和分配的的基本单位,实现了操作系统的并发;

        线程:是进程的子任务,是CPU调度和分派的基本单位,用于保证程序的实时性,实现进程内部的并发;    线程是操作系统可识别的最小执行和调度单位;    每个线程都独自占用一个虚拟处理器:独自的寄存器组,指令计数器和处理器状 态(栈也是独立的);    每个线程完成不同的任务,但是共享同一地址空间(也就是同样的动态内存(堆 区),映射文件(映射区),目标代码等等),打开的文件队列和其他内核资源。(例 如 Socket, 文件句柄什么的)

        根本区别:进程是操作系统资源分配的基本单位,而线程是CPU执行和调度的基本单位;

        <1>从资源开销上讲:每个进程都有独立的代码和数据空间(程序上下文),进程之间的切换会有较大的开销;线程可以看作轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小;

        <2>从包含关系上讲:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以下次也被成为轻权进程或者轻量级进程;

        <3>从内存分配上讲:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源的相互独立的;

        <4>从影响关系上讲,一个进程奔溃后,在保护模式下不会堆其他进程产生影响,但是一个线程崩溃整个进程都会死掉。所以多进程要比多线程健壮;

        <6>从执行关系上讲,每个独立的进程有程序运行的入口,顺序执行序列和程序出口。但是线程不能独立执行,必须一寸在应用程序中,由应用程序提供多个程序执行控制,两者均可并发执行。

        <5>从通信上讲:同一进程中的多个线程具有相同的地址空间,致使它们之间的同步和通信的实现 变得比较容易。线程间可以直接读写进程数据段(如全局变量)来进行通信—— 需要线程同步和互斥手段的辅助,以保证数据的一致性。而进程间通信IPC主要包括:管道, 系统IPC(包括消息队列、信号量、 信号、共 享内存等) 以及套接字socket。

3.有了进程,为什么还要线程?

        线程产生的原因:进程可以使多个程序能并发执行,以提高资源的利用率和系统的吞吐量;但是有一些缺点:(1)进程在同一时间只能干一件事;(2)进程在执行的过程中如果发生阻塞,整个进程就会挂起,及时进程中有些工作不依赖等待的资源,仍然不会执行。  因此,操作系统引入了比进程粒度更小的线程,作为并发执行的基本的单位,从而减少程序在并发执行时所付出的时空开销,提高并发性。

        和进程相比,线程的优势如下:(1)从资源上讲,线程是一种非常“节俭”的多任务操作方式。在linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种“昂贵”的多任务工作方式。(2)从切换效率上讲,运行于一个进程中的多个线程,他们之间使用相同的地址空间,而且线程间彼此切换所需时间也远远小于进程间切换所需要的时间。据统计,一个进程的开销大约是一个线程的30倍左右。(3)从通信机制上讲,线程间通信更加方便。对于不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过进程间通信的方式进行,这种方式不仅费时,而且很不方便。线程则不然,由于同一进程的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便。

        除了以上优点外,多线程作为一种多任务、并发的工作方式,还有以下优点: (1)使多CPU线程更加有效。操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。(2)改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或者半独立的运行部分,这样的程序才会利于理解和修改。

4.什么是协程?

        是一种比线程更加轻量级的存在。正如一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程。        

        协程是一种用户态的轻量级线程,协程的调度完全由用户控制。从技术的角 度来说,“协程就是你可以暂停执行的函数”。协程拥有自己的寄存器上下文和栈。协 程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存 的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局 变量,所以上下文的切换非常快。

        协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。

5.协程和线程的区别?

        (1)和多线程比,协程最大的优势就是具有极高的执行效率

        (2)因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销, 和多线程比,线程数量越多,协程的性能优势就越明显。

        (3)第二大优势不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突, 在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。

        在协程上利用多核CPU——多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。

6.进程间通信的几种方式?

方式解释
管道(pipe)及命名管道管道可用于具有亲缘关系的父子进程间的通信,有名管道除了具有管道所具有的功能外,它还允许无沁园关系进程间的通信;
信号(signal)信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发送;
消息队列消息队列是消息的链接表,它客服了上面两种通信方式中信号量有限的缺点,具有写权限的进程可以按照一定的规则向消息队列中添加信息;对消息队列有读权限的进程可以从消息队列中读信息;
共享内存可以说这是最有用的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等;
信号量主要作为进程之间及同一种进程的不同线程之间的同步和互斥手段
套接字这是一种更为一般的进程间通信机制,它科用于网络中不同及其之间的进程间通信,应用非常广泛。

7.线程同步的几种方式?

方式描述
临界区通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问
互斥量为协调对一个共享资源的单独访问设计,采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源的安全共享。
信号量为控制一个具有有限数量的与用户资源而设计。它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问我此资源的最大线程数量;
事件(信号)用来通知线程有一些事件已经发生,从而启动后继任务的开始保持多线程同步,也方便的实现多线程优先级的比较操作。

8.虚拟内存和共享内存的区别?

虚拟内存:虚拟内存是操作系统内核为了对进程地址空间进行管理而设计的一种逻辑意义上的内存空间。当一个进程启动时内核会给每一个新的进程建立一个虚拟地址空间,并且会为每个进程维护一个从虚拟内存到物理内存的映射表,即页表。页表根据虚拟地址查找所映射的物理页位置以及偏移量,得到实际需要访问的物理地址。

共享内存:进程在运行过程中,会加载许多操作系统的动态库,这些动态库对于每个进程都是公用的,它们在内存中实际只加载一份,这部分被称为共享内存。或者进程之间需要通信时,需要将不同的虚拟地址空间指向相同的内存块,这部分内存也被称为共享内存。

9.32位和64位的区别?

        64位和32位主要所指:32位和64位意味着处理器一次能处理的最大位数。主要区别是针对CPU而言,指CPU一次处理的二进制位数,64位计算机一般指拥有64位的处理器和64位的操作系统,32位计算机一般指拥有32位的处理器和32位的操作系统。而现在的32位处理器只支持安装32位操作系统,64位处理器却能同时支持安装32位和64位操作系统。

从寻址能力来区别
1.32位系统的最大寻址空间是2的32次方=4294967296(bit)= 4(GB)左右;

2.64位系统的最大寻址空间为2的64次方方,数值大于1亿GB;

3.也就是说32位系统的处理器最大只支持到4G内存,而64位系统最大支持的内存高达亿位数,实际运用过程中大多数的电脑32位系统最多识别3.5GB内存,64位系统最多识别128GB内存。
 

 从软件兼容性来讲

        一般情况下,我们很大部分的软件都是在32位架构环境下开发的,这就是为啥64位系统的兼容性不如32位。我们需要了解的是,在32位系统下是无法运行64位软件的,而64位系统却支持安装大部分的32位软件。在64位系统下32位软件安装文件夹带x86区分的哦。

从系统体积大小来讲

        64位操作系统包含32位系统兼容库,既兼容64位又兼容32位的使用程序;

        64位系统都比32位系统大的多,比如win7 64位比win7 32位系统大700M左右。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值