计算机网络

网络体系结构

image.png

应用层(数据):确定进程之间通信的性质以满足用户需要以及提供网络与用户应用
表示层(数据):主要解决用户信息的语法表示问题,如加密解密
会话层(数据):提供包括访问验证和会话管理在内的建立和维护应用之间通信的机制,如服务器验证用户登录便是由会话层完成的
传输层(段):实现网络不同主机上用户进程之间的数据通信,可靠
与不可靠的传输,传输层的错误检测,流量控制等
网络层(包):提供逻辑地址(IP)、选路,数据从源端到目的端的
传输
数据链路层(帧):将上层数据封装成帧,用MAC地址访问媒介,错误检测与修正
物理层(比特流):设备之间比特流的传输,物理接口,电气特性等

简述 TCP/IP 四层体系结构

  • 1.应用层:HTTP、TELNET、FTP、SMTP
  • 2.传输层:TCP、UDP
  • 3.网络层:IP、ICMP,ARP(在OSI 模型中 ARP 协议属于链路层;而在 TCP/IP 模型中,ARP 协议属于网络层。)
  • 4.数据接口:PPP

IP 地址的分类

IP 地址编址方案将IP地址空间划分为 A、B、C、D、E 五类,其中 A、B、C 是基本类,D、E 类作为多播和保留使用,为特殊地址。
A 类地址:以 0 开头,第一个字节范围:0~127 。
B 类地址:以 10 开头,第一个字节范围:128~191 。
C 类地址:以 110 开头,第一个字节范围:192~223。
D 类地址:以 1110 开头,第一个字节范围:224~239 。
E 类地址:以 1111 开头,保留地址。

IP 地址与物理地址的区别?

物理地址(MAC 地址),是数据链路层和物理层使用的地址。
IP 地址是网络层和以上各层使用的地址,是一种逻辑地址。
其中 ARP 协议用于 IP 地址与物理地址的对应。

网络层的 ARP 协议工作原理?

网络层的 ARP 协议完成了 IP 地址与物理地址的映射。

  • 首先,每台主机都会在自己的 ARP 缓冲区中建立一个 ARP 列表,以表示 IP 地址和 MAC 地址的对应关系。
  • 当源主机需要将一个数据包要发送到目的主机时,会首先检查自己 ARP 列表中是否存在该 IP 地址对应的 MAC 地址:
    如果有,就直接将数据包发送到这个 MAC 地址。
  • 如果没有,就向本地网段发起一个ARP请求的广播包,查询此目的主机对应的 MAC 地址。此 ARP 请求数据包里包括源主机的 IP 地址、硬件地址、以及目的主机的 IP 地址。网络中所有的主机收到这个 ARP 请求后,会检查数据包中的目的 IP 是否和自己的 I P地址一致。
  • 如果不相同,就忽略此数据包。
  • 如果相同,该主机首先将发送端的 MAC 地址和 IP 地址添加到自己的 ARP 列表中(如果 ARP 表中已经存在该 IP 的信息,则将其覆盖),然后给源主机发送一个 ARP 响应数据包,告诉对方自己是它需要查找的 MAC 地址。
  • 源主机收到这个 ARP 响应数据包后,将得到的目的主机的 IP 地址和 MAC 地址添加到自己的 ARP 列表中,并利用此信息开始数据的传输。
  • 如果源主机一直没有收到 ARP 响应数据包,表示 ARP 查询失败。

TCP 是什么?

TCP(Transmission Control Protocol),传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。
主要特点如下:

  • TCP 是面向连接的。
  • 每一条 TCP 连接只能有两个端点,每一条TCP连接只能是点对点的(一对一)。
  • TCP 提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复、并且按序到达。
  • TCP 提供全双工通信。TCP 允许通信双方的应用进程在任何时候都能发送数据。TCP 连接的两端都设有发送缓存和接收缓存,用来临时存放双方通信的数据。
  • 面向字节流。虽然应用程序和 TCP 的交互是一次一个数据块(大小不等),但 TCP 把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。

TCP 对应的应用层协议?

