基础篇
TCP/IP 网络模型有哪几层?
应用层:
- 通过应用进程间的通信来完成特定的网络应用
- 应用层只需要专注于为用户提供应用功能
- 应用层是工作在操作系统中的用户态
- 常见协议:HTTP、SMTP、FTP、Telnet、DNS等
传输层:
- 传输层(Transport Layer)是为应用层提供网络支持的
- 负责端到端的数据传输
- 解决进程之间基于网络的通信问题,解决出现传输错误时,如何处理问题
- 常见协议:TCP、UDP
网络层:
- 处理数据在网络中的传输
- 解决如何标识各网络以及各网络中的各主机(网络和主机共同编制的问题,例如IP地址)问题
- 解决路由器转发分组,路由选择问题
- 常见协议:IP、ARP、ICMP
网络接口层:
- 网络接口层主要为网络层提供「链路级别」传输的服务
- 负责在以太网、WiFi 这样的底层网络上发送原始数据包,工作在网卡这个层次
- 使用 MAC 地址来标识网络上的设备
HTTP篇
HTTP是什么?
HTTP 是超文本传输协议,也就是HyperText Transfer Protocol。
HTTP 是一个在计算机世界里专门在「两点」
之间「传输」
文字、图片、音频、视频等「超文本」
数据的「约定和规范」
。
HTTP常见的状态码有哪些
GET 和 POST 有什么区别?
-
参数:
- 按照规范,GET请求的参数一般在URL中,POST兴趣的参数一般放在请求Body中(这不是绝对,只是规范来讲)
- 而URL中的参数只支持ASCLL,对BODY没有限制
- 浏览器会对 URL 的长度有限制,对BODY的没有限制
-
安全性(对于传输的数据来说):
POST的安全性与GET相比相对较高。规范情况下,GET的参数会暴露在URL上,而POST的参数则是在请求体中保存。
然而,从传输的角度来说,他们都是不安全的,因为 HTTP 在网络上是明文传输的,只要在网络节点上捉包,就能完整地获取数据报文,要想安全传输,就只有加密 -
幂等性:
- GET 方法就是安全且幂等的。规范来讲,它是「只读」操作,无论操作多少次,服务器上的数据都是安全的,且每次的结果都是相同的。所以,可以对 GET 请求的数据做缓存
- POST 方法不是安全且幂等的。规范来讲,POST 因为是「新增或提交数据」的操作,会修改服务器上的资源,所以是不安全的,且多次提交数据就会创建多个资源,所以不是幂等的。所以,浏览器一般不会缓存 POST 请求
HTTP1.0,1.1,2.0,3.0 的版本区别?
HTTP1.0
HTTP/1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求。
这种方式就好像我们打电话的时候,只能说一件事儿一样,说完之后就要挂断,想要说另外一件事儿的时候就要重新拨打电话。
HTTP/1.0中浏览器与服务器只保持短暂的连接,连接无法复用。也就是说每个TCP连接只能发送一个请求。发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接。
我们知道TCP连接的建立需要三次握手,是很耗费时间的一个过程。所以,HTTP/1.0版本的性能比较差。
HTTP1.0 其实也可以强制开启长链接,例如接受Connection: keep-alive 这个字段,但是,这不是标准字段,不同实现的行为可能不一致,因此不是根本的解决办法。
HTTP1.1
HTTP/1.1 相比 HTTP/1.0 性能上的改进:
- 使最主要的改进就是默认是持久连接。所谓的持久连接即TCP连接默认不关闭,可以被多个请求复用。
- 还引入了管道机制(pipelining),即在同一个TCP连接里面,客户端可以同时发送多个请求。
HTTP2.0
HTTP/2 为了解决HTTP/1.1中仍然存在的效率问题,主要做了以下优化:
- 头部压缩:HTTP/2 会压缩头(Header)如果你同时发出多个请求,他们的头是一样的或是相似的,那么,协议会帮你消除重复的部分。这就是所谓的 HPACK 算法:在客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就提高速度了。
- 二进制格式:HTTP/2采用二进制格式而非文本格式。对计算机更友好,且节省了空间。增加了数据传输的效率
- 并发传输:引出了 Stream 概念,多个 Stream 复用在一条 TCP 连接。针对不同的 HTTP 请求用独一无二的 Stream ID 来区分,接收端可以通过 Stream ID 有序组装成 HTTP 消息,不同 Stream 的帧是可以乱序发送的,因此可以并发不同的 Stream ,也就是 HTTP/2 可以并行交错地发送请求和响应
- 服务器推送:HTTP/2 还在一定程度上改善了传统的「请求 - 应答」工作模式,服务端不再是被动地响应,可以主动向客户端发送消息。比如,客户端通过 HTTP/1.1 请求从服务器那获取到了 HTML 文件,而 HTML 可能还需要依赖 CSS 来渲染页面,这时客户端还要再发起获取 CSS 文件的请求,需要两次消息往返,在 HTTP/2 中,客户端在访问 HTML 时,服务器可以直接主动推送 CSS 文件,减少了消息传递的次数。
HTTP3.0
HTTP 与 HTTPS的区别
HTTPS 解决了 HTTP 的哪些问题?
HTTP 由于是明文传输,所以安全上存在一些风险:
- HTTPS通过信息加密,使用混合加密的方式实现信息的机密性,解决了窃听的风险。
- HTTPS通过校验机制,使用摘要算法的方式来实现完整性,它能够为数据生成独一无二的「指纹」,指纹用于校验数据的完整性,解决了篡改的风险。。
- HTTPS通过将服务器公钥放入到数字证书中,解决了冒充的风险。
HTTPS 是如何建立连接的?其间交互了什么?
整体上是两个阶段:
一、TLS 的「握手阶段」:生成会话秘钥
二、数据传输阶段:使用会话秘钥
,来对传输的数据进行加密(对称加密)
假设第一阶段使用的是RSA 算法。首先我先介绍一下RSA非对称加密,共有两个密钥:
- 一个是公钥,这个是可以公开给所有人的;
- 一个是私钥,这个必须由本人管理,不可泄露。
这两个密钥可以双向加解密的,比如可以用公钥加密内容,然后用私钥解密,也可以用私钥加密内容,公钥解密内容。
公钥加密,私钥解密
。这个目的是为了保证内容传输的安全,因为被公钥加密的内容,其他人是无法解密的,只有持有私钥的人,才能解密出实际的内容;私钥加密,公钥解密
。这个目的是为了保证消息不会被冒充,因为私钥是不可泄露的,如果公钥能正常解密出私钥加密的内容,就能证明这个消息是来源于持有私钥身份的人发送的
一、TLS 的「握手阶段」:生成
会话秘钥
- 首先,由客户端向服务器发起加密通信请求,也就是 ClientHello 请求。
- 服务器收到客户端请求后,向客户端发出响应,也就是 SeverHello。
3. 客户端收到服务器的回应之后,首先通过浏览器或者操作系统中的 CA 公钥,确认服务器的数字证书的真实性
如果证书没有问题,客户端会从数字证书中取出服务器的公钥,然后使用它加密报文,向服务器发送如下信息:
4. 服务器收到客户端的第三个随机数(pre-master key)之后,通过协商的加密算法,计算出本次通信的「会话秘钥」。
至此,整个 TLS 的握手阶段全部结束。
二、数据传输阶段:使用
会话秘钥
,来对传输的数据进行加密(对称加密)
接下来,客户端与服务器进入加密通信,就完全是使用普通的 HTTP 协议,只不过用「会话秘钥」加密内容。
HTTP和RPC的区别?
服务发现
底层连接形式
传输的内容
既然有 HTTP 协议,为什么还要有 WebSocket?
TCP篇
TCP 和 UDP 区别
TCP 和 UDP 应用场景
重传机制
超时重传
超时重传时间 RTO 的值应该略大于报文往返 RTT 的值
快速重传
SACK 方法
TCP Keepalive 和 HTTP Keep-Alive 是一个东西吗?
-
HTTP 的
Keep-Alive
也叫HTTP 长连接
,该功能是由「应用程序」实现的,可以使得用同一个 TCP 连接来发送和接收多个 HTTP 请求/应答,减少了 HTTP 短连接带来的多次 TCP 连接建立和释放的开销。 -
TCP 的
Keepalive
也叫TCP 保活机制
,该功能是由「内核」实现的,当客户端和服务端长达一定时间没有进行数据交互时,内核为了确保该连接是否还有效,就会发送探测报文,来检测对方是否还在线,然后来决定是否要关闭该连接。
TCP 和 UDP 可以同时绑定相同的端口吗?
IP篇
ICMP
ICMP 功能都有啥?
ICMP 类型