计算机网络基础

说说ARP协议以及他的工作原理:
ARP协议就是地址解析协议,他的功能就是通过IP地址获取到物理MAC地址。
为什么我们需要MAC地址呢?一种说法就是MAC地址记录着下一跳的地址的值,IP地址则记录的是终点的值,所以我们需要不断地中转来达到最终地IP地址。
工作原理:

  1. 主机A检查自己的ARP缓存中是否存在该IP对应的MAC地址,如果有的话直接使用缓存中的MAC地址即可。
  2. 如果没有的话,主机A广播一个数据包(其中包含自己(发送方)的IP地址和MAC地址以及目标地IP地址),本地网络中的所有主机都会收到该数据包,并且取出里面的IP地址和自己的IP地址进行比较,如果不同,就直接丢弃该数据包
  3. 如果相同的话,当前主机B会将主机A(发送方)的MAC地址加入缓存,然后根据包里主机A的IP地址和MAC地址发送给A自己的ARP信息。
  4. A收到来自B的ARP信息后,将其加入自己的缓存,然后就可以发起通信了。(该缓存有生命期限的,过期了的话就会重复第一步)

应用层都有哪些协议
5. DNS(Domain Name System):提供域名到IP地址的映射
6. FTP (File Transfer Protocol):文件传输协议
7. HTTP (HyperText Transfer Protocol):上网的
这些协议说白了就是定义了
各种消息的类型:请求消息,响应消息
各种消息的语法和语义
以及各种规则

计算机网络5层协议
应用层(报文):
功能:为用户的应用提供服务的地方
使用协议:主要有DNS,FTP,HTTP这类我们常用的协议。

运输层(报文段/用户数据报):
功能:

  • 复用:将上层多个应用层应用报文报文分段
  • 分用:将下层报文段重组分发给各个应用。

使用协议:TCP使用的是报文段,而UDP使用的是用户数据报。
引用自https://blog.csdn.net/zhangliangzi/article/details/52554439
说下值得说的:
序号:就是代表我方发送的数据的序号
确认号:代表希望下一次希望接收到的TCP数据段序号(确认号之前所有的数据都已经接收到了)
数据偏移:代表TCP数据部分的第一个数据是从报文头第一个数据之后多少开始的即:TCP报文段首位+数据偏移量=TCP数据部分的第一个数据位置(因为TCP头部长度不是固定的)
引用自https://blog.csdn.net/zhangliangzi/article/details/52554439

网络层(数据报):
功能:

  • 将运输层的报文段/用户数据报封装成数据报
  • 确定传输时中间途径的网络节点和路由(因为ARP协议提供了MAC地址)

使用协议:IPARP

引用自https://blog.csdn.net/jhg1204/article/details/41624169
这里说些值得说的:
16位标识符:确认该数据报独一无二的标识。
3位标志:分别是保留位,分片位,不分片位
13位片偏移:如果有分片的话,那么就需要知道该片相对于原始数据报的偏移量(这样才能拼的回去)
8位生存时间:代表该数据报最多可以经过多少的路由节点。

数据链路层(帧):
功能:

  • 对上层下来的数据提供点对点的传输(因为是在这一层加上MAC地址头部的)
  • 对下层上去的数据提供纠错和修正

物理层(比特流):
功能:传输比特流

注意!!!
五层模型其实是OSI七层模型和TCP/IP四层模型的结合
TCP/IP四层模型是将链路层和物理层合为一体了。
而OSI模型则是多了两层:

  • 表示层:解码和编码(翻译),压缩解压缩之类的
  • 会话层:管理不同主机间应用的会话的(开启或者关闭)

同时TCP/IP也不是单指TCP和IP这两个协议,他们只是有代表性的两个协议,真正的是一堆协议组成的协议簇。

为什么需要四次挥手:
TCP是全双工的,这意味着他可以同时接收也可以发送。四次挥手其实前两次就是关闭客户端对服务端的发送通道,后两次关闭的是客户端对服务端的接收通道。之所以会比三次挥手多一次,也就是因为客户端发送给服务端结束的(FIN=1)消息后,服务端仍有消息要发送,处于close_wait状态。而在建立连接的时候这种情况是不可能发生的,因为连接都还没建立自然不可能发送数据报文。

为什么需要三次握手:
因为客户端和服务端都需要自己的接收和发送能力都是正常的。
第一次是服务端确认客户端的发送能力正常以及自己的接收能力正常(此时客户端不知道自己的发送以及服务端的接收是否正常)
第二次是客户端确认自己的发送能力正常以及服务端的接收能力正常(此时服务端不知道自己的发送能力以及客户端的接收能力是否正常)
第三次是服务端确认自己的发送能力正常以及客户端的接收能力正常。

