计算机网络

计算机网络

http 和 https 的区别

http 是超文本传输协议,信息是明文传输,https 是更加安全的 ssl 加密传输协议
http 默认是 80 端口,https 默认是 443 端口
https 需要申请 CA 证书
https 是 http + ssl/tls(数字证书)进行组合的更加安全的传输协议

https 工作原理(非对称加密) 1.服务端向客户端传递证书作为公钥 2.客户端对证书进行解析,判断证书的办法机构和过期时间等,如果都没有问题,生成一个随机值作为私钥,然后使用证书进行加密发送给服务端 3.服务端解密得到客户端私钥 4.之后双方利用私钥进行加密解密,完成信息的通信

HTTP 协议 1.0、1.1、2.0 有什么区别?

  • HTTP 1.0

    • 最基础的 HTTP 协议
    • 支持基本的 GET、POST 方法
  • HTTP 1.1

    • 缓存策略 cache-control、E-tag 等
    • 支持长连接 Connection: keep-alive,一次 TCP 连接多次请求
    • 支持断点续传,状态码 206
    • 支持新的方法 PUT、DELETE 等,可用于 Restful API
  • HTTP 2.0

    • 头部数据压缩:http2.0 使用 HPACK 算法对 header 对头部数据进行压缩,体积变小后,网络传输速度会更快
      • http/1.1 版本的头部信息是本文,而 http/2.0 头部数据就是二进制
    • 多路复用,一次 TCP 连接中可以多个 HTTP 并行请求
  • HTTP 3

    • TCP连接问题
      • http/2使用TCP协议,tcp存在三次握手建立连接的延迟问题
      • http/3采用QUIC协议,quic基于UDP,可以实现0-RTT的快速连接
    • 对头阻塞问题
      • http/2中,多路复用时一个请求阻塞,会导致后续所有请求被阻塞
      • http/3采用QUIC的流控机制,每个请求都有独立的流,一个流不会影响其他流
    • 安全性问题
      • http/3完全基于TLS加密,提供更好的安全性
      • QUIC集成了加密机制,不需要TCP+TLS那样叠加两个协议
    • 网络环境适应性
      • QUIC可以适应更复杂的网络环境,包括wifi、移动网络等,抗丢包和重传能力更强

301 和 302 的区别

301 表示资源被永久移除,浏览器在拿到状态码后跳转到一个新的 URL 地址,可从相应头的 location 首部中获取,搜索引擎在抓取新内容的同时也将就地址交换为重定向之后的网址。

302 表示地址资源还在,仍可以访问,搜索引擎会抓取新的内容而保存旧的地址,seo 302 优于 301.

重定向的原因:
网站调整(改变网页目录结构)
页面被移到一个新地址
页面扩展名改变 .php ->.html
如果不做重定向会返回 404 页面,会白白流失用户访问量。

1XX 信息性状态码,表示接受的请求正在处理
2XX 成功状态码,表示请求被正常处理完毕
3XX 重定向状态码,表示需要进行附加操作以完成请求
4XX 客户端错误状态码,表示服务器无法处理请求
400 Bad Request 请求出现语法错误
401 被请求的页面需要用户名和密码
403 forbidden 请求页面的访问被禁止
404 资源未找到
5XX 服务器错误状态码,表示服务器处理请求出错
502 网关错误
503 服务器超负载或者停机维护,无法处理请求
504 网关超时

HTTP 协议和 UDP 协议有什么区别?

  • 网络协议
    • HTTP 协议在应用层
    • TCP、UDP 协议在传输层
      • TCP 协议
        • 有连接,有断开
        • 稳定传输
      • UDP 协议
        • 无连接,无断开
        • 不稳定传输,但效率高
        • 如视频会议、语音通话

