计算机网络

1.OSI七层模型

OSI网络七层模型详解 - 云计算成长路 - 博客园 (cnblogs.com)

2.TCPIP互联网协议群

2.1 要解决的五个问题

 2.1.1 报文拆分

        1.数据量大,网络底层设备不支持

        2.复用路径。拆包后传输的路径可以复用

 2.1.2 增加协议头

        数据拆分后在接收端需要重组,所以需要使用头部Head来添加一些描述字段(body)。

 2.1.3 数据在相邻设备间数据传递

 2.1.4 路由和寻址

 2.1.5 数据重组

2.2 优化后的5层模型

 5层模型和OSI七层模型的区别:

        1.删除了会话层,会话是虚拟概念,不是必须的。不需要一个伪连接,不需要在建立网络通讯。

        2.删除了表示层,数据压缩、数据格式转换不是必须的。如ping一个网址。

3.TCP协议

3.1什么是连接?

 3.2 全双工

       

 3.3 可靠的

3.3 TCP协议的工作过程

 

 解释:断开连接时,发送ACK后,服务端不能马上传FIN(finish)的,因为断开连接要处理的问题比较多,要释放资源,比如说服务端给客户端发了一些消息,但是客户端还没有收到,服务端不能确定自己要不要关闭连接,当服务端通过一段时间的等待确定自己可以关闭了,再向客户端发送FIN。客户端收到后处理完自己的时候后发送ACK服务端,断开连接结束。

断开连接的时候,服务端向客户端发送的ACK和FIN是没办法打包了,在建立连接的时候是可以打包的。

3.4 传输数据

3.4.1 报文拆分

 3.4.2 顺序保证

发送放为每个TCP段排序,接受方接收到之后根据顺序进行组装。 

如果TCP段特别多的话,就按照某个时间段内 的拆包顺序处理。如果某个TCP段不在时间窗口内(也就是时间窗口内的数据不是连续的),就会觉得时间窗口不完整,会抛弃掉一个完整的时间窗口,要求发送方重新发送。   

因为是双全工,所以1个序号是不够用的,所以TCP序号分为两种:发送序号Seq、接收序号Ack

 

 3.4.3 传输过程

 问题:

1.如果此时A发送给B两条数据Syn:101和102,服务端结收到了101还未接收到102,那么Sync 102和服务端接收到的Ack = 101+1相同了,所以A发送102序号和B返回的102序号冲突了。所以需要发送序号Seq和接收序号Ack,两种序号来区分。  

 结论:

TCP/IP的设计者,没有用时间来确定数据的唯一,因为服务器之间的时间是相对的。

使用Seq和Ack来确保数据的唯一,用来TCP段的排序。

3.4.4 TCP头

 

 

 4.IP协议(IPV4)

 4.1分片

 4.2增加协议头

 

 

 

 

 

 

 

 

 

 总结:

首先IP协议会进行分片,将上游数据拆成一个个的封包(Datagram),然后为封包增加IP头。封包发送出去后,就开始寻址。寻址的过程就是找到IP地址对应的设备。在局域网内,如果找不到设备,就需要路由。路由就是找到数据应该往哪里发送,最后通过层层路由定位到具体的设备。寻址就是通过地址查找到设备,和我们生活中的寻址差不多,比如根据一个地址查找到一个大厦,在IPv4协议中,寻址找到的就是一个设备所在的位置。路由本质是路径的选择,就好像知道地址,但是到了一个十字路口,还需要选择具体的路径。寻址找到最终的设备,同时借助路由在每个节点选择数据传输的线路,因此寻址和路由是相辅相成的关系。  

(29条消息) 对于IPv4协议,寻址和路由有什么区别呢?_NeilNiu的博客-CSDN博客_寻址和路由

4.3 广播和多播

广播是将数据报发送到网络中的所有主机(通常是本地相连的网络);

多播是将数据报发送到网络的一个主机组;

 5.IP协议(IPV6)

5.1背景

因为IPV4有4个8位,共32位,所以只能支持2的32次方个设备,即43亿。  

 5.2 工作原理

 5.4 IPV4和IPV6的区别

5.4.1 地址

 

 

5.4.2 寻址

 

 

总结:1.解决了IP地址耗尽的问题 2.解决了网络区域站点划分的问题,可以给站点机构大量的地址,不用再划分很多子网。3.对多播的支持更好。4.在数据链路层,新设备接入的时候,使用了ND协议,做到了无状态设备介入。

