关于udp:线上-udp-客户端请求服务端客户端句柄泄漏问题

本题别离从如下三个方面来分享: 问题形容<!----> 自定义连接池的编写<!----> common_pool 的应用问题形容线上有一个业务,某个通服务告诉 udp 客户端通过向 udp 服务端(某个硬件设施)发送 udp 包来进行用户上线操作 当同时有大量的申请打到 udp 服务端的时候,udp 服务端的回包可能会在网络环境中丢包,(udp 是不牢靠的)导致 udp 客户端不能及时的收到 udp 服务端的回包,在短时间内,udp 客户端的句柄又没有失去复用或者开释,没有收到回包的句柄就始终阻塞在那里,最终导致句柄透露 那么能够如何解决呢? 增大客户端的句柄数<!----> 应用连接池并且在读取服务端响应数据时加上超时工夫显然,第一个解决形式治标不治本,改大句柄数,当申请质变大的时候,依然会呈现句柄透露的状况 第二种形式绝对靠谱很多 首先,咱们将发送 udp 包给服务端后,期待读取服务端的回包时,设置超时工夫,超时后读取失败,开释或者偿还句柄<!----> 保护一个外部的连接池,缩小每一次创立句柄耗费的资源和工夫,应用的时候从池子外面获取句柄,应用结束之后再偿还句柄自定义连接池的编写 customer_pool那么对于连接池,咱们实际上是能够本人来进行造轮子的,仅用于学习,理论应用的话,天然还是会去应用通过公众考研过的公共开源库,咱们能够来根本的剖析和钻研一下一个连接池须要有些什么? 创立池子,敞开池子,池子的敞开状态<!----> 从池子中获取连贯,偿还连贯,销毁以后连贯<!----> 池子中能包容的最大连接数,最小连接数,以后连接数<!----> 依据以后理论的连接数来对池子进行扩容和缩容<!----> 池子中创立连贯的函数具体实现当然,咱们本人来领会一下连接池以及演示上述 udp 的 demo,咱们仅实现如下几个简略性能作为演示 创立池子,池子的敞开状态<!----> 从池子中获取连贯,偿还连贯<!----> 池子中能包容的最大连接数,最小连接数,以后连接数<!----> 池子中创立连贯的函数具体实现对于池子中具体链接的销毁,池子的敞开,池子的扩缩容,以及其余高级应用,xdm 能够进行扩大 customer_pool demo自定义连接池,实际上咱们是应用 chan 通道来进行实现,具体源码能够查看:https://github.com/qingconglaixueit/customer_pool/blob/master/customer_pool/pool.go 定义连接池 MyConnPool 数据结构,和创立连接池MyConnPool 构造中的 sync.Mutex 次要是用于管制多协程中 非 pool 成员的其余成员的互斥,咱们晓得 chan 外部是有锁进行管制的 获取对象的具体实现从池子中获取对象,如果获取不到则默认查看以后的池子状态是否能够创立新的连贯<!----> 若能够,则间接创立连贯,返回对象<!----> 此处在进行池子成员的变动时,须要加锁进行管制func (conn *MyConnPool) GetObject() (interface{}, error) { return conn.getObject()}func (conn *MyConnPool) getObject() (interface{}, error) { if conn.isClosed { return nil, errors.New("pool is closed") } // 从通道外面读,如果通道外面没有则新建一个 select { case object := <-conn.pool: return object, nil default: } // 校验以后的连接数是否大于最大连接数,若是,则还是须要从 pool 中取 // 此时应用 mutex 次要是为了锁 MyConnPool 的非通道的其余成员 conn.Lock() if conn.currentConn >= conn.maxConn { object := <-conn.pool conn.Unlock() return object, nil } // 逻辑走到此处须要新建对象放到 pool 中 object, err := conn.connFun() if err != nil { conn.Unlock() return nil, fmt.Errorf("create conn error : %+v", err) } // 以后 pool 已有连接数+1 conn.currentConn++ conn.Unlock() return object, nil}开释对象的具体实现应用结束对象之后,须要偿还<!----> ...

September 5, 2023 · 2 min · jiezi

关于udp:化虹为桥-Nginx-如何代理-UDP-连接

家喻户晓,UDP 并不像 TCP 那样是基于连贯的。但有些时候,咱们须要往一个固定的地址发送多个 UDP 来实现一个 UDP 申请。为了保障服务端可能晓得这几个 UDP 包形成同一个会话,咱们须要在发送 UDP 包时绑定某个端口,这样当网络栈通过五元组(协定、客户端IP、客户端端口、服务端IP、服务端端口)进行辨别时,那几个 UDP 包可能分到一起。通常咱们会把这种景象称之为 UDP 连贯。 但这样又有了一个新的问题。不同于 TCP 那样有握手和挥手,UDP 连贯仅仅意味着应用固定的客户端端口。尽管作为服务端,因为当时就跟客户端约定好了一套固定的协定,能够晓得一个 UDP 连贯该当在何处终止。但如果两头应用了代理服务器,那么代理是如何辨别某几个 UDP 包是属于某个 UDP 连贯呢?毕竟没有握手和挥手作为分隔符,一个中间人是不分明某个会话该当在何处放下句号的。 通过上面的试验,咱们会看到 Nginx 是如何解决这个问题的。 试验在接下来的几个试验中,我都会用一个固定的客户端。这个客户端会向 Nginx 监听的地址建设 UDP “连贯”,而后发送 100 个 UDP 包。 // save it as main.go, and run it like `go run main.go`package mainimport ( "fmt" "net" "os")func main() { conn, err := net.Dial("udp", "127.0.0.1:1994") if err != nil { fmt.Printf("Dial err %v", err) os.Exit(-1) } defer conn.Close() msg := "H" for i := 0; i < 100; i++ { if _, err = conn.Write([]byte(msg)); err != nil { fmt.Printf("Write err %v", err) os.Exit(-1) } }}根底配置上面是试验中用到的 Nginx 根底配置。后续试验都会在这个根底上做些改变。 ...

January 29, 2023 · 4 min · jiezi