UDP & TCP 的区别

  • 相同点:

    • UDP 协议 和 TCP 协议 都是运输层协议
  • 不同点:

    • UDP 特点:

      • 无连接 —— 知道对端的 IP 和端口号就直接进行传输,不需要建立连接
      • 不可靠 —— 没有确认机制,没有重传机制,即使因为网络故障无法发送到
        对方,UDP 协议也不会给应用层返回任何错误信息
      • 面向数据报
      • 传输速 度块
    • TCP 特点:

      • 面向连接,在客户端和服务器进行交换数据前,必须先在双方之间建立一个
        TCP 连接
      • 可靠传输,具有确认应答机制、超时重传机制、拥塞控制、流量控制、
        滑动窗口机制、延迟应答等。
      • 面向字节流
  • UDP 的响应速度优于 TCP,安全性和数据可靠性不如 TCP

  • UDP 一般用在网络负担非常重,但对响应速度要求高,数据类型都是短消息的情况下

网络模型

OSI(open system interconnect)参考模型

  • 应用层(为应用程序提供网络服务)
  • 表示层(数据格式化,加密等)
  • 会话层(建立、维护管理会话连接)
  • 传输层(建立、维护管理到端连接)
  • 网络层(IP 寻址和路由选择)
    • 寻址就是根据 IP 地址找到具体的设备
    • 路由就是选择数据传输的线路
  • 数据链路层(控制网络层和物理层之间通信)
  • 物理层(通过光缆、无线电波等方式连接组网)

TCP/IP 模型

  • 应用层(应用层就是向用户提供通信服务的活动,提供用户程序接口 HTTP、FTP、DNS)
  • 传输层(传输层为两台主机上的应用程序提供端到端的通信 TCP,UDP)
  • 网络层(网络层实现数据包的选路和转发)
  • 数据链路层(ARP 地址解析协议、RARP 逆地址解析协议,使用物理地址寻找一台机器)

WebSocket

WebSocket是html5定义的新协议,特点是即时通信、替代轮训

与传统http协议不同,实现了浏览器和服务器的全双工通信

HTTP 和 WebSocket

相同点:

  • 都是基于 TCP 可靠传输协议

不同点:

  • WebSocket 是全双工通信协议,通信双方可以同时发送和接收消息,http 是单向的
  • WebSocket 没有 Request 和 Response 概念
  • WebSocket 需要依赖 http 协议进行一次握手,握手成功后直接从 TCP 通道传输,与 http 无关
  • WebSocket 数据格式较轻量,数据包头部较小,http 协议每次通信需要携带完成头部信息
  • WebSocket 无跨域问题
  • WebSocket 多了两个属性 Upgrade: webSocket、Connection: Upgrade,服务端返回 101 成功状态码

单工、半双工和全双工通信

  • 单工通信:指消息只能单向传输的工作方式,数据信息从一端到另一端是单向的。例如:广播
  • 半双工通信:可以双向通信,但必须交替进行。例如:对讲机
  • 全双工通信:指在通信的任意时刻,都允许数据同时在两个方向上传输,通讯双方都设置了发送器和接收器。

DNS 负载均衡

当一个网站有足够多的用户的时候,假如每次请求的资源都位于同一台机器上面,那么这台机器随时可能会蹦掉。处理办法就是用 DNS 负载均衡技术,它的原理是在 DNS 服务器中为同一个域名配置多个 IP 地址,在应答 DNS 查询时,DNS 服务器对每个查询将以 DNS 文件中主机记录的 IP 地址按顺序返回不同的解析结果,将客户端的访问引导到不同的机器上去,使得不同的客户端访问不同的服务器,从而达到负载均衡的目的。例如可以根据每台机器的负载量,该机器离用户地理位置的距离等等。

强缓存和协商缓存

强缓存:(expires、Cache-Control)在过期时间内,浏览器再次加载资源时,不会向服务器发起请求,直接从缓存中读取资源

