传输控制协议-TCP (Transmisson Control Protocol)
提供面向连接的,可靠的数据传输服务。
1. TCP 是面向连接的(需要先建立连接);
2. 每一条 TCP 连接只能有两个端点,每一条 TCP 连接只能是一对一;
3. TCP提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复、并且按序到达;
4. TCP 提供全双工通信。TCP 允许通信双方的应用进程在任何时候都能发送数据。
5. TCP 连接的两端都设有发送缓存和接收缓存,用来临时存放双方通信的数据;面向字节流。
6. TCP 中的“流”(Stream)指的是流入进程或从进程流出的字节序列。
用户数据协议-UDP (User Datagram Protocol)
1. UDP 是无连接的;
2. UDP 是尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态;
3. UDP 是面向报文的;
4. UDP 没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如直播,实时视频会议等);
5. UDP 支持一对一、一对多、多对一和多对多的交互通信;
6. UDP 的首部开销小,只有 8 个字节,比 TCP 的 20 个字节的首部要短。
超文本传输协议- HTTP ( HyperText Transfer Protocol )
HTTP:
1. 运行在 TCP 之上,明文传输,客户端与服务器端都无法验证对方的身份
2. 无加密机制
3. 端口: 80
4. 不需要证书
5. 资源占用少
HTTPS:
1. 身披 SSL( Secure Socket Layer )外壳的 HTTP,运行于 SSL 上,SSL 运行于 TCP 之上, 是添加了加密和认证机制的 HTTP。
2. 共享密钥加密和公开密钥加密并用的混合加密机制
3. 端口: 443
4. 需要证书
5. 资源占用多
对称加密与非对称加密
对称密钥加密是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是密钥发送问题,即如何安全地将密钥发给对方;
而非对称加密是指使用一对非对称密钥,即公钥和私钥,公钥可以随意发布,但私钥只有自己知道。
发送密文的一方使用对方的公钥进行加密处理,对方接收到加密信息后,使用自己的私钥进行解密。
由于非对称加密的方式不需要发送用来解密的私钥,所以可以保证安全性;但是和对称加密比起来,非常的慢.
综上:我们还是用对称加密来传送消息,但对称加密所使用的密钥我们可以通过非对称加密的方式发送出去。
TCP 三次握手和四次挥手
第一次握手:
建立连接时,向服务器发出连接请求报文,这是报文首部中的同部位 SYN = 1,
同时选择一个初始序列号 seq = x ,客户端进程进入了 SYN-SENT (同步已发送状态)状态,等待服务器确认;
第二次握手:
服务器收到 syn 包后,如果同意连接,则发出确认报文; 确认报文 ACK = 1,SYN = 1,确认号是 ack = x + 1,
同时也要为自己初始化一个序列号 seq = y,此时服务器进程进入了 SYN-RCVD(同步收到)状态;
第三次握手:
客户端收到服务器的 SYN+ACK 包,要向服务器给出确认。
确认报文的 ACK = 1,ack = y + 1,自己的序列号 seq = x + 1,此时,TCP 连接建立,客户端进入 ESTABLISHED (已建立连接)状态。
第一次挥手:
客户端进程发出连接释放报文,并且停止发送数据。
释放数据报文首部 FIN=1,其序列号为 seq = u(等于前面已经传送过来的数据的最后一个字节的序号加1),
此时,客户端进入 FIN-WAIT-1(终止等待1)状态。
第二次挥手:
服务器收到连接释放报文,发出确认报文,ACK = 1,ack = u + 1,并且带上自己的序列号 seq = v,
此时,服务端就进入了 CLOSE-WAIT(关闭等待)状态。
第三次挥手:
服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN = 1,ack = u + 1,
由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为 seq = w,
此时,服务器就进入了 LAST-ACK(最后确认)状态,等待客户端的确认。
第四次挥手:
客户端收到服务器的连接释放报文后,必须发出确认,ACK = 1,ack = w + 1,而自己的序列号是 seq = u + 1,
此时,客户端就进入了 TIME-WAIT(时间等待)状态。
四次的原因:
这是因为服务端的 LISTEN 状态下的 SOCKET 当收到 SYN 报文的建连请求后,它可以把 ACK 和 SYN(ACK 起应答作用,而 SYN 起同步作用)放在一个报文里来发送。
但关闭连接时,当收到对方的 FIN 报文通知时,它仅仅表示对方没有数据发送给你了;
但未必你所有的数据都全部发送给对方了,所以你未必会马上会关闭 SOCKET ,
也即你可能还需要发送一些数据给对方之后,再发送 FIN 报文给对方来表示你同意现在可以关闭连接了,
所以它这里的 ACK 报文和 FIN 报文多数情况下都是分开发送的.
DNS
DNS Prefetch - DNS 预获取,是前端优化的一部分。一般来说,在前端优化中与 DNS 有关的有两点:
1. 减少 DNS 的请求次数
2. 进行 DNS 预获取
CDN
Content Delivery Network,即内容分发网络
CDN 是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。
CDN 的关键技术主要有内容存储和分发技术。
CDN的优势:
1. CDN 节点解决了跨运营商和跨地域访问的问题,访问延时大大降低;
2. 大部分请求在 CDN 边缘节点完成,CDN 起到了分流作用,减轻了源站的负载。
CDN & 静态资源
静态资源本身具有访问频率高、承接流量大的特点,因此静态资源加载速度始终是前端性能的一个非常关键的指标。CDN 是静态资源提速的重要手段。
CDN & Cookie
静态资源往往并不需要 Cookie 携带什么认证信息。把静态资源和主页面置于不同的域名下,就可以完美地避免请求中携带不必要的 Cookie。
HTTP 强缓存&协商缓存
- HTTP 协议主要是通过请求头当中的一些字段来和服务器进行通信,从而采用不同的缓存策略。
- HTTP 通过缓存将服务器资源的副本保留一段时间,这段时间称为新鲜度限值。这在一段时间内请求相同资源不会再通过服务器。
- HTTP 协议中 Cache-Control 和 Expires 可以用来设置新鲜度的限值。
强缓存 ( Cache-Control 和 Expires )
强缓存主要是采用响应头中的 Cache-Control 和 Expires 两个字段进行控制的。
其中 Expires 是 HTTP 1.0 中定义的,它指定了一个绝对的过期时期。而 Cache-Control 是 HTTP 1.1 时出现的缓存控制字段。
注: 这两个字段同时使用的时候 Cache-Control 的优先级会更高一点。
客户端都会通过对比本地时间和服务器返回的生存时间来检测缓存是否可用。如果缓存没有超出它的生存时间,客户端就会直接采用本地的缓存。如果生存日期已经过了,这个缓存也就宣告失效。接着客户端将再次与服务器进行通信来验证这个缓存是否需要更新。
协商缓存 ( Last-Modified 和 Etag )
协商缓存机制下,浏览器需要向服务器去询问缓存的相关信息,进而判断是重新发起请求、下载完整的响应,还是从本地获取缓存的资源。
如果服务端提示缓存资源未改动(Not Modified),资源会被重定向到浏览器缓存,这种情况下网络请求对应的状态码是 304。