6.UDP协议

 

 

 问题:

1.聊天室场景是否适合UDP?

答:不适合,聊天室并发高但是流量不大,依赖可靠性

2.Http协议适不适合UDP?

答:适合,Http3.0就是建立在UDP之上的。

7.Wireshark

8.Socket

 

 内核收一个包是流程是怎样的???

9.Http协议 

9.1Http协议上

 

 DNS记录

A记录中定义的是example.com的IP

 

 

 

 CDN内容分发

 

总结:

本次主要学习了Http协议的基本描述、DNS、CDN 

9.2 Http协议中(请求头和返回头)

 

 

 

 

 

 

9.3 Http协议下

9.3.1 缓存

 

 

 9.3.2 代理

 

 正向代理是很明确的知道,自己使用的是代理服务器;反向代理不知道自己请求的是代理服务器; 

9.3.3 KeepAlive

 KeepAlive

 

 

 9.4 加密、解密、证书

 ​​​​​​​

 公钥加密系统中,加密和解密是相对独立的,加密和解密会使用两把不同的密钥,加密密钥(公开密钥)向公众公开,谁都可以使用,解密密钥(秘密密钥)只有解密人自己知道,非法使用者根据公开的加密密钥无法推算出解密密钥,这样就大大加强了信息保护的力度。公钥密码体制不仅解决了密钥分配的问题,它还为签名和认证提供了手段。

摘要算法:MD5、SHA1,特点:公开、一致、难碰撞、不可逆

 加密算法效率:

摘要算法>对称加密>非对称加密

 即使用户拿到数据库存储的MD5值,也无法解密,因为摘要算法是不可逆的。

总结:本节对互联网的信任,加密、解密、验签做了系统的介绍。 

10. Htpps和Htpp2.0

10.1 https

 

 Htpps过程分为以下几步:
1、浏览器发起往服务器的 443 端口发起请求,请求携带了浏览器支持的加密算法和哈希算法。
2、服务器收到请求,选择浏览器支持的加密算法和哈希算法。
3、服务器下将数字证书返回给浏览器,这里的数字证书可以是向某个可靠机构申请的,也可以是自制的。(注释:证书包括以下这些内容:1. 证书序列号。2. 证书过期时间。3. 站点组织名。4. 站点DNS主机名。5. 站点公钥。6. 证书颁发者名。7. 证书签名。因为证书就是要给大家用的,所以不需要加密传输)
4、浏览器进入数字证书认证环节,这一部分是浏览器内置的 TSL 完成的:
4.1 首先浏览器会从内置的证书列表中索引,找到服务器下发证书对应的机构,如果没有找到,此时就会提示用户该证书是不是由权威机构颁发,是不可信任的。如果查到了对应的机构,则取出该机构颁发的公钥。
4.2 用机构的证书公钥解密得到证书的内容和证书签名,内容包括网站的网址、网站的公钥、证书的有效期等。浏览器会先验证证书签名的合法性(验证过程类似上面 Bob 和 Susan 的通信)。签名通过后,浏览器验证证书记录的网址是否和当前网址是一致的,不一致会提示用户。如果网址一致会检查证书有效期,证书过期了也会提示用户。这些都通过认证时,浏览器就可以安全使用证书中的网站公钥了。
4.3 浏览器生成一个随机数 R,并使用网站公钥对 R 进行加密。
5、浏览器将加密的 R 传送给服务器。
6、服务器用自己的私钥解密得到 R。
7、服务器以 R 为密钥使用了对称加密算法加密网页内容并传输给浏览器。
8、浏览器以 R 为密钥使用之前约定好的解密算法获取网页内容。
 

注释:
第3步中,证书的内容包含的证书的签名是什么?签名是指利用上一层证书的私钥,加密一些元信息(证书所有者的信息,包括基本信息,公钥,证书生效域名等)。这样,当收到签名证书时,只需要根据CA提供的公钥对签名解密,验证元信息是否一致,就可以判断当前证书是否合法。一句话来说就是,每个证书会对下一层的证书合法性做担保 。
第4步中,怎么认证数字证书?
客户端怎么确认你的证书是合法的呢。首先你的证书会在https握手过程中被传递到浏览器,浏览器从你的证书中找到了颁发者,从颁发者的证书(如果你电脑上有的话)又找到了CA的证书(CA证书会在操作系统安装时就安装好,所以每个人电脑上都有根证书),使用CA证书中带的公钥来对颁发者证书做验签,一旦匹配,说明你电脑上的颁发者证书不是伪造的,同理,再用颁发者证书中的公钥去验证你的证书,以此证明你的证书不是伪造的。这样整个链状的验证,从而确保你的证书一定是直接或间接从CA签发的,这样浏览器地址栏会显示一个绿色的盾牌,表示你的网站能通过证书验证
如果你的电脑上没有颁发者证书(断链)或者你自己本身就是自签名证书(自己做CA,但是要记得,人家电脑上并没有装你的自签名根证书),那么浏览器会报警提示不能验证证书,问你是否还需要继续。