FTP :定义了文件传输协议
Telnet :它是一种用于远程登陆
SMTP :定义了简单邮件传送协议
POP3 :它是和 SMTP 对应,POP3 用于接收邮件
HTTP :从 Web 服务器传输超文本到本地浏览器的传送协议。

【重要】什么是 TCP 三次握手?

  • 发送方:我要和你建立链接?
  • 接收方:你真的要和我建立链接么?
  • 发送方:我真的要和你建立链接,成功。


    image.png
  • 第一次握手:Client 将标志位 SYN=1 ,随机产生一个值 seq=J ,并将该数据包发送给 Server 。此时,Client 进入SYN_SENT 状态,等待 Server 确认。
  • 第二次握手:Server 收到数据包后由标志位 SYN=1 知道Client请求建立连接,Server 将标志位 SYN 和 ACK 都置为 1 ,ack=J+1,随机产生一个值 seq=K ,并将该数据包发送给 Client 以确认连接请求,Server 进入 SYN_RCVD 状态。此时,Server 进入 SYC_RCVD 状态。
  • 第三次握手:Client 收到确认后,检查 ack 是否为 J+1 ,ACK 是否为 1 。
    如果正确,则将标志位 ACK 置为 1 ,ack=K+1 ,并将该数据包发送给 Server 。此时,Client 进入 ESTABLISHED 状态。
    Server 检查 ack 是否为 K+1 ,ACK 是否为 1 ,如果正确则连接建立成功。此时 Server 进入 ESTABLISHED 状态,完成三次握手,随后 Client 与 Server 之间可以开始传输数据了。
  • 仔细看来,Client 会发起两次数据包,分别是 SYNC 和 ACK ;Server 会发起一次数据包,包含 SYNC 和 ACK 。也就是说,三次握手的过程中,Client 和 Server 互相做了一次 SYNC 和 ACK 。

为什么 TCP 连接需要三次握手,两次不可以么,为什么?

防止了服务器端的一直等待而浪费资源

  • 若不采用“三次握手”,那么只要 Server 发出确认数据包,新的连接就建立了。由于 Client 此时并未发出建立连接的请求,所以其不会理睬 Server 的确认,也不与 Server 通信;而这时 Server 一直在等待 Client 的请求,这样 Server 就白白浪费了一定的资源。
  • 若采用“三次握手”,在这种情况下,由于 Server 端没有收到来自客户端的确认,则就会知道 Client 并没有要求建立请求,就不会建立连接

客户端不断进行请求链接会怎样?

服务器端准备为每个请求创建一个链接,并向其发送确认报文,然后等待客户端进行确认后创建。如果此时客户端一直不确认,会造成 SYN 攻击,即SYN 攻击,英文为 SYN Flood ,是一种典型的 DoS/DDoS 攻击。

  • 怎么解决 SYN 攻击呢?答案是只能预防,没有彻底根治的办法,除非不使用 TCP

【重要】什么是 TCP 四次挥手?

  • 发送方:我要和你断开连接!
  • 接收方:好的,断吧。
  • 接收方:我也要和你断开连接!
  • 发送方:好的,断吧。


    image.png
  • 第一次挥手:Client 发送一个 FIN=M ,用来关闭 Client 到 Server 的数据传送。此时,Client 进入 FIN_WAIT_1 状态。
  • 第二次挥手,Server 收到 FIN 后,发送一个 ACK 给 Client ,确认序号为 M+1(与 SYN 相同,一个 FIN 占用一个序号)。此时,Server 进入 CLOSE_WAIT 状态。注意,TCP 链接处于半关闭状态,即客户端已经没有要发送的数据了,但服务端若发送数据,则客户端仍要接收。
  • 第三次挥手,Server 发送一个 FIN=N ,用来关闭 Server 到 Client 的数据传送。此时 Server 进入 LAST_ACK 状态。
  • 第四次挥手,Client 收到 FIN 后,此时 Client 进入 TIME_WAIT 状态。接着,Client 发送一个 ACK 给 Server ,确认序号为 N+1 。Server 接收到后,此时 Server 进入 CLOSED 状态,完成四次挥手。

为什么要四次挥手?