协商缓存:向服务器发送请求,服务器会根据请求头(request header)的一些参数(Etag、last-modified)来判断是否命中协商缓存,首先根据 Etag 的值判断请求的文件有没有被修改,如果 Etag 一致则没有被修改,命中协商缓存返回 304,如果不一致则返回新的资源并带上新的 Etag 返回 200 状态码。如果没有 Etag 值,则对比 If-Modified-Since 和请求文件的最后修改时间,一致则命中协商缓存返回 304,不一致则返回新的 last-modified 和 200 状态码

http 协议的特点

1.支持客户/服务器模式 2.简单快速:客户向服务器发送请求时,只需传送请求方法和路径。 3.灵活:http 允许传输任意类型的数据对象(Content-Type 内容编码类型)

application/x-www-form-urlencoded 常见 post 提交数据格式(key-value 格式)
application/json

4.无连接:限制每次连接只处理一个请求,服务器处理完客户端的请求,并收到客户端的应答后,即断开连接。(原因是早期服务器需要同时面对全世界数十万、上百万的客户端的网页访问,但是每次客户端与服务端传输的数据关联性很低,就会导致大部分通过会很空闲,无端占用资源)

(解决无连接)Keep-Alive:使客户端到服务端之间的 Http 连接保持,不会断开,当再次对服务器发送请求时,keep-Alive 功能避免了重新建立连接

5.无状态:Http 是一个无状态协议,就是每个请求都是独立的,数据传输完毕不会记录任何信息。缺点就是如果后续处理需要前面的信息,就必须重传,就会导致每次连接传送的数据量增加,如果服务器不需要前面信息的时候应答就会很快。

(解决无状态)怎样保持 http 连接状态呢
Cookie(每次 http 请求的时候,客户端都需要发送响应的 cookie 信息到服务端,服务端根据 cookie 判断来自哪个客户端)
服务端生成 cookie,客户端保存

Session
服务端生成一个 sessionid,在客户端下次请求的时候在 cookie 里面记录这个 sessionid,然后发送给服务端,服务端再根据 cookie 中的 sessionid 来识别客户端返回资源数据。

禁用 cookie 怎么办?
url 重写,每次 http 请求的时候,在 url 后面拼接 sid=**参数

withCredentials:指定在涉及到跨域请求时,是否携带 cookie 信息,默认为 false
Access-Control-Allow-Credentials: true

  1. 存取方式不同: cookie 只能保存 ASCII 字符串,session 能够存储任意类型的数据
  2. 隐私策略不同
  3. cookie 是存在客户端,session 是存在服务器的
  4. 浏览器的支持不同,浏览器可以禁用 cookie

权限身份验证

一般都是通过 sessionid 来进行用户身份验证,sessionid 一般会存放在 redis 中。

  1. 用户向服务端发送用户名和密码进行登陆
  2. 服务器验证通过后,服务器为用户创建一个 session,并将 session 信息存储起来
  3. 服务器向用户返回一个 sessionid,写入用户的 cookie
  4. 当用户保持登陆状态时,每次后续请求都会一起发送给后端
  5. 服务器将存储在 cookie 中的 sessionid 和存储在内存或者数据库中的 sessin 信息进行一个比较,验证用户身份,然后返回响应信息

注意: 1.依赖 session 的关键业务一定要确保客户端开启了 cookie 2.注意 session 的过期时间

一般在 http header 的 Authorization 字段中添加 token

url 重写,例如 https://javascript.cn/?session_id=xxx
缺点是安全性降低,可以对 sessionid 进行一次加密后传输

get 和 post 的区别

  1. url 可见性:get 参数 url 可见,post 参数 url 不可见
  2. 数据传输:get 通过拼接 url 进行传递参数,post 通过 body 体传输参数
  3. 缓存性:get 请求可以缓存,post 请求不可以缓存
  4. get 请求网页回退时,不产生影响,post 请求网页回退会重新发请求
  5. 传输数据:get 一般传输数据大小不超过 4k,post 可以传输大量数据
  6. post 较 get 安全性较高,get 是不安全的因为 url 可见,可能会泄漏私密信息

http 常见的请求头字段