关于udp:网络协议之基于UDP的高速数据传输协议UDT

 简介 简略就是美。在网络协议的世界中,TCP和UDP是建设在IP协定根底上的两个十分通用的协定。咱们当初常常应用的HTTP协定就是建设在TCP协定的根底上的。相当于TCP的稳定性来说,UDP因为其数据传输的不可靠性,所以用在某些特定的场合,如直播、播送音讯、视频音频流解决等不太须要校验数据完整性的场合。 UDP绝对TCP协定而言,其特点就是简洁,它删除了在TCP协定中为了保障音讯准确性的各种限制性特色。简洁带来的益处就是快!明天给大家解说一下,基于UDP的高速数据传输协定UDT。 UDT协定 UDP因为其简略的个性,所以能够做到很多TCP做不到的事件,比方进行大数据量的疾速传输。这里并不是要将TCP和UDP分个好坏高下,毕竟各个协定的适应场景不同,他们之所以风行,就是因为能够在特定的场景施展出重要的作用。套用中国的一句谚语就是:不论白猫黑猫,能抓到老鼠的,就是好猫。 用好UDP协定,咱们就能够疾速的传递大量的数据,这个协定就是UDT协定。 话说,像这些根底协定都是老外创造的,而中国的互联网巨头都在抢着做平台、做流量的生意,真的是无话可说…. UDT我的项目开始于2001年,是由Yunhong Gu在芝加哥伊利诺伊大学国家数据挖掘核心 (NCDM)读博士期间开发的,并在毕业之后继续的进行保护和降级改良。 UDP的呈现是因为那时候,传输更快更便宜的光纤网络呈现了,代替了之前的铜缆线和双绞线,从而极大的晋升了信息传输的效率。这时候大家就发现之前应用TCP协定来进行大数据的传输会有很大的问题。从而基于UDP的UDT协定呈现了。 UDT的第一个版本,也称为SABUL(Simple Available Bandwidth Utility Library),UDT通过反对批量数据传输,从而不便在公有网络中进行数据的传输。 要留神的是UDT的第一个版本SABUL应用UDP协定进行传输数据,同时应用独自的TCP协定连贯传输管制音讯。 UDT的初始版本是在超高速网络(1 Gbit/s、10 Gbit/s等)上进行开发和测试的,2003年10月,NCDM实现了从美国芝加哥到荷兰阿姆斯特丹的均匀每秒6.8G比特的传输。在30分钟内的测试中,他们传输了大概1.4TB的数据。 从2004年公布的2.0版本开始,SABUL改名为UDT,UDT的全称是UDP-based Data Transfer Protocol,也就是基于UDP的数据传输协定。 为什么要改成UDT呢?因为在UDT2.0中,删除了SABUL中的TCP 管制连贯,并应用UDP来解决数据和管制信息。 另外,UDT2还引入了一种新的拥塞控制算法,容许协定动静调整UDT和TCP流,实现UDT和TCP流的并发运行。 在2006年,UDT协定降级到了3版本,该协定不仅是在公有网络中运行了,而是扩大到了商业互联网中。同时UDT3中的拥塞管制能够进行调整优化,能够在低带宽的环境中运行,并且容许用户轻松定义和装置本人的拥塞控制算法。另外,UDT3还显着缩小了系统资源(CPU和内存)的应用。 2007年,UDT4版本在高并发和防火墙穿透方面进行优化和性能的晋升。UDT4容许多个UDT连贯绑定到同一个UDP端口,它还反对汇合连贯设置,以便UDP hole punching。 什么是UDP hole punching呢? UDP hole punching通常被用在网络地址转换 (NAT)中。用来保护穿梭NAT的用户UDP数据包流。它是一种应用网络地址转换器在专用网络中的Internet主机之间建设双向UDP连贯的办法。 什么是NAT呢? 大家都晓得IPV4地址是无限的,很快IPV4地址就快用完了,那怎么解决这个问题呢? 当然,一个永恒解决的方法是IPV6,不过IPV6推出这么多年了,如同还没有真正的遍及。 不应用IPV6的话还有什么解决办法呢? 这个方法就是NAT(Network Address Translators)。 ...

May 5, 2022 · 1 min · jiezi

关于udp:我到底是怎么被炸房挂轰炸掉线的

我到底是怎么被"炸房挂"轰炸掉线的?炸房挂?家喻户晓,在一些吃鸡类、MOBA对战类游戏中,咱们常常都会遇到一些”神仙局”,比方在吃鸡,FPS类游戏中常常遇到”枪枪爆头”,在MOBA类游戏中遇到各种对手的技能零CD有限开释,这类型的外挂,都是利用模仿鼠标键盘,或者是截取Sock和API内容,将其批改达到成果的。 而另外一类的外挂,就是要害的对战时刻,间接让玩家网络卡顿甚至掉线了;或者在游戏刚开始的时候,间接让所有玩家掉线,而后通过管制攻打的进行工夫,更快地从新连贯到战斗服中,比方在吃鸡游戏外面,如果游戏刚开始的时候,大家都掉线了,而后60秒后再重连回去,首先重连胜利的玩家(个别是开外挂的玩家,因为他能够管制进行工夫),将能够轻易地将周边的落地玩家击杀,从而获利。这类外挂统称为“炸房挂”,这就是明天次要的话题。 游戏中的UDP协定在即时多人对战类的游戏外面,通常都会应用UDP协定间接让多个玩家连贯到同一局战斗服务器中(同一局对战/正本,会调配到雷同的公网IP地址和端口),所以歹意玩家(开挂)是能够轻易地获取到具体的对战服务器地址和端口的。 DDoS攻打与UDP常见的DDoS攻打伎俩,次要分为两种类型: 管制内部大量的肉机,应用脚本,让这些肉机应用脚本,间接攻打指标服务器。仅须要管制大量的肉机,通过拜访互联网的公共服务,而后通过批改源地址,对指标服务器进行分布式的反射攻打。咱们来比照一下TCP和UDP的协定包构造:咱们能够发现,在UDP的业务流中,并不像TCP那样,有多个字段维度能够检测的。所以总结一下,UDP的次要特点是:无连贯源IP容易伪造(有很多运营商是不会检测源地址是否是本人调配的),难溯源攻打成本低Azure防护计划所以,针对这些攻打,咱们有5种次要的防护思路: 1. 服务器白名单、黑名单只容许业务目标端口,屏蔽常见的反射源端口。 2. 地理位置过滤针对业务用户的地理位置个性,在遇到UDP反射攻打时,优先从用户量起码地理位置的源IP进行封禁阻断,直到将异样地理位置的源IP申请全副封禁,使流量降至服务器可解决的范畴之内,可无效加重烦扰流量。 3. 基于IP和端口的限速通过对源IP、源端口、指标IP、指标端口的多种搭配组合进行限速管制,实现灵便无效的防护策略,升高业务影响范畴。 4. 流量异样稳定克制算法对失常的业务流量进行学习建模,当某类异样流量呈现疾速突增的稳定时,主动判断哪些是异样从而进行限速/封禁,以防止对失常流量造成影响。 5. 指纹(水印)过滤协商好特定的水印算法,在客户端发包的时候带上水印字段,而后通过水印过滤辨认失常还是攻打流量。 而这5种防护的思路,Azure都能提供对应的防护计划。 Network Security GroupAzure Firewall高级定制防护Azure DDoS Standard Plan高级定制防护咱们大抵总结为三道次要的防线: 第一道防线:Azure DDoS Standard Plan启用Azure DDoS规范防护,阻挡大部分的3-4层攻打。 第二道防线:增加水印在手机客户端发送每条信息中都嵌入了水印,而攻打的报文没有携带水印,Azure能够通过这些水印进行过滤,只有携带水印的报文,才会达到后端游戏服务器,从而达到防护的成果。 第三道防线:基于端口的速率限度咱们不能保障水印计划能够100%抵御所有DDoS流量,所以当DDoS依然能够达到后端服务器的时候,咱们能够通过限度每个端口的速率,以就义一局游戏的代价(作废解决),来换取整台服务器上的其余游戏房间的失常运行。

November 4, 2021 · 1 min · jiezi