TCP 协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP 是全双工模式,这就意味着:

  • 当主机 1 发出 FIN 报文段时,只是表示主机 1 已经没有数据要发送了,主机 1 告诉主机 2 ,它的数据已经全部发送完毕了;但是,这个时候主机 1 还是可以接受来自主机 2 的数据;当主机 2 返回 ACK 报文段时,表示它已经知道主机 1 没有数据发送了,但是主机 2 还是可以发送数据到主机 1 的。
  • 当主机 2 也发送了 FIN 报文段时,这个时候就表示主机 2 也没有数据要发送了,就会告诉主机 1 ,我也没有数据要发送了,之后彼此就会愉快的中断这次 TCP 连接。

为何一定要等 2MSL

TIME_WAIT 表示收到了对方的 FIN 报文,并发送出了 ACK 报文,就等 2MSL后即可回到 CLOSED 可用状态了。如果 FIN_WAIT_1 状态下,收到了对方同时带 FIN 标志和 ACK 标志的报文时,可以直接进入到 TIME_WAIT 状态,而无须经过 FIN_WAIT_2 状态。
如果不等,释放的端口可能会重连刚断开的服务器端口,这样依然存活在网络里的老的 TCP 报文可能与新 TCP 连接报文冲突,造成数据冲突,为避免此种情况,需要耐心等待网络老的 TCP 连接的活跃报文全部死翘翘,2MSL 时间可以满足这个需求(尽管非常保守)!

【重要】TCP 数据如何传输?

建立连接后,两台主机就可以相互传输数据了。如下图所示:

TCP 套接字的数据交换过程
TCP 套接字的数据交换过程

  • 上图给出了主机 A 分 2 次(分 2 个数据包)向主机 B 传递 200 字节的过程。
  • 首先,主机 A 通过 1 个数据包发送 100 个字节的数据,数据包的 Seq 号设置为 1200 。主机 B 为了确认这一点,向主机 A 发送 ACK 包,并将 Ack 号设置为 1301 。
    • 为了保证数据准确到达,目标机器在收到数据包(包括 SYN 包、FIN 包、普通数据包等)包后必须立即回传 ACK 包,这样发送方才能确认数据传输成功。
    • 此时 Ack 号为 1301 而不是 1201,原因在于 Ack 号的增量为传输的数据字节数。假设每次 Ack 号不加传输的字节数,这样虽然可以确认数据包的传输,但无法明确 100 字节全部正确传递还是丢失了一部分,比如只传递了 80 字节。因此按如下的公式确认 Ack 号:Ack 号 = Seq 号 + 传递的字节数 + 1 。
      • 与三次握手协议相同,最后加 1 是为了告诉对方要传递的 Seq 号。

TCP 数据传输丢失怎么办?

因为各种原因,TCP 数据包可能存在丢失的情况,TCP 会进行数据重传。如下图所示:

TCP套接字数据传输过程中发生错误
TCP套接字数据传输过程中发生错误

  • 上图表示通过 Seq 1301 数据包向主机 B 传递 100 字节的数据,但中间发生了错误,主机 B 未收到。经过一段时间后,主机 A 仍未收到对于 Seq 1301 的 ACK 确认,因此尝试重传数据。为了完成数据包的重传,TCP 套接字每次发送数据包时都会启动定时器,如果在一定时间内没有收到目标机器传回的 ACK 包,那么定时器超时,数据包会重传。上图演示的是数据包丢失的情况,也会有 ACK 包丢失的情况,一样会重传。
  • 重传超时时间
    这个值太大了会导致不必要的等待,太小会导致不必要的重传,理论上最好是网络 RTT 时间,但又受制于网络距离与瞬态时延变化,所以实际上使用自适应的动态算法(例如 Jacobson 算法和 Karn 算法等)来确定超时时间。
    往返时间(RTT,Round-Trip Time)表示从发送端发送数据开始,到发送端收到来自接收端的 ACK 确认包(接收端收到数据后便立即确认),总共经历的时延。
  • 重传次数
    TCP 数据包重传次数,根据系统设置的不同而有所区别。有些系统,一个数据包只会被重传 3 次,如果重传 3 次后还未收到该数据包的 ACK 确认,就不再尝试重传。但有些要求很高的业务系统,会不断地重传丢失的数据包,以尽最大可能保证业务数据的正常交互。
    最后需要说明的是,发送端只有在收到对方的 ACK 确认包后,才会清空输出缓冲区中的数据。

