如何正确设计 TCP/IP 流式应用层网络协议

在我多年打黑工的职业生涯之中,除了在盛大游戏出身的半个老师(做游戏服务器的)曾今深入的教过我,关于正确的 TCP/IP 流式应用层网络协议的设计理念,前往其它公司打黑工、包括一些的开源项目,见识到的 TCP/IP 应用层网络协议设计似乎都有一些潜在问题。

很多人虽然设计的 TCP/IP 应用层协议解决了沾包的问题,但是并没有对 CC 有一定预防措施,也没有对错误的协议有预防措施。

举个例子:

很多人涉及 TCP/IP 应用层协议,只是在每个包前面加上两个字节、或三个/四个字节代表长度字节,也不考虑大小端平台的差异性,也没有考虑别人会不会恶意的 CC 挂着大量的长连接,每个TCP 链接实例保护一般是在7200秒(2个小时),多数操作系统一般能够保证至少 30 分钟链接是存活的。

那么是否可以完全可以挂着大量的 CC 来耗死服务器系统的资源,并且经过抓包分析测试应用层协议的长度,假设为两个字节代表长度,人家完全有必要每个挂起的链接,只发送 65534 个字节数据包,让服务器一直处于缓冲区数据保持读入的状态,而资源无法得到释放。

你算算一个G内存能够支撑多少个64字节,而且这不是成比例的,应用层分配64K内存,往往需要至少多占用一个页的内存空间大小,因为内存分配是需要加上链表帧头、校队帧尾的,所以分配64K,意味着至少需要分配 64K+4096K 的内存资源(这里还没有算页头这些占用的内存空间)。

单纯指望三方防火墙,而开发人员不做一些处理是有些搞笑的,别人是正常的网络链接,也是在给服务器跑流量的。

而且在现代的网络环境之中,充斥着大量恶意轮段 TCP 应用层协议扫端口的情况,不做一些预防措施是典型错误的想法。

所以一个正确的 TCP/IP 应用层协议需要确保以下两个点:

1、帧头(关键帧字)

2、长度

帧头字节的目的,人们可以理解为判定协议是否为程序所需的,例如:帧头(0x2A 关键帧字)为我们设计的应用层协议 “KF 关键帧字”,那么当读入的第一个字节不是 0x2A,那么可以理解立即关闭链接,不在需要处理后续的行为。

正确的 TCP/IP 协议读入是片段读入的,而不是直接读入一个完整帧头,这是不正确的,因为你并不知道这个帧是否为伪造的,如果你完整读入,那么在这个帧头没有完整被读取完毕之前,程序都将处于 pending 状态,而持有的资源也没有办法得到释放。

若只按照上述只在帧头加上这两个部分,并不能缓解:

可以针对某个 “关键帧字” 的 TCP 端口扫段,这个时候人们应该引入 “效验核” 的概念,每个帧头都需要验证效验合。

那么可以缓解这类情况,但需要注意一点:CC的工具链基本只是连接上服务器,并不做数据发送的动作,而发送数据数据均为抓包所得。

程序预防普通CC,基本服务器对每个连入TCP链接正确计时,当超时没有正确完成某些行为就应该理解关闭链接,防止服务器应用过多的占用内核资源被占满。

在全球范围内这个时间都不应该超过五秒,国内期望尽快回收设定值为1秒,是比较合理的,用户在国内网络环境之中,通常一秒钟以内,客户端都没有发送有效数据过来,那么基本可以判断是被人 CC 之中了,当然你会说弱网环境的问题。

在弱网环境之中 RTT 往返延迟时间,通常不会超过 2 秒时(算上丢包),而两秒钟足够用户完成弱网环境下的服务器认证行为了,而且你要知道当TCP能够弱化到2秒才完成,那么基本意味着这个链接在丢失一次客户端就会成为 “链接被积极拒绝问题”,因为 TCP 最大只允许重传 3~5 次,普遍只会重传三次,所以那么设定在三秒没有完成,立即关闭链接即可。

须知:弱网不等于没有网络。

关于 TCP 协议重传公式相关的文章可以参考以下两篇文章。

TCP系列13—重传—3、协议中RTO计算和RTO定时器维护 - lshs - 博客园 (cnblogs.com)

第14章 TCP超时与重传:RTT与RTO概念;RTO计算的经典方法;RTO计算的标准方法;超时重传;快速重传;SACK;DSACK - 雲淡風輕333 - 博客园 (cnblogs.com)