关于udp:字符数组和字符串基本掌握

/*字符数组把握:strlen,strcat,strcpy,strstr,strcmp*/char c[100]="ZIFUshuzu1",c1[100]="give me five";//字符数组//gets(c);//读入一整行直到换行//cin>>c;//当没有空格//1.长度 strlenint len_c=strlen(c);;cout<<"长度:"<<len_c<<endl;//2.赋值strcpy(c,c1);//把c1赋值给ccout<<"把c1赋值给c:"<<c<<endl;//3.合并(连贯)strcat(c,c1);//c+c1(c1加到c后)cout<<"c1加到c后:"<<c<<endl;/*字符串把握:size(),length()等*/string s,s1;s="ZIFUCHUAN1";s1="good good study";//1.读入一整行(直到换行),包含读入空格// getline(cin,s);//2.size() 求字符串的长度,等同于length()函数s="12 34";cout<<s.size()<<endl;//3.s[下标i] 取字符串的某个字符 ,等同于at(下标i)s="abcd";cout<<s[0]<<s.at(2)<<endl;/*4.substr(开始地位i,子串长度len);取字符串的子串。当len超过原字符串的长度时,只取下剩下的。揭示:i要在字符串长度内。*/s="abcdef";cout<<s.substr(3,2)<<s.substr(3,20)<<endl;/*5.insert(插入地位i,插入字符串s);在字符串第i个地位插入s*/s="abcdef";s.insert(2,"+1234");cout<<s<<endl;/*6.erase(开始地位i,删除菜单len);输入字符串的第i个地位后的len个字符。*/s="abcdef";s.erase(2,3);cout<<s<<endl;/*7.replace(开始地位i,长度len,要换上的字符串ss);用字符串ss替换字符串中i开始的长度是len的一段。*/s="abcdef";s.replace(2,1,"123");cout<<s<<endl;/*8.find(子串subs)查找子串subs第1次呈现的地位,没有找到返回string::nposfind还有一些更弱小的模式,比方在某一段*/s="abcdef";int i=s.find("cd");cout<<i<<endl;return 0;}

August 20, 2021 · 1 min · jiezi

关于udp:教你如何将表格里手机号和座机号分开

金芝号码提取整顿助手,软件作者徽veve188,能够解决题目中的问题,你能够佰渡搜一下它,去电脑上安一个。咱们在平时整顿货色的时候常常遇到这种难题:如何将表格里手机号和座机号离开?excel表格里电话和座机号离开?excel表手机号和座机号离开等相干问题,都能够用它来解决。 把你的excel关上,全副把你的芜杂文本(座机号码手机号文字等)复制好,关上软件“金芝号码提取整顿助手”,粘贴进去,点“独自提取号码”,就能够把11位的手机号独自提取进去,主动删除去除座机号码固定电话号码。省事,省时,省力。工夫就是金钱,借助工具能疾速解决咱们的问题,节约下来的工夫,能够去做重要的工作,发明更多的价值。座机号码和手机号码混在一起怎么拆分?如何将表格里手机号和座机号离开?这个问题,借助软件“金芝号码提取整顿助手”,让您享受解放双手的高兴。

August 17, 2021 · 1 min · jiezi

关于udp:教你如何提取文本文档里的手机号如何从文档中提取电话

软件“金芝号码提取整顿助手”(能够百度搜寻一下)能够解决题目中的问题,如何提取文本文档里的手机号,如何从文档中提取电话的办法解说。也就是咱们的txt文本文档或者word或者excel外面有大量混淆的芜杂的信息,咱们只想独自提取外面的11位手机号码。那么上面解说的操作方法看起来很简略,须要的敌人能够参考上面的办法步骤操作一遍吧,置信会帮大家解决问题的。 这款实用的软件叫做“金芝号码提取整顿助手”,能够百度搜寻一下,进去网站下载,它的第一个性能便是“手机号码独自提取”,它具备智能辨认手机号码的性能。话不多说,简略三步就能够轻松做到你想要的,解放双手。第一步:关上你的txt或者Excel或者Word把你的所有芜杂信息复制,而后到软件找“单纯提取号码”性能,粘贴你的信息到软件上。第二步:点“提取手机号码”,软件就能够自动识别并独自提取进去手机号码,能看到号码提取进去在软件上。第三步:导出txt。号码导出的格局是:txt,一个号码一行,单列。如果想打印进去,倡议应用软件另外的性能:号码打印排版,单列号码主动排版成多行多列,能够导出EXCEL电子表格,很不便间接打印,节约纸张空间。 除了“手机号码提取性能”以外,这个软件还具备另外的便捷性能,能够对提取失去的号码进一步整顿,比方“手机号码去除反复”、“手机号码打乱程序”、“手机号码三网拆散”、“手机号码打印前排版”等,帮您把失去的号码个性化整顿得更好。 这篇文章解说的就是咱们在日常解决数据时候遇到的问题:如何提取文本文档里的手机号,如何从文档中提取电话的办法解说。利用软件“金芝号码提取整顿助手”的话的确能疾速进步咱们的工作效率,省事省力。

August 10, 2021 · 1 min · jiezi

关于udp:LinuxsetROOT

假如有文件夹 mine_dir,想要把它设为管理员能力拜访读写. 更改文件夹拥有者 sudo chown root:root mine_dir递归地将 mine_dir 下的文件权限全设为级别700 sudo chmod -R 700 mine_dir上述2条命令之后,普通用户便无法访问 mine_dir. 若想要拜访,须要变更为管理员用户sudo su 若想切换回普通用户,则: sudo su 普通用户名称

July 22, 2021 · 1 min · jiezi

关于udp:网云穿搭建minecraft我的世界服务端-外网远程联机

休闲工夫想游戏联机,在家和当地敌人联机玩我的世界。然而没有公网ip怎么整?之前测试过几款内网穿透,有的须要本人搭建,很麻烦并且破费不低。有的穿透免费版外网端口不固定老是变,一遍就要从新连贯游戏,十分麻烦;最近找到了一个收费的内网穿透,网云穿内网穿透;在理解了外网端口和域名是固定不变的,所以尝试了一番。感觉挺实用,配置比较简单,下载简略配置就能够让外网的敌人连进来一块开撸。做了一篇教程,有须要的能够参考,教程如下: 所需工具: _*_网云穿内网穿透[我的世界]服务端 我用的是Minecraft 1.6.2版本_*_ 一、关上网云穿官网,注册账号,开明收费隧道 二、配置隧道 1、支付完隧道,会主动跳转控制台,让咱们配置隧道 2、在命令提示符界面,输出ipconfig查看电脑的IP,个别127.0.0.1永远代表本机,填127.0.0.1即可 3、设置服务器配置(端口和ip) 4、回到控制台配置隧道,点击隧道上的配置,填写隧道信息,配置信息如下: ①隧道名称:自定义②隧道地址:127.0.0.1 内网服务器ip ③内网端口:25565 我的世界服务端口 ④二级域名:零碎主动调配 ⑤穿透协定:tcp 配置完点击确定: 三、官网下载网云穿客户端,我的是windows零碎,故下载windows客户端版本(依据本人零碎下载对应版本) ![上传中...]()![上传失败,undefined]() 1、客户端是绿色免装置的,下载解压,双击运行即可 2、登录客户端 登录客户端能够看到,软件调配咱们一个映射地址,咱们先复制映射地址,而后启动隧道 四、在内网测试服务器连贯是否失常 1、开启我的世界服务器 2、在局域网内咱们另找一台电脑,来测试用内网ip和内网端口是否能够连贯上服务 能够看到内网测试能胜利连贯 3、外网连贯测试,看是否能够胜利连贯 在客户端 须要输出服务器地址的中央,输出咱们方才复制的映射地址即可 外网测试连贯胜利,能够邀请小伙伴开撸了,完满实现。