【重要】什么是 TCP 滑动窗口?

TCP 协议操作是围绕滑动窗口 + 确认机制来进行的。
滑动窗口协议,是传输层进行流控的一种措施,接收方通过通告发送方自己的窗口大小,从而控制发送方的发送速度,从而达到防止发送方发送速度过快而导致自己被淹没的目的。
TCP 的滑动窗口解决了端到端的流量控制问题,允许接受方对传输进行限制,直到它拥有足够的缓冲空间来容纳更多的数据。

TCP 协议如何来保证传输的可靠性?

  • 数据包校验:校验出包有错,则丢弃报文段并且不给出响应,这时 TCP 重发数据。
  • 对失序数据包重排序:TCP报文段到达可能会失序,对失序数据重新排序
  • 丢弃重复数据:对于重复数据,能够丢弃重复数据。
  • 应答机制
  • 超时重发:当 TCP 发出一个段后,启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
  • 流量控制:TCP 连接的每一方都有固定大小的缓冲空间。TCP 的接收端只允许另一端发送接收端缓冲区所能接纳的数据,这可以防止较快主机致使较慢主机的缓冲区溢出,这就是流量控制。TCP 使用的流量控制协议是可变大小的滑动窗口协议。

什么是 TCP 拥堵?

计算机网络中的带宽、交换结点中的缓存及处理机等都是网络的资源。在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会变坏,这种情况就叫做拥塞。

怎么解决 TCP 拥堵?**

通过拥塞控制来解决。拥堵控制,就是防止过多的数据注入网络中,这样可以使网络中的路由器或链路不致过载。注意,拥塞控制和流量控制不同,前者是一个全局性的过程,而后者指点对点通信量的控制。

拥塞控制的方法主要有以下四种:

  • 1、慢开始。
  • 2、拥塞避免。
  • 3、快重传。
  • 4、快恢复。

1)慢开始
不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小。

2)拥塞避免
拥塞避免算法,让拥塞窗口缓慢增长,即每经过一个往返时间 RTT 就把发送方的拥塞窗口 cwnd 加 1 ,而不是加倍,这样拥塞窗口按线性规律缓慢增长。

慢开始和拥塞避免算法的实现举例
慢开始和拥塞避免算法的实现举例

3)快重传
快重传,要求接收方在收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方),而不要等到自己发送数据时捎带确认。
快重传算法规定,发送方只要一连收到三个重复确认,就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期。

快重传的示意图
快重传的示意图

4)快恢复
快重传配合使用的还有快恢复算法,当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把 ssthresh 门限减半。

  • 但是接下去并不执行慢开始算法:因为如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方现在认为网络可能没有出现拥塞。
  • 所以此时不执行慢开始算法,而是将 cwnd 设置为 ssthresh 的大小,然后执行拥塞避免算法。
    从连续收到三个重复的确认转入拥堵避免

UDP 是什么?

UDP(User Data Protocol,用户数据报协议),是与 TCP 相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去。
主要特点如下:

  • UDP 是无连接的。
  • UDP 使用尽最大努力交付,即不保证可靠交付
  • UDP 是面向报文的。
  • UDP 没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低。
  • UDP 支持一对一、一对多、多对一和多对多的交互通信。
  • UDP 的首部开销小,只有 8 个字节,比 TCP 的 20 个字节的首部要短。

UDP 对应的应用层协议?

DNS :用于域名解析服务
SNMP :简单网络管理协议
TFTP:简单文件传输协议

【重要】TCP 与 UDP 的区别

image.png

TCP 只支持点对点通信;UDP 支持一对一、一对多、多对一、多对多的通信模式。
TCP 有拥塞控制机制;UDP 没有拥塞控制,适合媒体通信,对实时应用很有用,如 直播,实时视频会议等