为什么建立连接的时候需要最后一次ACK:
就像上面说的为了让服务器确认自己的发送正常且客户端接收正常。
同时还有一种情况,
1.客户端发送了一个连接请求A,但是A滞留在网络中太久了,
2.所以客户端又发送了一个连接请求B,请求B先到了服务端,然后就建立了连接。
3.后来迟到的A到了,服务端就返回了一个ACK
注意!如果此时是“两次握手就建立连接的话”那么此时服务端一旦发送了ACK(客户端不会搭理这个ACK,因为他已经建立连接了),新的连接就建立了,但是这个新的连接其实是没用的,只是服务端空耗资源进行等待而已。而如果是三次握手的话,收不到客户端的第二次ACK,连接也不会建立,也就不会出现这种白白建立连接的情况了。

什么是TCP粘包问题,为什么会出现这样的问题
主要是nagel算法会将数据量较小,间隔较短的的几个数据包合并为一个,为了提高效率嘛。然后传输的时候是以流的形式进行传输的,而流数据是没有明确的开始结尾边界
来自https://www.cnblogs.com/vipstone/p/14239160.html

如果这些数据是来自同一组文件的话,那其实是没问题的,TCP是可以保证按照发送顺序传输的。正常的拼接即可。
但是如果是来自不同组的文件的话,那这就是个问题了,最好的方法就是使用特殊标记来确保消息的间隔(格式化数据,有特定的开始和结束符号),比如说A的尾巴黏上了B的头,但是我们读到了A的结束标记,那么我们就可以把他们分开来了,粘包问题解决。
UDP是面向消息传输的,严格执行一个包就发送一次,是有保护消息边界的,接收方一次只接受一条独立的信息,所以不存在粘包问题。

TCP和UDP的区别:
TCP:面向连接,安全可靠,点对点传输,效率低,有流量控制,所以会拆分/合并报文(报文长度是动态的),首部开销大。
适用场景:数据完整性要求大于数据实时性
UDP:面向消息,不安全,可以多播,广播,效率高,没有流量控制,不会拆分/合并报文,首部开销小。
适用场景:数据实时性要求大于数据完整性

如何使UDP变得可靠
一个原则就是让他变得像个TCP,但是我们不会在运输层做手脚,而是去应用层:
在应用层:

  1. 加入超时重传机制
  2. 加入序列号和确认号的机制
    或者直接使用RUDP这种已经实现好了的可靠UDP协议。

TCP的缓冲区是什么,有什么作用
每个Socket都会带有一个输入缓冲区和一个输出缓冲区。
我们write()的时候,只要写进去了就会直接返回,剩下数据的发送全部是交给TCP的。
缓存区主要是用来实现流量控制的,根据buffer的填充状态来确定流量的大小。比如说缓冲区快满了就要通知减缓消息的发送(减小窗口,因为TCP不会接收比窗口还大的数据,所以对方只能发送小于窗口大小的数据),这也就是滑动窗口机制了。

说说滑动窗口机制
其实就是通过观察输入缓冲区的状态,来调节首部里面窗口的值实现流量控制而已。
但是有一个特殊情况就是缓冲区满了,那么就会发送窗口为0的报文。这时,另一方(A)会启动一个计时器,周期性的发送报文询问B“现在的窗口是多少呀”,然后B会返回他当前的窗口大小。这么周期询问的目的是防止B端发送了报文然后途中丢失了,A端在那里死等。
注意TCP使用的是ARQ协议而不是停止等待协议,ARQ协议意味着可以发送多个分组然后等待确认而不是发送一个分组等待确认了之后才可以发送下一个。

说说HTTP 2.0 和 1.1 区别
首先HTTP1.0的时候,一个请求就会开启一个连接,响应结束连接关闭,如果有多个请求就要多次建立、关闭连接,这是很消耗资源的。虽然我们可以在HTTP1.1的时候,在首部设置Keep-alive,保持一个连接一定时间不关闭,也就是所谓的长连接,但是处理请求的时候我们还是串行化处理的,也就是一个请求响应完了才会去处理下一个请求。而如果有多个请求需要同时并发处理,那么就需要建立多个连接,但是这个连接数是有限制的。
所以说1.x优化的关键不是高带宽而是低时延,因为你哪怕传送过去一点点,后面的也还是要等前面的处理完才能继续啊。
而HTTP2.0则使用了多路复用技术,在HTTP2.0中,所有解析都是基于二进制协议解析的,而1.x中则是基于文本解析的。在2.0中最小的数据单位就是二进制帧,这些帧则构成了流。那么他是怎么做到一路并发处理多个请求的呢?其实就是在帧里封装了该帧属于哪个请求的信息(id),这就意味着我们可以先传送一部分的请求A再传送一部分的请求B,这样就实现了一个连接并发处理多个请求了。比如这样①H ②W ①e ②o ①l ②r ①l ②l ①o ②d,根据id就可以还原出Hello请求和World请求了。