类似像开源的 KCP 这类控制协议算法在RTO计算上跟TCP是没有多大区别的,只是系数上会有一些的差异。

比如: 

https://github.com/skywind3000/kcp/blob/master/ikcp.c#L559

(7 * kcp->rx_srtt + rtt) / 8 在 KCP 之中这句换到 TCP 之中则大约等于: (8 * rx_srtt + rtt) / 8 这个样子,区别上不是很大,只是 KCP 的重传时间要比TCP小,当然也意味着 KCP 相对会消耗更多带宽。

但应用层过于复杂的协议设计是没有意义的,这会消耗更多的宝贵的硬件CPU资源,应用层TCP协议设计这些部分也只不过是减少了,被一定 CC 拖垮系统资源的问题,减少服务器对于错误链接的预防措施。

但好一点的实现方式是需要带上掩码计算,即客户端发送到服务器的数据包都应带上掩码,进阶一点需要补充时间效验,以便服务器防止抓包工具搞得CC攻击。

那么一个相对完整且较为安全得 TCP/IP 应用层协议帧头就类似以下这样:

1、关键帧字

2、时间帧字

3、掩码帧字

4、效对合帧字

5、帧长度字节

6、帧载荷数据

而只有长度两个、三个、四个字节得 TCP/IP 应用层协议是不安全得,当然无论如何都需要做无效长时间挂起得 CC 链接中断检查,即在 X 个时间内没有完成第一个验证有效包得情况,而为了减少上述帧头占用得网络宽频开销,因为在网络传输之中,我们一般只看有效数据载荷得长度,帧头通常属于无效数据这一类。

另外需要说明:

效验核是需要包含完整帧头、及载荷数据一起计算,而不是只包含帧载荷数据,掩码需要计算整个帧,就像在 RFC 6455 - The WebSocket Protocol (ietf.org) 之中客户端向服务器发送得数据一样,系统学习成熟的 TCP/IP 应用层协议设计是很有意义得。

所以人们应当在设计 TCP/IP 应用层时,对于第一个握手帧做非常复杂处理是合理得,但对于握手帧完成后得载荷帧却并需要,因为这会产生大量无效得宽频占用,这是权衡得手段,在中国大陆这种带宽非常昂贵得情况,基本就是买带宽送服务器硬件,所以合理得设计 TCP/IP 应用层协议及权衡利弊变得尤为重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/2148.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每个开发人员都应该知道的13个Nodejs库

Node.js,作为一种广受推崇的后端JavaScript环境,已成为众多网络开发者的首选。它不仅位列全球最流行编程语言之一,还通过JavaScript库的代码复用功能,极大地提升了项目开发效率。然而,面对众多选项,挑选合适…

mybatis快速入门-注解版

mybatis 使用注解,简化 xml 配置,汲及到动态 sql 或是多表查询,还是使用 xml 映射文件配置编写。(企业工作中,几乎全是 xml 配置,xml 的 sql 使用注解方式少,而类引用注解方式)。 注解 Select():查询Inse…

Spring事务失效可能是哪些原因

典型回答 Spring中比较容易失效的就是通过Transactional 定义的声明式事务,他在以下几个场景中会导致事务失效,首先,就是Spring的Transactional是基于Spring的AOP机制实现的,而AOP机制又是基于动态代理实现的。那么如果代理失效了…

ArrayList与顺序表(2)

前言~🥳🎉🎉🎉 hellohello~,大家好💕💕,这里是E绵绵呀✋✋ ,如果觉得这篇文章还不错的话还请点赞❤️❤️收藏💞 💞 关注💥&#x1…

归并排序精讲

一.定义 归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子…

C++ 虚表起源

本文会让看不见 摸不着的虚表(Vtable),虚指针(Vptr)彻底现行 本文涉及思想: C 面向对象 封装 继承 多态 中的 多态 概念解释: 虚表指针: 这是指向虚表(vtable)的指针,虚表中包含了该类的所有虚函数对应的地址。 虚表&#x…

外贸客户开发有用的软件

外贸客户开发过程中,选择合适的软件工具能够显著提升效率和效果。以下是一些对外贸客户开发非常有用的软件: CRM系统: Salesforce:全球领先的CRM平台,提供强大的客户关系管理、市场分析、销售自动化等功能,…

vue基础语法学习

Object.defineProperty方法的使用 // 这是一个普通的对象 let phone {} // 给这个phone新增一个属性 三个参数:新增属性的对象,新增啥属性,属性值,key value对 Object.defineProperty(phone,color,{value:太空灰, //设置属性值wr…