为什么 TCP 叫数据流模式? UDP 叫数据报模式?

  • “流模式”,是指TCP 发送端发送几次数据和接收端接收几次数据是没有必然联系的。
  • “数据报模式”,是指 UDP 发送端调用了几次 write ,接收端必须用相同次数的 read 读完。

DNS 是什么?

  • 域名解析,将域名转换成 IP ,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的 IP 数串。
  • DNS 协议运行在 UDP 协议之上,使用端口号 53 。

DNS 使用什么协议?

既使用 TCP 又使用 UDP 。

  • 区域传送时使用 TCP 协议。
  • 域名解析时使用 UDP 协议。

主机解析域名的顺序?

  1. 浏览器缓存
  2. 找本机的 hosts 文件
  3. 路由缓存
  4. 找 DNS 服务器(本地域名、顶级域名、根域名)

HTTP 是什么?

HTTP 协议,是 Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网服务器传输超文本到本地浏览器的传送协议。
主要特点如下:

  • 简单快速
  • 数据格式灵活
  • 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  • 无状态:是指协议对于事务处理没有记忆能力。
  • 支持 B/S 及 C/S 模式。

HTTP 基本格式

请求报文包含三部分:
a、请求行:包含请求方法、URI、HTTP版本信息
b、请求首部字段
c、请求内容实体
响应报文包含三部分:
a、状态行:包含HTTP版本、状态码、状态码的原因短语
b、响应首部字段
c、响应内容实体

HTTP 协议包括哪些请求?

GET: 对服务器资源的简单请求。
POST: 用于发送包含用户提交数据的请求。
HEAD:类似于 GET 请求,不过返回的响应中没有具体内容,用于获取报头。
PUT:传说中请求文档的一个版本。
DELETE:发出一个删除指定文档的请求。
TRACE:发送一个请求副本,以跟踪其处理进程。
OPTIONS:返回所有可用的方法,检查服务器支持哪些方法。
CONNECT:用于 SSL 隧道的基于代理的请求。

POST与GET的区别

  • get重点在从服务器上获取资源,post重点在向服务器发送数据;
  • get传输数据是通过URL请求,以field(字段)= value的形式,置于URL后,并用"?"连接,多个请求数据间用"&"连接,这个过程用户是可见的;post传输数据通过Http的post机制,将字段与对应值封存在请求实体中发送给服务器,这个过程对用户是不可见的;
  • Get传输的数据量小,因为受URL长度限制,但效率较高;Post可以传输大量数据,所以上传文件时只能用Post方式;
  • get是不安全的,因为URL是可见的,可能会泄露私密信息,如密码等;post较get安全性较高;
  • get方式只能支持ASCII字符,向服务器传的中文字符可能会乱码。
  • post支持标准字符集,可以正确传递中文字符。

http缺点

1.明文发送,内容可能被窃听
2.不验证通信方的身份,因此可能遭遇伪装
3.无法证明报文的完整性,可能被篡改

HTTP 有哪些状态码?

  • 1×× : 请求处理中,请求已被接受,正在处理
  • 2×× : 请求成功,请求被成功处理
    200 OK // 客户端请求成功
  • 3×× : 重定向,要完成请求必须进行进一步处理
    301 Moved Permanently // 永久重定向,使用域名跳转
    302 Found // 临时重定向,未登陆的用户访问用户中心重定向到登录页面
  • 4×× : 客户端错误,请求不合法
    400 Bad Request // 客户端请求有语法错误,不能被服务器所理解
    401 Unauthorized // 请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域一起使用
    403 Forbidden // 服务器收到请求,但是拒绝提供服务
    404 Not Found // 请求资源不存在,eg:输入了错误的 URL
  • 5×× : 服务器端错误,服务器不能处理合法请求
    500 Internal Server Error // 服务器发生不可预期的错误
    503 Server Unavailable // 服务器当前不能处理客户端的请求,一段时间后可能恢复正常

HTTP、TCP、Socket 的关系是什么?

  • TCP/IP 代表传输控制协议/网际协议,指的是一系列协议族。
  • HTTP 本身就是一个协议,是从 Web 服务器传输超文本到本地浏览器的传送协议。
  • Socket 是 TCP/IP 网络的 API ,其实就是一个门面模式,它把复杂的 TCP/IP 协议族隐藏在 Socket 接口后面。对用户来说,一组简单的接口就是全部,让 Socket 去组织数据,以符合指定的协议。