February 23, 2021 · 1 min · jiezi

关于udp:TCP-协议灵魂问题巩固你的网路底层基础

先亮出这篇文章的思维导图 TCP 作为传输层的协定,是一个软件工程师素养的体现,也是面试中常常被问到的知识点。在此,我将 TCP 外围的一些问题梳理了一下,心愿能帮到各位。 001. 能不能说一说 TCP 和 UDP 的区别?首先概括一下根本的区别: TCP是一个面向连贯的、牢靠的、基于字节流的传输层协定。 而UDP是一个面向无连贯的传输层协定。(就这么简略,其它TCP的个性也就没有了)。 具体来剖析,和 UDP 相比,TCP 有三大外围个性: 面向连贯。所谓的连贯,指的是客户端和服务器的连贯,在单方相互通信之前,TCP 须要三次握手建设连贯,而 UDP 没有相应建设连贯的过程。可靠性。TCP 花了十分多的功夫保障连贯的牢靠,这个可靠性体现在哪些方面呢?一个是有状态,另一个是可管制。TCP 会精准记录哪些数据发送了,哪些数据被对方接管了,哪些没有被接管到,而且保障数据包按序达到,不容许半点过错。这是有状态。 当意识到丢包了或者网络环境不佳,TCP 会依据具体情况调整本人的行为,管制本人的发送速度或者重发。这是可管制。 相应的,UDP 就是无状态, 不可控的。 面向字节流。UDP 的数据传输是基于数据报的,这是因为仅仅只是继承了 IP 层的个性,而 TCP 为了保护状态,将一个个 IP 包变成了字节流。002: 说说 TCP 三次握手的过程?为什么是三次而不是两次、四次?恋爱模仿以谈恋爱为例,两个人可能在一起最重要的事件是首先确认各自爱和被爱的能力。接下来咱们以此来模仿三次握手的过程。 第一次: 男: 我爱你。 女方收到。 由此证明男方领有爱的能力。 第二次: 女: 我收到了你的爱,我也爱你。 男方收到。 OK,当初的状况阐明,女方领有爱和被爱的能力。 第三次: 男: 我收到了你的爱。 女方收到。 当初可能保障男方具备被爱的能力。 由此残缺地确认了单方爱和被爱的能力,两人开始一段苦涩的恋情。 实在握手当然刚刚那段属于扯淡,不代表自己价值观,目标是让大家了解整个握手过程的意义,因为两个过程十分类似。对应到 TCP 的三次握手,也是须要确认单方的两样能力: 发送的能力和接管的能力。于是便会有上面的三次握手的过程: 从最开始单方都处于CLOSED状态。而后服务端开始监听某个端口,进入了LISTEN状态。 而后客户端被动发动连贯,发送 SYN , 本人变成了SYN-SENT状态。 服务端接管到,返回SYN和ACK(对应客户端发来的SYN),本人变成了SYN-REVD。 之后客户端再发送ACK给服务端,本人变成了ESTABLISHED状态;服务端收到ACK之后,也变成了ESTABLISHED状态。 另外须要揭示你留神的是,从图中能够看出,SYN 是须要耗费一个序列号的,下次发送对应的 ACK 序列号要加1,为什么呢?只须要记住一个规定: ...

February 18, 2021 · 5 min · jiezi

关于udp:颜小熙听孙秀花絮絮叨叨地说了这些事情

颜小熙的眉头皱了皱,这个小媳妇不是刚刚说回去喊人的三婶。 她有点想晓得,三婶去哪里了?看到她们,那小媳妇停下脚步,神气凝重地看着李梅英问道:“梅英姐,你生啦?”李梅英快乐地点了拍板,“是个儿子……”话音刚落,她就又哭了起来。“相公可算是有后了!”她的相公颜北斗年前被朝廷征兵给征走了,没想到前几天,村子里有人接到了家书,说她相公战死沙场了。若非是肚子里还怀着个孩子,她顾念着要把这个孩子平安地生下来,这才没怎么哭闹,刚强地撑了下来。却没想到相公不在了,没人给她撑腰,大姑子和婆婆居然打起了卖她女儿的主见。“快别哭了!”那小媳妇连忙刺激她。“你刚生了孩子,可千万不能哭,要是回了奶,回头孩子就没吃的了。”李梅英连忙收住眼泪,“秀花妹子,你咋来了?你不是回娘家喝喜酒去了吗?”“我刚到家,半路上碰到了我公公,他上你家去给你爹娘送信了,我据说了你家的事,我就连忙过去瞧瞧,后果在村子口遇到你们家三婶,她跟我说你要生了,我就连忙回去把我相公和小叔子都叫了来。”孙秀花说着,指挥身后那两个男人。“你们把架子撑好了,让梅英姐躺上去。”李梅英有点不好意思,“不必了,我本人能走。”“别胡闹了!”那小媳妇杂色斥责她。“你才刚生了孩子,基本就不能下地,听我的,把孩子给我,你刚生产完,身子虚,别把孩子摔了。”李梅英只好听她的,让她扶着本人躺到担架上,“秀花妹子,谢谢你了。”这小媳妇名叫孙秀花,同李梅英的娘家是一个村子的,二人打小交好,长大了又嫁到了一处,平时始终都是互相呼应的。“快别说这些客气话了,咱们先回家。”这孙秀花也是个爽利人,连忙打发自家男人和小叔子抬了她回去。颜小熙在一旁问道:“婶子,那我三婶呢?”孙秀花从鼻孔里收回一声冷嗤,“你三叔把她拽回家,不让她跟着来。”说着,她抬头看着颜小熙,眼中满是讶异,“二妮子,不是说你死了吗?怎么又活过来了?”颜小熙赶紧道:“我就是撞到头,晕过去了,才没死!”她才不会通知旁人,本人是个穿梭女的事。孙秀花这才松了一口气,小声道:“幸好你没事,不然的话,可真是坑死你娘了。”他们住的村子间隔这个乱葬岗大概得有五里地,此时正是初夏节令,地里曾经冒出了绿油油的麦苗。村子里稀稀落落的有上百户人家,这会子正是黄昏,远远地能够看见不少人家的烟囱里冒出了灰白色的炊烟。孙秀花一边走,一边小声骂道:“你们家大姑也真不是个货色,他大姑父都考了那么些年了,也没考个举人进去,本人个儿不争气,却糊弄着你公公婆婆给供养他。那年卖了你小姑子给他凑盘缠,这一次又卖了大妮子。你们家老爷子和老太太这心也够狠的,本人的亲闺女、亲孙女说卖就卖……”李梅英没谈话,不过紧闭的眼睛里却淌出两行泪。颜小熙听孙秀花絮絮叨叨地说了这些事件,心中微叹,她不太理解这里的法律,所以不敢轻易倡议,在古代,若是有这样的事件,就间接上法院起诉了,这可是交易人口!然而这里是现代,她尽管不晓得这里是什么朝代,然而却晓得,现代交易人口是齐全非法的。而且,现代律法规定,前辈立功,家中长辈不能去衙门告发检举,反而要帮忙瞒哄,不然的话,即使前辈真的有罪,去告发检举的人也要坐牢放逐,或者承受杖刑。卖掉她姐姐的是她的爷爷奶奶,她和她娘是相对不能通过法律路径来讨回这个公平。然而这件事件她不可能就这么算了,尽管她不是这具身材的本尊,然而现如今,她既然曾经占据了这具身材,就得担负起爱护这个家的职责。她得好好地推敲推敲,要怎样才能讨回这个公平!不然的话,下一次被卖的人就会是她了。