私钥可以生成公钥
公钥可以解开私钥加密的数据
私钥可以解开公钥加密的数据
公钥无法解开公钥加密的数据

ca证书就是为了保护公钥,防止中间人伪造。
证书=密文(第三方私钥加密服务端公钥)+签名(hash 服务端公钥)+签名算法
 

10.2 Htpp 2.0

 

 

 总结:http2.0主要讲了对网络的优化,如压缩、多路复用。

11.同源策略

 解决方案:

1.JSONP

(29条消息) 彻底弄懂jsonp原理及实现方法(跨域问题)_阿学世界的博客-CSDN博客_jsonp跨域原理

jsonp的缺点

    • 只能发送get请求。因为script只能发送get请求
    • 需要后台配合。此种请求方式应该前后端配合,将返回结果包装成callback(result)的形式。

2.预检 

 第一步为预检,携带请求源和请求header,

第二步为同意第一步的预检,返回源信息、请求method、缓存过期时间(未过期只会发起一次options请求)等信息,

第三步为按照第二步同意的信息,重新请求。

预检请求

在发出跨域请求时,如果是非简单请求, 浏览器会自动帮你先发出一个OPTIONS查询请求,称为预检, 用于确认目标资源是否支持跨域,允许后才发送 在简单请求必须满足两个条件:

  1. 使用的方法必须是(之一):head,get,post
  2. 请求的header是: Accept, Accept-Language, Content-Language, Content-Type: 只限于三个值:application/x-www-form-urlencoded、multipart/form-data、text/plain

我们经常用的post+ Content-Type=application/json 也属于非简单请求,这个时候可以让服务器端设置Access-Control-Max-Age字段,这样在缓存未到期时间内,只会发起一次option请求

减少CORS预请求的次数

方案一:发出简单请求

方案二:服务端设置Access-Control-Max-Age字段,在有效时间内浏览器无需再为同一个请求发送预检请求。但是它有局限性:只能为同一个请求缓存,无法针对整个域或者模糊匹配 URL 做缓存

同源策略以及跨域、预检请求 - 掘金 (juejin.cn)

3.使用代理

 总结:本节主要学习了,服务端解决同源策略的三种方法。1.JSONP 2.预检 3.CORS 4.代理

11.Linux网络指令

12.计算机网络复习+面试题

1.TCP/IP协议群做了哪些事情?

2.TCP协议为什么是三次握手,四次挥手??

TCP三次握手时,因为有两条消息是合二为一的,而在四次挥手的时候,这两条消息是要分开发送的。

 服务端给客户端的ACK响应、服务端给客户端再次发起握手的SYN请求,这两步是可以合二为一的。原因是因为现在客户端和服务端,都处于初始状态,本身没有其他事情在做,其实他们在建立连接的时候还没有数据在发送,所以说此时是可以合并的。而四次挥手时,为什么服务端给客户端的ACK响应、FIN状态不可合并呢??因为此时可能还有服务端发出的请求客户端还没有收到客户端发给服务端的请求,服务端还未收到,所以此时服务端本身需要有准备时间,所以ACK和FIN是不可合并的。

3.IPV4和IPV6的区别

IPV4用.分隔开,IPV6用:分隔开

4.TCP和UDP的区别

 TCP是面向流的,客户发送服务端的是流,对于服务端而言,会把客户端发送的数据理解为流,会监听数据的到来,流就是未来可能会产生的数据。UDP时候,是面向报文的,客户端给服务端发送的都是报文。

TCP是有握手的过程的,会建立连接,建完连接之后才会通讯。而UDP一个数据发过去之后,准备好了就是准备好了,没准备好就是没准备好。UDP的目标就是想在传输层给用户提供直接封包的能力。

TCP的头部信息和UDP的头部信息不一致。

TCP保证正确性,UDP不保证。http3.0使用了UDP,可以在UDP之上再搭建正确性、可靠性的协议。