TCP中RST关键字的作用
其实就是异常情况下关闭连接的,比如4次挥手的时候,无法正常关闭。无法正常关闭,但是连接又占着资源,就会将RST置为1去强制关闭连接。

说说HTTP和HTTPS的区别
HTTPS其实就是HTTP层下加了SSL层,来确保连接的安全性。
他们主要的区别就是安全性

  1. HTTPS需要CA (Certificate Authority,证书颁发机构)申请证书,一般是要付费的,为了安全性付费。(安全性的代价)
  2. HTTP是明文传输的,基本上很容易被截取获得到里面的信息,而HTTPS是经过SSL协议加密过后的传输,更具有安全性。(安全性的好处)
  3. HTTP使用80端口,HTTPS使用443端口。(使用方式)
  4. 但是同时HTTPS这种较为安全的连接不是没有代价的,他需要更长的时间来握手建立连接。

说说HTTPS加密的过程:
在这里插入图片描述

  1. 客户端向服务端发起HTTPS连接请求,同时告诉服务端自己支持的加密算法列表。
  2. 服务端响应给客户端一个CA证书(包含了服务端的身份信息,公钥以及自己选取的加密算法)
  3. 客户端根据服务端选取的加密算法自己生成一个会话密钥(对称密钥)
  4. 客户端使用公钥对该会话密钥进行加密并发送给服务端
  5. 服务端利用自己的私钥解密,获得会话密钥(非对称加密)
  6. 开始通信