联合概率、条件概率、边缘概率、贝叶斯定理

事件 事件是实现的一组结果(一个或多个)。就像"扔硬币时反面是事件",“从一副纸牌中选择国王(国王中的任何一个)也是事件”, “roll到5是事件等” 独立每个事件均不受其他事件影响。例: 抛硬币两次。第一次扔事件的结果不会影响第二个事件结果 相关(也…

Axure糖尿病健康管理APP原型 (知识科普/病友社区/远程医生会诊/购物商城/血糖监测/饮食监测)

作品概况 页面数量:共 50 页 源文件格式:rp格式,兼容 Axure RP 9/10,非程序软件无源代码 应用领域:医疗健康、慢病管理、糖尿病管理 作品特色 本作品为Axure糖尿病健康管理APP端原型图,设计规范内容清晰…

深度解读《深度探索C++对象模型》之C++虚函数实现分析(一)

目录 成员函数种类 虚函数的实现 单一继承下的虚函数 接下来我将持续更新“深度解读《深度探索C对象模型》”系列,敬请期待,欢迎关注!也可以关注公众号:iShare爱分享,或文章末尾扫描二维码,自动获得推文…

邮件接口的安全性如何保障?如何有效使用?

邮件接口故障时如何处理?怎么设置和配置邮件接口? 邮件接口作为企业内外部沟通的重要桥梁,其安全性显得尤为重要。那么,邮件接口的安全问题如何保障。AokSend将深入探讨如何保障邮件接口的安全性,确保企业信息的安全传…

什么是仪器校准报告?

在科学实验和工业生产中,仪器是一种非常重要的辅助工具,无论是测量数据、控制实验进程还是保证产品质量,仪器都发挥着至关重要的作用。为了确保仪器的准确性和稳定性,仪器校准报告这一概念应运而生。本文给大家详细介绍仪器校准报…

科研基础与工具(论文写作)

免责申明: 本文内容只是学习笔记,不代表个人观点,希望各位看官自行甄别 参考文献 科研基础与工具(YouTube) 学术写作句型 Academic Phrase bank 曼彻斯特大学维护的一个网站 写论文的时候,不不知道怎么…

简单使用Web3.js

随着区块链技术的快速发展,以太坊(Ethereum)作为其中的佼佼者,为开发者们提供了一个构建去中心化应用的强大平台。为了更轻松地与以太坊区块链进行交互,我们需要一个强大的工具,而Web3.js正是这样一个工具。…

速盾:cdn原理图解

CDN(Content Delivery Network)是一种分布式计算机网络系统,主要用于提供快速、可靠的网页内容传输服务。CDN的核心原理是将网站的静态资源(如图片、视频、音频文件等)复制到多个地理位置的服务器上,并通过…

【Linux】IO多路转接技术Epoll的使用

【Linux】IO多路转接技术Epoll的使用 文章目录 【Linux】IO多路转接技术Epoll的使用前言正文接口介绍工作原理LT模式与ET模式边缘触发(ET)水平触发(LT) 理解ET模式和非阻塞文件描述符ET模式epoll实现TCP服务器简单地封装epoll系统…

【软件测试】认识测试|测试岗位|软件测试和开发的区别|优秀的测试人员需要具备的素质

一、什么是测试 测试在⽣活中处处可⻅ 1.生活中的测试场景 案例⼀:对某款购物软件进⾏测试 *启动测试:点击软件图标,测试软件是否可以正常打开 搜索测试:点击输入框,输入关键词,点击搜索 商品测试&#…

给c++小白的教程4:运算

大家好,又见面了! 本次所说的运算将包括 算术运算符位运算符赋值运算符 算术运算符 算术运算符,顾名思义,就是用来支持数字运算的符号。 像什么加减乘除啦,取模啦,都是算术运算符 假设变量 A 的值为 10&#xff…

【数据结构】图论(图的储存方式,图的遍历算法DFS和BFS、图的遍历算法的应用、图的连通性问题)

目录 图论一、 图的基本概念和术语二、图的存储结构1. 数组(邻接矩阵)存储表示无向图的数组(邻接矩阵)存储表示有向图的数组(邻接矩阵)存储表示 邻接表存储表示有向图的十字链表存储表示无向图的邻接多重表存储表示 三、图的遍历算法图的遍历——深度优先搜索(DFS&a…