Accept: 浏览器可接受的数据类型
Accept-Charset: 浏览器可接受的字符集
Accept-Encoding:浏览器能够进行解码的数据编码方式
Accept-Language: 浏览器所希望的语言种类
Connection:是否需要持久连接,值“Keep-Alive”,HTTP1.1 默认进行持久连接
Cookie:cookie 信息
content-type
If-Modified-Since:内容被修改才会返回
User-Agent:浏览器类型

响应头:
content-Length: 表示内容长度
content-type:文档类型
Date:当前时间
Expires:指定缓存过期时间
Last-Modified:文档过期时间

xss(跨域脚本攻击)csrf(跨站请求伪造)

csrf: 需要用户先登陆网站 A,获取 cookie,利用的是网站 A 本身的漏洞,去请求网站 A 的 api,—进行 token 验证,referer 验证,只接收本站的请求

xss:向网站 A 注入 js 代码,然后执行 js 代码,篡改网站 A 的内容,破坏页面正常结构,插入恶意广告。—编码转换

正向代理和反向代理

1
2
3
4

正向代理是客户端代理,服务端不知道是哪个客户端发起的请求
反向代理是服务端代理,客户端不知道是哪个服务端提供的资源

三次握手

为什么需要三次握手?
两次握手第二次结束后,服务端并不能保证客户端已经接收到了第二次的应答信息,如此一来服务器会一直保持通信过程,因为 TCP 通信会占用端口,造成资源浪费。

防止已失效的连接请求报文段突然又传送到服务端,产生错误。
如上述情况,如果 client 没有再次向 server 发出确认,server 收不到确认就不会建立连接,可以避免 server 端一直等待浪费资源。

四次挥手

什么是 HTTPS 中间人攻击?如何预防?

  • HTTPS 加密传输

    • HTTP 明文传输
    • HTTPS 加密传输 HTTP + TLS/SSL
    • https加密
  • 答案

    • 使用正规厂商的加密证书可以防止中间人攻击

WebSocket 和 HTTP 有什么区别?

  • WebSocket

    • 支持端对端通讯

    • 可以由 client 发起,也可以由 server 发起

    • 用于:消息通知,直播间讨论区,聊天室,协同编辑

    • client

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    const { WebSocketServer } = require('ws');
    const wsServer = new WebSocketServer({ port: 3000 });

    wsServer.on('connection', (ws) => {
    console.log('connection');

    ws.on('message', (msg) => {
    console.log('收到了信息', msg.toString());

    setTimeout(() => {
    ws.send('服务端已经收到了信息' + msg.toString());
    }, 2000);
    });
    });
  • server
1
2
3
4
5
6
7
8
9
10
11
12
13
14
const ws = new WebSocket('ws://127.0.0.1:3000');
ws.onopen = () => {
console.log('opened');
ws.send('client opened');
};
ws.onmessage = (event) => {
console.log('收到了信息', event.data);
};
const btn = document.getElementById('btn');
btn.addEventListener('click', () => {
console.log('clicked');

ws.send('当前时间' + Date.now());
});
  • WebSocket 连接过程

    • 先发起一个 http 请求
    • 成功之后再升级到 WebSocket 协议,再通讯
  • WebSocket 和 HTTP 区别?

    • WebSocket 协议名是 ws://,可双端发起请求
    • WebSocket 没有跨域限制
    • 通过 send 和 onmessage 通讯(HTTP 通过 req 和 res)
  • ws 可升级为 wss(like https)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import { createServer } from 'https';
    import { readFileSync } from 'fs';
    import { WebSocketServer } from 'ws';

    const server = createServer({
    cert: readFileSync('/path/to/cert.pem'),
    key: readFileSync('/path/to/key.pem'),
    });

    const wss = new WebSocketServer({ server });
  • 实际项目推荐 socket.io,API 更简洁

WebSocket 和 HTTP 长轮询的区别?

  • 区别

    • HTTP 长轮询:客户端发起请求,服务端阻塞,不会立即返回
    • WebSocket:客户端可发起请求,服务端也可发起请求
  • 注意

    • HTTP 长轮询,需处理 timeout,即 timeout 之后重新发请求

