如何正确设计 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.mfbz.cn/a/566982.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网动统一通信平台(Active UC) downloadDocument.action 任意文件读取漏洞复现

0x01 产品简介 网动统一通信平台(Active UC) 是一个涵盖了多种通信功能的综合平台,通常包括文字、语音、视频通讯等功能,并且可能提供了一系列的通讯工具和服务。这样的平台通常旨在提升用户的沟通效率和便利性,为用户提供一个统一的通信环境…

Tomcat源码解析——一次请求的处理流程

在上一篇文章中,我们知道Tomcat在启动后,会在Connector中开启一个Acceptor(接收器)绑定线程然后用于监听socket的连接,那么当我们发出请求时,第一步也就是建立TCP连接,则会从Acceptor的run方法处进入。 Acceptor&…

用户体验至上:独立站脱颖而出的关键要素解析

在数字化时代,独立站成为了许多品牌和企业展示自身形象、推广产品、建立客户联系的重要平台。然而,要想在众多的独立站中脱颖而出,吸引并留住用户,良好的用户体验至关重要。本文Nox聚星将和大家探讨如何做好独立站的用户体验&…

antDesignPro ProForm表单里使用dependencies属性

场景&#xff1a;ProForm表单里前一个下拉框选择的值带出后面下拉框的枚举值 <script><ProFormformRef{formRef}onFinish{{}}><ProForm.Group><ProFormSelectname"projectId"label"项目"width"sm"request{projectList}plac…

echerts饼图分割操作

在饼图制作中遇到了一个难点就是饼图中间是分散的 试了很多方法&#xff0c;最后选择了给每个值中间再加一节的处理方式&#xff0c;并把颜色设置为透明就能达到相同效果。 处理后的样式&#xff1a; 代码&#xff1a; let list this.data.list;/饼图内部展示数据// let _t…

文心一言 VS 讯飞星火 VS chatgpt (242)-- 算法导论17.4 1题

一、假定我们希望实现一个动态的开地址散列表。为什么我们需要当装载因子达到一个严格小于 1 的值 a 时就认为表满&#xff1f;简要描述如何为动态开地址散列表设计一个插入算法&#xff0c;使得每个插入操作的摊还代价的期望值为 O(1) 。为什么每个插入操作的实际代价的期望值…

React基础知识大汇总

函数组件和类组件 函数组件与类组件有什么区别呢&#xff1f; function getName(params:{name:string}){const count 0;return params.name -count; } getName({name:"test"}) getName({name:"哈哈哈"})getName是一个纯函数&#xff0c;不产生任何副作用…

54、图论-实现Trie前缀树

思路&#xff1a; 主要是构建一个trie前缀树结构。如果构建呢&#xff1f;看题意&#xff0c;应该当前节点对象下有几个属性&#xff1a; 1、next节点数组 2、是否为结尾 3、当前值 代码如下&#xff1a; class Trie {class Node {boolean end;Node[] nexts;public Node(…

nginx配置挂载html

目标 很多软件的官方文档&#xff0c;在国内打开很慢&#xff0c;每次都得等很久&#xff0c;看到官方同时提供了html的包&#xff0c;所以想着挂载到本地nginx下&#xff0c;查看会方便很多。 下载官方html文档包&#xff0c;解压到documentation_htmls下 想添加新的文档也是…

Sql Server 数据库:查询表结构脚本

查询脚本: SELECT CASE WHEN col.colorder 1 THEN obj.name ELSE END AS 表名, col.colorder AS 序号 , col.name AS 列名 , ISNULL(ep.[value], ) AS 列说明 , t.name AS 数据类型 , col.length AS 长度 , ISNULL(COLUMNPROPERTY(col.id, col.name, Scale), 0) AS 小数位数…

<开源> 轮廓内缩外扩算法

轮廓内缩外扩算法 项目是论文A new offset algorithm for closed 2D lines with Islands的JAVA实现。 项目的GitHub地址&#xff1a;https://github.com/Lee-0o0/polygon-offset-algorithm。 参考博客 https://blog.csdn.net/qq_41261251/article/details/114462696

设计模式 -- 行为型模式

1. 行为型模式概述 行为型模式用于描述程序在运行时复杂的流程控制&#xff0c;即描述多个类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务&#xff0c;它涉及算法与对象间职责的分配。 行为型模式分为类行为模式和对象行为模式&#xff0c;前者采用继承机制在类…

java开发之路——node.js安装

1. 安装node.js 最新Node.js安装详细教程及node.js配置 (1)默认的全局的安装路径和缓存路径 npm安装模块或库(可以统称为包)常用的两种命令形式&#xff1a; 本地安装(local)&#xff1a;npm install 名称全局安装(global)&#xff1a;npm install 名称 -g本地安装和全局安装…

input的type=‘radio‘设置只读属性颜色为灰色,如何修改

目录 1.设置input和label的样式为不可点击。 2.设置input的readonly属性。 3.若想变回可修改&#xff0c;用js实现 4.如何自定义radio的颜色。 5.完整代码 input的单选框有时候需要实现只读&#xff0c;两个办法&#xff0c;一个disabled&#xff0c;一个是readonly. 但d…

前期Hadoop学习总结

前期Hadoop学习总结 1.Linux&#xff1a;操作系统 ​ 2.虚拟机&#xff1a;主机 3.SecureCRT &#xff08;客户端&#xff09;&#xff1a;连接Linux 方便操作 4.Hadoop&#xff1a;软件 这个软件要装在Linux里面 5.Hadoop是干嘛的&#xff1a; Hadoop是一个开源的分布式计…

前端路由的实现原理

当谈到前端路由时&#xff0c;指的是在前端应用中管理页面导航和URL的机制。前端路由使得单页应用&#xff08;Single-Page Application&#xff0c;SPA&#xff09;能够在用户与应用交互时动态地加载不同的视图&#xff0c;而无需每次都重新加载整个页面。 在前端开发中&…

货拉拉0-1数据指标体系构建与应用

目录 一、背景 二、指标体系搭建 2.1 指标设计 2.2 指标体系搭建 2.3 指标维度拆解 三、指标标准化建设 四、指标元数据管理 五、指标应用&未来规划 原文大佬介绍的这篇指标体系构建有借鉴意义&#xff0c;现摘抄下来用作沉淀学习。如有侵权请告知~ 一、背景 指标…

什么是仪器校准报告?

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

利用STM32的定时器和中断实现精准时间控制

⬇帮大家整理了单片机的资料 包括stm32的项目合集【源码开发文档】 点击下方蓝字即可领取&#xff0c;感谢支持&#xff01;⬇ 点击领取更多嵌入式详细资料 问题讨论&#xff0c;stm32的资料领取可以私信&#xff01; 在嵌入式系统开发中&#xff0c;精确的时间控制是许多应用的…

0元实现网站HTTP升级到HTTPS(免费https证书)

HTTPS就是在HTTP的基础上加入了SSL&#xff0c;将一个使用HTTP的网站免费升级到HTTPS主要包括以下几个步骤&#xff1a; 1 获取SSL证书 永久免费的https证书申请通道https://www.joyssl.com/certificate/select/free.html?nid16 免费的SSL证书同样能实现HTTPS&#xff0c;国…