测开需掌握网络技术

tcp详解

https://leetcode-cn.com/circle/discuss/aqTOW4/

  1. tcp三次握手的目的是什么?为什么不用两次和四次

    img

     

    tcp握手三次的主要目的是防止失效的连接请求报文被服务器接受

    如果只有两次握手,假设客户端发送第一次接连请求由于网络拥塞的原因,迟迟未到服务端,客户顿啊没接收到确认报文,认为服务器没收到,于是重新发送请求报文并与服务器建立连接,等这次连接断开了,之前滞留的请求报文又到达了服务器,就会让服务器与客户端再次连接成功,这时服务端就会一直等待客户端发送请求,造成了资源浪费。

    两次握手只能保证单向链路是可通信的,理论上,要保证双向链路可以通信需要四次握手,但实际上服务端给客户端的syn和ack数据包可以合为一次握手,所以实际上只需要三次握手即可

     

  2. 为什么tcp挥手需要四次呢?三次不行吗?

    挥手阶段中服务端的ack和fin数据包 不能合为一次。因为挥手阶段的流程为客户端发送fin数据包表示自己已经发完了,服务端立即回复ack数据包表示自己知道了,此时客户端到读物端的连接已经释放了,客户端不会再发送数据了,但服务端可以继续向客户端发送数据,等服务端也完成了数据发送,才会发送fin,这时客户端回复ack,就可以结束通信了。

  3. tcp在四次挥手的过程中为什么客户端最后还要等待2MSL(Maximum segment lifetime)?

    因为客户端要保证他的ACK包顺利到达服务端,如果客户端ACK数据包丢失,则服务端或重新发送fin包到客户端,而这两个过程的最长时间为1MSL,加起来2MSL,如果2MSL后客户端还没有收到服务端重发的FIN包,则说明ACk包顺利到达,可以关闭通信了

  4. tcp保证数据可靠性的方式大致可以分为三类:

    数据包层面:校验和

    在数据包传输层面:序列号、确认应答、超时重传

    在流量控制层面:拥塞控制

  5. tcp的长短连接

    tcp短连接是指客户端与服务端连接后只进行一次读写就关闭连接,一般是客户端关闭

    长连接则是进行完一次读写后不关闭连接,直到服务端压力过大则选择关闭一些长时间为进行读写的连接。

    tcp短连接有点在于管理简单,而不会对服务端造成太大压力,而缺点是每次读写都需要重新连接耗时较长

    tcp长连接的优点是可以迅速进行多次读写,缺点是对服务端压力大,且容易被恶意连接影响服务

    长短连接的区别在于客户端和服务端选择的关闭策略不用,具体需要根据应用场景来选择合适的策略。


     

网址访问过程详解

https://leetcode-cn.com/circle/discuss/UrcaDQ/

  1. 请你详细描述一下从我们在浏览器中输入网址到最后看到网页,这个过程中发生了什么?

    全过程简要概述:当我们将网页输入到浏览器后,第一件事就是解析url得到域名,通过DNS协议获取到该域名的ip地址,得到ip后浏览器会先与服务器通过tcp三次握手建立连接,然后构建HTTP请求,将HTTP的传输工作交给操作系统的协议栈,发送请求成功后,浏览器会从服务器拿到该页面的HTML以及资源文件,浏览器会渲染页面,呈现出我们所看到的页面

    在这整个过程中,涉及到了DNS解析,http请求,TCP/IP协议栈,页面渲染等知识。

    DNS解析

    浏览器拿到url后,首先会对url进行解析,将域名与实际的文件路径分离,然后需要使用DNS协议,通过域名拿到ip

    首先浏览器会查询浏览器缓存,如果有这个网址就可以直接获取到ip,如果没有就进一步访问本机缓存,如果本季缓存也没有才会发起DNS请求

    HTTP请求

    在解析url时,我们能获取到需要请求资源的资源路径,端口号,请求参数等信息,这些信息会被存储在http头中,通过DNS请求获取到ip后,浏览器会构建并发送http请求获取https请求,https就是在http的基础上加了一个TLS协议来进行数据加密

    http请求有很多种,但对资源的操作离不开增删改查,也就对应着post、delete、put、get请求。最常用的是post与get,其区别在于get的参数在url上,post参数在请求的body中

    HTPS请求

    SSL 通过加密防止窃听,通过签名来防止篡改,通过证书来防止冒充

    HTTPS协议在客户端与服务端开始通信前,会进行密钥协商,通过一轮非对称加密,后续通信过程中使用对称加密,在密钥协商过程中,服务端会将自己的证书发送给客户端,客户端会到CA机构通过摘要验证证书的合法性,从而防止中间人攻击

    TCP网络连接

    http请求发出后会将数据包交给下层协议栈处理,在传输层和网络层该数据包会被分别加上TCP头和IP头,并且被发送出去,沿路的网关会收到这个数据包并进行识别和转发,直到该数据包被服务器收到,通过相同的流程返回回复数据包

    页面渲染

    一般来说浏览器第一次从服务器请求的资源都是一个HTML文件,例如服务端默认的 index.html 等,浏览器获取到这个HTML文件就会对其进行解析,构建出一颗DOM树,并通过执行其中的js代码发起更多的请求,请求渲染页面需要的其他资源,CSS或者一些外链的图片等,拿到CSS后将其与DOM树结合进行更近一步的渲染,我们就能看到页面了

    状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果。借助于状态码,浏览器(或者说用户)可以知道服务器是正常的处理了请求,还是出现了错误。

    数字的第一位指定了响应类型,后两位无分类。响应类别一共有5种:

    1XX Informational(信息性状态码)

    2XX Success(成功状态码)

    3XX Redirection(重定向状态码)

    4XX Client Error(客户端错误状态码)

    5XX Server Error(服务器错误状态码)

    常见状态码

    100 Continue 继续,一般在发送post请求时,已发送了http、header之后服务端将返回此信息,表示确认,之后发送具体参数信息

    200 OK 正常返回信息

    201 Created 请求成功并且服务器创建了新的资源

    301 Moved Permanently 请求的网页已永久移动到新位置。

    302 Found 临时性重定向。该状态码表示请求的资源已被分配了新的URI,希望用户(本次)能使用新的URI访问

    400 Bad Request 服务器无法理解请求的格式,客户端不应当尝试再次使用相同的内容发起请求。

    403 Forbidden 该状态码表明对请求资源的访问被服务器拒绝了

    404 Not Found 找不到如何与 URI 相匹配的资源。

    500 Internal Server Error 最常见的服务器端错误。

    503 Service Unavailable 该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求