ajax

  • xhr.readyState

    • 0 (未初始化)还没有调用 send()方法
    • 1 (载入)已调用 send()方法,正在发送请求
    • 2 (载入完成) send()方法执行完成,已经接收到全部响应内容
    • 3 (交互) 正在解析响应内容
    • 4 (完成) 响应内容解析完成,可以在客户端调用
  • xhr.status

    • 2xx 表示成功处理请求,如 200
    • 3xx 需要重定向,浏览器直接跳转,如 301、302、304
    • 4xx 客户端请求错误,如 404、403
    • 5xx 服务端错误

常见状态码?

信息响应

  • 101 协议切换

成功响应

  • 200 成功
  • 204 请求成功,不返回任何内容
  • 206 分块请求成功

重定向

  • 301 永久重定向(配合 location,浏览器自动处理)
  • 302 临时重定向(配合 location,浏览器自动处理)
  • 304 资源未被修改(协商缓存 )

客户端响应

  • 400 无法被服务器理解
  • 401 未授权
  • 403 禁止访问
  • 404 资源未找到
  • 405 没有权限,请求方法(get/post 等)错误

服务端响应

  • 500 服务器错误

  • 503 服务不可达

  • 504 网关超时

  • 本身状态码就是一种约定,一种协议和规范,不要尝试违反规范,例如 IE 浏览器

http 常见 methods?

  • 传统 methods

    • get 获取服务器的数据
    • post 向服务器提交数据
  • 新的 methods

    • get 获取数据
    • post 新建数据
    • patch/put 更新数据
    • delete 删除数据

Restful API

  • 一种新的 API 设计方法

  • 传统 API 设计:把每个 url 当作一个功能

  • Restful API 设计:把每个 url 当作一个唯一的资源

  • 原则

    • 不使用 url 参数
      • 传统 API 设计:/api/list?pageIndex=2
      • Restful API 设计:/api/list/2
    • 用 method 表示操作类型
      • 传统 API 设计
        • post 请求 /api/create-blog
        • post 请求 /api/update-blog?id=100
        • get 请求 /api/get-blog?id=100
      • Restful API 请求
        • post 请求 /api/blog
        • patch 请求 /api/blog/100
        • get 请求 /api/blog/100

常见 http headers?

  • Request Headers

    • Accept 浏览器可接收的数据格式
    • Accept-Encoding 浏览器可接收的压缩算法,如 gzip
    • Accept-Languange 浏览器可接收的语言,如 zh-CN
    • Connection: keep-alive 一次 TCP 连接重复使用
    • cookie
    • Host 如:www.baidu.com
    • Cache-Control
    • User-Agent (简称 UA)浏览器信息
    • Content-type 发送数据的格式,如 application/json
  • Response Headers

    • Content-type 返回数据的格式,如 application/json
    • Content-length 返回数据的大小,多少字节
    • Content-Encoding 返回数据的压缩算法,如 gzip
    • Set-Cookie
    • Expires
    • Etag
    • date
  • 自定义 header

  • 缓存相关的 headers

    • Cache-Control Expires
    • Last-Modified If-Modified-Since
    • Etag If-None-Match

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

  • 校验和
  • 确认应答 + 序列号
  • 超时重传
  • 流浪控制
  • 拥塞控制
  • TCP 的连接管理
  • 滑动窗口

http 和 https 的区别

  • http 是一种一种广泛使用的网络协议,是一个客户端和服务器请求和应答的标准。
  • http 工作在 TCP 协议的 80 端口,https 工作在 TCP 协议的 443 端口
  • http 协议运行在 TCP 协议之上,所有的传输内容都是明文,https 运行在 SSL/TLS 之上,
    SSL/TLS 运行在 TCP 之上,所有的传输内容都是经过加密的。
  • https 是以安全为目标的 http 通道,是 http 的安全版。是 http 加上 SSL 层对传输的信息和 url 做了一些加密处理,更加安全