综上所述:
需要 IP 协议来连接网络,TCP 是一种允许我们安全传输数据的机制,使用 TCP 协议来传输数据的 HTTP 是 Web 服务器和客户端使用的特殊协议。HTTP 基于 TCP 协议,所以可以使用 Socket 去建立一个 TCP 连接。

Cookies 和 Session 的区别

  • Session 在服务器端,Cookie 在客户端(浏览器)。
  • Session 默认被存在在服务器的一个文件里(不是内存)。
    Session 的运行依赖 sessionid ,而 sessionid 是存在 Cookie 中的,也就是说,如果浏览器禁用了 Cookie ,同时 session 也会失效。但是,可以通过其它方式实现,比如在 url 参数中传递 sessionid 。
    Session 可以放在文件、数据库、或内存中都可以。
    【关键】用户验证这种场合一般会用 Session 。

【重要】一次完整的 HTTP 请求所经历的步骤

  • 1、DNS 解析(通过访问的域名找出其 IP 地址,递归搜索)。
    • 1.1、 浏览器DNS缓存
    • 1.2. 找本机的 hosts 文件
    • 1.3. 路由DNS缓存
    • 1.4. 迭代查找找DNS服务器(本地域名、顶级域名、根域名)
  • 2、HTTP 请求,当输入一个请求时,建立一个 Socket 连接发起 TCP的 3 次握手。
    • 2.1、浏览器所在的客户端向服务器发出连接请求报文;
    • 2.2、服务器接收报文后,同意建立连接,向客户端发出确认报文;
    • 2.3、客户端接收到确认报文后,再次向服务器发出报文,确认已接收到确认报文;
  • 3、客户端向服务器发送请求命令(一般是 GET 或 POST 请求),发送请求头信息和数据
  • 4、服务器发送应答头数据信息。
  • 5、客户端根据返回的 HTML、CSS、JS 进行渲染。。
  • 6、服务器关闭 TCP 连接(4次挥手)。
    • 6.1、浏览器所在主机向服务器发出连接释放报文,然后停止发送数据;
    • 6.1、服务器接收到释放报文后发出确认报文,然后将服务器上未传送完的数据发送完;
    • 6.1、服务器数据传输完毕后,向客户机发送连接释放报文;
    • 6.1、客户机接收到报文后,发出确认,然后等待一段时间后,释放TCP连接;

HTTPS 是什么?

HTTPS ,实际就是在 TCP 层与 HTTP 层之间加入了 SSL/TLS 来为上层的安全保驾护航,主要用到对称加密、非对称加密、证书,等技术进行客户端与服务器的数据加密传输,最终达到保证整个通信的安全性。


image.png

SSL/TLS 协议作用

  • 认证用户和服务器,确保数据发送到正确的客户机和服务器。
  • 加密数据以防止数据中途被窃取。
  • 维护数据的完整性,确保数据在传输过程中不被改变。

HTTP 和 HTTPS 的区别?

端口不同:HTTP 与 HTTPS 使用不同的连接方式,端口不一样,前者是 80,后者是 443。
资源消耗:和 HTTP 通信相比,HTTPS 通信会由于加解密处理消耗更多的 CPU 和内存资源。
开销:HTTPS 通信需要证书,而证书一般需要向认证机构申请免费或者付费购买。

SSL 加密方式是什么

SSL 协议即用到了对称加密也用到了非对称加密

  • 对称密钥加密,是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是密钥发送问题,即如何安全地将密钥发给对方。
  • 非对称加密,指使用一对非对称密钥,即公钥和私钥,公钥可以随意发布,但私钥只有自己知道。发送密文的一方使用对方的公钥进行加密处理,对方接收到加密信息后,使用自己的私钥进行解密。

加解密过程

image.png