涉及协议:

(1)应用层HTTP(www访问协议),DNS(域名解析服务)

(2)传输层TCP(为HTTP提供可靠的数据传输),UDP(DNS使用UDP传输)

网络层:IP(IP数据包传输和路由选择),ICMP(提供网络传输过程中的差错检测),ARP(将本机的默认网关IP地址映射成物理MAC地址)

 

操作系统详解

https://leetcode-cn.com/circle/discuss/zIxrWn/

  1. 堆与栈的区别

    堆是用户控制的,我们可以使用malloc这种命令来在堆中申请内存,而栈是由操作系统控制的,在栈中存储是这个进程的局部变量等,比如我们用malloc来申请一块内存,内存本身是在堆中开辟的,而指向这块内存的指针存储在栈中

  2. 进程通信的各种方法

    进程间通信的方式通常分为管道、系统IPC、套接字三种,其中管道有无名管道、命名管道、系统IPc有消息队列、信号、共享内存

    • 无名管道的本质是在内存缓冲区的环形队列,每次读取数据后缓存区都会移动,并且无名管道只能在有亲缘关系的进程间使用

    • 命名管道则以文件的形式存在,由于有一个路径名,使用没有亲缘关系的进程间可以使用命名管道

    • 消息队列是存放在内核中的消息链表,具有特性的格式,支持多种数据类型,且允许多个进程和内核间通信

    • 共享内存顾名思义就是两个进行对同一块内存进行读写,是最快的IPC形式,但不适合大量的数据传输

    • socket是对TCP/IP协议族的封装,不仅可以用于本机上的进程间通信,更多的被用于网络通信中

  3. 进程的互斥与同步

    当有多个线程的时候,经常需要去同步这些线程以访问同一个数据或资源。例如,假设有一个程序,其中一个线程用于把文件读到内存,而另一个线程用于统计文件中的字符数。当然,在把整个文件调入内存之前,统计它的计数是没有意义的。但是,由于每个操作都有自己的线程,操作系统会把两个线程当作是互不相干的任务分别执行,这样就可能在没有把整个文件装入内存时统计字数。为解决此问题,你必须使两个线程同步工作。

    所谓互斥,是指散布在不同进程之间的若干程序片断,当某个进程运行其中一个程序片段时,其它进程就不能运行它们之中的任一程序片段,只能等到该进程运行完这个程序片段后才可以运行。如果用对资源的访问来定义的话,互斥某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的

    所谓同步,是指散步在不同进程之间的若干程序片断,它们的运行必须严格按照规定的某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。如果用对资源的访问来定义的话,同步是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源

  4. 线程与进程区别

    进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。线程是进程的一个实体,是CPU**调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行多进程,允许多个任务同时运行;多线程**,允许单个任务分成不同的部分运行;

    进程和程序的区别:进程即运行中的程序,从中即可知,进程是在运行的,程序是非运行的,当然本质区别就是动态和静态的区别。程序可以存在外存中,也可以存在内存中。

    进程和线程的关系:

    (1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。 (2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。 (3)处理机分给线程,即真正在处理机上运行的是线程。 (4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。线程是指进程内的一个执行单元,也是进程内的可调度实体.

    进程与线程的区别:

    (1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位 (2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行 (3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源. (4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。

  5. 死锁的解决方法

    死锁的产生是在这样一种环境中,比如我们有两个进程AB,她们都需要资源1和资源2,当进程A持有资源1,进程B只有资源2的时候,她们都需要对方手上的进程,而一般操作系统 不会允许抢占,这个时候就会发生了死锁

    从这个例子中其实可以总结出死锁的几个必要条件:

    • 一个资源只能被一个进程占有,不能共享

    • 一个线程请求资源失败时,它会等到而不是释放

    • 一个线程在释放资源之前其他进程不能抢夺资源

    • 循环等待

    设计一些方法避免死锁发生

    • 静态分配资源,一开始就把一个进程所需的全部资源都分配给它,但这样会降低资源的使用效率

    • 允许抢占,需要设计进程的不同优先级,高优先级的进程可以抢占低优先级的进程资源

    • 把资源进行编号,申请资源必须按照资源的编号顺序进行申请

    如果死锁发生了,就需要去解开死锁,其本质思想就是分配资源打破循环等待

    • 可以运行抢占,从一个或多个进程中抢出资源来给其他进程

    • 也可以终止一些进程,来达到释放资源的目的

     

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值