一.计算机网络
Github地址:https://github.com/liangtaichi/Notes/blob/master/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E7%9F%A5%E8%AF%86%E7%82%B9%E6%A6%82%E6%8B%AC.md
1.get请求和post请求的区别
- get和post都是http协议里发送请求方式之一。
- 最直观的区别是get把参数包含在url里面;post通过request body来传递参数。
- 比较微观的是:get方式请求,浏览器会把:header和data一起发送,服务器相应;post方式请求,浏览器先发送header,然后服务器响应,然后浏览器再发送data,服务器再响应。
2.在浏览器网址输入一个url后直到浏览器显示页面的过程 (这边面试官可能会详细的考察DNS服务器的知识)
-
输入地址
- 此时浏览器已经在匹配url
-
浏览器查找url对应ip地址:
- 浏览器查找hosts文件,如果文件里面有,直接利用hosts里面的ip地址。
- hosts没有时,浏览器发送DNS请求到本地的DNS服务器(本地DNS服务器一般会接入运营商,如电信、联通等)
- 查询到网址的dns请求后,本地dns先查询自己的缓存,如果有直接返回,没有则向根dns服务器查询。
- 根dns服务器没有记录具体域名与ip地址的对应关系,指挥告诉本地dns服务器对应的根服务器地址,让本地dns服务器去跟地址请求。
- 本地dns继续向域名服务器发送请求,对应域名服务器也不会直接返回域名与ip地址的对应关系,而是告诉本地dns域名解析服务器的地址。
- 本地dns收到域名解析服务器地址后,发送请求,就收到ip地址与域名的对应关系。
- 收到后,本地dns服务器不仅要将此关系返回,还要缓存此关系,下次用户访问时,直接从缓存区取出,加速访问。
-
TCP连接
- 客户端发送一个带 SYN=1,Seq=X 的数据包到服务器端口(第一次握手,由浏览器发起,告诉服务器我要发送请求了)
- 服务器发回一个带 SYN=1, ACK=X+1, Seq=Y 的响应包以示传达确认信息(第二次握手,由服务器发起,告诉浏览器我准备接受了,你赶紧发送吧)
- 客户端再回传一个带 ACK=Y+1, Seq=Z 的数据包,代表“握手结束”(第三次握手,由浏览器发送,告诉服务器,我马上就发了,准备接受吧)
-
发送http请求报文。
- 请求行包含请求方法、url、协议版本。
- 请求头包含请求的附加信息,由关键字、值对组成,每行一对,关键字和值用英文冒号“:”隔开。
- 请求体,可以承载多个请求参数的数据,包含回车符、换行符和请求数据,并不是所有请求都有请求数据。
服务器处理请求并返回http报文。
-
浏览器解析渲染页面。
- 根据html解析dom树
- 根据css解析生成css规则树
- 结合dom和css生成渲染树
- 根据渲染树计算每一个节点的信息
- 根据计算好的信息绘制页面
-
断开连接(tcp四次挥手)
- 发起方被动发送报文:fin、ack、seq,表示已经没有数据传输了,并进入fin-wait-1状态。(第一次挥手由浏览器发送,表示自己报文已经发送完成,让服务器准备关闭)。
- 被动方发送报文:ack、seq,表示同意关闭请求,并进入fin-wait-2状态。(第二次挥手:由服务器发起,告诉浏览器:我的请求报文接收完了,我准备关闭了,你也准备吧)
- 被动方发起报文fin、ack、seq,请求关闭连接,并进入last-ack状态。(第三次挥手,由服务器发起,告诉浏览器我的报文已经发送完毕了,你准备关闭吧)
- 发起方发送报文,ack、seq,然后进入等待状态,一定时间内没有回复,则正常关闭。(第四次挥手:由浏览器发起,告诉服务器,我的响应报文接受完了,你也准备吧)
(补充)dns服务器是什么,有什么用?
- DNS是domain name system ,域名系统。
- 是英特网上作为域名和ip地址的相互映射的一个分布式数据库,能够使用户更加方便的访问互联网,而不是去记住ip地址串。通过主机名,最终得到ip地址的过程叫做域名解析。
- 域名解析的好处是我们不用记住ip地址串了,直接记住域名即可,坏处是可能dns被污染或劫持,使相应的用户无法访问对应的网站(主机)。
3.tcp三次握手和四次挥手的过程 (为什么不可以两次握手,为什么握手要三次,挥手需要四次)
三次握手
- tcp服务器进程先船舰传输控制模块tcb,时刻准备接受客户端进程的连接邀请,此时服务器进入了listen(监听)状态
- tcp客户端进程也是先创造tcb传输控制模块,然后向服务器发送请求报文,这时报文首部syn=1.同时选择一个初始序列号seq=x,此时,tcp客户端进入syn-sent(同步已发送状态)。tcp规定,syn报文不能携带数据,但是需要消耗一个序号。
- tcp服务器收到请求报文后,如果同意连接,发送确认报文。确认报文中,ack=1,syn=1,确定号是ack=x+1,为自己初始化一个seq=y,此时,tcp服务器进入syn-rcvd(同步收到)状态。这个报文也不能携带数据,消耗一个序号。
- tcp收到确认后,还要向服务器给出确认。确认保温ack=1,seq=x+1,ack=y+1.此时,tcp连接,客户端进入established(已连接)状态。tcp规定,ack报文可以携带数据,如果不懈怠,则不消耗序号
- 服务器收到tcp的确认后,也进入ESTABLLISHED状态,此后双方可以正常通信。
为什么tcp客户端最后还要发送一次确认?
- 防止已失效的连接请求报文又重新传到服务器,从而发生错误。
- 假设是两次握手,tcp客户端发送了一个请求,没有丢失但是在网络节点滞留时间很长,由于tcp认为服务器没有收到,再发送一个,结果第二个连上了,第一个才到,那么就再次建立连接。
四次挥手
客户端发送释放报文,并且停止发送数据。释放数据报文首部Fin=1,序列号为seq=u(前一个发送过来的序号+1),此时,客户端进入fin-wait-1(终止等待)状态。tcp规定,fin报文段不懈怠数据,也要消耗一个字段。
服务器收到连接释放报文,发出确认报文ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了close-wait(关闭等待)状态。tcp服务器通知高层应用进程,客户端要向服务端释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器如果发送数据,客户端也照常接受。这个状态要持续一段时间,就是整个close-wait状态持续时间。
客户端收到服务器请求后,就进入fin-wait-2状态等待服务器发送连续释放报文(在这之前还要服务器发送最后的数据)。
服务器最后数据发送完毕后,向客户端发送连接释放报文。fin=1,ack=u+1,由于在半关闭状态,服务器可能又发送一些数据,假定此时的序号为seq=w,此时,服务器进入了last-ack(最后确认)状态。
客户端收到服务器的连接释放报文之后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入time-wait状态。注意此时tcp连接还没有释放,必须经过2msl(最长报文段寿命)的时间后,当客户端撤销相应的tcb后,才进入closed状态。*
服务器只要接收到客户端的确认,立刻关闭,同样,撤销tcb后,就结束了这次tcb连接。可以看到,服务器结束tcp连接的时间比客户端早一点。
为什么客户端最后还要等待2MSL?
MSL(Maximum Segment Lifetime),TCP允许不同的实现可以设置不同的MSL值。
第一,保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。
第二,防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中不会出现旧连接的请求报文。
4.七层OSI模型或TCP/IP协议模型 (各层分别实现了什么协议)
应用层
- 应用层(application-layer)的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通信和交互的规则。对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如域名系统DNS,支持万维网应用的 HTTP协议,支持电子邮件的 SMTP协议等等。我们把应用层交互的数据单元称为报文。
传输层
-
传输层(transport layer)的主要任务就是负责向两台主机进程之间的通信提供通用的数据传输服务。应用进程利用该服务传送应用层报文。“通用的”是指并不针对某一个特定的网络应用,而是多种应用可以使用同一个运输层服务。由于一台主机可同时运行多个线程,因此运输层有复用和分用的功能。所谓复用就是指多个应用层进程可同时使用下面运输层的服务,分用和复用相反,是运输层把收到的信息分别交付上面应用层中的相应进程。
传输层主要使用以下两种协议:
- 传输控制协议 TCP(Transmission Control Protocol)--提供面向连接的,可靠的数据传输服务。
- 用户数据协议 UDP(User Datagram Protocol)--提供无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)。
网络层
在 计算机网络中进行通信的两个计算机之间可能会经过很多个数据链路,也可能还要经过很多通信子网。网络层的任务就是选择合适的网间路由和交换结点, 确保数据及时传送。 在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。在 TCP/IP 体系结构中,由于网络层使用 IP 协议,因此分组也叫 IP 数据报 ,简称 数据报。
这里要注意:不要把运输层的“用户数据报 UDP ”和网络层的“ IP 数据报”弄混。另外,无论是哪一层的数据单元,都可笼统地用“分组”来表示。
这里强调指出,网络层中的“网络”二字已经不是我们通常谈到的具体网络,而是指计算机网络体系结构模型中第三层的名称.
互联网是由大量的异构(heterogeneous)网络通过路由器(router)相互连接起来的。互联网使用的网络层协议是无连接的网际协议(Internet Protocol)和许多路由选择协议,因此互联网的网络层也叫做网际层或IP层。
数据链路层
数据链路层(data link layer)通常简称为链路层。两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。 在两个相邻节点之间传送数据时,数据链路层将网络层交下来的 IP 数据报组装成帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。
在接收数据时,控制信息使接收端能够知道一个帧从哪个比特开始和到哪个比特结束。这样,数据链路层在收到一个帧后,就可从中提出数据部分,上交给网络层。 控制信息还使接收端能够检测到所收到的帧中有无差错。如果发现差错,数据链路层就简单地丢弃这个出了差错的帧,以避免继续在网络中传送下去白白浪费网络资源。如果需要改正数据在链路层传输时出现差错(这就是说,数据链路层不仅要检错,而且还要纠错),那么就要采用可靠性传输协议来纠正出现的差错。这种方法会使链路层的协议复杂些。
物理层
物理层(physical layer)的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异, 使其上面的数据链路层不必考虑网络的具体传输介质是什么。“透明传送比特流”表示经实际电路传送后的比特流没有发生变化,对传送的比特流来说,这个电路好像是看不见的。
5.各种io模型的知识 (BIO,NIO,AIO)
1.BIO (同步阻塞I/O模式)
数据的读取写入必须阻塞在一个线程内等待其完成。
这里使用那个经典的烧开水例子,这里假设一个烧开水的场景,有一排水壶在烧开水,BIO的工作模式就是, 叫一个线程停留在一个水壶那,直到这个水壶烧开,才去处理下一个水壶。但是实际上线程在等待水壶烧开的时间段什么都没有做。
2.NIO(同步非阻塞)
同时支持阻塞与非阻塞模式,但这里我们以其同步非阻塞I/O模式来说明,那么什么叫做同步非阻塞?如果还拿烧开水来说,NIO的做法是叫一个线程不断的轮询每个水壶的状态,看看是否有水壶的状态发生了改变,从而进行下一步的操作。
3.AIO (异步非阻塞I/O模型)
异步非阻塞与同步非阻塞的区别在哪里?异步非阻塞无需一个线程去轮询所有IO操作的状态改变,在相应的状态改变后,系统会通知对应的线程来处理。对应到烧开水中就是,为每个水壶上面装了一个开关,水烧开之后,水壶会自动通知我水烧开了。
6.http协议和tcp协议的区别
tcp是传输层协议,主要解决数据如何在网络中传输的问题,而http是应用层协议,主要解决如何包装数据的问题。
把ip想象成一条高速公路,它允许其他协议在上面行驶并找到其他电脑的出入口。TCP和UDP使用该协议从一个网络传送数据包到另一个网络。把ip想象成一种高速公路,tcp和udp就是上面的卡车,用来运输http等各种协议
7.https和http的区别
- 端口:http的url由“http://”其实并且使用80端口,而https的url由“https://”起始且默认使用端口443
- 安全性和资源:http协议运行在tcp之上,所有传输都是明文,客户端和服务器都无法验证对方身份,https运行在ssl/tsl之上的http协议,所有传输内容都经过加密,采用对称加密,但对称加密的密钥服务器方的证书使用了非对称加密。所以说,http安全性没有https高,但是https比http消耗了更多的服务器资源。
8.https的请求过程
- 浏览器向服务器发起443端口请求,请求携带了浏览器支持的加密算法和哈希算法。
- 服务器收到请求,选择浏览器支持的加密算法和哈希算法。
- 服务器将数字证书返回给浏览器。
- 浏览器进入数字证书认证环节,这部分是浏览器内置的tsl完成的
- 浏览器会从内置的证书列表中索引,查找对应的机构。如果没有找到,那么会提示这个证书不是权威机构颁发,是不可靠的。如果找到,则取出对应机构的公钥。
- 用机构的公钥解密得到数字证书的内容和证书签名,内容包括网站网址、网站公钥、证书的有效期等。浏览器会先验证证书签名的合法性,签名通过后,浏览器验证证书记录的网址是否和当前网址一致,如果一致,就开始安全使用公钥,不一致提示用户。
- 浏览器生成一个随机数r,用公钥进行加密。
- 浏览器将加密的r发送给服务器。
- 服务器用自己的私钥解密得到r。
- 服务器将r作为密钥使用对称加密算法加密网页内容并且将内容传输给浏览器。
- 浏览器以r作为密钥使用之前约定好的解密算法获取网页内容。
9.http协议的发展历程
10.lvs,nginx,HA在七层网络协议中分别作用于哪层,各自的区别
11.tcp如何实现可靠传输 (如何实现udp的可靠传输)
- 数据被分割为tcp认为最合适发送的数据块。
- tcp给发的每一个包进行编号,接收方对数据包进行排序,把有序数据传给应用层。
- 校验和:tcp将保持它首部和数据的校验和。这是一个端到端的校验和,检测数据在传输过程中有无任何变化,如果有差错,则弃之不用。
- tcp接收端会丢弃重复数据。
- 流量控制:tcp连接的每一方都有固定大小的缓冲空间,tcp的接收端只允许发送端发送接收端缓冲区能够接纳的数据。用滑动窗口控制。
- 拥塞控制:当网络拥塞时,减少数据发送。
- arq协议:为了实现可靠传输,他的基本原理是每发完一个分组停止发送,直到收到对方的确认。
- 超时重传:当tcp发出一个分组后,启动计时器,当收不到确认,重新发送该报文。
arq协议
Automatic Repeat-reQuest,自动重传协议,是ois模型直以,包括停止等待协议和连续arq协议。
- 停止等待arq协议:停止等待是为了实现可靠传输,他发了一组就停止等待确认,过了一段时间没有回复就重新发送。
- 连续arq协议:设置一个发送窗口,凡是发送窗口内的分组都连续发送出去,不需要等待对方确认。接收方进行累计确认。
12.tcp和udp的区别
类型 | 特 | 点 | 性 | 能 | 应用场景 | 首部字节 | |
---|---|---|---|---|---|---|---|
是否面向连接 | 是否可靠 | 传输形式 | 传输效率 | 所需资源 | |||
tcp | 面向连接 | 可靠 | 字节流 | 慢 | 多 | 要求通信可靠 | 20-60 |
udp | 无连接 | 不可靠 | 数据报文段 | 快 | 少 | 要求通信速度高 | 8 |
- udp在传输数据之前不需要建立连接,远程主机接收到报文不需要给出任何确定。
- tcp提供面向连接服务,必须进行三次握手,四次挥手,不提供广播或者多播服务,只提供可靠的、面向连接的服务。