为什么 https 不会被截取信息

  • 完成 TCP 三次同步握手
  • 客户端验证服务器数字证书,通过,进入步骤 3
  • DH 算法协商对称加密算法的密钥、hash 算法的密钥
  • SSL 安全加密隧道协商完成
  • 网页以加密的方式传输,用协商的对称加密算法和密钥加密,保证数据机密性;
    用协商的 hash 算法进行数据完整性保护,保证数据不被篡改

如何处理 TCP 的粘包?

发生 TCP 粘包或拆包有很多原因,现列出常见的几点:

要发送的数据大于 TCP 发送缓冲区剩余空间大小,将会发生拆包。
待发送数据大于 MSS(最大报文长度),TCP 在传输前将进行拆包。
要发送的数据小于 TCP 发送缓冲区的大小,TCP 将多次写入缓冲区的数据一次发送出去,将会发生粘包。
接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包。

关键点:如何给每个数据包添加边界信息

发送端给每个数据包添加包首部,首部中应该至少包含数据包的长度,这样接收端在接收到数据后,通过读取包首部的长度字段,便知道每一个数据包的实际长度了。

发送端将每个数据包封装为固定长度(不够的可以通过补 0 填充),这样接收端每次从接收缓冲区中读取固定长度的数据就自然而然的把每个数据包拆分开来。

可以在数据包之间设置边界,如添加特殊符号,这样,接收端通过这个边界就可以将不同的数据包拆分开。

请说说 HTTPS 的握手过程?

HTTPS 的握手过程主要包括以下步骤:

客户端向服务端发送一个加密过的客户端随机数和客户端支持的加密算法列表,同时请求建立 SSL/TLS 连接。

服务端在接收到请求后,向客户端发送一个包含服务端随机数、服务器支持的加密算法列表以及服务器的数字证书的报文。

客户端在接收到服务器的响应后,会对证书进行校验。如果证书被认为是合法的,那么客户端将使用证书中包含的公钥对一个随机数进行加密,并将加密后的随机数发送给服务端。

服务端在接收到客户端的响应后,使用私钥对加密的随机数进行解密,得到客户端生成的随机数。同时,服务端也会生成一个加密的会话密钥,并使用客户端和服务端的随机数以及协商出的加密算法对该密钥进行加密,最后将加密后的密钥发送给客户端。

客户端接收到服务端发送的加密的会话密钥后,使用服务端公布的公钥进行解密,得到原始的会话密钥。

客户端和服务端都会使用会话密钥进行加密和解密,从而实现安全的通信。

这个过程中,客户端和服务端会进行多次来回的通信,以建立安全的 SSL/TLS 连接。其中数字证书的校验和会话密钥的生成都是关键步骤,它们保证了通信的安全性。

请说说什么是数字证书?它有什么作用?

  • 数字证书是一种加密技术,用于验证在线交互中的身份和信息安全性。它是由可信任的第三方机构(例如数字证书颁发机构)颁发的一份电子文档,其中包含了一些加密信息,如公钥、数字签名等。数字证书的作用是确保通信双方的身份和数据的完整性和保密性。

  • 在使用数字证书进行加密通信时,服务端会向证书颁发机构申请一份数字证书。数字证书包含了服务端的公钥,以及一些描述服务端身份的信息,例如域名、组织名称等。客户端在与服务端建立连接时,会向服务端请求数字证书,并验证证书的真实性和合法性。如果验证成功,客户端就可以使用服务端的公钥加密数据并发送给服务端了。同时,服务端也可以使用客户端的公钥进行数据的加密和验证。这样就可以确保通信过程中的数据不被窃听或篡改。

  • 数字证书的使用广泛,特别是在网站安全和电子商务领域。它可以用来验证网站的真实性和合法性,确保网站访问过程中的信息安全。此外,数字证书还可以用于文件签名、电子邮件加密等其他领域。
    ````

评论