(注:对称密钥指的是双方用同样的方法加密和解密;公钥与私钥是一对的,公钥加密的信息只能使用私钥来解密,反之,私钥加密的信息同样只能使用公钥来解密,这就是所谓的非对称加密

我们看到了HTTPS采用了对称加密和非对称加密两种形式的混合加密,这是为什么?
第一个阶段非对称加密是为了防止中间密钥被截取,安全性更强(但不是没有漏洞的),中间人攻击一样可以实现,所以后来引入了证书和数字签名(也就是防止被中间人冒充)。
第二个阶段对称加密是为了加快加密解密的速度

第一阶段的时候我们就确保了双方安全的获得了只有自己知道的会话密钥。所以后面其实就可以用效率更高的对称加密了。

说说IP地址的分类
IP地址分为ABCDE五类
IP地址共4个字节
其中ABC就是网络位逐渐从1到3,主机位逐渐从3位到1位。
至于为什么要分类也很简单。
比如说你一个C类地址,你的路由器只用维护255个地址的路由表就好了,只要到了你这个网段的你就能找出来。但是如果不分类的话,那你是让每个路由器都维护2的32次个地址嘛?那显然是不现实的。

说说HTTP请求的组成:
其实主要就3个部分:请求行,请求头,请求体
请求行就是​ 请求方法字段、URL字段和HTTP协议版本
​ 例如:GET(请求方法字段) /index.html HTTP(URL字段)/1.1(HTTP协议版本)
请求头则就有很多了,主要都是键值对的形式。
比如:
User-Agent:客户端使用的浏览器类型
Accept:客户端支持的内容类型列表
Host:请求的主机名
接下来就是空行,代表请求头已经结束了。
然后就是请求体了。
请求体不在Get方法里面使用,Get方法中所有的客户端数据都在URL字段中提交了(即请求行),而Post则会用到请求体,比如客户端填写了表单,提交了大量的数据。

说说HTTP响应的组成:
其实基本就是与请求相同的
状态行,消息头,响应数据
状态行:HTTP-Version+Status-Code+Reason
例如:HTTP/1.1(HTTP版本号) 200(状态码) OK(文本描述)
消息头:基本和HTTP请求报文的请求头相同
例如:
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 122
响应数据:
<html>
<head>
<title>Wrox Homepage</title>
</head>
<body>
<!-- body goes here -->
</body>
</html>

HTTP1.1和HTTP2.0有什么区别

  1. HTTP2.0支持多路复用而不是继续使用长连接,这使得潜在可能并发数量大了几个数量级。
  2. HTTP1.1头部都是明文传输的,HTTP2.0则对头部进行了压缩(对User-Agent,Cookie这些基本不怎么变动的部分进行压缩)
  3. HTTP2.0中将请求分为二进制数据帧,使得高并发成为了可能。

HTTP2.0使用了TCP还是UDP协议?
使用了TCP,为了建立可靠的连接。

HTTP3.0使用了什么协议,为什么?
HTTP3.0使用了UDP协议,因为TCP始终是顺序发送,顺序接收,哪怕你允许当部分未确认数据的存仍然接收数据,但是队头阻塞还是依然无法避免,所以UDP

说说HTTP里面的缓存机制:
首先HTTP里面主要控制缓存的有三个关键词:
Expire,Cache-control里面的Max-age,must-revalidate
Expire里面有一个日期时间,如果过了这个时间那么就意味着缓存过期要重新请求服务器了。
同时Cache-control的Max-age属性如果存在,那么Expire就会被忽略,就会使用Max-age属性了。
Must-revalidate则意味着我们每次都必须使用**“协商缓存”**。
这又涉及到了一个“协商缓存”和“强缓存”的概念了
协商缓存就是拿着当前缓存的etag去服务器询问,我这缓存还可以用吗,你那边更新了吗,如果服务器说没有更新,那就直接使用原先缓存里的数据,而如果有更新,自然就是直接返回新的数据了。
强缓存就是缓存没过期而且命中了且Must-revalidate为false,那么就是强缓存了。

现在直播一般都使用什么协议
RTMP协议 RTSP协议 这两个都是流媒体协议加上一个HTTP协议

说说单工,半双工,全双工的区别:
单工:只允许数据在单一方向传输,且同一时间只有一方能发送或者接收消息,类似收音机,你就只能收着。
半双工:允许数据双向的传输,但是同一时间依然只有一方能发送或者接收消息,类似对讲机。
全双工:其实就是两个单工,不仅允许数据双向传播,同时允许双方都能同时发送和接收消息,类似我们的电话机。

公有IP和私有IP的区别:
公有IP直接连接外网,不需要通过路由
私有IP则连接的是内网,需要通过路由实现通信。
说白了,公网IP就是运营商,大公司所持有的,他们买下来然后分成一个个IP地址分为各个个体家庭使用,所以其实很多时候不同家庭其实使用的是同一个外网IP,外网IP是全世界唯一的,而内网IP则是在内网唯一的,可以在同一个局域网下能分辨出不同的设备。因为同一局域网的设备其实都是使用同一个“外网IP”进行通信的。内外网是使用**“端口映射”**的方式进行通信的,比如给A请求分配一个端口,然后使用路由自己的公网IP去请求服务,服务端返回消息到路由器的该端口之后,路由器再转发给A请求。

TCP和UDP补充

TCP是流式传输的,而UDP则是包式传输

http和https

请求方式:
Get:请求指定的页面信息,并返回实体主体,这是幂等的。GET请求不会导致新的资源的建立和/或已有资源的修改。
Post:向指定资源提交数据进行处理请求(例如提交表单或者上传文件),这不是幂等的。POST请求可能会导致新的资源的建立和/或已有资源的修改。
Update:更新全量数据
Delete:删除数据

304状态码:Not modified,根据你的e-tag和Last-Modified的时间,来判断你缓存里的数据是否产生了变化,如果没有产生变化,那么就直接返回304,告诉客户端你直接用你原先缓存里的数据就好了。

HTTPS就是多了个混合加密。

HTTP2.0

文本传输改为二进制传输
为什么说二进制有优势呢?你比如说 20081314作为文本传输,那你就是2,0,0,8,1,3,1,4都各为一个字节,一共8个字节,而你如果把20081314化为数字,作为一个int 来传输那么就只有4个字节了,总的来说二进制的解析就更高效,更符合计算机存储结构。

多路复用
因为你式二进制传输了,所以你的数据就变成了二进制帧,每个帧都有自己的ID,你可以使用同样的通道去传输不同请求的帧,这也可以是乱序的,因为根据头部ID组合回去就好了。而原先的1.x,所有的请求都需要开启新的连接。这样的话显然性能是更高的。

CDN(Content Delivery Network)

CDN主要解决的就是网络访问较慢的问题。
解决方法就是将源站内容拉取到离用户最近的边缘节点,以此来提高用户的访问速度。
比如当用户访问一个网站的时候,返回接受到的是CDN边缘节点的地址,用户去访问该地址,然后第一次的时候该节点去访问真正的服务器,把内容缓存到边缘节点上,这样下次用户就可以快速的获取到该资源了。
而确保缓存一致性也可以通过这样的订阅——发布的方法来实现:

一且内容发生变化,内容提供商就通知代理缓存服务器。因为只有当对象被修改时信息才发送,所以这种方法大大降低了内容提供商和代理缓存服务器之间控制信息的数量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值