1)客户端发起 https 请求(就是用户在浏览器里输入一个 https 网址,然后连接到 server
的 443 端口)
2)服务端的配置(采用 https 协议的服务器必须要有一套数字证书,可以自己制作,
也可以向组织申请,这套证书就是一对公钥和私钥,这是非对称加密)。
3)传输证书(这个证书就是公钥,只是包含了很多信息)
4)客户端解析证书(由客户端 tls 完成,首先验证公钥是否有效,若发现异常,则弹出
一个警示框,提示证书存在问题,若无问题,则生成一个随机值(对称加密的私钥),然后用证书对随机值进行加密)
5)传输加密信息(这里传输的是加密后的随机值,目的是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密了)
6)服务端解密信息(服务端用私钥(非对称加密)解密后得到了客户端传来的随机值(对称加密的私钥),然后把通信内容通过该值(对称加密的私钥随机值)进行对称加密。所谓对称加密就是,将信息和私钥(对称加密的私钥)通过某种算法混在一起,这样除非知道私钥(对称加密的私钥),不然无法获取内容,而正好客户端和服务端都知道这个私钥(对称加密的私钥),所以只要加密算法够彪悍,私钥够复杂,数据就够安全)
7)传输加密的信息
8)客户端解密信息,用随机数(对称加密的私钥)来解。

浏览器在与服务器建立了一个 TCP 连接后是否会在一个 HTTP 请求完成后断开?什么情况下会断开?

默认情况下建立 TCP 连接不会断开,只有在请求报头中声明 Connection: close 才会在请求完成后关闭连接。
在 HTTP/1.0 中,一个服务器在发送完一个 HTTP 响应后,会断开 TCP 链接。但是这样每次请求都会重新建立和断开 TCP 连接,代价过大。所以虽然标准中没有设定,某些服务器对 Connection: keep-alive 的 Header 进行了支持。意思是说,完成这个 HTTP 请求之后,不要断开 HTTP 请求使用的 TCP 连接。这样的好处是连接可以被重新使用,之后发送 HTTP 请求的时候不需要重新建立 TCP 连接,以及如果维持连接,那么 SSL 的开销也可以避免.

一个 TCP 连接可以对应几个 HTTP 请求?

如果维持持久连接,一个 TCP 连接是可以发送多个 HTTP 请求的。

一个 TCP 连接中 HTTP 请求发送可以一起发送么(比如一起发三个请求,再三个响应一起接收)?

HTTP/1.1 存在一个问题,单个 TCP 连接在同一时刻只能处理一个请求,在 HTTP/1.1 存在 Pipelining 技术可以完成这个多个请求同时发送,但是由于浏览器默认关闭,所以可以认为这是不可行的。在 HTTP2 中由于 Multiplexing 特点的存在,多个 HTTP 请求可以在同一个 TCP 连接中并行进行。

为什么有的时候刷新页面不需要重新建立 SSL 连接?

TCP 连接有的时候会被浏览器和服务端维持一段时间。TCP 不需要重新建立,SSL 自然也会用之前的。

浏览器对同一 Host 建立 TCP 连接到数量有没有限制?

有。Chrome 最多允许对同一个 Host 建立六个 TCP 连接。不同的浏览器有一些区别。

收到的 HTML 如果包含几十个图片标签,这些图片是以什么方式、什么顺序、建立了多少连接、使用什么协议被下载下来的呢?

如果图片都是 HTTPS 连接并且在同一个域名下,那么浏览器在 SSL 握手之后会和服务器商量能不能用 HTTP2,如果能的话就使用 Multiplexing 功能在这个连接上进行多路传输。不过也未必会所有挂在这个域名的资源都会使用一个 TCP 连接去获取,但是可以确定的是 Multiplexing 很可能会被用到。

如果发现用不了 HTTP2 呢?或者用不了 HTTPS(现实中的 HTTP2 都是在 HTTPS 上实现的,所以也就是只能使用 HTTP/1.1)。那浏览器就会在一个 HOST 上建立多个 TCP 连接,连接数量的最大限制取决于浏览器设置,这些连接会在空闲的时候被浏览器用来发送新的请求,如果所有的连接都正在发送请求呢?那其他的请求就只能等等了

你可能感兴趣的:(计算机网络)