一、 为甚有了ip还要mac地址?
- 局域网内IP地址是动态分配的,假如我是192.168.2.100,如果我下线了,可能IP就分配给了另一台电脑。IP和设备并不总是对应的,这对通信就产生了问题,但是MAC地址不同,MAC地址和设备是一一对应且全球唯一的。所以局域网使用MAC地址通信没有问题。
- 历史遗留问题:早期的以太网只有交换机,没有路由器,以太网内通过MAC地址通信。后来才有了互联网,为了兼容原本的模式,采用了IP+MAC地址通信的方式。为啥不推到了重来呢?看看IPv6的处境你就知道了。所以是先有MAC地址后有的IP,IP的提出主要还是因为MAC地址本身的缺陷,这个问题换成有了MAC为何还要IP地址也很有意思。
- 我这里简单说一下第一:MAC地址本身的缺陷:因为MAC地址是硬件提供商写在网卡中的,MAC地址虽然唯一但是不能表明用户在整个互联网中的位置,除非维护一个超级大MAC地址对应表,那寻址效率肯定爆炸。但是IP地址解决了这个问题,因为IP地址是网络提供商给你的,所以你在哪里整个网络都是知道的。第二:安全问题:获取MAC地址是通过ARP协议来完成的,如果只用MAC地址通信,那么广播风暴是个难题。
- 那么我觉得如果哪天每人一个固定的IPv6地址,那么我觉得MAC地址+IPv4的模式是不是可以被替换了?
MAC地址更像是身份证,是一个唯一标识, 但是它的通信范围较小,局限在一个子网之内。IP有远程定位功能。
二、TCP和UDP的区别?
- TCP是面向连接的(三次握手,四次挥手),UDP是面向无连接的,所谓建立连接,是为了客户端和服务端
维护
连接,而建立一定的数据结构来维护双方交互的状态,用这样的数据结构来保证所谓面向连接的特性。 - TCP是面向字节流的,发送的时候发的是一个流,没有头尾。IP包不是流,而是一个个的IP包。之所以变成流,这也是TCP自己状态维护做的事情。而UDP继承了IP的特性,基于数据报的,一个一个的发。
- TCP可以又拥塞控制的,会根据网络环境来调整,UDP没有,应用让发就发。
- 如果
MAC 层定义了本地局域网的传输行为
,IP 层定义了整个网络端到端的传输行为
,这两层基本定义了这样的基因:网络传输是以包为单位的,二层叫帧
,网络层叫包
,传输层叫段
。我们笼统地称为包。包单独传输,自行选路,在不同的设备封装解封装,不保证到达。基于这个基因,生下来的孩子 UDP 完全继承了这些特性,几乎没有自己的思想。
三、TCP三次握手四次挥手
连接
:在自己监听的端口接收到连接的请求,然后经过“三次握手”,维护一定的数据结构和对方的信息
,确认了该信息:我发的内容对方会接收,对方发的内容我也会接收,直到连接断开。keepalive
:客户端和服务端建立tcp连接时,为了验证连接是否还在,客户端和服务端之间应该会不停地发送一些确认的信息,保证客户端和服务端之间的连接还在。断开
:经过“四次挥手”确保双方都知道且同意对方断开连接,然后在remove为对方维护的数据结构和信息,对方之后发送的包也不会接收,直到 再次连接。- 我看到有的同学说,TCP是建立了一座桥,我认为这个比喻不恰当,TCP更好的比喻是在码头上增加了
记录人员,核查人员和督导人员
,至于IP层和数据链路层,它没有任何改造。 UDP
也有相应的错误检验,但是没用重传
四、TCP慢启动问题
-
设备缓存会导致延时?
假如经过设备的包都不需要进入缓存,那么得到的速度是最快的。进入缓存且等待,等待的时间就是额外的延时。BBR就是为了避免这些问题:充分利用带宽;降低buffer占用率。 -
降低发送packet的速度,为何反而提速了?
标准TCP拥塞算法是遇到丢包的数据时快速下降发送速度,因为算法假设丢包都是因为过程设备缓存满了。快速下降后重新慢启动,整个过程对于带宽来说是浪费的。通过packet速度-时间的图来看,从积分上看,BBR充分利用带宽时发送效率才是最高的。可以说BBR比标准TCP拥塞算法更正确地处理了数据丢包。对于网络上有一定丢包率的公网,BBR会更加智慧一点。回顾网络发展过程,带宽的是极大地改进的,而最小延迟会受限与介质传播速度,不会明显减少。BBR可以说是应运而生。 -
BBR如何解决延时?
S1:慢启动开始时,以前期的延迟时间为延迟最小值Tmin。然后监控延迟值是否达到Tmin的n倍,达到这个阀值后,判断带宽已经消耗尽且使用了一定的缓存,进入排空阶段。
S2:指数降低发送速率,直至延迟不再降低。这个过程的原理同S1
S3:协议进入稳定运行状态。交替探测带宽和延迟,且大多数时间下都处于带宽探测阶段。
五、https加密过程
- 各大CA机构的公钥是默认安装在操作系统里的
- Nonce是由服务器生成的一个随机数,在客户端第一次请求页面时将其发回客户端;客户端拿到这个Nonce,将其与用户密码串联在一起并进行非可逆加密(MD5、SHA1等等),然后将这个加密后的字符串和用户名、Nonce、加密算法名称一起发回服务器;服务器使用接收到的用户名到数据库搜索密码,然后跟客户端使用同样的算法对其进行加密,接着将其与客户端提交上来的加密字符串进行比较,如果两个字符串一致就表示用户身份有效。这样就解决了用户密码明文被窃取的问题,攻击者就算知道了算法名和nonce也无法解密出密码。
- 每个nonce只能供一个用户使用一次,这样就可以防止攻击者使用重放攻击,因为该Http报文已经无效。可选的实现方式是把每一次请求的Nonce保存到数据库,客户端再一次提交请求时将请求头中得Nonce与数据库中得数据作比较,如果已存在该Nonce,则证明该请求有可能是恶意的。然而这种解决方案也有个问题,很有可能在两次正常的资源请求中,产生的随机数是一样的,这样就造成正常的请求也被当成了攻击,随着数据库中保存的随机数不断增多,这个问题就会变得很明显。所以,还需要加上另外一个参数Timestamp(时间戳)。
- Timestamp是根据服务器当前时间生成的一个字符串,与nonce放在一起,可以表示服务器在某个时间点生成的随机数。这样就算生成的随机数相同,但因为它们生成的时间点不一样,所以也算有效的随机数