December 19, 2020 · 1 min · jiezi

关于udp:王者荣耀如何使用UDP做到低延迟

https://www.bilibili.com/vide...

December 2, 2020 · 1 min · jiezi

关于udp:UDP的epoll并发框架解决OpenUOM的并发问题

UDP具备是一种很好的封装协定,比方OpenUOM应用UDP封装会比TCP好很多,当初越来越多的业务采纳UDP传输,而后本人定义按序达到以及流控逻辑,然而就我集体的应用教训来看,UDP太难做并发,大多数状况下,应用UDP会让epoll等高性能event机制劣势全无。本文以OpenUOM为例,阐明一下我是怎么解决UDP并发问题的。 异步并发模型与epoll和apache相比,nginx采纳异步的解决形式,也就是说,一个线程能够解决多个连贯,基于event模型,来了个数据包就读,可能顺次达到的数据不属于同一个连贯,然而没关系,只有能将可读的socket描述符和具体的连贯对应上即可。这样会使得在大并发场景下,让CPU迫近其极限运行,因为它简直没有工夫闲着,它会始终解决达到的数据包。apache的模型就不是这样,它会让一个连贯独自占有一个线程,如果有大量的连贯就会有大量的线程,然而对于每一个线程而言,其数据读写的压力并不是很大,这就会导致大量线程之间频繁切换,而切换会导致cache的刷新等副作用...因而在同样的硬件配置情景下,nginx的异步模型要比apache好很多。 咱们曾经晓得,异步解决是搞定大并发的基本,接下来的问题是,如何让一个就绪的socket和一个业务逻辑连贯对应起来,这个问题在同步模型下并不存在,因为一个线程只解决一个连贯。已经的event机制比方select,poll,它们只能通知你socket n就绪了,你不得不本人去通过数据结构来组织socket n和该连贯信息之间的关系,典型的如下: struct conn { int sd; void *others;};list conns;一个链表conns囊括了该线程负责的所有连贯,如果select/poll通知你socket n就绪了,你不得不遍历这个conns链表,比拟谁的sd是n,而后取出conn来解决,尽管能够用更加高效的数据结构,然而查找是必不可少的。然而epoll解决了这个问题。 在调用epoll_ctrl将一个socket退出到epoll中时,API会为你提供一个指针,让你间接绑定一个socket描述符和一个指针,一旦socket就绪,取出的是一个构造体,其中蕴含了与该socket对应的指针,因而你便能够这么做: conn.sd = sd;conn.others = all;ev.events = EPOLLIN;ev.data.ptr = &conn;epoll_ctl(kdpfd, EPOLL_CTL_ADD, sd, &ev);while (1) { nfds = epoll_wait(kdpfd, events, 10000, -1); for (n = 0; n < nfds; ++n) { conn = events[n].data.ptr; recv(conn.sd, ....); .... }}conn会一下子取出来。这是正当的形式。毕竟,内核中曾经通过socket查找了,一个5元组惟一代表了一个连贯,为何要在用户态程序再找一次呢?因而除了epoll不须要遍历所有的被监督socket之外,能够保留用户的指针也是其绝对于select/poll的一大劣势。nginx正是用的这种形式。咱们回到OpenUOM。 应用TCP的OpenUOM应用TCP的OpenUOM跟nginx简直是截然不同,其外围解决逻辑如下: /* 退出侦听socket */context.sd = listener;context.others = dont_care;listen_ev.events = EPOLLIN;listen_ev.data.ptr = context;epoll_ctl(kdpfd, EPOLL_CTL_ADD, listener, &listen_ev);/* 退出TUN网卡 */tun.sd = tun;tun.others = dont_care;entry.ptr = tun;entry.type = TUN;tun_ev.events = EPOLLIN;tun_ev.data.ptr = entry;epoll_ctl(kdpfd, EPOLL_CTL_ADD, tun, &tun_ev);while(1) { nfds = epoll_wait(kdpfd, events, 10000, -1); for (n = 0; n < nfds; ++n) { if (events[n].data.ptr == context) { child_sd = accept(context.sd, remote_addr....); multi_instance *mi = create_mi(child_sd, remote_addr, ...); entry.ptr = mi; entry.type = SOCKET; new_ev.events = EPOLLIN; new_ev.data.ptr = entry; epoll_ctl(kdpfd, EPOLL_CTL_ADD, child_sd, &new_ev); .... } else if (events[n].data.ptr.type == SOCKET){ multi_instance *mi = events[n].data.ptr; data = read_from_socket(mi); // 这里简化了解决,因为并不是每一个数据包都是须要加密解密的,还有管制通道的包 decrypt(mi, data); write_to_tun(data); } else { tun *tun = events[n].data.ptr.ptr; packet = read_from_tun(tun); lock(mi_hashtable); multi_instance *mi = lookup_multi_instance_from(packet); unlock(mi_hashtable); encrypt(packet); write_to_socket(packet, mi); } } ...}以上就是TCP模式下的OpenUOM全副逻辑,能够看到,如果socket可读,那么就能够间接取到multi_instance,而后程序解决就是了。我记得去年我就把OpenUOM改成多线程了,然而当初看来那是个失败的做法。如果应用TCP,从上述逻辑能够看到,就算应用多线程,在socket-to-tun这个门路上也不必加锁,因而multi_instance间接通过epoll_wait就能够取的到。 ...

November 17, 2020 · 5 min · jiezi

IPUDP和TCP的关系

互联网,实际上是一套理念和协议组成的体系架构。其中,协议是一套众所周知的规则和标准,如果各方都同意使用,那么它们之间的通信将变得毫无障碍。 IP:把数据包送达目的主机数据包要在互联网上进行传输,就要符合网际协议(IP)标准,互联网上不同的在线设备都有唯一的地址,地址只是一个数字,这和大部分家庭收件地址类似,你只需要知道一个家庭的具体地址,就可以往这个地址发送包裹,这样物流系统就能把物品送到目的地。 计算机的地址就称为 IP 地址,访问任何网站实际上只是你的计算机向另外一台计算机请求信息。 如果要想把一个数据包从主机 A 发送给主机 B,那么在传输之前,数据包上会被附加上主机 B 的 IP 地址信息,这样在传输过程中才能正确寻址。额外地,数据包上还会附加上主机 A 本身的 IP 地址,有了这些信息主机 B 才可以回复信息给主机 A。这些附加的信息会被装进一个叫 IP 头的数据结构里。IP 头是 IP 数据包开头的信息,包含 IP 版本、源 IP 地址、目标 IP 地址、生存时间等信息。 简化的 UDP 网络三层传输模型 UDP:把数据包送达应用程序IP 是非常底层的协议,只负责把数据包传送到对方电脑,但是对方电脑并不知道把数据包交给哪个程序,是交给浏览器还是交给王者荣耀?因此,需要基于 IP 之上开发能和应用打交道的协议,最常见的是“用户数据包协议(User Datagram Protocol)”,简称UDP。 UDP 中一个最重要的信息是端口号,端口号其实就是一个数字,每个想访问网络的程序都需要绑定一个端口号。通过端口号 UDP 就能把指定的数据包发送给指定的程序了,所以IP 通过 IP 地址信息把数据包发送给指定的电脑,而 UDP 通过端口号把数据包分发给正确的程序。和 IP 头一样,端口号会被装进 UDP 头里面,UDP 头再和原始数据包合并组成新的 UDP 数据包。UDP 头中除了目的端口,还有源端口号等信息。 简化的 UDP 网络四层传输模型 UDP 不能保证数据可靠性,但是传输速度却非常快,所以 UDP 会应用在一些关注速度、但不那么严格要求数据完整性的领域,如在线视频、互动游戏等。 ...

August 20, 2019 · 1 min · jiezi

浅谈DDOS中NTP放大攻击的操作过程以及防御措施

在诸多的DDoS攻击事件中,放大攻击的流行度占了百分之五十左右,攻击难度系数只是占中间部分,但它的影响力较大。这意味着它的防护和缓解比较复杂。那么就有人想要知道什么是NTP放大攻击?NTP的防御措施是怎么样的呢?接下来小编我就分享下NTP放大攻击的操作过程以及防御措施。 那首先就要知道什么是NTP呢?NTP协议(network time protocol)是计算机时间同步化的一种协议,它可以使计算机与时钟源进行同步化并且提高精准度的时间校正,它主要是采用层次化时间的分布模型。网络体系结构的组成是由主时间服务器、从时间服务器和客户机,主时间服务器主要布置在根节点,负责与高精度时间源进行同步,为其他节点提供时间服务,各客户端由从时间服务器经主服务器获得时间同步。 其次NTP放大攻击原理是什么?NTP协议是基于UDP协议的123端口进行通信,但是由于UDP协议的无连接性具有不安全性的缺陷,攻击者就会利用NTP服务器的不安全性能漏洞发起DDoS攻击。攻击者攻击的步骤是先寻找攻击对象或者互联网中支持NTP放大攻击的服务器资源;然后通过伪造IP地址向NTP服务器发送monlist的请求报文,为了增加攻击的强度,monlist指令会监控响应 NTP 服务器并且将其返回进行时间同步的最近多个客户端的IP地址,通常NTP服务器与大量的客户端进行交互时,一个不超过64字节的请求数据包可以触发100个482个字节响应的数据包,因此它具有放大数百倍的功能。从而这些大流量就会阻塞网络,导致网络不通,造成了分布式拒绝服务。 然后NTP放大攻击的防御措施是:1.对NTP服务器进行合理的管理和配置,将全部的NTP服务软件升级到最新的版本;2.在配置文件中添加noquery参数来限制客户端的monlist等信息查询请求;3.通过防火墙对UDP试用的123端口进行限制,只允许NTP服务于固定IP进行通信;4.运用足够大的带宽,硬抗NTP服务产生的放大型流量攻击。5.使用DDoS防御产品,将入口异常访问请求进行过滤清洗,然后将正常的访问请求分发给服务器进行业务处理。

July 12, 2019 · 1 min · jiezi

udp协议-看这篇就够了

UDP 概述用户数据报协议 UDP 只在 IP 的数据报服务之上增加了很少一点的功能,这就是复用和分用的功能以及查错检测的功能UDP 的主要特点UDP 是无连接的,即发送数据之前不需要建立连接(发送数据结束时也没有连接可释放),减少了开销和发送数据之前的时延UDP 使用尽最大努力交付,即不保证可靠交付,主机不需要维持复杂的连接状态表UDP 是面向报文的,发送方的 UDP 对应用程序交下来的报文,在添加首部后就向下交付 IP 层。UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界UDP 没有拥塞控制,网络出现的拥塞不会使源主机的发送速率降低。这对某些实时应用是很重要的UDP 支持一对一、一对多、多对一和多对多的交互通信UDP 的首部开销小,只有8个字节,比 TCP 的20个字节的首部要短《PHP面试问答》 https://github.com/colinlet/P…结合实际 PHP 面试,系统的汇总面试中的各种各样的问题,尝试提供简洁准确的答案。如果你在 PHP 面试中遇到问题,欢迎提 Issues 交流。包含网络协议、数据结构与算法、PHP、Web、MySQL、Redis、Linux、安全、设计模式、架构、自我介绍、离职原因、职业规划、准备问题等部分 如果觉得不错欢迎 star 关注,正在不断持续更新中~~存在问题某些实时应用需要使用没有拥塞控制的 UDP,但很多的源主机同时都向网络发送高速率的实时视频流时,网络就有可能发生拥塞,导致大家都无法正常接收。还有一些使用 UDP 的实时应用,需要对 UDP 的不可靠传输进行适当的改进,以减少数据的丢失。应用进程可以在不影响应用的实时性的前提下,增加一些提高可靠性的措施,如采用前向纠错或重传已丢失的报文UDP 的首部格式用户数据报 UDP 有两个字段:数据字段和首部字段。首部字段很简单,只有8个字节,由四个字段组成,每个字段都是两个字节首部字段源端口 源端口号。在需要对方回信时。不需要时可用全0目的端口 目的端口号。这在终点交付报文时必须使用长度 UDP 用户数据报的长度,其最小值是8(仅有首部)检验和 检测 UDP 用户数据报在传输中是否有错。有错就丢弃端口分用当运输层从 IP 层收到 UDP 数据报时,就根据首部中的目的端口,把 UDP 数据报通过相应的端口,上交最后的终点——应用进程如果接受方 UDP 发现收到的报文中的目的端口号不正确(即不存在对应于该端口号的应用程序),就丢弃该报文,并由网际控制报文协议 ICMP 发送“端口不可达”差错报文给发送方伪首部UDP 用户数据报首部中检验和的计算方法有些特殊。在计算检验和时,要在 UDP 用户数据报之前增加 12 个字节的伪首部。所谓“伪首部”是因为这种伪首部并不是 UDP 用户数据报真正的首部。只是在计算检验和时,临时添加在 UDP 用户数据报前面,得到一个临时的 UDP 用户数据报。检验和就是按照这个临时用户数据报来计算的。伪首部既不向下传也不向上递交,而仅仅是为了计算检验和本文转载自 枫叶林博客,《用户数据报协议UDP》https://blog.maplemark.cn/201…

April 17, 2019 · 1 min · jiezi

快速理解TCP和UDP的差异

前言最头疼的问题莫过于到底该选TCP还是UDP作为传输层协议。通过快速对比分析 TCP 和 UDP 的区别,来帮助即时通讯初学者快速了解这些基础的知识点,从而在IM、消息推送等网络通信应用场景中能准确地选择合适的传输层协议。建立连接方式的差异TCP说到 TCP 建立连接,相信大多数人脑海里肯定可以浮现出一个词,没错就是–“三次握手”。TCP 通过“三次握手”来建立连接,再通过“四次挥手”断开一个连接。在每次挥手中 TCP 做了哪些操作呢?流程如下图所示(TCP的三次握手和四次挥手):上图就从客户端和服务端的角度,清楚的展示了 TCP 的三次握手和四次挥手。可以看到,当 TCP 试图建立连接时,三次握手指的是客户端主动触发了两次,服务端触发了一次。我们可以先明确一下 TCP 建立连接并且初始化的目标是什么呢?1初始化资源;2告诉对方我的序列号。所以三次握手的次序是这样子的:client端首先发送一个SYN包告诉Server端我的初始序列号是X;Server端收到SYN包后回复给client一个ACK确认包,告诉client说我收到了;接着Server端也需要告诉client端自己的初始序列号,于是Server也发送一个SYN包告诉client我的初始序列号是Y;Client收到后,回复Server一个ACK确认包说我知道了。其中的 2 、3 步骤可以简化为一步,也就是说将 ACK 确认包和 SYN 序列化包一同发送给 Client 端。到此我们就比较简单的解释了 TCP 建立连接的“三次握手”。UDP我们都知道 TCP 是面向连接的、可靠的、有序的传输层协议,而 UDP 是面向数据报的、不可靠的、无序的传输协议,所以 UDP 压根不会建立什么连接。就好比发短信一样,UDP 只需要知道对方的 ip 地址,将数据报一份一份的发送过去就可以了,其他的作为发送方,都不需要关心。数据发送方式的差异关于 TCP、UDP 之间数据发送的差异,可以体现二者最大的不同之处:TCP:由于 TCP 是建立在两端连接之上的协议,所以理论上发送的数据流不存在大小的限制。但是由于缓冲区有大小限制,所以你如果用 TCP 发送一段很大的数据,可能会截断成好几段,接收方依次的接收。UDP:由于 UDP 本身发送的就是一份一份的数据报,所以自然而然的就有一个上限的大小。那么每次 UDP 发送的数据报大小由哪些因素共同决定呢?UDP协议本身,UDP协议中有16位的UDP报文长度,那么UDP报文长度不能超过2^16=65536;以太网(Ethernet)数据帧的长度,数据链路层的MTU(最大传输单元);socket的UDP发送缓存区大小先来看第一个因素,UDP 本身协议的报文长度为 2^16 - 1,UDP 包头占 8 个字节,IP 协议本身封装后包头占 20 个字节,所以最终长度为: 2^16 - 1 - 20 - 8 = 65507 字节。只看第一个因素有点理想化了,因为 UDP 属于不可靠协议,我们应该尽量避免在传输过程中,数据包被分割。所以这里有一个非常重要的概念 MTU – 也就是最大传输单元。在 Internet 下 MTU 的值为 576 字节,所以在 internet 下使用 UDP 协议,每个数据报最大的字节数为: 576 - 20 - 8 = 548数据有序性的差异TCP对于 TCP 来说,本身 TCP 有着超时重传、错误重传、还有等等一系列复杂的算法保证了 TCP 的数据是有序的,假设你发送了数据 1、2、3,则只要发送端和接收端保持连接时,接收端收到的数据始终都是 1、2、3。UDP而 UDP 协议则要奔放的多,无论 server 端无论缓冲池的大小有多大,接收 client 端发来的消息总是一个一个的接收。并且由于 UDP 本身的不可靠性以及无序性,如果 client 发送了 1、2、3 这三个数据报过来,server 端接收到的可能是任意顺序、任意个数三个数据报的排列组合。可靠性的差异其实大家都知道 TCP 本身是可靠的协议,而 UDP 是不可靠的协议。TCPTCP 内部的很多算法机制让他保持连接的过程中是很可靠的。比如:TCP 的超时重传、错误重传、TCP 的流量控制、阻塞控制、慢热启动算法、拥塞避免算法、快速恢复算法 等等。所以 TCP 是一个内部原理复杂,但是使用起来比较简单的这么一个协议。UDPUDP 是一个面向非连接的协议,UDP 发送的每个数据报带有自己的 IP 地址和接收方的 IP 地址,它本身对这个数据报是否出错,是否到达不关心,只要发出去了就好了。所以来研究下,什么情况会导致 UDP 丢包:数据报分片重组丢失:在文章之前我们就说过,UDP 的每个数据报大小多少最合适,事实上 UDP 协议本身规定的大小是 64kb,但是在数据链路层有 MTU 的限制,大小大概在 5kb,所以当你发送一个很大的 UDP 包的时候,这个包会在 IP 层进行分片,然后重组。这个过程就有可能导致分片的包丢失。UDP 本身有 CRC 检测机制,会抛弃掉丢失的 UDP 包;UDP 缓冲区填满:当 UDP 的缓冲区已经被填满的时候,接收方还没有处理这部分的 UDP 数据报,这个时候再过来的数据报就没有地方可以存了,自然就都被丢弃了。使用场景总结在文章最后的一部分,聊聊 TCP、UDP 使用场景。先来说 UDP 的吧,有很多人都会觉得 UDP 与 TCP 相比,在性能速度上是占优势的。因为 UDP 并不用保持一个持续的连接,也不需要对收发包进行确认。但事实上经过这么多年的发展 TCP 已经拥有足够多的算法和优化,在网络状态不错的情况下,TCP 的整体性能是优于 UDP 的。那在什么时候我们非用 UDP 不可呢?对实时性要求高:比如实时会议,实时视频这种情况下,如果使用 TCP,当网络不好发生重传时,画面肯定会有延时,甚至越堆越多。如果使用 UDP 的话,即使偶尔丢了几个包,但是也不会影响什么,这种情况下使用 UDP 比较好;多点通信:TCP 需要保持一个长连接,那么在涉及多点通讯的时候,肯定需要和多个通信节点建立其双向连接,然后有时在NAT环境下,两个通信节点建立其直接的 TCP 连接不是一个容易的事情,而 UDP 可以无需保持连接,直接发就可以了,所以成本会很低,而且穿透性好。这种情况下使用 UDP 也是没错的。以上我们说了 UDP 的使用场景,在此之外的其他情况,使用 TCP 准没错。毕竟有一句话嘛:when in doubt,use TCP。 ...

January 20, 2019 · 1 min · jiezi

UDP中一个包的大小最大能多大?

前言因为UDP数据传输的无连接特性,最简单的UDP数据传输就是一次数据交互一个UDP包搞定,这样就不用管分包问题(因为不像TCP,UDP传输时如果分包则是不能保证顺序的,这会带来很多问题)。所以你一次交互的数据如果太多的话,用UDP实现就很可能并不优雅。思考在进行UDP编程的时候,我们最容易想到的问题就是,一次发送多少bytes好? 当然,这个没有唯一答案,相对于不同的系统,不同的要求,其得到的答案是不一样的,我这里仅对像ICQ一类的发送聊天消息的情况作分析,对于其他情况,你或许也能得到一点帮助。网络原理首先,我们知道,TCP/IP通常被认为是一个四层协议系统:包括链路层、网络层、运输层、应用层 。UDP属于运输层,下面我们由下至上一步一步来看。结论1:局域网环境下,建议将UDP数据控制在1472字节以下以太网(Ethernet)数据帧的长度必须在46-1500字节之间,这是由以太网的物理特性决定的,这个1500字节被称为链路层的MTU(最大传输单元)。 但这并不是指链路层的长度被限制在1500字节,其实这这个MTU指的是链路层的数据区,并不包括链路层的首部和尾部的18个字节。所以,事实上这个1500字节就是网络层IP数据报的长度限制。因为IP数据报的首部为20字节,所以IP数据报的数据区长度最大为1480字节。而这个1480字节就是用来放TCP传来的TCP报文段或UDP传来的UDP数据报的。又因为UDP数据报的首部8字节,所以UDP数据报的数据区最大长度为1472字节。这个1472字节就是我们可以使用的字节数当我们发送的UDP数据大于1472的时候会怎样呢?这也就是说IP数据报大于1500字节,大于MTU,这个时候发送方IP层就需要分片(fragmentation)。把数据报分成若干片,使每一片都小于MTU,而接收方IP层则需要进行数据报的重组。这样就会多做许多事情,而更严重的是,由于UDP的特性,当某一片数据传送中丢失时,接收方无法重组数据报,将导致丢弃整个UDP数据报。因此,在普通的局域网环境下,我建议将UDP的数据控制在1472字节以下为好。结论2:Internet编程时,建议将UDP数据控制在548字节以下进行Internet编程时则不同,因为Internet上的路由器可能会将MTU设为不同的值。如果我们假定MTU为1500来发送数据,而途经的某个网络的MTU值小于1500字节,那么系统将会使用一系列的机制来调整MTU值,使数据报能够顺利到达目的地,这样就会做许多不必要的操作。鉴于Internet上的标准MTU值为576字节,所以我建议在进行Internet的UDP编程时, 最好将UDP的数据长度控件在548字节(576-8-20)以内。这句话貌似有问题,unix网络编程第一卷里说:ipv4协议规定ip层的最小重组缓冲区大小为576!所以,建议udp包不要超过这个大小,而不是因为internet的标准MTU是576!

January 20, 2019 · 1 min · jiezi

协议简史:如何学习网络协议?

大学时,学到网络协议的7层模型时,老师教了大家一个顺口溜:物数网传会表应。并说这是重点,年年必考,5分的题目摆在这里,你们爱背不背。考试的时候,果然遇到这个问题,搜索枯肠,只能想到这7个字的第一个字,因为这5分,差点挂科。后来工作面试,面试官也是很喜欢七层模型,三次握手之类的问题,但是遇到这些问题时,总是觉得很心虚。1. 协议分层四层网络协议模型中,应用层以下一般都是交给操作系统来处理。应用层对于四层模型来说,仅仅是冰山一角。海面下巨复杂的三层协议,都被操作系统给隐藏起来了,一般我们在页面上发起一个ajax请求,看见了network面板多了一个http请求,至于底层是如何实现的,我们并不关心。应⽤层负责处理特定的应⽤程序细节。运输层运输层主要为两台主机上的应⽤程序提供端到端的通信。网络层处理理分组在⽹网络中的活动,例例如分组的选路链路层处理理与电缆(或其他任何传输媒介)的物理理接⼝口细节下面重点讲一下运输层和网络层1.1. 运输层的两兄弟运输层有两个比较重要的协议。tcp和udp。大哥tcp是比较严谨认真、温柔体贴、慢热内向的协议,发出去的消息,总是一个一个认真检查,等待对方回复和确认,如果一段时间内,对方没有回复确认消息,还会再次发送消息,如果对方回复说你发的太快了,tcp还会体贴的把发送消息的速度降低。弟弟udp则比较可爱呆萌、调皮好动、不负责任的协议。哥哥tcp所具有的特点,弟弟udp一个也没有。但是有的人说不清哪里好 但就是谁都替代不了,udp没有tcp那些复杂的校验和重传等复杂的步骤,所以它发送消息非常快,而且并不保证对方一定收到。如果对方收不到消息,那么udp就会呆萌的看着你,笑着对你说:我已经尽力了。一般语音而视频数据都是用udp协议传输的,因为音频或者视频卡了一下并不影响整体的质量,而对实时性的要求会更高。1.2. 运输层和网络层的区别运输层关注的是端到端层面,及End1到End2,忽略中间的任何点。网络层关注两点之间的层面,即hop1如何到hop2,hop2如何到hop3网络层并不保证消息可靠性,可靠性上层的传输层负责。TCP采用超时重传,分组确认的机制,保证消息不会丢失。从下图tcp, udp, ip协议中,可以发现传输层的tcp和udp都是有源端口和目的端口,但是没有ip字段源ip和目的ip只在ip数据报中理解各个协议,关键在于理解报文的各个字段的含义1.3. ip和端口号的真正含义上个章节讲到运输层和网络层的区别,其中端口号被封装在运输层,ip被封装到网络成,那么端口号和ip地址到底有什么区别呢?ip用来用来标记主机的位置端口号用来标记该数据应该被目标主机上的哪个应用程序去处理1.4. 数据在协议栈的流动 封装与分用当发送消息时,数据在向下传递时,经过不同层次的协议处理,打上各种头部信息当接受消息时,数据在向上传递,通过不同的头部信息字段,才知道要交给上层的那个模块来处理。比如一个ip包,如果没有头部信息,那么这个消息究竟是交给tcp协议来处理,还是udp来处理,就不得而知了2. 深入阅读,好书推荐《http权威指南》 有人说这本书太厚,偷偷告诉你,其实这本书并厚,因为这本书的后面的30%部分都是附录,这本书的精华是前50%的部分《图解http》、《图解tcp/ip》这两本图解的书,知识点讲的都是比较通俗易懂的,适合入门《tcp/ip 详解 卷1》这本书,让你知其然,更知其所以然《tcp/ip 基础》、《tcp/ip 路由技术》这两本书,会让你从不同角度思考协议《精通wireshark》、《wireshark网络分析实战》如果你看了很多书,却从来没有试过网络抓包,那你只是懂纸上谈兵罢了。你永远无法理解tcp三次握手的怦然心动,与四次分手的刻骨铭心。

January 19, 2019 · 1 min · jiezi