UDP实现广播成本低,因为不需要建立连接。

UDP开销小,成本低,比如说ping一个网站的时候就是用的UDP。

5.TCP如何保证拆包后的数据顺序

 数据在传输的过程中,在发送方式需要拆分、封包的,拆分过程是顺序的,但是经过网络、封包交换那数据就会无序。

6.如果网络延迟是30ms,那么ping一个网站需要多少ms?如果请求一个https协议的网站,TTFB(time to first bit,第一个二进制返回的时候)需要至少ms?

如果是TCP协议,那么TCP三次握手延迟时间为90ms,如果是UDP协议,只有建立连接和返回的时间,去掉响应时间,那么时间至少为60ms

如果是https协议的网站,经历三次握手后90ms,服务端返回证书给客户端30ms,客户端发起与服务端协商秘钥30ms,服务端确认协商秘钥完成30ms,客户端传输数据。所以在传输数据之前至少耗时为180ms。

7.CND如何更换图片,缓存是如何更新的?

CDN全名为作内容分发网络,目标为:去中心化。

如果所有静态文件请求都请求到一台服务器,那么随着请求数量的增加,服务器肯定是支撑不住的。

CDN的实现方式就是智能DNS,比如请求A发给了智能DNS服务器,智能DNS服务器会帮助我们CNAME请求到离目标资源最近的服务器,动态的分布资源。

更换图片面临的问题。1.CND服务器之间的图片缓存,2.用户浏览器的缓存

浏览器的强制缓存的时间肯定是天级别的,我们肯定等不及那我们只能用另外一张图片URL都要变掉。

缓存更新只能是用一个缓存更新的服务器,将各个CDN服务器上的图片缓存更新掉。

 8.LRU(Least Recently Used,即最近最少使用)是什么???

比如CPU的缓存,L1、L2、L3级别的缓存,会将时间上最早的数据清除掉。

 9.什么是Https中间人攻击?

 要想实现中间人攻击,黑客一定要将非法的根证书安装到用户的客户端,如钓鱼、发送非法邮件、玩盗版邮件、插U盘到电脑上。因为只有只有将非法根证书安装到客户端,才会信任黑客伪造的证书(信任链的存在)。这样黑客就会明确知道客户的私密信息,篡改金额,修改密码等。

所有的调试工具,也是要测试中间人攻击的。

10.NIO有什么优势?

 现在大部分减少线程的切换,用的都是Reactive模型+非阻塞的方式,如携程。

NIO能提供用户级别的拷贝,有什么作用呢?JVM运行的程序通常是在内核的用户空间(用户态),内核的程序是运行在内核空间(内核态),如果内核级别不支持拷贝到JVM,那么就要进行系统调用,JVM线程发起读取socket文件的请求(系统调用请求),需要切换,增加从用户态到内核态的切换成本,是一种消耗。NIO可以减少系统调用,减少内核级别的切换,方法就是直接以内核级别的程序映射到JVM,很底层的程序,这个程序可以避免很多内核程序的拷贝,避免很多用户态到内核态的切换。 

可以灵活的使用缓冲区,NIO中的缓冲区操作都是O(1)的,可以灵活的控制这些指针。

所以在处理所有的IO场景下有明显的的优势。如RPC调用、写日志文件。

写日志文件完全有可能将CPU写满,因为每来一个请求,包括如下IO:从网卡读数据读到Socket,再读到用户空间(用户态),再读到JVM中,会有较大的消耗,可以用NIO去减少。

来一条请求写一条日志,也是非常消耗性能的,问题是用户可能在执行程序的过程中在不停的写,此时不可再创建很多的阻塞线程写日志,因为会将CPU的IO/wait写满。

(29条消息) 如何理解 iowait_Linux开发那些事儿的博客-CSDN博客_iowait

11.一次DNS查询最快和最慢差距有多大?

不考虑一致性的场景,可以考虑使用DNS分级缓存

 12.Http keep-alive 和Http2.0的多路复用有什么区别?

 13.强制缓存和协商缓存的区别???

14.正向代理和反向代理的区别???

正向代理:用户可以真正意识到代理服务的存在的,用户清除请求的是代理服务器。

反向代理:用户不知道有代理服务器,以为请求的是目标资源,用户请求后,通过反向代理,将客户请求转发给内部服务器或目标网站。

最大的区别就是用户有没有意识到有代理服务器

最大的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值