0%


Redis 是基于内存的 Key Value 的 NoSql 数据库,由于其高性能,高可用,支持分布式集群的优点被广泛应用于缓存的业务场景。本篇文章就来详细了解下 Redis 缓存机制及内存淘汰策略。

阅读全文 »


Redis 作为最流行的非关系型数据库之一,既然是数据库就应该具备数据持久化的机制,本篇文章将针对 Redis 的数据持久化与数据恢复来进行讨论。

阅读全文 »


本篇文章来介绍 Redis 的第三种集群模式 Cluster 集群模式,该模式也是 Redis3.x 之后才引入的,在该
模式下解决了主从同步哨兵模式 的不能水平扩容的问题,使得 Redis 集群的性能得到提高,也由此成为了Redis 官方推荐使用的集群方案。本篇文章来介绍如何搭建使用 Redis Cluster 集群并试图去探究 Redis Cluster 集群的实现原理。

阅读全文 »


上一篇文章介绍了 Redis 集群的主从同步模式,虽然配置简单,但是缺点也十分突出:Master 内存受限,Master 宕机之后不能自动切换,不能水平扩容等等。本篇文章来介绍 Redis 的第二种集群模式 哨兵模式

阅读全文 »


在生产环境中,为了保证 Redis 服务的高可用,我们往往要使用 Redis 的集群模式,Redis 的集群模式有三种:主从同步集群模式、哨兵集群模式、Cluster 集群模式,本篇文章先介绍 Redis 主从同步集群模式的原理及实现。

阅读全文 »


当我们在浏览器输入网址回车后,首先就需要对网址解析,找到该网址对应的真正的服务地址,那么域名解析的过程就是 DNS 解析。

一次完整的请求

  1. 域名解析
  2. 建立TCP连接,三次握手
  3. Web浏览器向Web服务端发送HTTP请求报文
  4. 服务器响应HTTP请求
  5. 浏览器解析HTML代码,并请求HTML代码中的资源(JS,CSS,图片)(这是自动向服务器请求下载的)
  6. 浏览器对页面进行渲染呈现给客户
  7. 断开TCP连接

如何解析对应的IP地址?域名解析过程:

dns

dns 协议

参考资料

HTTP1.0 HTTP 1.1主要区别
探究!一个数据包在网络中的心路历程
万字长文爆肝 DNS 协议!


UDP 协议简介

UDP(User Datagram Protocol)传输与IP传输非常类似。你可以将UDP协议看作IP协议暴露在传输层的一个接口。UDP协议同样以数据包(datagram)的方式传输,它的传输方式也是”Best Effort”的,所以UDP协议也是不可靠的(unreliable)。那么,我们为什么不直接使用IP协议而要额外增加一个UDP协议呢? 一个重要的原因是IP协议中并没有端口(port)的概念。

UDP协议非常简单,但它的产生晚于更加复杂的TCP协议。早期的网络开发者开发出IP协议和TCP协议分别位于网络层和传输层,所有的通信都要先经过TCP封装,再经过IP封装(应用层->TCP->IP)。

UDP 报文格式

UDP的数据包同样分为头部(header)和数据(payload)两部分。

![udp-pakage]!(/images/udp-pakage.png)

源端口:发送方的端口号;2个字节
目的端口:接收方的端口号;2个字节
数据报长度:长度是指包括报头和数据部分在内的总字节数。因为报头的长度是固定的,所以该域主要被用来计算可变长度的数据部分;2个字节
校验值:校验值来保证数据的安全。校验值首先在数据发送方通过特殊的算法计算得出,在传递到接收方之后,还需要再重新计算。如果某个数据报在传输过程中被第三方篡改或者由于线路噪音等原因受到损坏,发送和接收方的校验计算值将不会相符,由此UDP协议可以检测是否出错。2 个字节

总共头部占 8个字节

UDP 协议特点

UDP使用具有最小协议机制的简单无连接通信模型。UDP提供数据完整性的校验和,以及用于在数据报的源和目标寻址不同函数的端口号。它没有握手对话,因此将用户的程序暴露在底层网络的任何不可靠的方面。如果在网络接口级别需要纠错功能,应用程序可以使用为此目的设计的传输控制协议(TCP)。

  • UDP无连接:UCP不维护连接状态,也不跟踪这些参数,开销小
  • 分组首部开销小:TCP首部20字节,UDP首部8字节。
  • UDP没有拥塞控制:应用层能够更好的控制要发送的数据和发送时间,网络中的拥塞控制也不会影响主机的发送速率
  • UDP提供尽最大努力的交付,不保证可靠交付:
  • UDP是面向报文的:添加首部后直接乡下交付为IP层,既不合并,也不拆分,保留这些报文的边界。对IP层交上来UDP用户数据报,在去除首部后就原封不动地交付给上层应用进程,报文不可分割,是UDP数据报处理的最小单位。
  • UDP 支持一对一、一对多、多对一和多对多的交互通信。

UDP校验和的计算方法和IP数据报首部校验和的计算方法相似,都使用二进制反码运算求和再取反,但不同的是:IP数据报的校验和之检验IP数据报和首部,但UDP的校验和是把首部和数据部分一起校验。

UDP 适用场景

UDP常用一次性传输比较少量数据且对数据丢失不敏感的网络应用。例如:DNS,SNMP等,因为对于这些应用,若是采用TCP,为连接的创建,维护和拆除带来不小的开销。UDP也常用于多媒体应用(如IP电话,实时视频会议,流媒体等)数据的可靠传输对他们而言并不重要,TCP的拥塞控制会使他们有较大的延迟,也是不可容忍的。

UDP 连接

客户端:直接绑定端口就可以发送数据了

1
2
3
4
5
6
7
8
9
10
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定端口:
s.bind(('127.0.0.1', 9999))
print('Bind UDP on 9999...')
while True:
# 接收数据:
data, addr = s.recvfrom(1024)
print('Received from %s:%s.' % addr)
# 返回数据给客户端
s.sendto(b'Hello, %s!' % data, addr)

服务端:使用UDP时,创建基于UDP的 Socket,然后,不需要调用connect(),直接通过sendto()给服务器发数据:

1
2
3
4
5
6
7
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
for data in [b'Michael', b'Tracy', b'Sarah']:
# 发送数据:
s.sendto(data, ('127.0.0.1', 9999))
# 接收数据:
print(s.recv(1024).decode('utf-8'))
s.close()

参考资料

UDP协议总结


TCP 协议是面向连接的传输层协议,具备可靠传输、点对点连接、全双工通信等特性。主要特点:

  • 面向连接的运输层协议,使用前必须先创建连接,传输完数据后必须关闭连接
  • 点对点传输,由一个进程的一个端口传输到另一个进程的端口
  • TCP 传输的数据无差错、不会丢失、不会重复
  • TCP 是双向数据流,两端都可以读写数据
  • 面向字节流
阅读全文 »