最近需要在Nodejs平台上使用UDP协议接收JSON数据,于是研究一下。
UDP服务器端代码
1 | /** |
UDP客户端代码
1 | /** |
参考链接
- Node js 开发入门 —UDP 编程,小白也能轻松学会,by crmeb.
- UDP 报文最大可以是多大呢,by cft56200_ln.
- UDP传输报文大小详解,by luckyone906.
最近需要在Nodejs平台上使用UDP协议接收JSON数据,于是研究一下。
1 | /** |
1 | /** |
应公司要求编写了一个流量转发加消息格式转换的程序,但是老是报错。于是使用 wireshark 抓包保存成 pcap 文件,然后想通过流量回放复现程序报错原因。下面研究一下流量回放的方法。
tcpreplay是一款强大的网络数据包重放工具,它可以将捕获到的网络流量(通常是pcap格式的文件)重新重放到网络中,实现对网络通信的重现。这在网络故障排查、安全测试、性能测试、开发调试等场景下具有广泛的应用。同时,tcpreplay不仅仅能重放TCP协议报文,它支持重放所有协议报文,同时支持IPv4和IPv6协议栈,不要被命名误导了,类比tcpdump的命名,tcpdump也能抓取所有协议报文而不仅仅是TCP。
TCPReplay包含几个核心组件和功能:
在进行重放之前,最好能预先确认是将整个pcap文件重放,还是有选择性的筛选特定报文再重放。
具体步骤如下:
1 | tcpdump -i eth0 -nn host 192.168.1.8 and \( tcp port 80 or icmp \) -v -w client.pcap |
1 | tcprewrite --infile=client.pcap --outfile=client_fix.pcap --fixcsum |
校验和(checksum)是通过对数据进行计算得到的一个数值,发送方和接收方会对相同的数据计算出相同的校验和。如果接收方计算出的校验和与发送方提供的校验和不一致,就说明数据在传输过程中发生了错误,接收方会丢弃该数据包,比如不做csum更新的话,对端收到重放包,校验不对,是不会正常响应的,直接丢弃掉:
1 | tcpreplay -v -t -i eth0 client_fix.pcap #-v参数可以看到重放的每一帧的细节;-t参数尽可能快的重放数据包 |
具体步骤如下:
Wireshark直接输入过滤表达式后,在左上角选项栏点击 文件(File)–> 导出特定分组(Export Specified Packets)即可。
1 | tcprewrite --infile=client_src.pcap --outfile=client_src_rewrite.pcap -S 0.0.0.0/0:192.168.1.12 -D 0.0.0.0/0:192.168.1.72 --enet-smac=00:50:56:81:8e:44 --enet-dmac=00:50:56:81:be:58 |
记录各种使用Blender过程中遇到的问题。
具体请参考:
具体请参考:
这些东西共同控制了 一个物体给人材质的感觉,让软件里面做的东西,看起来更像真实的物体。
具体请参考:
一本好书,值得学习。
垂直扩展,又称为“纵向扩展”,指的是通过增加单个服务器的计算能力(CPU、RAM等)来提升其性能。
水平扩展,又称为“横向扩展”,允许通过向资源池中添加更多服务器来进行扩展。
引用自维基百科:“数据库复制可适用于许多数据库管理系统,通常在原始数据库(master)与副本数据库(slaves)之间建立主/从关系”。
主数据库通常仅支持写的操作。从数据库从主数据库中复制数据并且仅支持读操作。所有修改数据的命令,如:insert,delete,update 都必须发送到主数据库。
缓存是一个临时存储区域,用于将昂贵的响应结果或频繁的访问数据存储在内存中,以便之后的请求能被更快的处理。
CDN(内容分发网络)是一个由地理上分散的服务器组成的网络,用于提供静态内容。CDN服务器缓存静态内容,如:图片、视频、CSS、JavaScript文件等。
无状态的Web层
消息队列是一个持久性组件,存储在内存中,支持异步通信,它充当缓冲区并分发异步请求。消息队列的基础架构非常简单,输入服务,被称为生产者/发布者,创建消息,并将它们发送到消息队列中。其他服务或服务器,称为消费者/订阅者,连接到队列,并执行消息定义的动作。
高可用性是系统持续运行的能力,期望能够长时间保持操作。 高可用性通常以百分比表示,100%意味着服务没有任何停机时间。大多数服务的可用性介于99%到100%之间。
服务水平协议(SLA)是服务提供商常用的术语。这是你(服务提供商)与你的客户之间的协议,该协议正式定义了你的服务将提供的运行时间水平。
在网络系统中,限流器被用于控制客户端或服务端发送流量的速率。在HTTP世界中,限流器限制在指定时间内允许发送客户端请求数。 如果API请求次数超过了限流器设置的阈值,则所有超出的调用都会被阻止。
流行算法的列表:
令牌桶(Token bucket)
漏桶算法(Leaking bucket)
固定窗口计数器(Fixed window counter)
滑动窗口日志(Sliding window log)
滑动窗口计数器(Sliding window counter)
为了实现水平扩展,在服务器之间高效、均匀地分配请求/数据非常重要。一致哈希是实现这一目标的常用技术。
引用自维基百科:“一致性哈希是一种特殊的哈希,当重新调整哈希表的大小并使用一致性哈希时,平均只需要重新映射 k/n 个键,其中
k 是键的数量,n 是槽的数量。 相比之下,在大多数传统的哈希表中,数组槽数量的变化导致几乎所有键都被重新映射 [1]”
分布式键值存储也称为分布式哈希表,它将键值对分布在许多服务器上。在设计分布式系统时,了解 CAP(C一致性、A可用性、P分区容错性)定理很重要。
CAP 定理指出,分布式系统不可能同时提供以下三种保证中的两种以上:一致性、可用性和分区容错性。让我们熟悉一些定义。
一致性:一致性意味着所有客户端无论连接到哪个节点,都在同一时间看到相同的数据。
可用性:可用性意味着即使某些节点已关闭,任何请求数据的客户端都会得到响应。
分区容忍度:分区表示两个节点之间的通信中断,分区容错意味着系统在网络分区的情况下继续运行。
CAP 定理指出,必须牺牲三个属性之一来支持 3 个属性中的 2 个。
可以使用多个选项在分布式系统中生成唯一ID。
短网址设计概念: 假设 URL https://www.systeminterview.com/q=chatsystem&c=loggedin&v=v3&l=long 是原始 URL。你的服务创建了一个长度较短的别名:https://tinyurl.com/y7keocwj。如果你单击较短的别名URL,它会将你重定向到原始 URL。
301重定向。301重定向表明,请求的URL被 “永久 “地移到了长URL上。由于是永久重定向,浏览器会缓存响应,对同一URL的后续请求将不会被发送到URL缩短服务上。相反,请求将直接被重定向到长网址服务器。
302重定向。302重定向意味着URL被 “暂时 “移到长URL上,这意味着对同一URL的后续请求将首先被发送到URL缩短服务上。然后,它们会被重定向到长网址服务器。
哈希+碰撞解决
base 62 转换
网络爬虫被称为机器人或蜘蛛。搜索引擎广泛使用它来发现 Web 上的新内容或更新内容。内容可以是网页、图像、视频、PDF 文件等。
近年来,通知系统已经成为许多应用程序非常流行的功能。 通知提醒用户重要信息,如突发新闻、产品更新、活动、优惠等。
什么是信息推送? 根据 Facebook 帮助页面,“动态是位于首页中间不断更新的动态列表。动态包括您在 Facebook 上关注的用户、公共主页和小组发布的状态更新、照片、视频、链接、应用事件和点赞。”
信息发布(Feed publishing):当用户发布帖子时,相应的数据被写入缓存和数据库。帖子被推送到她朋友的动态中。
信息流构建(Newsfeed building):为简单起见,我们假设信息推送是通过按时间倒序聚合朋友的帖子来构建的。
Fanout 是将帖子传递给所有朋友的过程。两种类型的扇出模型是:写扇出(也称为推模型)和读扇出(也称为拉模型)。两种模型各有利弊。
当发送方通过聊天服务向接收方发送消息时,它使用久经考验的 HTTP 协议,这是最常见的 Web 协议。在此场景中,客户端打开与聊天服务的 HTTP 连接并发送消息,通知服务将消息发送给接收者。 Keep-Alive 对此很有效,因为 Keep-Alive 标头允许客户端与聊天服务保持持久连接。 它还减少了 TCP 握手的次数。
由于HTTP是由客户发起的,因此从服务器发送消息并非易事。多年来,许多技术被用来模拟服务器发起的连接:轮询(Polling)、长轮询(Long polling)和 WebSocket。
图12-9显示了1对1聊天的消息表。主键是 message_id ,它有助于决定消息的顺序。我们不能依靠 created_at 来决定消息的顺序,因为两条消息可以同时创建。
定期地,一个在线客户端向状态服务器发送一个心跳事件。如果状态服务器在一定时间内收到心跳事件,比如说来自客户端的X秒,那么用户被认为是在线的。否则,它就处于离线状态。
当你在谷歌上搜索或在亚马逊购物时,在搜索框中输入,会有一个或多个与搜索词相匹配的内容呈现给你。这一功能被称为自动完成、提前输入、边输入边搜索或增量搜索。
trie 的主要思想包括以下内容:
trie是一种树状的数据结构。
根代表一个空字符串。
每个节点存储一个字符并有 26 个子节点,每个节点对应一个可能的字符。 为了节省空间,我们不绘制空链接。
每个树节点代表一个单词或一个前缀字符串。
当你在YouTube上观看一个视频时,它通常立即开始流媒体,你不会等到整个视频被下载。下载意味着整个视频被复制到你的设备上,而流媒体意味着你的设备不断接收来自远程源视频的视频流。当你观看流媒体视频时,你的客户端每次加载一点数据,所以你可以立即和连续地观看视频。
流媒体协议。这是一种控制视频流数据传输的标准化方式。流行的流媒体协议有:
MPEG–DASH:MPEG代表 “移动图像专家组”,DASH代表 “HTTP动态自适应流”。
苹果 HLS:HLS是 “HTTP实时流媒体 “的缩写。
微软 Smooth Streaming。
Adobe HTTP动态流(HDS)。
Facebook的流媒体视频引擎使用了一个有向无环图(DAG)编程模型,它分阶段定义任务,因此它们可以顺序或平行地执行。
Google Drive 是一种文件存储和同步服务,可帮助您在云端存储文档、照片、视频和其他文件。您可以从任何计算机、智能手机和平板电脑访问您的文件。你可以轻松地与朋友、家人和同事共享这些文件。
附近地点服务用于发现附近的餐厅、酒店、剧院、博物馆等场所,是一个核心组件,为 Yelp 上查找附近最佳餐厅或 Google 地图上查找最近加油站等功能提供支持。
LBS服务(基于位置的服务)是系统的核心部分,用于在给定半径和位置范围内查找附近的商家。
从广义上讲,有两种类型的地理空间索引方法,如图1.5所示。
对于选择加入并授予位置访问权限的用户,移动客户端会显示地理位置上靠近的好友列表。
什么是排行榜?排行榜在游戏和其他领域很常见,用于显示谁在特定的赛季或比赛对局中领先。用户在完成任务或挑战后会被分配分数,分数最高的用户就会在排行榜上名列前茅。
最近公司的一台 CentOS 服务器需要克隆一下,以便在另一台服务器或者虚拟机上运行,因此,研究了一下Linux的磁盘克隆方法。
UEFI引导与BIOS引导在结构上的区别:
BIOS引导的结构相对简单,由3个部分组成:BIOS程序、MBR(主引导记录)和操作系统引导程序。其中BIOS程序是由计算机制造商预装在ROM芯片中的,MBR是位于磁盘的名列前茅个扇区,用于存储操作系统引导程序的位置信息,操作系统引导程序则是由用户安装的操作系统自带的。
UEFI引导的结构相对复杂,由多个部分组成:UEFI固件、GPT(GUID分区表)、EFI系统分区、操作系统引导程序。其中UEFI固件是由计算机制造商预装在主板上的,GPT是磁盘分区表,EFI系统分区是用于存储操作系统引导程序和其他UEFI应用程序的特殊分区,操作系统引导程序则是由用户安装的操作系统自带的。
主引导扇区是硬盘的第一扇区。它由三个部分组成,主引导记录MBR、硬盘分区表DPT和硬盘有效标志。在总共512字节的主引导扇区里MBR占446个字节,偏移地址0000H–0088H),它负责从活动分区中装载,并运行系统引导程序;第二部分是Partition table区(DPT分区表),占64个字节;第三部分是Magic number,占2个字节。
GPT分区格式包含传统MBR(主引导记录)、分区表头、分区表、备份分区表头、备份分区表以及数据区。
fdisk, 查看磁盘分区情况,或者用于磁盘分区,注意 fdisk 只支持 MBR 分区格式,只支持 2T 以下的磁盘
lsblk, 查看磁盘分区情况
blkid, 获取分区 UUID ,用于编辑 /etc/fstab 永久挂在分区
parted, 查看磁盘分区情况,或者用于磁盘分区,支持 MBR 或者 GPT 分区格式,支持 2T 以上的磁盘
mkfs.ext4, 用于分区后的磁盘文件系统格式化
mount, 挂载磁盘分区
dd, 磁盘克隆的工具
1 | # 读取硬盘的mbr扇区 |
以上命令的使用方法请参考:
需要磁盘克隆的服务器,其硬盘有4T大小,但只使用了不到512G,用于克隆的目标磁盘同样有4T大小。因此考虑先生成原磁盘的镜像文件,再向目标磁盘克隆。具体步骤如下:
1 | # /media/nvme1n1 为目标磁盘挂载目录 |
1 | mv /media/nvme1n1/nvme0n1.dd.gz /root |
1 | gzip -dc /root/nvme0n1.dd.gz | dd of=/dev/nvme1n1 |
如果目标磁盘小于原磁盘,就不能简单的使用dd命令进行全盘克隆了。好在原磁盘实际使用的空间不大,因此,采用的步骤如下:
对于 home 分区,应根据不同情况不同处理:
最近遇到 Linux 重启后进入 initramfs 导致无法开机的问题,虽然问题没有解决,但是记录一下过程。
在initramfs命令行接口下,输入如下命令:
1 | # 使用如下命令查看和识别磁盘、分区或文件系统的信息 |
由于无法修复文件系统中错误,linux 还是无法开机。
1 | sudo fdisk -l |
最近工作中使用的一个基于QT开发三维程序中有很多以 .mesh 扩展名结尾的三维模型,搜索了一下,原来是 QtQuick3D 使用的专有三维模型格式。
QtQuick3D 附带Balsam导入工具,用于将常见格式转换为QtQuick3D支持的格式。
Balsam的目的是让可以轻松获取在常用工具(Blender,Maya,或3dsMax)中创建的资源,并在QtQuick3D中使用它们。
通过balsamui导出mesh文件和qml文件。
学习理解注意力机制的目的是为了更好的掌握深度学习模型,指导实践。
之所以要引入 Attention 机制,主要是3个原因:
模型复杂度跟 CNN、RNN 相比,复杂度更小,参数也更少。所以对算力的要求也就更小。
Attention 解决了 RNN 不能并行计算的问题。Attention机制每一步计算不依赖于上一步的计算结果,因此可以和CNN一样并行处理。
在 Attention 机制引入之前,有一个问题大家一直很苦恼:长距离的信息会被弱化,就好像记忆能力弱的人,记不住过去的事情是一样的。
Attention 是挑重点,就算文本比较长,也能从中间抓住重点,不丢失重要的信息。
最近遇到一个问题,需要程序进行严格的时间同步,因此学习一下网络时间协议。
网络时间协议NTP(Network Time Protocol)是TCP/IP协议族里面的一个应用层协议,用来使客户端和服务器之间进行时钟同步,提供高精准度的时间校正。NTP服务器从权威时钟源(例如原子钟、GPS)接收精确的协调世界时UTC,客户端再从服务器请求和接收时间。
NTP基于UDP报文进行传输,使用的UDP端口号为123。
NTP最典型的授时方式是Client/Server方式:
客户端用上述4个时间戳参数就能够计算出2个关键参数:
$delay=(t_4-t_1)-(t_3-t_2)$
联立方程组:
$t_2=t_1+offset+delay/2$
$t_4=t_3+offset+delay/2$
可得:
$offset=((t_2-t_1)+(t_3-t_4))/2$
NTP客户端根据计算得到的offset来调整自己的时钟,实现与NTP服务器的时钟同步。
NTP时间同步频率修改请参考:
打开站点 https://time.is/ 可查看机器的时间精度。
最近遇到一个问题,某个程序默认使用第一个网卡绑定组播地址,如果网卡顺序不对,将导致无法从组播地址上接收和发送数据。因此,必须指定某个网口绑定一个组播地址。具体方法有两种:
下面重点介绍第二种方法,修改网卡跃点数来调整组播地址绑定的网卡。
所谓“跃点”,即路由。一个路由为一个跃点。数据传输过程中需要经过多个网络,每个被经过的网络设备点(有能力路由的)叫做一个跃点,地址就是它的IP。
如果电脑中存在多个连接,哪个连接的跃点数小,哪个优先级就高。多播地址就会绑定在跃点数最小的网卡上。