关于网络:推荐-10-个不错的网络监视工具

有几个网络监督工具能够用于不同的操作系统。在这篇文章中,咱们将探讨从 Linux 终端中运行的 10 个网络监督工具。 它对不应用 GUI 而心愿通过 SSH 来放弃对网络管理的用户来说是十分现实的。 1、iftop iftop network monitoring tool Linux 用户通常都相熟 top —— 这是一个零碎监督工具,它容许咱们晓得在咱们的零碎中实时运行的过程,并能够很容易地治理它们。 iftop 与 top 应用程序相似,但它是专门监督网络的,通过它能够晓得更多的对于网络的详细情况和应用网络的所有过程。 2、vnstat vnstat network monitoring tool vnstat 是一个缺省蕴含在大多数 Linux 发行版中的网络监督工具。它容许咱们对一个用户抉择的工夫周期内发送和接管的流量进行实时控制。 3、IPTraf iptraf monitoring tool for linux IPTraf 是一个基于控制台的 Linux 实时网络监督程序。它会收集通过这个网络的各种各样的信息作为一个 IP 流量监视器,包含 TCP 标记信息、ICMP 详细情况、TCP / UDP 流量故障、TCP 连贯包和字节计数。它也收集接口上全副的 TCP、UDP、…… IP 协定和非 IP 协定 ICMP 的校验和谬误、接口流动等等的详细情况。 4、Monitorix – 零碎和网络监督 monitorix system monitoring tool for linux ...

November 19, 2020 · 1 min · jiezi

关于网络:继linux命令之后我又给你们整理了网络命令归纳快给爷来收藏

前言上次发了linux命令总结之后,很多敌人说想看网络命令演绎总结,明天他来了,别废话,给我珍藏起来。欢送各位进群973961276一起聊聊技术吹吹牛,每周都会有几次抽奖送专业书籍的流动,奖品虽不甚值钱,但也算个彩头不是 网络连通性检测当利用呈现网络异样时,首先须要确认的就是网络的连通性是否失常,上面一组命令可疾速检测网络的连通性,如下:检测DNS dig www.baidu.combashnslookup www.baidu.combashhost www.baidu.com 检测主机是否可达 ping www.baidu.com 检测port是否可达 #查看tcp端口telnet www.baidu.com 80#查看udp端口nc -uvz ip port 检测SSLSSL认证也常常导致程序无奈连贯,次要呈现在SSL握手过程中。 openssl s_client -connect www.baidu.com:443 -prexit 一键检测少数状况下,能够应用curl一键检测所有过程,如果有问题,再应用下面的命令一一排查。 curl -v http://www.baidu.com:80/ 工夫耗费散布应用curl可检测出http协定接口各阶段破费的工夫。 $ curl -o /dev/null -s -w " time_namelookup:%{time_namelookup}sn time_connect:%{time_connect}sn time_starttransfer:%{time_starttransfer}sn time_total:%{time_total}sn speed_download:%{speed_download}n http_code:%{http_code}" "http://www.baidu.com" time_namelookup:0.016542s time_connect:0.038686s time_starttransfer:0.063550s time_total:0.063593s speed_download:37793.000 http_code:200 time_namelookup:开始到DNS查问实现的工夫time_connect:开始到TCP三次握手实现的工夫time_starttransfer:开始到收到服务端发来首字节数据的工夫time_total:开始到服务端数据接管实现的工夫 零根底和大三大四的敌人看这里>>c/c++ 企业级我的项目实战曾经工作了想持续自我晋升跳槽涨薪的工程师看这里>>c/c++ linux服务器高级 查看socket连贯因为网络通信都须要靠socket,所以检查一下socket连贯以及它的散布状况也是十分有必要的。查看端口是否监听服务端程序肯定会监听至多一个端口,查看监听socket是否存在,也是判断服务过程是否还存在的一种办法。 netstat -nltp|grep 8080lsof -nP -i -sTCP:LISTEN|grep 8080 ...

November 18, 2020 · 3 min · jiezi

关于网络:问题为什么有了IP地址后还需要用MAC地址

等同问题:为什么有了MAC地址,还须要IP地址? 首先,咱们先来看IP地址和MAC地址。 IP地址: 是IP协定提供的一种对立的地址格局,它为互联网上的每一个网络和每一台主机调配一个逻辑地址,是因特网上惟一表明主机的地址。能够是动静的,好比是你住址的门牌号。 MAC地址: 是在数据链路层上标记每一个主机或者设施的独立标识符。在局域网中,称为硬件地址或者物理地址。是每个适配器(网卡)都有的一个寰球惟一的48位二进制地址,是一出厂就能够确定一个MAC地址。好比一个人的身份证号码。(MAC地址是以太网卡的物理标识。) 角度1:只有IP,没有MAC。网卡的实现上极其艰难。 如果没有MAC地址,网卡就须要解读网络层协定头的地址信息,而每一种网络层的地址又都差不多,这减少了以太网卡的实现复杂度。而网卡有了MAC地址,就能够不依赖于任何网络层协定,能够独立判断一个以太帧是否接管(根据MAC地址匹配),这样大大简化了网卡的实现。即便有更多的网络层协定,网卡也无需太多扭转。思维:分层,外部实现无需通晓下层或上层协定字段。 角度2:只有MAC,没有IP。网卡的实现上极其艰难。 如果只应用MAC地址的话,路由器就须要记住每个MAC地址所在的子网是哪一个,而世界上有2的48次方个MAC地址,这就意味着即便咱们给每个 MAC 地址只留 1 字节的贮存空间,每个路由器也须要 256 TB 的内存!这显然是不可能实现的。 角度3:只有IP,没有MAC。IP地址的局限。 IP地址是要设施上线当前,能力依据他进入了哪个子网来调配的,在设施还没有IP地址的时候(或者调配IP地址的过程中),还须要用MAC地址来辨别不同的设施,并依据MAC地址通信。 【类比形象了解】: IP地址好比住址的门牌号,住在不同的中央就有不同的门牌号,邮局送信的时候回依据这个门牌号找到你的地位。 MAC地址好比身份证号码,一出世就有的且不会产生扭转。然而晓得身份证号码是无奈找到你的,身份证号码和地理位置无关。 参考文章1、https://www.zhihu.com/questio... 你好啊世界2、https://www.zhihu.com/questio... 车小胖

October 22, 2020 · 1 min · jiezi

关于网络:理论研究漫谈传统IT基础设施06网络下

本文欢送转载,转载请注明出处和作者。 持续讨论一下OSI七层模型,如果上篇的解释还是意犹未尽,那么咱们持续尝试以应用QQ软件聊天的类比阐明,来阐明OSI七层模型。 两主机通信的过程,从发送者(以下简称A)到接收者(以下简称B),属于从7层(应用层)->1层(物理层)封装,而后传输到远端,再从1层(物理层)->7层(应用层)解封装的过程。 1、 当A关上了QQ这个软件,相当就达到应用层了;因为软件会依据你的操作调动机器底层的硬件工作了。 2、 当A往QQ这个软件的聊天窗口外面输出信息,收回后,QQ会将这个信息保留在本地聊天记录文件MSGEX.db(个别就保留在QQ目录下以你的QQ号码为文件夹里)。以某种格局编码/保留某种信息,这能够了解为表示层了。 3、 当A关上与B的聊天窗口,输出信息,按下“输出”按钮,用户的操作就完结了,剩下都是机器本人的操作了。理论传输之前QQ会先建设A与B的会话连贯,才真正开始传输信息/数据(你能够了解借传输文件了解:你发送文件给对方,要期待对方按下接管,才算建设了会话,而后才开始传输。)这算会话层了。 4、 会话建设后,会将A发的信息斩件,如A发送“你吃了饭没有”?传输层将这句话斩成“你”“吃”“了”“饭”“没”“有”6个数据段,标记号应用的端口号,而后筹备收回去。 5、 接上一层,信息还未收回去,这时候在网络层做路由选路,能够了解为,从A家进来,能够别离经“联通”“电信”“挪动”3个网络中的一个再到B家。 网络层依据路由协定负责选路(依据链路品质、带宽、开销等方法论)。假如最初选了2条,可能就A->联通->B发送“你”“吃”“了”3个数据段,A->电信->B发送“饭”“没”“有”3个数据段。 选路后,这一层要标记IP包头,包头次要内容是源IP地址,目标IP地址,应用什么协定。其中源、目标IP相当于你寄信的时候的收发的地址与邮政编码,标记出发送者与接收者。而协定相当于这封信到底用什么语言书写。(只有保障2端应用同种语言,能力确保通信起来,否则你用英文写信给大妈,大妈怎么看得懂呢?) 6、 而后再到数据链路层,数据链路层次要是负责同一个子网内的通信的。例如A、B连贯在同一台二层交换机,就属于同一个子网,那么数据帧的通信是不须要通过网络层的(即三层交换机或者路由器),间接在这台二层交换机就过来了。这一层打的是MAC地址的帧头,对于上述通信过程来说,就是为数据帧打上A的机器的MAC与A的网关的MAC。这一层的工作就实现了。 7、 最初一层了,通过上述斩件、打完各层标签后的6个数据帧,物理层将他们翻译文6段0、1示意的比特流,而后通过光纤、铜缆进行传输。 8、 当比特流传输到了远端,接着B的机器依照上述的1~7的步骤反方向运行一次即可(即有物理层到应用层)。就是一层层读取标签,传输给标签标记着的相应对象,而后摘除标签,再读取上一层标签,直到最初B的应用程序可能读到A往应用程序输出的数据为止。 2个主机之间的通信,对于2台主机来说,必定是都须要逾越7层的,而平时说的只须要去到2层或者3层,其实是对于两头零碎而言的,就是说两头的交换机、路由器而言;例如图1的假如两端的通信实体在一个局域网内,其实传输的数据包去到交换机时,交换机拆开二层帧头,再查本身的MAC地址表,发现表外面有对应的目标MAC地址,而后对应的端口是哪个,接着就把帧发送到该端口转发进来,它的工作就实现了。基本不须要达到网络层的意思是,基本都不须要拆开3层的IP包头来读取外面的信息。 通过转发,最初达到B主机,而后从1层拆到7层,B用户的主机最终就读取到信息了。对于图2,因为A、B两通信实体跨域广域网,所以光靠MAC地址表,必定是查不到的,这时候路由器会把IP包头也拆开,读取目标IP地址,再查路由表,就晓得往哪个端口收回去了。而后层层转发,就能够达到目的地了,接下来就和图1的一样了。 对于网络的实践还有很多很多,VLAN、STP、VRRP、动静路由(OSPF、EIGRP、BGP)、×××、GRE TUNNEL等,俗话说抛开剂量论毒性就是耍流氓,如果光说不练,来讲述下面的这些实践,根本无法很好地了解与消化。因而前面,网络局部咱们以packet tracer模拟器来作为入口,试着每个概念既讲述实践,又尝试入手试验,穿插着讲,务求学以致用。 更多精彩内容,能够关注我的微信公众号:Waiting的运维日常 本篇文章由一文多发平台ArtiPub主动公布

October 17, 2020 · 1 min · jiezi

关于网络:使用鸽子理解HTTPS的原理

前言在网络上的任何流动都能够归结为服务器之前的收发音讯。咱们能够将这些音讯的收发,设想成由鸽子实现的。这很荒诞,但的确如此。 Http有一天爱丽丝通过鸽子发送一条“我爱你”的音讯给鲍勃。然而爱丽丝的情敌马洛里,半路拦挡了鸽子,并将音讯批改为了“我不爱你”。然而鲍勃无奈晓得,音讯被篡改了。这就是Http的工作形式,十分的不牢靠。 一个明码爱丽丝和鲍勃,筹备对音讯进行加密。比方将字母偏移3位,比方“A”应用“D”示意,“B”应用“E”示意。马洛里即便拦挡了鸽子,也无奈进行批改,因为他不分明加密的形式,无奈了解音讯的内容。然而鲍勃却能够轻松将音讯进行解密。 这被称为symmetric key cryptography(对称密钥加密),你晓得如何加密也晓得如何解密。事实的生产中,会应用更简单的加密形式,然而主体思路是雷同的。 如何确定密钥如果爱丽丝和鲍勃在发送音讯前不见面,他们无奈建设平安的密钥。如果在音讯自身之中,携带密钥。马洛里就会晓得音讯的内容,对其解密后进行篡改。 这就是典型的MITM(中间人攻打),防止中间人攻打咱们必须更改加密零碎。 一个盒子爱丽丝和鲍勃设计出了一个更好的加密零碎,上面是操作步骤 鲍勃向爱丽丝,发送了一只没有任何音讯的鸽子爱丽丝在鸽子腿上绑了一个带锁的盒子,盒子是开着的,然而盒子的钥匙爱丽丝留下了。鸽子又飞回到鲍勃哪里。鲍勃写好消息,将音讯放进盒子,并锁了起来。而后鸽子将音讯带回给爱丽丝。爱丽丝收到鸽子,应用钥匙关上了盒子,并读取了音讯爱丽丝和鲍勃之间的通信应用了asymmetric key cryptography(非对称密钥加密)。你能够加密音讯(把音讯放进盒子),然而你没方法解密(你没有钥匙) 盒子也能够称为“公钥”,盒子的钥匙被称为“私钥”。 是否是牢靠的盒子?目前还有一个问题。如果马洛里拦挡了鸽子,将盒子换成了本人的盒子,怎么办? 爱丽丝能够在盒子上,增加上本人的签名,鲍勃就会晓得这个盒子是否来自爱丽丝。那么鲍勃一开始该如何辨认签名呢? 爱丽丝和鲍勃决定让泰德代替爱丽丝在盒子上签名。泰德是一个十分有名的,并且值得信赖的人。泰德只有确定是爱丽丝的盒子的状况下,才会在盒子上签名。而马洛里不会失去泰德的签名。 而泰德就是Certification Authority(证书颁发机构) 盒子比拟重带有盒子的鸽子,飞的比不带盒子的鸽子飞的慢,这该怎么办? 应用非对称加密比应用对称加密要慢。爱丽丝鲍勃决定,只应用盒子(非对称加密)替换加密的密钥。而后应用密钥对音讯进行对称加密。 鲍勃向爱丽丝发送一只什么都没有的鸽子爱丽丝返回了一个带有盒子的鸽子鲍勃本地生成了一个密钥(用于对称加密),而后把这个密钥放到盒子里,发送给爱丽丝爱丽丝通过私钥对盒子解密,获取了鲍勃生成的密钥之后发送音讯,鲍勃只须要应用密钥进行对称加密即可(这样速度就很快了)这就是Https的原理。 原文HTTPS explained with carrier pigeons参考Man-in-the-middle attackHow does HTTPS actually work?

October 10, 2020 · 1 min · jiezi

关于网络:四种会话追踪技术

四种会话追踪技术四种会话追踪技术CookieSessionURL重写暗藏表单域Session和Cookiesession用来示意用户会话,session对象在服务端保护,个别tomcat设定session生命周期为30分钟,超时将生效,也能够被动设置有效。cookie寄存在客户端,能够分为内存cookie和磁盘cookie。内存cookie在浏览器敞开后隐没,磁盘cookie超时后隐没。当浏览器发送申请时,将主动发送对应cookie信息,前提是申请url满足cookie门路。能够将sessionId寄存在cookie中,也能够通过重写url将sessionId拼接到url上。因而能够查看浏览器cookie或地址栏url看到sessionId。申请到服务端时,将依据申请中的sessionId查找session,如果能够获取到则返回,否则返回null或者返回新构建的session,老的session仍旧存在,请参考API。URL重写能够通过url参数的模式将信息发送至服务器。然而这种形式参数的大小受到浏览器限度,cookie禁用时能够持续的工作,不存在持久性,一旦页面敞开则完结。这种形式通过明文将信息传输,并不平安,容易被劫持。暗藏表单域表单暗藏域type=hidden的作用: HTML中写表单的时候,写入这段代码<input type="hidden" name="#" value="#">意思是在这里减少一个暗藏域。对于用户来说,在页面上暗藏域是不可见的。 暗藏域的作用是帮忙表单收集和发送信息,便于后端解决数据。用户点击提交数据的时候,暗藏域的信息也被一起发送到了后端。后端接管前端传来的数据,须要确认前端的身份,是本公司的网页传来的数据,而不是其余黑客晓得后端地址后传来的假数据。那么就加一个暗藏域,验证value里的值和数据库里name的值是不是对应的,相似于“天王盖地虎,宝塔镇河妖”,暗号对的上,能力证实是本人人。当然这些货色也能用cookie实现,但应用暗藏域比较简单,而且不会有浏览器不反对,用户禁用cookie的懊恼。有时候一个表单里有多个提交按钮,后端怎么晓得用户是点击哪个按钮提交过去的呢?这时候咱们只有加暗藏域,对每一个按钮起个名字(value值),后端接管到数据后,查看value值,就能晓得是哪个按钮提交的了。有时候一个网页中有多个form,咱们晓得多个form是不能同时提交的,但有时这些form的确相互作用,咱们就能够在form中增加暗藏域来使它们分割起来。JavaScript不反对全局变量,但有时咱们必须用全局变量,咱们就能够把值先存在暗藏域里,它的值就不会失落了。还有个例子,比方按一个按钮弹出四个小窗口,当点击其中的一个小窗口时其余三个主动敞开.可是IE不反对小窗口互相调用,所以只有在父窗口写个暗藏域,当小窗口看到那个暗藏域的值是close时就本人关掉。例题1.无关会话跟踪技术形容正确的是? A Cookie是Web服务器发送给客户端的一小段信息,客户端申请时,能够读取该信息发送到服务器端。B 敞开浏览器意味着长期会话ID失落,但所有与原会话关联的会话数据仍保留在服务器上,直至会话过期。C 在禁用Cookie时能够应用URL重写技术跟踪会话。D 表单暗藏域将字段增加到HTML表单并在客户端浏览器中显示。答案A, B, C 解析A 参考本二级题目知识点B session存在服务器,然而sessionid存在客户端,作为客户端找到session的援用。C 能够通过重写url将sessionId拼接到url上。D 表单暗藏域用来收集或发送信息的不可见元素,对于网页的访问者用户来说,表单暗藏域是看不见的。当表单被提交时,表单暗藏域会将其中定义的名称和值发送到服务器上。jsessionidjsessionid 是 session 的标识。这就好比每个人都有身份证一样。 (jsessionid 只是 tomcat 中对 session id 的叫法,在其它容器外面,不肯定就是叫 jsessionid 了)。 Q&A是不是只有一关上一个页面就会产生一个jsessionid?在不敞开浏览器的状况下,什么时候jsessionid会扭转?我登陆后,登陆而后退出,jsessionid会有什么变动?session 和 jsessionid 有什么关系?所谓session能够这样了解:当与服务端进行会话时,比如说登陆胜利后,服务端会为用户开壁一块内存区间,用以寄存用户这次会话的一些内容,比如说用户名之类的。那么就须要一个货色来标记这个内存区间是你的而不是他人的,这个货色就是 session id (jsessionid 只是 tomcat 中对 session id 的叫法,在其它容器外面,不肯定就是叫 jsessionid 了)。而这个内存区间能够了解为 session。 而后,服务器会将这个session id发回给你的浏览器,放入你的浏览器的cookies中(这个cookies是内存cookies,跟个别的不一样,它会随着浏览器的敞开而隐没)。 之后,只有你浏览器没有敞开,你每向服务器发申请,服务器就会从你发送过去的cookies中拿出这个session id,而后依据这个session id到相应的内存中取你之前寄存的数据。 然而,如果你退出登陆了,服务器会清掉属于你的内存区域,所以你再登的话,会产生一个新的session了。 jsessionid 解释的解释如下: 这是一个保险措施 因为Session默认是须要Cookie反对的,但有些客户浏览器是敞开Cookie的。而jsessionid是存储在Cookie中的,如果禁用Cookie的话,也就是说服务器那边得不到jsessionid,这样也就没法依据jsessionid取得对应的session了,取得不了session就得不到session中存储的数据了。 这个时候就须要在URL中指定服务器上的session标识,也就是相似于"jsessionid=5F4771183629C9834F8382E23BE13C4C"这种格局。 用一个办法(忘了办法的名字)解决URL串就能够失去这个货色,这个办法会判断你的浏览器是否开启了Cookie,如果他认为应该加他就会加上去。 Q:是不是只有一关上一个页面就会产生一个jsessionid? A:显然不是的。session是有肯定作用域的,而且是有工夫限度的。 Q:在不敞开浏览器的状况下,什么时候jsessionid会扭转?我登陆后,登陆而后退出,jsessionid会有什么变动? A:jsessionid是服务器那边生成的,因为cookie是服务器那边送到客户端的信息。不论能不能批改jsessionid,都不应该批改,如果你批改了,这就失去了jessionid的本身意义了,你批改的话,你让服务器那边如何找到对应的session?找不到的话,你寄存在那个session中的数据不是取不到了吗? 登陆而后退出,我认为会从新生成一个jsessionid。因为退出的话,application作用域的数据都会失落,更何况这个比它作用域还小的session?既然session都隐没了,这个jsessionid有什么用? Q:session和jsessionid有什么关系? A:jsessionid是session的标识。这就好比每个人都有身份证一样。 cookie和session机制区别与分割具体来说cookie机制采纳的是在客户端放弃状态的计划,而session机制采纳的是在服务器端放弃状态的计划。同时咱们也看到,因为采纳服务器端放弃状态的计划在客户端也须要保留一个标识,所以session机制可能须要借助于cookie机制来达到保留标识的目标,但实际上它还有其余抉择。 cookie机制正统的cookie散发是通过扩大HTTP协定来实现的,服务器通过在HTTP的响应头中加上一行非凡的批示以提醒浏览器依照批示生成相应的cookie。然而纯正的客户端脚本如JavaScript或者VBScript也能够生成cookie。而cookie的应用是由浏览器依照肯定的准则在后盾主动发送给服务器的。浏览器查看所有存储的cookie,如果某个cookie所申明的作用范畴大于等于将要申请的资源所在的地位,则把该cookie附在申请资源的HTTP申请头上发送给服务器。 cookie的内容次要包含:名字,值,过期工夫,门路和域。门路与域一起形成cookie的作用范畴。若不设置过期工夫,则示意这个cookie的生命期为浏览器会话期间,敞开浏览器窗口,cookie就隐没。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie个别不存储在硬盘上而是保留在内存里,当然这种行为并不是标准规定的。若设置了过期工夫,浏览器就会把cookie保留到硬盘上,敞开后再次关上浏览器,这些cookie依然无效直到超过设定的过期工夫。存储在硬盘上的cookie能够在不同的浏览器过程间共享,比方两个IE窗口。而对于保留在内存里的cookie,不同的浏览器有不同的解决形式。 session机制session机制是一种服务器端的机制,服务器应用一种相似于散列表的构造(也可能就是应用散列表)来保存信息。 当程序须要为某个客户端的申请创立一个session时,服务器首先查看这个客户端的申请里是否已蕴含了一个session标识(称为session id),如果已蕴含则阐明以前曾经为此客户端创立过session,服务器就依照session id把这个session检索进去应用(检索不到,会新建一个),如果客户端申请不蕴含session id,则为此客户端创立一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会反复,又不容易被找到法则以仿造的字符串,这个session id将被在本次响应中返回给客户端保留。 ...

September 30, 2020 · 1 min · jiezi

关于网络:云图说-华为云应用服务网格让你的应用治理智能化可视化

摘要:华为云应用服务网格产品与CCE容器引擎深度整合,提供非侵入、智能流量治理的利用全生命周期治理计划,加强了华为云容器服务全栈能力,并在易用性、可靠性、可视化等方面进行了一系列加强,为客户提供开箱即用的上手体验。应用服务网格提供非侵入式的微服务治理解决方案,反对残缺的生命周期治理和流量治理,兼容Kubernetes和Istio生态,其性能包含负载平衡、熔断、限流等多种治理能力。应用服务网格内置金丝雀、蓝绿、A/B Test等多种灰度公布流程,提供一站式自动化的公布治理。应用服务网格基于无侵入的监控数据采集,提供实时流量拓扑、调用链等服务性能监控和运行诊断,构建全景的服务运行视图。 点击“理解更多”,对于ASM,你想晓得的都在这里! 点击关注,第一工夫理解华为云陈腐技术~

September 23, 2020 · 1 min · jiezi

关于网络:出网速率问题

问题出网速率变高有哪些起因?服务器CPU性能,内存,SQL日志,都没问题,有其余什么起因会这样? 办法1.Windows 无奈利用 Scripts 设置。Scripts 设置可能具备本身的日志文件。请单击“详细信息”链接。 2.接管到以下重大正告: 42。 3.生成以下重大正告: 40。外部谬误状态为 1205。 4.从近程客户端应用程序收到一个 TLS 1.0 连贯申请,但没有任何受客户端应用程序反对的明码套件是受服务器反对的。SSL 连贯申请失败。 5.没有为网络地址是 0x02004C4F4F50 的网卡从网络向计算机指派地址(由 DHCP 服务器指派)。 呈现了以下谬误: 0x79。计算机将持续尝试从网络地址(DHCP)服务器获取地址。 6.策略禁用了其余反对设施的重定向。 最初查看IIS日志,发现IIS的设置问题 出网速率问题

September 12, 2020 · 1 min · jiezi

关于网络:DoS攻击和预防

DoS全称Denial of Service,也就是拒绝服务。DoS攻打的目标是为了使服务器无奈给用户提供失常的服务。本图针对各种会导致 DoS 的攻打和预防进行演绎总结。

September 2, 2020 · 1 min · jiezi

关于网络:从三体到中美科技战3分钟理解网络D丝为什么要迎娶算力白富美

摘要:在多维的世界里,高维的文化对于低维文化具备碾压的劣势,而网络也正在从二维走向三维!网络硬件的竞争次要是“芯片+算法”。从三体到中美科技战,了解网络与算力深度交融助力高维度竞争1:反抗封闭,须要云天明、面壁人和执剑人早在奥巴马时代,白宫就对《三体》体现出了极大的趣味:“奥巴马读了《三体1》和《三体2》,而后就痴迷于刘慈欣的作品,二心等着《三体3》的出版。《三体3》的中文版出了之后,奥巴马就让白宫里的工作人员给刘慈欣发电子邮件,想尽快看到这部作品。但刘慈欣不晓得邮件来自白宫,认为是垃圾邮件,间接给删除了。又发了两次还是这样。于是,奥巴马通过我国外事部门找到刘慈欣,说想看《三体3》的英文版。刘慈欣说《三体3》的英文版在美国出版社那里,还没有正式出版。白宫马上分割出版社,要了几套还没有正式出版的《三体3》,让奥巴马过了个瘾。奥巴马甚至还在网站上写推文举荐《三体》” 看完《三体》,记忆最粗浅的就两个词,一个是“光明森林法令”,第二个“降维打击”。通信网络市场自身就是一个“光明丛林”,考究人文情怀的欧洲人,Nokia、西门子、马可尼等一个个从辉煌走向败落,不考究的美国人终于撕破脸皮寰球开打,无节操的压抑中国科技回升势头。 我不晓得特朗普有没有认真读过《三体》,然而在中美关系上事实上齐全接收了“光明丛林法令”和“降维打击”的精华,通过根技术的管控,全面锁死中国半导体高端产业,撕破脸皮毫不掩饰目标从经济、科技、金融甚至不惜冷战的扼杀中国的发展势头,同时又通过对寰球ICT基础设施的监控(从棱镜到Clean 5G打算)实现了“智子”一样的能力,在发现颠覆性翻新技术萌芽的时候,通过并购、制裁等形式将其扼杀在摇篮里。 地球人与三体人的博弈就是选举出比“智子”更聪慧的“面壁人”,面壁人所有思维都只存储在本人的脑子里,智子监控不到,但智子能够从面壁人的行为“揣测”出他们的策略,泰勒的量子军队打算,迪亚斯的“地球焦土”打算,希斯的“大脑革新”打算都被识破。罗辑则胜利看破“宇宙光明森林法令”,成为了执剑人,但其作用只是相当于明天中美关系,基于核弹技术均衡下,不会产生冷战的一种策略威慑,并不能冲破被锁死的技术。而云天明从三体带回来的三个童话故事为“曲率驱动,二维武器,升高光速”则提供了正确的技术方向,帮忙地球人实现了技术冲破。特朗普对中国留学生和H-1B技术签证的收紧,或者也是受了“云天明”的影响。 反抗三体封闭,地球有三个要害角色:智子无奈监控的面壁人,指引技术方向的云天明,把握冷战均衡的执剑人。 反抗美国封闭,也须要三个要害角色:美国无奈监控的5G和数据中立,可能指引技术正确方向的技术蠢才,可能放弃冷战均衡的“波塞冬”(美国围绕天上飞来的威逼构建了高空防导,天空星链一体化的防御能力,却被俄罗斯水下核鱼雷翻新武器所颠覆)。 2:为什么要讲数据中立一个不受美国监控的5G网络的价值比拟容易了解,但为什么要“数据中立”?因为5G只是管道,数据才是思维。 以后以云为核心的ICT基础设施,所有数据都会寄存在云上,对5G的监控只是对个体的小偷小摸,对云上数据的篡夺才是大盗的抉择。 而寰球绝大多数没有核主权的国家在美国霸权背后,放在少数几家私有云上的数据和放在美国自家后院一样,能够简略而高效的被其获取。 数据中立就是要将当初的“Full Stack”的私有云进行解耦,将数据保留在用户侧/或者中立的边缘算力平台上,平台只提供计算能力,对数据没有主权,数据的主权还属于用户。 解耦的架构会不会带来效率的升高?并不会!但须要新技术! 互联网的倒退和商业相似,最早的商业行为是很多家小商铺组成,用户要花很多工夫能力买全商品;起初呈现沃尔玛,只须要在一个商场就能够买到绝大多数商品,效率确实进步了,然而也带来一个问题,买到的商品有的性价比高,也有的性价比不高,在这里并不能买到所有性价比最好的商品;而后电商平台呈现,用户能够在网上比价,抉择性价比最好的商品,间接通过物流送到家里。 当初的私有云相似“沃尔玛”,所有服务都是本人提供,客户抉择了一朵云就要承受云外面所有服务,然而这些服务外面有性价比高的,也有性价比低的。 电商模式能颠覆沃尔玛模式的要害是:反对海量用户对接并对货物通明的交易平台,无处不在并使命必达的物流网络。 对应的撑持数据中立,实现私有云程度解耦的要害是: 反对海量用户对接并对数据中立(通明)的算力平台,无处不在并反对确定性的宽带网络。 交易平台提供商铺与用户的间接沟通渠道,并提供可信的交易保障; 算力平台提供云服务商与用户间接交易的渠道,并提供可信的算力保障。 物流配送可能做到使命必达,须要构建起分层分级,贴近用户、专业化的物流网络,顺丰在2018年曾经建设9个枢纽站点,49个航空铁路站点,143个中转场,330个集散点,1.5万个营业网点,为保障生鲜运送建设了51座食品冷库,投资680多辆冷藏车。 联接要保障确定性,也须要构建分层分级,骨干到末梢的超宽网络,运营商骨干、城域、接入三层网络和为保障确定性,构建边缘MEC,5G端到端切片的网络能力。 在高效算力平台和确定性宽带网络撑持下,基于数据中立的“解耦”不会造成效率升高,反而会激活千行百业的服务创新能力,给用户带来更多的抉择和更好的体验。 3:为什么网络也须要与算力深度交融?回到《三体》,“多维世界”是故事的外围主线,神级文化最高能够达到11维世界,三体人还领有三维到二维的可逆变动能力,在环境好转时,能够脱水成二维状态,在环境好的时候,又能够吸水复原到三维状态,通过降维应答环境的变动,云天明传给地球的信息里也提到,地球能够通过将本人降为二维,躲过劫难。 在多维的世界里,高维的文化对于低维文化具备碾压的劣势,而网络也正在从二维走向三维! 网络硬件的竞争次要是“芯片+算法”。 芯片制作技术从7nm之后,工艺方向次要是从二维微缩到三维重叠的演进,因为美国的限度,国内制作能力要自主冲破三维制作工艺,挑战很大,而台积电则在将来几年将这个方向上突飞猛进,5nm、3nm、1nm,继续突进,产业的网络芯片将面临低维对高维的竞争压力。 算法是网络产品的一大特色,被广泛应用于信号处理、性能优化、编解码等多个畛域,在芯片工艺相当的时候,网络产品的竞争力很大水平上构建在算法上。传统算法是基于时域或者频域采集的二维数据序列(d1,d2,d3)进行运算,近两年越来越多的钻研机构提出将采集的多种二维数据结构化,如 或者图形化,如 并将其作为神经网络计算的输出,找到传统二维算法无奈辨认的要害特色,并对将来的变动进行揣测,实现更精确的决策。传统算法对数据的解决和判断能够类比为一般相机照片,而基于神经网络的数据处理能够类比为CT断层扫描图像。 网络数据量绝对图像识别要小一些,单任务GB存储空间即可满足,然而网络对实时性要求高,须要亚秒工夫内动静调整,因而对于算力有肯定要求,比方TOPS级别。这些规格只是举例,具体要联合业务理论需要进行设计。 网络硬件的两个外围芯片和算法,芯片产业曾经从2维走向3维,算法也正在产生相似的趋势,产业一方面要冲破半导体工艺的门槛,同时也要加大算法畛域的翻新,被动构建网络+计算的超交融架构,牵引网络算法从2维到3维的能力晋升,实现从无线、光、数通端到端网络性能变动的可预测性,从而真正做到“确定性”的能力。 从二维到三维算法,传统单板DSP和CPU曾经无奈满足要求,须要引入FPGA或NPU高算力部件(白富美),实现智能超宽。 点击关注,第一工夫理解华为云陈腐技术~

August 24, 2020 · 1 min · jiezi

关于网络:墙裂推荐这款网络排查工具堪称神器

MTR是一款十分好用的网络分析工具。置信好多人都用过,因为集体工作中须要常常用到剖析网络情况,加之它非常简单实用,明天民工哥给大家介绍并举荐一下。 1、mtr简介Mtr是 Linux中有一个十分棒的网络连通性判断工具,它联合了ping, traceroute,nslookup 的相干个性。当网络链路呈现问题时很多人会用ping命令,能够简略的测试网络的连通性,看下丢包率,然而却无奈确定是在哪里呈现了问题;有些人就会用tracert命令来查看路由,或者用nslookup命令来查看DNS是否可用;如果你也感觉这三个命令太麻烦的话,那就用mtr吧。 linux下mtr仅是一个简略的命令,应用的时候带上各种参数用起来得心应手。windos下用的话就下载mtr软件就能够了,用起来更简略,间接输出指标ip地址即可。 2、mtr的装置1.Windows零碎 间接在https://cdn.ipip.net/17mon/be...。也能够在https://github.com/oott123/Wi... GitHub上下载MTR专用工具,该工具为免装置,下载后能够间接应用。 2.Linux装置 Debian/Ubuntu 零碎sudo apt install mtrRedHat/CentOS 零碎yum install mtr -y3.Apple客户端 能够在App store搜寻Best NetTools下载安装 4.Android客户端 能够在Google Play上下载TracePing,然而因为国内Google Play无法访问,笔者自行下载下来,能够间接拜访 https://dwz.cn/KCdNPH4c 下载TracePing。 上面是mtr软件包装置后产生的相应目录: [root@localhost~]# rpm -ql mtr/usr/sbin/mtr/usr/share/doc/mtr-0.75/usr/share/doc/mtr-0.75/AUTHORS/usr/share/doc/mtr-0.75/COPYING/usr/share/doc/mtr-0.75/FORMATS/usr/share/doc/mtr-0.75/NEWS/usr/share/doc/mtr-0.75/README/usr/share/doc/mtr-0.75/SECURITY/usr/share/man/man8/mtr.8.gz3、mtr的应用首先来看一下mtr的帮忙信息: [root@localhost~]# mtr -h usage: mtr [-hvrwctglspniu46] [--help] [--version] [--report] [--report-wide] [--report-cycles=COUNT] [--curses] [--gtk] [--raw] [--split] [--no-dns] [--address interface] [--psize=bytes/-s bytes] [--interval=SECONDS] HOSTNAME [PACKETSIZE]介绍一下mtr罕用的几个参数: -v:查看以后版本号;-r:以报告模式显示,不加-r会动静的显示;-c:设置每秒发送数据包的数量,默认值是10;-s:指定ping数据包的大小;-n:相当于--no-dns 不解析dns;利用举例: [root@localhost~]# mtr -vmtr 0.75#查看版本对北京的dns服务器202.106.0.20发送15个包,不做dns解析,并以报告的模式显示,测试数据如下: [root@localhost~]# mtr -r -n -c 15 202.106.0.20HOST: localhost.localdomain Loss% Snt Last Avg Best Wrst StDev1. 1.94.32.1 0.0% 15 3.0 3.1 2.7 3.5 0.22. 1.94.32.1 0.0% 15 3.1 4.3 2.8 19.1 4.13. 218.241.253.61 0.0% 15 4.0 3.9 3.5 4.3 0.34. 218.241.166.10 0.0% 15 5.0 5.3 4.2 12.1 1.95. 202.106.0.20 0.0% 15 3.6 3.3 2.9 3.7 0.34、mtr测试返回后果的查看第一列:host显示的是IP地址和本机域名,这点和tracert很像; 第二列:loss%就是对应IP行的丢包率了,须要留神的是有些丢包是因为icmp的爱护机制造成的,并不 代表真的丢包; 第三列:snt每秒发送数据包的数量,默认值是10,窝这里通过参数 -c来指定发送15个包; 第四列:Last显示的最近一次的返回时延; 第五列:Avg是平均值 这个应该是发送ping包的均匀时延; 第六列:Best是最好或者说时延最短的; 第七列:Wrst是最差或者说时延最常的; 第八列:StDev是标准偏差,统计学名词,一种量度数据分布的扩散水平规范,用以掂量数据值偏离算术平均值的水平。标准偏差越小,这些值偏离平均值就越少。 总结:工欲善其事,必先利其器,一个好的工具会让工作和生存变的更加不便。

August 6, 2020 · 1 min · jiezi

关于网络:转干货连交换机的攻击防御都不懂还做什么网络工程师

为什么须要关注交换机平安??? 纵轴:网络设备(防火墙、路由器、交换机) 横轴:网络模型(边界和DMZ、外围和散布层、接入层) 这个图次要是说,防火墙、路由器、交换机个别别离放在边界或者DMZ、外围和散布层、接入层; 这些设施外面,为什么交换机最不足安全性呢? 首先,防火墙或者路由器个别都是放在外围机房,外围机房物理平安失去最大的保障(非管理人员个别无奈进出外围机房) 其次,接入交换机个别零散散布,提供终端用户的接入(非管理人员都能比拟轻易接触到接入层交换机) 交换机层面可能波及的攻打模式以及进攻措施: 针对这么多的攻打模式,咱们大抵能够分为四类: MAC Layer Attacks VLAN Attacks Spoofing Attacks Switch Device Attacks 一、VLAN跳跃攻打利用Trunk或Double Tag(native)实现从对其余VLAN的信息嗅探或攻打 应答措施: 1.将闲暇端口置为access模式(trunk off),甚至shutdown; 2.批改Native VLAN,防止与在用VLAN雷同。 二、STP坑骗攻打通过伪造谬误的BPDU音讯影响生成树拓扑 应答措施: 1.在接主机或路由器的接口(access)配置bpdu guard,这类接口不应收到BPDU,如果收到则将接口置为error disable状态。 接口下spanning-tree bpduguard enable 2.或在上述接口配置Root Guard,这类接口能够收到BPDU,但若是更优的BPDU,则接口置为error disable 状态,防止根桥扭转。 接口下spanning-tree guard root 三、MAC坑骗攻打盗用别人MAC地址伪造攻打,或非法接入网络窃取信息 应答措施: 1.端口平安,设置某物理端口能够容许的非法MAC地址,将非法MAC地址发送的流量抛弃,甚至将接口err-disable 2.动态增加CAM表项(MAC和端口、VLAN的绑定关系) 四、CAM/MAC泛洪攻打通过一直伪造MAC地址并发送报文,促使交换机CAM表短时间内被垃圾MAC地址充斥,实在MAC被挤出,已知单播变未知单播,被迫泛洪,导致数据被嗅探。 应答措施: 端口平安,限度端口可容许学习的最大MAC地址个数 五、DHCP服务器坑骗攻打通过非法DHCP服务器领先为客户调配地址,通过下发伪造的gateway地址,将客户流量疏导到“中间人”从而实现信息嗅探。 应答措施: 在三层交换机上配置DHCP Snooping,监听DHCP音讯,拦挡非法DHCP服务器的地址调配报文。 六、DHCP饥饿(地址池耗尽) 一直变换MAC地址,伪造DHCP申请音讯,短时间内将DHCP服务器地址池中的地址耗费殆尽,导致非法用户无奈获取IP地址。 应答措施: 1.同样应用端口平安技术,限度端口可容许学习的最大MAC地址个数,阻止攻击者通过变换MAC地址的形式伪造DHCP申请报文。 2.针对不变换MAC,仅变换CHADDR的状况下,在启用了DHCP Snooping技术的交换机配置DHCP限速,设定满足惯例地址获取需要频率的阀值,超出的状况下阻塞、隔离试图异样获取地址的端口。 七、ARP坑骗公布虚伪的ARP reply音讯,将客户音讯疏导至“中间人”,从而实现数据嗅探。 ...

August 5, 2020 · 1 min · jiezi

关于网络:网络-3分钟带你认识网络体系结构

1 起源1.1 OSI 和 TCP/IP为了使不同体系结构的计算机网络可能互连,国际标准化组织ISO提出了驰名的“开放系统互连根本参考模型” OSI/RM (Open System Intercommunication Reference Model)简称为 OSI。 “凋谢”指的是只有遵循OSI规范,一个零碎就能够和世界上任何中央的也遵循这个规范的零碎通信。“零碎”指的是事实的零碎中与互连无关的各局部。 因为OSI的档次划分不太正当,有些性能在多个档次中反复呈现。等各种起因,当初失去最广泛应用的不是法律上的国际标准OSI,而是非国际标准TCP/IP。 1.2 五层协定的体系结构OSI的七层协定体系结构概念分明,实践残缺,可是它太过简单,实用性也不高。TCP/IP的四层体系结构简洁很多。而五层体系结构是综合了OSI和TCP/IP的长处,这样既简洁又能将概念论述分明。 2 五层体系结构的介绍2.1 每一层的作用应用层:定义了利用过程间的通信和交互的规定运输层:向两个主机中过程之间的通信提供通用的数据传输服务网络层:为分组替换网上的不同主机提供通信服务。数据链路层:将网络层交下来的IP数据报组成帧(Frame),在两个相邻结点间的链路上传送。物理层:确保原始的数据可在各种物理媒体上传输咱们来通过一个比喻来认知下这几个层的作用。假如咱们有一天须要与世界上其余中央的人替换货物。那咱们会通过哪些步骤呢。 应用层:如果咱们须要买一个电子产品,咱们可能会抉择京东,如果是书本,咱们会抉择当当。 这个就像是咱们如果要发送电子邮件咱们抉择SMTP协定,发送文件抉择FTP一样。运输层:下单后,上面就波及到如何把寄送货物的问题。咱们须要抉择快递公司,如果是重要的文件的话,咱们会抉择EMS,如果是对速度有要求的话,咱们会抉择顺丰。 这个就像如果咱们须要牢靠的数据传输,咱们能够抉择TCP,如果咱们须要实时性高的话抉择UDP。网络层:快递公司收到快递订单,依据订单上的地址信息(相当于IP地址),抉择最优的运输门路 这个就像网络层基于IP地址为数据的传输进行网络间的路由抉择数据链路层:快递小哥上门取件(或者之后的派件),都是依据收发人的手机号和名字(相当于mac地址)来取送件。 这个就像是物理地址寻址,为网络层提供数据传送服务物理层:司机应用不同的交通工具进行运输。 这个就像是物理层为数据传输提供物理媒体,进行数据的理论传输2.2 每一层的数据传输应用层:含有data,这个data之后会被拆分成一个个小的segments,每个segment都带着个一个header运输层:每个segment的header蕴含source和destination的端口信息网络层:segment加上source和destination的IP地址,生成一个packet。数据链路层:每个packet加上source和destination的MAC地址,生成Frame物理层:把frame转换成二进制代码进行传输具体如下图: 2.3 网络包的旅途 参考:《网络是怎么连贯的》

August 4, 2020 · 1 min · jiezi

关于网络:网络-认识-socket

1 什么是socketSocket是对TCP/IP协定的封装,Socket自身并不是协定,而是一个调用接口(API),通过Socket,咱们能力应用TCP/IP协定. 2 socket是如何通信的首先,有一个服务端和一个客户端。连贯过程分为三个步骤:服务器监听,客户端申请,连贯确认。 1。服务器监听:服务端先设置好本人的IP地址和端口号,进入阻塞状态。服务器端socket并不定位具体的客户端socket,而是处于期待连贯的状态,实时监控网络状态,期待客户端的连贯申请。 2。客户端申请:客户端的socket指出服务端的IP地址和端口号,向服务端socket收回连贯申请,把服务端从阻塞状态唤醒。 3。连贯确认:当服务器端socket监听到或者说接管到客户端socket的连贯申请时,就响应客户端socket的申请,建设一个新的线程,把服务器端socket的形容发给客户端,一旦客户端确认了此形容,单方就正式建设连贯。 具体步骤如下: 下图形容了客户端和服务端交互过程。 3 socket特点3.1 socket是长连贯HTTP也是用socket传输数据的。可是基于HTTP的连贯是短连贯,socket则不是,默认状况下,单方会始终保持联系。 短连贯:就是客户端申请一次后就被动会服务器断开连接。 连贯->传输数据->敞开连贯 长连贯:连贯->传输数据->放弃连贯 -> 传输数据-> 。。。 ->敞开连贯。 HTTP也能够建设长连贯的,应用Connection:keep-alive,HTTP 1.1默认进行长久连贯。对于实时性要求高的场景,抉择长连贯。因为每次建设TCP连贯都要三次握手,这个须要工夫,如果每次都建设连贯会升高速度。 像web网站一样的http服务个别都用短连贯,这种服务的特点是,用户并发量大,可是每个用户无需频繁操作,应用短连贯就能满足要求,应用长连贯反而会耗费资源。 3.2 socket能够传输任何内容socket传输的是字节流,而任何文件都能够作为字节流进行传送,不论是文本文件还是二进制文件,所以说socket能够传输任何内容。 当咱们做推送的时候,须要终端和服务器建设一条长连贯,以便服务器能够随时推送音讯,这时候联合3.1和3.2的特点,抉择socket是比拟适合的。 3.3 不仅能够和别的计算机通信,还能够作为不同过程通信的形式socket不光能够链接两台不同的计算机,同一台计算机上的两个过程也能够通过socket找到对方而后进行通信。在个别的操作系统中,同一个计算机中的两个过程是互相隔离的,如果两个过程须要进行通信,则能够抉择一个作为socket的服务端,一个作为socket的客户端。

August 4, 2020 · 1 min · jiezi

关于网络:计算机网络协议是什么

计算机网路协定概览: TCP/IP四层模型HTTP三次握手和四次挥手TCP和UDP ;UDP丢包起因HTTP0.9 / HTTP1.0 / HTTP1.1 / HTTP2.0之间的区别HTTPS协定,工作原理以及加密算法。浏览器从申请到响应,两头产生了什么?1、TCP/IP的四层模型 数据从网络中一个终端上的应用程序传送到另外一个终端的应用程序,两头须要经验很多过程,有多方参加对数据进行层层封装、转发。咱们把这个流程在逻辑上进行分成层,每一层依据本层的规章制度(协定)各司其职。 TCP/IP协定可分为应用层、运输层、网际层、网络接口层。 应用层:与网络相干的程序通过网络与其余程序通信应用的数据格式标准。HTTP(80端口),次要用于一般浏览。HTTPS(443端口),HTTP协定的平安版本。FTP(20和21端口),用于文件传输。POP3(110端口),收邮件用。SMTP(25端口),用来发送电子邮件。SSH(22端口),用于加密平安登陆用。DHCP(67端口,动静主机配置协定),动静配置IP地址。DNS,用于实现地址查找,邮件转发等工作(运行在TCP和UDP协定上)。SNMP,用于网络信息的收集和网络管理。ARP,用于动静解析以太网硬件的地址。传输层:解决诸如端到端可靠性(数据是否曾经达到目的地)和保证数据依照正确的程序达到这样的问题。TCP/UDP协定 网际层:解决在一个繁多网络上传输数据包的问题。IP协定 网络接口层:它是数据包从一个设施的网络层传输到另外一个设施的网络层遵循的标准。比方以太网协定、Wi-Fi协定。 2、HTTP三次握手和四次挥手三次握手 第一次握手:客户端发送第一个包,其中SYN标记位为1, ACK=0,发送顺序号seq=x(随机int)。客户端进入SYN发送状态,期待服务器确认。 第二次握手:服务器收到这个包后发送第二个包,其中包SYN、ACK标记位为1,发送顺序号seq=Y(随机int),接管顺序号ack=x+1,此时服务器进入SYN接管状态。 第三次握手:客户端收到服务器传来的包后,向服务器发送第三个包,SYN=0, ACK=1,接管顺序号ack = Y+1,发送顺序号seq=X+1。此包发送结束,客户端和服务器进入ESTABLISHED建设胜利状态,实现三次握手。 为什么要三次握手?为了避免服务器端开启一些无用的连贯减少服务器开销以及避免已生效的连贯申请报文段忽然又传送到了服务端,因此产生谬误。 因为网络传输是有延时的,在传输的过程中,例如客户端发动了SYN=1创立连贯的申请(第一次握手),如果服务器端就间接创立了这个连贯并返回蕴含SYN、ACK和Seq等内容的数据包给客户端,这个数据包因为网络传输的起因失落了。 客户端认为未胜利建设连贯,不会传输报文和敞开连贯申请,服务器端的端口就始终开着,等到客户端因超时从新发出请求时,服务器就会从新开启一个端口连贯,造成服务器端开销的重大节约。 四次挥手 第一次挥手: 被动敞开方(客户端)发送第一个包,其中FIN标记位为1,发送顺序号seq为u。 第二次挥手: 被动敞开方(服务器)收到FIN包后发送第二个包,其中发送顺序号seq为v,接管顺序号ack为u+1。 第三次挥手: 被动敞开方(服务器)再发送第三个包,其中FIN标记位为1,发送顺序号seq为w,接管顺序号ack为u+1。 第四次挥手: 被动敞开方(客户端)发送第四个包,其中发送顺序号为u+1,接管顺序号为w+1。至此,实现四次挥手 为什么要四次挥手:建设连贯时,被动方服务器端完结CLOSED阶段进入“握手”阶段并不需要任何筹备,能够间接返回SYN和ACK报文,开始建设连贯。开释连贯时,被动方服务器,忽然收到被动方客户端开释连贯的申请时并不能立刻开释连贯,因为还有必要的数据须要解决,所以服务器先返回ACK确认收到报文,通过CLOSE-WAIT阶段筹备好开释连贯之后,能力返回FIN开释连贯报文。 为什么要等2MSL: 如果客户端在2MSL内,再次收到了来自服务器端的FIN报文,阐明服务器端因为各种起因没有接管到客户端收回的ACK确认报文。客户端再次向服务器端收回ACK确认报文,计时器重置,从新开始2MSL的计时;若客户端在2MSL内没有再次收到来自服务器端的FIN报文,阐明服务器端失常接管了ACK确认报文,客户端能够进入CLOSED阶段,实现“四次挥手”。 3、TCP和UDPTCP: 传输控制协议(Transmission Control Protocol)UDP: 用户数据报协定(User Datagram Protocol) 次要区别: TCPUDP是否连贯面向连贯无连贯是否牢靠牢靠不牢靠连贯对象个数一对一反对单播、多播、播送传输方式面向字节流面向报文首部开销20-60字节8字节程序复杂度较简单简略系统资源开销大小速度慢快应用场景实用于要求牢靠传输的利用,例如文件传输实用于实时利用(IP电话、视频会议、直播等)UDP丢包次要起因 发送的包过大: 若比64K大会导致UDP协定sendto返回谬误。若比MTU大,UDP包在接收端容易丢包,超过接收者缓存导致丢包。发送包频率太块: 接收端来不及接管导致丢包。发送端网卡解决不过去。在发送频率过快的时候思考sleep一下。接收端解决工夫过长: 接收端两次调用recv办法接收数据之间发送过去的包可能失落。解决:能够批改接收端,将包接管后存入一个缓冲区,而后迅速返回持续recv。4、HTTP0.9 / HTTP1.0 / HTTP1.1 / HTTP2.0之间的区别工夫版本性能和区别1991HTTP/0.9仅反对GET申请,不反对申请头;服务器发送完申请就敞开TCP连贯。1996HTTP/1.0默认短连贯(一次申请建设一次连贯,申请实现就断开连接);反对GET、POST、HEAD申请;减少了状态码(status code)、多字符集反对、多局部发送(multi-part type)、权限(authorization)、缓存(cache)、内容编码(content encoding)等。1999HTTP/1.1默认长连贯(一次TCP连贯能够屡次申请);减少Host头,反对虚拟主机;反对断点续传性能;新增五种申请办法OPTIONS、PUT、PATCH、DELETE、TRACE 、 CONNECT。2015HTTP/2.0多路复用(一次TCP连贯能够同时解决多个申请);解析基于二进制,解析谬误少,更高效(HTTP/1.X解析基于文本);服务器被动推送,容许服务器被动向客户端推送资源;<br/>报头压缩,升高开销。5、HTTPS协定HTTP协定通常承载于TCP协定之上,HTTPS协定是在HTTP和TCP之间增加了一个平安协定层(SSL或TSL)。 作用: ①对数据进行加密,并建设一个信息安全通道,保障传输过程中的数据安全;②对网站服务器进行身份认证,如果信息被篡改,通信单方能够立即发现; ③数据完整性校验 HTTPS和HTTP的区别 ...

August 4, 2020 · 1 min · jiezi

关于网络:计算机网络基础十二网络层外部网关路由协议

文章内容概览 BGP协定BGP(Border Gateway Protocol:边际网关协定)BGP协定是运行在自治零碎(AS)之间的一种协定(在一个网络管理机构下边的网络,都能够看做是一个AS。比方:公司网络、学校网络)为什么在AS之间须要应用BGP协定? 1、互联网的规模很大 使得在AS之间路由的抉择艰难。如果在AS之间应用链路状态协定,每个路由器都要存储很多的链路状态的数据,并且,如果应用迪杰斯特拉算法计算最短门路,也会运行很慢。因而,须要BGP协定解决此问题 2、AS外部应用不同的路由协定 例如在A公司外部可能应用RIP协定,在B公司外部应用的是OSPF协定。这两个AS之间在外部应用的是不同的协定,对于不是应用同一种外部网关协定的AS,他们之间是不能间接进行通信的。因为,对于A公司的RIP协定来说,它的指标是跳数,而对于B公司的OSPF协定来说,它的指标是带宽、时延等等。因而,他们之间须要BGP协定进行协调 3、AS之间须要思考除网络个性以外的一些因素 如:政治因素、平安因素等等。因为AS之间,可能是一个地区到另一个地区,也可能是一个国家到另外一个国家,地区之间可能法律不一样,国家之间可能有一些军事因素 假如有AS1、AS2、AS3、AS4,AS1能够通过AS2将数据传递给AS4,也能够通过AS3将数据传递给AS4,在物理上,他们是相互连接的。然而,因为政治或平安的因素,AS1的网络不合乎AS2的法律要求,因而,AS2有权不容许AS1将信息传递过来,或者AS1不想将敏感信息传递给AS2,因而AS1会抉择将信息通过AS3传递给AS4。这些就是AS之间须要思考的问题 因为这些起因,所以BGP并不能找到一个最好的路由,他只能找到一条达到目的地的比拟好的路由 在配置BGP协定时,须要理解一个重要的概念:BGP发言人(speaker),其实就是一个路由器 假如有下图中这样的一个网络,在该网络中可能有两个边际路由器,它位于AS的边界,能够将这两个边际路由器配置成BGP发言人 为什么要有BGP发言人? BGP并不关怀外部网络拓扑在AS之间通过BGP发言人交流信息BGP Speaker能够人为配置策略(也就是能够人为配置某个AS是否能够通过我的AS)比方中国要和美国进行信息的互通,那么网络通信时,某些敏感的信息不容许进入中国。此时,就能够在中国的AS进行人为的配置,使得某些敏感的信息不能进入中国。下图是一个通过BGP Speaker连贯的网络拓扑

August 4, 2020 · 1 min · jiezi

关于网络:转必看如何向女朋友解释TCP的三次握手和四次挥手

第一次约会 (一次握手) 男:我会去某某餐厅吃饭,和我一起品味一下哪里的美味吧。 (二次握手) 女:好的 (三次握手) 男:那等下一起登程 吃完饭,不要想着一步到位,先收 (一次挥手) 男:不好意思,我要走了(不要解释,除非她问,意犹未尽,不便你的下次相约) (二次挥手) 女:啊(女孩子的意犹未尽) (三次挥手) 女:为什么 (四次挥手) 男:敌人有急事(或者公司有急事,这两个答复给女孩子是不一样体验,她就会想你这个人大略是什么样的,公司有急事的话就认为你比拟看中事业,敌人有急事的话,阐明你人际关系比拟好,不要说家里有急事啊,也不要过多解释,除非她问) TCP三次握手 在一些文化中,两个人见面时经常通过握手来问好。 单方都把握手的行为了解为敌对问候的信号。 网络中的连贯是相似的。 第一次握手申请同步。 第二次握手确认初始同步申请,并同步相同方向上的连贯参数。 第三次握手网段是一次确认,用于告诉指标两端批准建设连贯。 当两台主机采纳 TCP 协定进行通信时,在替换数据前将建设连贯。 通信实现后,将敞开会话并终止连贯。 连贯和会话机制保障了 TCP 的可靠性性能。 请参见图中建设并终止 TCP 连贯的步骤。 主机跟踪会话过程中的每个数据段,并应用 TCP 报头信息替换已接收数据的相干信息。 TCP 是全双工协定,每个连贯都代表两个单向通信数据流或会话。 若要建设连贯,主机应执行三次握手。 TCP 报头中的管制位指出了连贯的进度和状态。 三次握手: 1) 确认目标设施存在于网络上; 2) 确认目标设施有流动的服务,并且正在源客户端要应用的目标端口号上承受申请; 3) 告诉目标设施源客户端想要在该端口号上建设通信会话。 在 TCP 连贯中,主机客户端与服务器建设连贯。 TCP 连贯创立的过程分为三个步骤: 第 1 步: 源客户端申请与服务器进行客户端——服务器通信会话。 第 2 步: 服务器确认客户端-服务器通信会话,并申请服务器——客户端通信会话。 第 3 步: 源客户端确认服务器——客户端通信会话。 ...

August 3, 2020 · 1 min · jiezi

关于网络:转技术TCP-的固定窗口和滑动窗口

固定窗口 ● TCP 还提供了流量管制机制。流量管制能够调整给定会话中源和目标之间的 数据流速,有助于放弃 TCP 传输的可靠性。流量管制的施行办法包含限度 一次能够转发的数据段数量,并要求在发送更多数据段之前确认接管。 ● 要施行流量管制,TCP 要确定的第一件事是目标设施能够承受的数据段数量。 TCP 报头包含一个称为“窗口大小”的 16 位字段。这是 TCP 会话的目标设 备一次能够承受和解决的字节数。 通过源和指标之间的三次握手,会话开始 时即可确定初始窗口大小。 一旦批准,源设施必须依据窗口大小限度发送到 目标设施的数据段数量。只有源设施收到数据段已接管的确认之后,能力继 续发送更多会话数据。 ● 在接管确认的提早过程中,发送方丌会发送任何额定数据段。如果网络拥挤, 或者接管主机资源缓和,延迟时间可能就更长。延迟时间越长,该会话过程 的无效传输速率越低, 当运行多个会话时,减缓每个会话的数据传输有助于 缩小网络和目标设施上的资源抵触。 请参看上图中对窗口大小和确认音讯的繁难展现。在本例中,TCP 会话的初 始窗口大小为 3000 字节。此会话的发送方在传输 3000 字节后期待这些数 据的确认音讯,以便持续传输更多数据段。一旦发送方收到接管方发送确实 认音讯,它就能够传输另外 3000 字节的数据段。 ● TCP 应用窗口大小尝试治理传输速率,将其调整为网络和目标设施能够反对 的最大速度,同时最大限度缩小损失和从新传输。 TCP滑动窗口● 咱们也能够通过动静窗口大小来控制数据流量。当网络资源受到限制时,TCP  能够减小窗口的大小,这样,目标主机就须要更加频繁地确认所接管的数据段。因为源主机须要更加频繁地期待数据确认,这便能够大大降低传输的速率。 ● 接管主机将窗口大小值发送到发送主机,示意其筹备接管的字节数。如果目 的主机因为缓冲内存受限须要升高通信速率,那么它向源主机发送的确认信息 中能够蕴含一个较小的窗口大小值。 ● 如图所示,如果接管主机产生拥挤,它能够向发送主机发送指定了较小窗口大 小的数据段。图中显示,其中一个数据段失落了。接管方将返回数据段的 TCP 报头中的窗口字段值由 3,000 减为 1,500,行将窗口大小改为 1,500。 ● 在没有数据失落或资源限度的状况下传输一段时间后,接管方开始减少窗口字 段,这样能够缩小网络开销,因为必须发送的确认缩小。窗口大小继续减少, 直至呈现数据失落,而后窗口大小随之缩小。 ...

July 31, 2020 · 1 min · jiezi

关于网络:转超详细模拟器EVE的安装与使用附下载链接

如需下载EVE模拟器,对话框回复:“模拟器”,即可下载应用。 1. 在电脑上装置VMware Workstation软件。 2. 把虚拟机拷到电脑的非系统盘下面。 3. 用VMware Workstation把VM EVE-NG CCNP外面的虚拟机关上(只有双击上面文件就能够关上) 4. 抉择开启虚拟机 5. 登录后的用户名是root,明码为eve 6. 登陆后的eve零碎ip地址默认设置了10.1.1.100,所以要把桥接到里面的网卡地址设置和他雷同网段,点击网络图标,而后选择网络和Internet设置。 7. 抉择“以太网”,外面的“更改适配器选项”。 8. 右键VMnet1(VMnet1是装置了Workstion虚构进去的网卡,每台具体看状况),抉择属性批改IP地址。 9. 抉择TCP/ip把IP地址设置成为10.1.1.1,使得虚拟机和里面物理机能互通 10. 物理机和虚拟机进行桥接,抉择虚拟机外面的“设置”,点击“网络适配器”,抉择桥接到VMnet1上。 11. 测试网络的连通性 12. 网络没有问题了,用浏览器关上,输出10.1.1.100,登录用户名admin明码eve 13. 如果你要搭建一个新的拓扑叫test你能够新建一个文件夹而后点击add folder,点击test外面而后点击add new lab 14. 拓扑的名字设置为test,而后save保留。 15. 保留当前会有一个空白的界面,而后右键抉择Node 16. 抉择Cisco IOL 17. 如果要创立应用路由器,能够依照下图抉择,而后再save保留。 18. 如果要创立应用交换机,能够依照下图抉择,而后再save保留。 19. 两台设施要相连点住上面图标拉过来。 20. 抉择两边相连的接口编号,而后save保留。 21. 选中两台设施右键start就能够应用了 22. 双击就能够关上配置。 === 应用CRT连贯装置客户端,抉择默认下一步就能够了 应用SecureCRT进行配置的话,那这个时候咱们首先须要找到装置好的应用程序文件SecureCRT.exe的目录地址 再找到EVE-NG的装置文件夹对win10_64bit_sCRT注册表进行编辑。 把win10_64bit_sCRT右键打开方式用txt形式关上,把门路信息改成CRT的门路,保留。 注册表门路批改好后,这时候咱们只须要单击这个R1,它就会弹出SecureCRT的配置界面,就能够进行配置了文章转自:微思网络本来地址:https://mp.weixin.qq.com/s/TA...

July 30, 2020 · 1 min · jiezi

关于网络:转超详细模拟器EVE的安装与使用附下载链接

如需下载EVE模拟器,对话框回复:“模拟器”,即可下载应用。 1. 在电脑上装置VMware Workstation软件。 2. 把虚拟机拷到电脑的非系统盘下面。 3. 用VMware Workstation把VM EVE-NG CCNP外面的虚拟机关上(只有双击上面文件就能够关上) 4. 抉择开启虚拟机 5. 登录后的用户名是root,明码为eve 6. 登陆后的eve零碎ip地址默认设置了10.1.1.100,所以要把桥接到里面的网卡地址设置和他雷同网段,点击网络图标,而后选择网络和Internet设置。 7. 抉择“以太网”,外面的“更改适配器选项”。 8. 右键VMnet1(VMnet1是装置了Workstion虚构进去的网卡,每台具体看状况),抉择属性批改IP地址。 9. 抉择TCP/ip把IP地址设置成为10.1.1.1,使得虚拟机和里面物理机能互通 10. 物理机和虚拟机进行桥接,抉择虚拟机外面的“设置”,点击“网络适配器”,抉择桥接到VMnet1上。 11. 测试网络的连通性 12. 网络没有问题了,用浏览器关上,输出10.1.1.100,登录用户名admin明码eve 13. 如果你要搭建一个新的拓扑叫test你能够新建一个文件夹而后点击add folder,点击test外面而后点击add new lab 14. 拓扑的名字设置为test,而后save保留。 15. 保留当前会有一个空白的界面,而后右键抉择Node 16. 抉择Cisco IOL 17. 如果要创立应用路由器,能够依照下图抉择,而后再save保留。 18. 如果要创立应用交换机,能够依照下图抉择,而后再save保留。 19. 两台设施要相连点住上面图标拉过来。 20. 抉择两边相连的接口编号,而后save保留。 21. 选中两台设施右键start就能够应用了 22. 双击就能够关上配置。 === 应用CRT连贯装置客户端,抉择默认下一步就能够了 应用SecureCRT进行配置的话,那这个时候咱们首先须要找到装置好的应用程序文件SecureCRT.exe的目录地址 再找到EVE-NG的装置文件夹对win10_64bit_sCRT注册表进行编辑。 把win10_64bit_sCRT右键打开方式用txt形式关上,把门路信息改成CRT的门路,保留。 注册表门路批改好后,这时候咱们只须要单击这个R1,它就会弹出SecureCRT的配置界面,就能够进行配置了文章转自:微思网络本来地址:https://mp.weixin.qq.com/s/TA...

July 30, 2020 · 1 min · jiezi

关于网络:转基础交换机堆叠模式

重叠是指将一台以上的交换机组合起来独特工作,以便在无限的空间内提供尽可能多的端口。多台交换机通过重叠造成一个重叠单元。可重叠的交换机性能指标中有一个"最大可重叠数"的参数,它是指一个重叠单元中所能重叠的最大交换机数,代表一个重叠单元中所能提供的最大端口密度。重叠与级联这两个概念既有区别又有分割。重叠能够看作是级联的一种非凡模式。 它们的不同之处在于:级联的交换机之间能够相距很远(在媒体许可范畴内),而一个重叠单元内的多台交换机之间的间隔十分近,个别不超过几米;级联个别采纳一般端口,而重叠个别采纳专用的重叠模块和重叠电缆。 重叠模式 1、菊花链重叠模式 菊花链重叠模式是利用专用的重叠电缆,将多台交换机以环路形式串接起来,组建成一个交换机重叠组。菊花链重叠模式中的冗余电缆只是冗余备份作用,也能够不连贯。采纳菊花链重叠模式,从主交换机到最初一台从交换机之间,数据包要历经两头所有交换机,传输效率较低,因而重叠层数不宜太多。菊花链重叠模式尽管保障了每个交换机端口的带宽,然而并没有使多交换机之间数据的转发效率失去晋升,而且重叠电缆往往间隔较短,因而采纳菊花链重叠模式时,次要实用于有大量计算机的机房。 2、星形重叠模式 星形重叠要求主交换机有足够的背板带宽,并且有多个重叠模块,而后应用高速重叠电缆将交换机的外部总线连贯成为一条高速链路。星形重叠的长处是传输速度要远远超过交换机的级联模式,而且能够显著地进步重叠交换机之间数据的转发速率。一个重叠的若干台交换机能够视为一台交换机进行治理,只需赋予1个IP地址,即可通过该IP地址对所有的交换机进行治理,从而大大减少了治理的难度。 原理 1、重叠的建设 两台交换机启动时,通过相互竞争,其中一台成为重叠主机,另一台成为重叠备机。竞争的规定如下: 第一,零碎的运行状态:已启动并失常运行的交换机优先级高于正在启动的交换机,前者成为CSS主机。 第二,重叠的优先级:如果运行状态雷同,则优先级高的交换机成为CSS主机。 第三,MAC地址大小:如果运行状态和重叠优先级均雷同,则MAC地址小的交换机成为CSS主机。 当2台交换机选出主、备机后,CSS主机的主用主控板就成为重叠零碎的主板,CSS备机的主用主控板则成为重叠零碎的备板。在零碎主板和备板之间进行HA备份解决,CSS主机和备机的备用主控板将成为重叠的候选零碎备板。 2、重叠的配置和转发 重叠建设后,能够通过接口板上的业务端口、零碎主板上的串口或网管口登陆CSS零碎,进行业务配置和系 交换机重叠 统治理。CSS提供四维的接口视图(框/槽/卡/端口),反对对两台设施中的所有端口进行业务相干配置、操作。以框/槽为单位对两台设施中的所有单板进行治理,如查问单板信息、对单板进行复位等操作。在CSS环境下,业务流量转发同单框环境下的区别:跨设施的转发须要通过交换网两次。对于报文内容的解决没有区别,都须要进行一次上、上行解决。对外出现为一台设施。 3、重叠的决裂解决 重叠建设后,重叠主机和备机定时发送心跳报文以维持重叠状态。当2台设施心跳超时后,为了防止CSS线缆、CSS卡和主控板等硬件故障导致2台交换机间没有可用的CSS链路,以至失去通信,CSS零碎将再决裂成2台独立交换机。重叠决裂后,下述状况将引发整个网络呈现故障:2台设施均运行失常,且以完全相同的全局配置运行,即以同样的IP和MAC地址与网络中的其余设施通信。因而,CSS决裂后需检测零碎是否有2个以雷同配置运行的设施(是否存在双主机),并进行相应解决,使整个网络得以失常运行,晋升重叠零碎的可用性。 本文转载自:微思网络原文地址:https://mp.weixin.qq.com/s/IH...

July 28, 2020 · 1 min · jiezi

关于网络:云小课|带你揭开IP地址的神秘身份

摘要:本文带你理解网络云产品和相干的常识内容。华为云网络服务大家族提供了丰盛的云产品,能够满足用户的各种网络互联需要。相应地,华为云帮忙核心也贴心的奉上了你想理解的所有网络云产品常识。 可是小课最近收到很多同学反馈,网络服务帮忙文档尽管全面,然而对于一些文档中提到的网络根底概念却似懂非懂,影响对产品的了解及应用。 为此,小课收集了一箩筐的网络常识,供大家学习参考~ IP地址当咱们搭建一套网络环境的时候,咱们首先要依据业务需要进行一下布局,要思考把环境搭建在哪个网段,搭建的网络环境怎么连贯到Internet。 搭建网络环境离不开IP地址,每台连贯到网络的计算机都有一个IP地址,使它与其余的计算机区别开来。IP地址就相似于咱们的地址,如果要写信给一个人,就要晓得他的地址。计算机发送信息就好比邮递员,它须要晓得惟一的“地址”才不至于把信送错给其他人。 首先咱们可通过第三方网站查问一下本机IP,例如:https://www.ipip.net/ip.html,如下图。 再用ipconfig查问一下本机IP,如下图。 小朋友~你是否有很多问号??? 不是说每个计算机都只有一个IP地址吗,这怎么还不一样捏?IP地址,没想到你还有两幅脸孔呢! 别急,小课带你揭开IP地址的神秘身份..... IP地址划分其实也不能怪IP地址有两副脸孔,如此神秘,事件是这样的.... 通过IP地址与世界任何终端无拘无束的通信,这是如许美妙的欲望,不过IP地址设计之初,只布局了32位,那全世界亿万万的用户须要上网,IP地址岂不是很快就会被瓜分完了。 于是互联网管理机构颁布了一项新的规定,大家能够自在的应用在以下三个网段的IP地址: A类:10.0.0.0 到 10.255.255.255B类:172.16.0.0 到172.31.255.255C类:192.168.0.0 到192.168.255.255然而这三个网段的IP地址不能连贯到Internet。 这......不能连贯Internet,那不就是不能上网,配置这些IP地址有什么用呢? 互联网管理机构会心一笑,给一个终端调配一个IP地址多不划算呐!把IP地址分为公网IP地址和私网IP地址,用户们各自有本人的私网IP,多个用户共享一个公网IP去连通Internet不就能够了吗? 以上的三个网段就是互联网管理机构预留的私网IP网段。要想实现与Internet的自在连通,那还得靠公网IP。 所以这就是为什么IP地址有两副脸孔,身份神秘的起因了。咱们用ipconfig查问到的其实只是咱们的私网IP,而通过上网查问到的是咱们的公网IP。 公网IP与私网IP私网IP:属于非注册地址,专门为组织机构外部应用。私网IP不能拜访Internet,个别只用作局域网。 一些小型企业或者学校,通常都是申请一个固定的IP地址,而后通过IP共享,使整个公司或学校的计算机都可能拜访互联网。而这些企业或学校的计算机应用的IP地址就是私网IP。在布局IPv4协定时,思考到IP地址资源可能有余,而且为了应酬某些企业外部的网络设定,于是就有了私网IP。 互联网管理机构定义了5种IP地址类型以适宜不同容量的网络。公有IP别离在A、B、C三个类中保留了一段作为公有IP网段。 公网IP:即除了保留的私网IP地址以外的IP地址。广域网的计算机和Internet上的其余计算机可通过公网IP随便相互拜访。 咱们通常所说的IP地址,其实就指的是公网IP。互联网上的每台计算机都有一个独立的IP地址,该IP地址惟一确定互联网上的一台计算机。这里的IP地址就是指的公网IP地址。 互联网上的计算机是通过“公网IP+私网IP”来惟一确定的,能够这样了解,公网IP是你家的地址,私网IP就相当于你在你家的地位。显然“进门右转第一个房间”,这句话也就只有在你家能够用。而“我家在A市B区C街1号”这样的地址,他人都能找到你家。然而“你”在你家的哪里,单凭公网IP地址,外人是不可能晓得的。 课堂练习俗话说“实际出真知”~ 华为虚构公有云为您提供以下网段:10.0.0.0/8~24、172.16.0.0/12~24和192.168.0.0/16~24,能够助您疾速搭建网络环境,业务上云。 有没有一点点动心~ 戳这里申请华为虚构公有云。 常识扩大 不懂如何布局网络配置,戳这里。理解更多虚构公有云信息,戳这里。搭建好公有网络环境怎么少得了公网IP呢? 华为云网络服务家族中的弹性公网IP,弹性灵便,即开即用,领有多种计费模式,价格也是很优惠哦~ 申请华为云弹性公网IP,戳这里。 常识扩大 理解更多华为云弹性公网IP信息,请戳这里。想要更多优惠,理解一下共享带宽、共享流量包、带宽加油包。点击关注,第一工夫理解华为云陈腐技术~

July 27, 2020 · 1 min · jiezi

关于网络:7个获取访问者真实IP的方法速学

通常状况下,网站拜访并不是简略地从用户的浏览器中转服务器,两头可能部署有CDN、WAF、高防。例如,采纳这样的架构:“用户 > CDN/WAF/高防 > 源站服务器” 。那么,在通过多层代理之后,服务器如何获取发动申请的实在客户端IP呢? 一个通明的代理服务器在把用户的HTTP申请转到下一环节的服务器时,会在HTTP的头部中退出一条“X-Forwarded-For”记录,用来记录用户的实在IP,其模式为“X-Forwarded-For:访问者的实在IP,代理服务器1-IP, 代理服务器2-IP,代理服务器3-IP,……”。 因而,访问者的实在IP能够通过获取“X-Forwarded-For”对应的第一个IP来失去。 如果您曾经应用Web利用防火墙服务,可间接通过WAF服务获取访问者的实在IP,也能够通过配置网站服务器来获取访问者的实在IP。以下别离介绍通过WAF间接获取实在IP的办法,以及针对Tomcat、Apache、Nginx和IIS服务器,相应的X-Forwarded-For配置计划及获取实在IP的办法。 通过WAF间接获取实在IPWAF默认提供获取客户端实在IP的性能,上面举荐两种形式获取客户的起源IP,依据您的须要,两种形式可二选一: WAF服务应用X-Forwarded-For的形式获取客户端的实在IP地址。实在的客户端IP会被WAF服务放在HTTP头部的X-Forwarded-For字段,格局如下: X-Forwarded-For: 用户实在IP, 代理服务器1-IP, 代理服务器2-IP,... 当应用此形式获取客户端实在IP时,获取的第一个地址就是客户端实在IP。 各种语言通过调用SDK接口获取X-Forwarded-For字段的形式: ASP:Request.ServerVariables("HTTP_X_FORWARDED_FOR") ASP.NET(C#):Request.ServerVariables["HTTP_X_FORWARDED_FOR"] PHP:$_SERVER["HTTP_X_FORWARDED_FOR"] JSP:request.getHeader("HTTP_X_FORWARDED_FOR") WAF服务还反对应用X-Real-IP变量,获取客户的起源IP(应用过程中思考了前面通过的多层反向代理对该变量的批改)。各种语言通过调用SDK接口获取X-Real-IP字段的形式: ASP:Request.ServerVariables("HTTP_X_REAL_IP") ASP.NET(C#):Request.ServerVariables["HTTP_X_REAL_IP"] PHP:$_SERVER["HTTP_X_REAL_IP"] JSP:request.getHeader("HTTP_X_REAL_IP") Tomcat如何在拜访日志中获取实在客户端的IP地址(集体举荐)如果您的源站部署了Tomcat服务器,可通过启用Tomcat的X-Forwarded-For性能,获取访问者的实在IP地址。 关上server.xml文件(“tomcat/conf/server.xml”),AccessLogValve日志记录性能局部内容如下:<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> 在pattern中减少“%{X-Forwarded-IP}i”,批改后的server.xml为:<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%{X-Forwarded-For}i %h %l %u %t "%r" %s %b" /> </Host> 查看localhost_access_log日志文件,可获取X-Forwarded-For对应的访问者实在IP。Apache如何在拜访日志中获取实在客户端的IP地址如果您的源站部署了Apache服务器,可通过运行命令装置Apache的第三方模块mod_rpaf,并批改http.conf文件获取客户IP地址。 执行以下命令装置Apache的一个第三方模块mod_rpaf。wget http://stderr.net/apache/rpaf..._rpaf-0.6.tar.gz tar xvfz mod_rpaf-0.6.tar.gz cd mod_rpaf-0.6 /usr/local/apache/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c ...

July 25, 2020 · 1 min · jiezi

关于网络:小白学YOLOYOLOv3网络结构细致解析

摘要:本文将具体介绍Yolov3的网络结构相干内容。Yolov3 网络结构在博客“Yolo倒退历史及网络结构”中咱们曾经具体的解释了Yolov1的网络结构,并简要的提到了Yolov2与Yolov3对于网络结构的改良,本篇博客将具体介绍Yolov3的网络结构,内容比较简单。 Yolov3网络结构图 从图中能够看出,Yolov3次要有以下几局部组成: 输出根底网络:根底网络是能够依据具体的需要抉择,作者原文用的是本人设计的:Darknet-53YOLOv3网络的三个分支:Y1,Y2,Y3网络部件介绍DBL: 如图1左下角所示,也就是代码中的Darknetconv2d_BN_Leaky,是yolo_v3的根本组件。就是卷积+BN+Leaky relu。对于v3来说,BN和leaky relu曾经是和卷积层不可拆散的局部了(最初一层卷积除外),独特形成了最小组件。 resn:n代表数字,有res1,res2, … ,res8等等,示意这个res_block里含有多少个res_unit。这是yolo_v3的大组件,yolo_v3开始借鉴了ResNet的残差构造,应用这种构造能够让网络结构更深(从v2的darknet-19回升到v3的darknet-53,前者没有残差构造)。对于res_block的解释,能够在图1的右下角直观看到,其根本组件也是DBL。 concat:张量拼接。将darknet中间层和前面的某一层的上采样进行拼接。拼接的操作和残差层add的操作是不一样的,拼接会裁减张量的维度,而add只是间接相加不会导致张量维度的扭转。 YOLOv3网络的三个分支 多尺度检测-Y1实用指标:大指标 门路:绿色线标注 输入维度:13×13×255 输入维度具体解释:13×13:图片大小;255=(80+5)×3;80:辨认物体品种数;5=x,y,w,h和c(置信度);3:每个点预测3个bounding box。 多尺度检测-Y2实用指标:中指标 门路:黄色线标注 输入维度:26×26×255 输入维度具体解释:26×26:图片大小;255=(80+5)×3;80:辨认物体品种数;5=x,y,w,h和c(置信度);3:每个点预测3个bounding box。 多尺度检测-Y3实用指标:小指标 门路:紫色线标注 输入维度:52×52×255 输入维度具体解释:52×52:图片大小;255=(80+5)×3;80:辨认物体品种数;5=x,y,w,h和c(置信度);3:每个点预测3个bounding box。 点击关注,第一工夫理解华为云陈腐技术~

July 21, 2020 · 1 min · jiezi

万万没想到一个技术方案帮实习生追到了运营妹子

上回说到,公司的新业务增长速度放缓,运营部门提出要发展短视频来促进更快的业务增长,而我也因为提前准备好了技术预案再一次得到老板的赞赏(了解详情请看上集:一个技术预案,让老板当场喊出了奥利给)。 既然万事俱备了,公司就着手开始做短视频业务。本着最小化成本验证、快速迭代的原则,公司并没有大规模地去推进,而是先开发一个简单的短视频网站,招聘了一个妹子来做运营,先跑着看看效果再决定要不要加大投入. 说到这个运营妹子,那可真是青(fu)春(bai)朝(mao)气(mei)有(da)活(chang)力(tui),听说她自己在短视频平台的账号就有几十万粉丝,还是什么穿搭博主。我们组那个985名校实习生明显感觉来公司上班的劲头都足多了。 你还别说,新来的运营妹子三天两头跑过来找我们实习生小哥,今天拜托给连个外接显示器,明天请帮忙查个网站新用户数,经常就听见:“小哥哥,你看这个要怎么实现呀~”小哥哥那也是有求必应,毕竟萌妹子嘛,总是不好拒绝,不像我们产品大哥要提个需求,那简直是山崩地裂。 前两天运营妹子突然跑过来问:“小哥哥,我这个网站可以放到一个单独的IP地址上么?”原来她遇到一个问题:新网站受原来网站的影响,不好做优化,负责网站优化的同事告诉她需要换一个单独的新IP地址。这个需求可把小哥哥给难住了,向来有求必应的他不知道怎么办才好,只能说:“每个服务器只有一个IP地址,如果要换IP地址,可能需要部署到新的服务器上,这个需要和老板协商…”运营妹子一听实现不了,明显就有些不开心了地走了,留下小哥哥在原地不知所措。 唉,还是太年轻呀,让老夫来帮你一把吧。我把实习生喊过来说:“想要有单独的IP地址不需要申请新的服务器,在现在的华为云弹性云服务器上挂载一个新的网卡就行了,只需要3步就可以实现。而且双网卡配置还能提升服务器带宽,提升短视频的访问速度。” 真的么?实习生小哥两眼冒光,特别期待地问我:“那怎么实现呀,我快点弄好,给她一个惊喜!说不定今天晚上就能一起去看电影了呢。” 具体操作嘛,很简单,很快我就给他写了一个操作文档:《3步实现弹性云服务器挂载网卡》 步骤1:创建网卡,发送POST请求,记录subnet 、network、port等ID。1、创建网络 1)发送一条POST请求。 POST:https://{endpoint}/v2.0/networks,其中endpoint是云服务器所在的区域节点。 Body: { "network": { "shared": false, "name": "demo-net", "admin_state_up": true, "tenant_id": "74610f3a5ad941998e91f076297ecf27" }} 2)记录返回响应中“network”的ID。 { "network": { "id": "c4a3019d-1ac0-4cfb-a838-2342eb992e6b", "name": "demo-net", "status": "ACTIVE", "shared": false, "subnets": [], "availability_zone_hints": [], "availability_zones": [ "az_test_01", "az_test_02" ], "admin_state_up": true, "tenant_id": "74610f3a5ad941998e91f076297ecf27", "provider:network_type": "vxlan", "router:external": false }} 2、创建子网 1)发送请求。 POST:https://{endpoint}/v2.0/subnets Body: { "subnet": { "name": "testsubnet", "enable_dhcp": true, "network_id": "c4a3019d-1ac0-4cfb-a838-2342eb992e6b", "tenant_id": "74610f3a5ad941998e91f076297ecf27", "dns_nameservers": [ "8.8.8.8", "8.8.8.7" ], "allocation_pools": [ { "start": "10.0.10.2", "end": "10.0.10.254" } ], "host_routes": [], "ip_version": 4, "gateway_ip": "10.0.10.1", "cidr": "10.0.10.0/24" }} 2)记录响应中“subnet”的ID。 ...

June 30, 2020 · 2 min · jiezi

三层转发基本原理

三层转发基本原理

June 26, 2020 · 1 min · jiezi

单臂路由是如何将两个不同Vlan下的主机联通的

单臂路由是如何将两个不同Vlan下的主机联通的?

June 26, 2020 · 1 min · jiezi

TCP层的分段和IP层的分片之间的关系-MTU和MSS之间的关系

TCP层的分段和IP层的分片之间的关系 & MTU和MSS之间的关系

June 26, 2020 · 1 min · jiezi

三层交换机与路由器傻傻分不清楚今天学习一下

三层交换机与路由器傻傻分不清楚,今天学习一下

June 24, 2020 · 1 min · jiezi

linux-设置网络ip

环境:VMware 、CentOS release 6.5 网络设置为NATetc/sysconfig/network-scripts/ifcfg-eth0 配置文件如下`DEVICE="eth0" BOOTPROTO="static" HWADDR="00:0C:29:BD:D5:33" IPV6INIT="yes" NM_CONTROLLED="yes" ONBOOT="yes" TYPE="Ethernet" UUID="6994fe7a-1963-4c51-885e-7e20b52437ff" BOOTPROTO=static IPV6INIT=no USERCTL=no IPADDR=192.168.200.130 NETMASK=255.255.255.0 GATEWAY=192.168.200.255 DNS1=8.8.8.8 DNS2=8.8.4.4` 1.如果ip不一致,可能的原因是BOOTPROTO="dhcp" 2.如果重启网卡有问题,可能是HWADDR没有配置对,要和ifconfig显示的信息一致 3.还有就是,ifcfg-eth0可能配置的是eth1,重点是看这个属性是什么DEVICE="eth0"。不要被迷惑的

October 16, 2019 · 1 min · jiezi

关于ipv4映射地址和ipv4兼容地址的区别

简介最近在看TCP/IP详解,在IPv6这一块对映射地址和兼容地址概念有点模糊,查找资料后进行一些总结。 正文ipv4映射地址:即ipv4映射的ipv6地址。如ipv6地址::ffff:10.0.0.1可以表示ipv4地址 10.0.0.1。此类型的地址用于将IPV4节点表示为IPV6节点。允许IPV6应用程序直接与IPV4应用程序通信。 ipv4兼容地址:即ipv4兼容的ipv6地址。如::0102:f001相当于地址::1.2.240.1。兼容地址与映射地址不同,兼容地址只是用类似ipv4地址的方式书写成ipv6格式或由软件处理给人看上去和ipv6兼容的样子。这种是用于ipv4和ipv6之间的过渡计划,现在已经不再需要(过渡已经完成)。这种主要在路由器上使用,ipv4的地址必须是全球唯一的ipv4单播地址,用于代表ipv4节点的ipv6地址。 引用https://www.cnblogs.com/lsgxe...https://www.zhihu.com/questio...

August 21, 2019 · 1 min · jiezi

win7网络的本地连接不见了

1 本地连接不知所踪 2 查看设备管理中的网络适配器 如果没有相关驱动,重新下载或更新网卡驱动。用驱动人生或其他驱动管理软件检测下,更新即可。

July 16, 2019 · 1 min · jiezi

网络之HTTPHTTPS

前言大学老师曾经说过,计算机界有三本天书,分别是:数据结构、计算机组成原理、计算机网络。所以网络也是我们从事计算机开发必须了解且掌握的一门技术 网络七层模型应用层 访问网络服务的端口,如HTTP传输 ‘hello,world’表示层 提供数据格式转换会话层 建立端连接并提供访问验证 如SSL/TLS认证传输层 UDP/TCP + ‘hello,world’网络层 IP + UDP/TCP + ‘hello,world’数据链路层 MAC地址 + IP + UDP/TCP + ‘hello,world’ + 帧尾物理层 传输二进制 01010101001HTTP请求/相应报文 **请求报文包括:** 请求方法 URL 协议版本HTTP1.0 首部字段名 请求体 (POST请求) **响应报文包括:** 版本 状态码 短语 首部字段名 响应实体请求方法GET: 代表获取资源 特点: 安全:不应该引起Server端的任何状态变化 幂等:请求多次的结果一样 可缓存:代理服务器可以缓存POST: 代表处理资源 特点: 不安全 不幂等 不可缓存HEADOPTIONPUT 状态码200: 请求成功300: 请求重定向400: 由于客户端请求地址和参数引用的失败500: 服务端原因 连接接建立流程TCP: 三次握手、四次挥手HTTP特点无连接: 每次请求都需要建立TCP连接无状态 ...

July 8, 2019 · 1 min · jiezi

就是要你懂负载均衡lvs和转发模式

本文希望阐述清楚LVS的各种转发模式,以及他们的工作流程和优缺点,同时从网络包的流转原理上解释清楚优缺点的来由,并结合阿里云的slb来说明优缺点。如果对网络包是怎么流转的不太清楚,推荐先看这篇基础:程序员的网络知识 -- 一个网络包的旅程,对后面理解LVS的各个转发模式非常有帮助。 几个术语和缩写cip:Client IP,客户端地址vip:Virtual IP,LVS实例IPrip:Real IP,后端RS地址RS: Real Server 后端真正提供服务的机器LB: Load Balance 负载均衡器LVS: Linux Virtual Serversip: source ipdip: destinationLVS的几种转发模式DR模型 -- (Director Routing-直接路由)NAT模型 -- (NetWork Address Translation-网络地址转换)fullNAT -- (full NAT)ENAT --(enhence NAT 或者叫三角模式/DNAT,阿里云提供)IP TUN模型 -- (IP Tunneling - IP隧道)DR模型(Director Routing--直接路由) 如上图所示基本流程(假设 cip 是200.200.200.2, vip是200.200.200.1): 请求流量(sip 200.200.200.2, dip 200.200.200.1) 先到达 LVS然后LVS,根据负载策略挑选众多 RS中的一个,然后将这个网络包的MAC地址修改成这个选中的RS的MAC然后丢给交换机,交换机将这个包丢给选中的RS选中的RS看到MAC地址是自己的、dip也是自己的,愉快地手下并处理、回复回复包(sip 200.200.200.1, dip 200.200.200.2)经过交换机直接回复给client了(不再走LVS)我们看到上面流程,请求包到达LVS后,LVS只对包的目的MAC地址作了修改,回复包直接回给了client。 同时还能看到多个RS和LVS都共用了同一个IP但是用的不同的MAC,在二层路由不需要IP,他们又在同一个vlan,所以这里没问题。 RS上会将vip配置在lo回环网卡上,同时route中添加相应的规则,这样在第四步收到的包能被os正常处理。 优点: DR模式是性能最好的一种模式,入站请求走LVS,回复报文绕过LVS直接发给Client缺点: 要求LVS和rs在同一个vlan;RS需要配置vip同时特殊处理arp;不支持端口映射。为什么要求LVS和RS在同一个vlan(或者说同一个二层网络里)因为DR模式依赖多个RS和LVS共用同一个VIP,然后依据MAC地址来在LVS和多个RS之间路由,所以LVS和RS必须在一个vlan或者说同一个二层网络里 DR 模式为什么性能最好因为回复包不走LVS了,大部分情况下都是请求包小,回复包大,LVS很容易成为流量瓶颈,同时LVS只需要修改进来的包的MAC地址。 DR 模式为什么回包不需要走LVS了因为RS和LVS共享同一个vip,回复的时候RS能正确地填好sip为vip,不再需要LVS来多修改一次(后面讲的NAT、Full NAT都需要) 总结下 DR的结构 ...

July 4, 2019 · 1 min · jiezi

什么是-VxLAN

本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫。VLAN 和 VxLAN 是不是还傻傻分不清楚,这篇文章就来告诉你。 01 什么是 VxLAN?VxLAN 全称是 Visual eXtensible Local Area Network(虚拟扩展本地局域网),从名字上就知道,这是一个 VLAN 的扩展协议。 VxLAN 本质上是一种隧道封装技术。它使用 TCP/IP 协议栈的惯用手法——封装/解封装技术,将 L2 的以太网帧(Ethernet frames)封装成 L4 的 UDP 数据报(datagrams),然后在 L3 的网络中传输,效果就像 L2 的以太网帧在一个广播域中传输一样,实际上是跨越了 L3 网络,但却感知不到 L3 网络的存在。 如下图所示,左右两边是 L2 广播域,中间跨越一个 L3 网络,VTEP 是 VxLAN 隧道端点(VxLAN Tunnel Point),当 L2 以太网帧到达 VTEP 的时候,通过 VxLAN 的封装,跨越 L3 层网络完成通信,由于 VxLAN 的封装"屏蔽"了 L3 网络的存在,所以整个过程就像在同一个 L2 广播域中传输一样。 VxLAN 是应网络虚拟化技术而生的。随着数据中心网络不断扩增,Cisco、VMware 和 Arista Networks 这些巨头发现,传统的 VLAN 隔离已经无法应对网络虚拟化技术所带来的成千上万的设备增长,于是便联合起草了这个协议,一直到 2014 年才定稿,由 RFC 7348 所定义。 ...

July 4, 2019 · 3 min · jiezi

如何保护网络免受DOS和DDOS的侵害呢

相信大家的对网站、服务器、APP等被流量攻击并不陌生吧。每天世界各个角落都上演着N多场的网络攻击,黑客攻击,其中包含了DDoS攻击,CC攻击等。我们通过新闻媒体可以关注到一些大企业受到的攻击,但实质上很多小企业,比如电子商城,支付网站,游戏等行业最容易被DOS关注到。即使没有被攻击的企业面对这些危险也是需要预防它,避免被侵害。 预防它们方法的前提是需要知道它们的含义区别。首先,DoS代表拒绝服务。攻击可阻止用户访问计算机、网络或者服务器。DOS通常会泛滥目标或者以Web服务器触发使其崩溃。与病毒不一样,DOS不需要运行任何特定的程序,主要利用计算机的固有性质。攻击者在获得DOS执行访问服务和信息的能力后,崩溃的服务器通常会被重启。但攻击流量的来源比较广泛,可能是众多源或者网页。因此导致了系统难以恢复。 然后DDoS代表着分布式拒绝服务,是一种针对目标系统的恶意网络攻击行为,主要针对网络层,传输层,会话层和应用层的攻击,这种攻击究竟是如何起作用的呢??通常利用大流量堵塞被攻击者的网络带宽,占用服务器的连接资源池以及占用服务器的应用层处理资源,消耗服务器处理性能后导致被攻击者的业务无法正常访问,也就是所谓的分布式拒绝服务。 那么为什么要进行DDoS攻击呢?与其他黑客攻击一样,有很多原因可以解释这个问题。有可能是是为了证明自己是一名黑客并建立信誉而发起的;或者是通过攻击进行敲诈来赚取大笔资金;又或者是同行的恶性竞争,攻击对方使其用户体验感变差,然后放弃该平台等。 最后是如何保护网络免受DOS和DDOS的侵害呢?墨者安全认为防护DDoS攻击的第一步是建立一套高性能处理器的基础设施,加高带宽;安装实时监控检测设备,当发现有恶意请求流量时,通过技术手段将其过滤清洗,然后将有效的流量转发至正确的源站;定期对系统扫描查杀,更新漏洞补丁;优先选择BGP线路。这样可以有效的缓解DDOS的迫害。

July 3, 2019 · 1 min · jiezi

http10-http11-http20特性及区别

http1.0特性无状态:服务器不跟踪不记录请求过的状态无连接:浏览器每次请求都需要建立tcp连接无状态对于无状态的特性可以借助cookie/session机制来做身份认证和状态记录 无连接无连接导致的性能缺陷有两种: 1. 无法复用连接 每次发送请求,都需要进行一次tcp连接(即3次握手4次挥手),使得网络的利用率非常低 2. 队头阻塞 http1.0规定在前一个请求响应到达之后下一个请求才能发送,如果前一个阻塞,后面的请求也给阻塞的 http1.1特性为了解决http1.0的性能缺陷,http1.1出现了 http1.1特性: 长连接:新增Connection字段,可以设置keep-alive值保持连接不断开管道化:基于上面长连接的基础,管道化可以不等第一个请求响应继续发送后面的请求,但响应的顺序还是按照请求的顺序返回缓存处理:新增字段cache-control断点传输长连接http1.1默认保持长连接,数据传输完成保持tcp连接不断开,继续用这个通道传输数据 管道化基于长连接的基础,我们先看没有管道化请求响应: tcp没有断开,用的同一个通道 请求1 > 响应1 --> 请求2 > 响应2 --> 请求3 > 响应3管道化的请求响应: 请求1 --> 请求2 --> 请求3 > 响应1 --> 响应2 --> 响应3即使服务器先准备好响应2,也是按照请求顺序先返回响应1 虽然管道化,可以一次发送多个请求,但是响应仍是顺序返回,仍然无法解决队头阻塞的问题 缓存处理当浏览器请求资源时,先看是否有缓存的资源,如果有缓存,直接取,不会再发请求,如果没有缓存,则发送请求 通过设置字段cache-control来控制 断点传输在上传/下载资源时,如果资源过大,将其分割为多个部分,分别上传/下载,如果遇到网络故障,可以从已经上传/下载好的地方继续请求,不用从头开始,提高效率 在 Header 里两个参数实现的,客户端发请求时对应的是 Range 服务器端响应时对应的是 Content-Range http2.0特性二进制分帧多路复用: 在共享TCP链接的基础上同时发送请求和响应头部压缩服务器推送:服务器可以额外的向客户端推送资源,而无需客户端明确的请求二进制分帧将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码 多路复用基于二进制分帧,在同一域名下所有访问都是从同一个tcp连接中走,http消息被分解为独立的帧,乱序发送,服务端根据标识符和首部将消息重新组装起来 区别http1.0 到http1.1的主要区别,就是从无连接到长连接http2.0对比1.X版本主要区别就是多路复用

June 19, 2019 · 1 min · jiezi

一文读懂-IPv4-到-IPv6-的过渡技术

在介绍 IPv4 到 IPv6 过渡技术之前,我们先来简单了解一下 IPv4 和 IPv6。什么是 IPv4?IPv4 全称为 Internet Protocol version 4,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,IP 地址是一个 32 位的二进制数,算下来其实也只有 2^32 个地址,这些地址中有分为 A、B、C、D、E 5 类,而比较常用的只有 B 类 和 C 类,这两类地址算起来数量就更加有限,在加上现在互联网迅猛的发展,在 2011 年 2 月 3 日 IANA 中 IPv4 地址池已全部耗尽,这就严重制约了互联网的发展。而对于 IPv6 来说,是用于替代 IPv4 的下一代 IP 协议,IPv6 地址长度是 128 位,长度是 IPv4 地址的 4 倍,IPv6 具体有多少地址呢?IPv6 128 位的地址长度可以提供 3.402823669 × 10³ 个地址,小编的数学不好,算不出来到底有多少,就借用一句话来形容,IPv6 可以为全世界每一粒沙子分配一个地址。这要是分配的是 GirlFriend 那该多好啊,这样工程师就能构建更厉害的技术,小编也能拥有一个 GF 了。 IPv4 VS IPv6除了充沛的 IP 地址数量,IPv6 相比 IPv4 还有其他诸多的优势。 ...

June 14, 2019 · 2 min · jiezi

Linux用户态与内核态通信的几种方式

本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫。Linux 用户态和内核态由于 CPU 权限的限制,通信并不像想象中的使用进程间通信方式那么简单,今天这篇文章就来看看 Linux 用户态和内核态究竟有哪些通信方式。 我们平常在写代码时,一般是在用户空间,通过系统调用函数来访问内核空间,这是最常用的一种用户态和内核态通信的方式。(关于 Linux 用户态和内核态可以参考 xx) 除此之外,还有以下四种方式: procfs(/proc)sysctl(/proc/sys)sysfs(/sys)netlink 套接口procfs(/proc)procfs 是 进程文件系统 的缩写,它本质上是一个伪文件系统,为什么说是 伪 文件系统呢?因为它不占用外部存储空间,只是占用少量的内存,通常是挂载在 /proc 目录下。 我们在该目录下看到的一个文件,实际上是一个内核变量。内核就是通过这个目录,以文件的形式展现自己的内部信息,相当于 /proc 目录为用户态和内核态之间的交互搭建了一个桥梁,用户态读写 /proc 下的文件,就是读写内核相关的配置参数。 比如常见的 /proc/cpuinfo、/proc/meminfo 和 /proc/net 就分别提供了 CPU、内存、网络的相关参数。除此之外,还有很多的参数,如下所示: root@ubuntu:~# ls /proc/1 1143 1345 1447 2 2292 29 331 393 44 63 70 76 acpi diskstats irq locks sched_debug sysvipc zoneinfo10 1145 1357 148 20 23 290 332 396 442 64 7019 77 asound dma kallsyms mdstat schedstat thread-self1042 1149 1361 149 2084 2425 291 34 398 45 65 7029 8 buddyinfo driver kcore meminfo scsi timer_list1044 1150 1363 15 2087 25 3 3455 413 46 66 7079 83 bus execdomains keys misc self timer_stats1046 1151 1371 16 2090 256 30 35 418 47 6600 7080 884 cgroups fb key-users modules slabinfo tty1048 1153 1372 17 21 26 302 36 419 5 67 71 9 cmdline filesystems kmsg mounts softirqs uptime11 1190 1390 18 22 27 31 37 420 518 6749 72 96 consoles fs kpagecgroup mtrr stat version1126 12 143 182 2214 28 32 373 421 524 68 73 97 cpuinfo interrupts kpagecount net swaps version_signature1137 1252 1434 184 2215 280 327 38 422 525 69 74 98 crypto iomem kpageflags pagetypeinfo sys vmallocinfo1141 13 144 190 2262 281 33 39 425 5940 7 75 985 devices ioports loadavg partitions sysrq-trigger vmstat可以看到,这里面有很多的数字表示的文件,这些其实是当前系统运行的进程文件,数字表示进程号(PID),每个文件包含该进程所有的配置信息,包括进程状态、文件描述符、内存映射等等,我们可以看下: ...

June 3, 2019 · 2 min · jiezi

怎样在-Linux-中配置静态网络连接

翻译:疯狂的技术宅原文:https://opensource.com/articl... 本文首发微信公众号:前端先锋欢迎关注,每天都给你推送新鲜的前端技术文章 为 Linux 系统配置网络连接可能是具有挑战性的。幸运的是,许多新的 Linux 发行版都带有网络管理工具,可以帮你自动连接到无线网络。但是能够为 Linux 机器建立静态网络连接不是更好吗?本指南将向你展示如何使用不同的 Linux 工具检查来自 CentOS/RHEL 机器的网络连接,并讲解如何使用 nmcli 工具添加静态网络配置。 步骤1:检查网络连接ping 命令是一个众所周知的程序,可以快速检查网络的连通性。在命令行中输入以下内容: ping -c3 opensource.com其中 -c3 选项表示你只 ping 三次。 如果你连接到了互联网,将会收到类似的数据包响应。 步骤2:检查连接信息你可以用 ip add 命令检查网络信息。 运行此命令可显示设备信息和 IP 地址等。稍后你将需要此类信息(如设备信息和IP地址)来设置静态连接,因此请记住它。 步骤3:检查网络信息通过输入以下命令,可以在 /etc/sysconfig/network-scripts 目录中找到网络信息: ls /etc/sysconfig/network-scripts 例如这个截图显示了 ifcfg-enp0s3 和 ifcfg-lo,但这些取决于你运行的 Linux 以及设备的设置方式。 步骤4:显示可用的连接可以用 nmcli 工具显示当前网络的可用连接。输入以下命令: nmcli con show 此截图显示有两个设备处于活动状态:enp0s8 和 enp0s3,它们被称为Wired Connection 1 和 2。但这可能会和你的显示有所不同,具体取决于 Linux 环境的设置方式。 步骤5:检查网络连接是否已打开用上面的 ping 可以命令检查你是否可以接收数据包,但现在我们要通过 systemctl 命令调用 network 来监视、更新网络状态和排除故障。命令是: ...

May 28, 2019 · 1 min · jiezi

云计算时代数据中心架构三层到大二层的演变

本文授权转载自公众号蛋蛋团。01 数据中心是什么数据中心,指用于安置计算机系统及相关部件的设施,例如电信和储存系统。 为了满足自身的业务需求,保证数据的稳定和可靠。无论是互联网还是传统行业,都会有自己或大或小的数据中心,甚至如阿里云和亚马逊这种专门以出租计算资源的云计算公司,更是在全世界各地建立了不等的数据中心。 尽管到到如今的云计算时代,将数据中心自身的资源虚拟化以达到更高的利用率,有一点肯定,物理资源决定了虚拟资源的天花板。 物理网络的特性,例如带宽,MTU,延时等,最终直接或者间接决定了虚拟虚拟网络的特性。对网络性能进行优化时,有些物理网络特性可以通过升级设备或线路来提升,但是有些与网络架构有关。升级或者改动网络架构带来的风险和成本是巨大的,因此在架设数据中心初始,网络架构的选择和设计尤其需要谨慎。 那么,从过去的传统数据中心,到如今的云计算时代数据中心,中间经历了怎样的变迁呢? 02 传统数据中心网络架构在传统的大型数据中心,网络通常是三层结构。Cisco称之为:分级的互连网络模型(hierarchical inter-networking model)。 三层网络结构是采用层次化架构的三层网络,有三个层次:核心层(网络的高速交换主干)、汇聚层(提供基于策略的连接)、接入层(将工作站接入网络),这个模型如下: 接入层(Access Layer) :接入交换机通常位于机架顶部,所以它们也被称为ToR(Top of Rack)交换机,它们物理连接服务器。汇聚层(Aggregation Layer) :汇聚交换机连接Access交换机,同时提供其他的服务,例如防火墙,SSL offload,入侵检测,网络分析等。核心层(Core Layer) :核心交换机为进出数据中心的包提供高速的转发,为多个汇聚层提供连接性,核心交换机为通常为整个网络提供一个弹性的L3路由网络。 一个三层网络架构示意图如下所示: 通常情况下,汇聚交换机是L2和L3网络的分界点,汇聚交换机以下的是L2网络,以上是L3网络。每组汇聚交换机管理一个POD(Point Of Delivery),每个POD内都是独立的VLAN网络。 服务器在POD内迁移不必修改IP地址和默认网关,因为一个POD对应一个L2广播域。 汇聚交换机和接入交换机之间通常使用STP(Spanning Tree Protocol,生成树协议)。STP使得对于一个VLAN网络只有一个汇聚层交换机可用,其他的汇聚层交换机在出现故障时才被使用(上图中的虚线)。 也就是说汇聚层是一个active-passive的HA模式。这样在汇聚层,做不到水平扩展,因为就算加入多个汇聚层交换机,仍然只有一个在工作。 一些私有的协议,例如Cisco的vPC(Virtual Port Channel)可以提升汇聚层交换机的利用率,但是一方面,这是私有协议,另一方面,vPC也不能真正做到完全的水平扩展。 下图是一个汇聚层作为L2/L3分界线,且采用vPC的网络架构。 传统的数据中心网络技术,STP 是二层网络中非常重要的一种协议。在二层有一个相当矛盾的点,那就是可靠性和安全性的矛盾。 可靠性是指构建二层网络时,一般会采用会采用设备冗余和链路冗余的方式。 安全性是指二层交换机同处于一个广播域,广播报文在环路中会反复持续传送,可能会形成广播风暴,所以必须防止形成环路。 要想两种同时达到,可以采用STP(生成树协议)自动控制,即冗余设备和冗余链路成备份,在正常情况下被阻塞掉,当出现链路故障时冗余的设备端口和链路才会被打开。 由于 STP 的收敛性能等原因, 一般情况下 STP 的网络规模不会超过 100台交换机。STP的这种机制导致了二层链路利用率不足,尤其是在网络设备具有全连接拓扑关系时,这种缺陷尤为突出。 如上图所示,当采用全网STP二层设计时,STP将阻塞大多数链路,使接入到汇聚间带宽降至1/4,汇聚至核心间带宽降至1/8。这种缺陷造成越接近树根的交换机,端口拥塞越严重,造成的带宽资源浪费就越可观。 03 云计算的发展对数据中心的影响随着互联网的发展带来的数据大爆发以及虚拟化技术的发展,计算资源被池化,对数据中心也提出了新的挑战:动态迁移和高性能。 采用大二层网络架构,可以实现整个数据网络都是L2广播域,这样即可实现动态迁移。大二层网络架构,L2/L3分界在核心交换机,核心交换机以下,也就是整个数据中心,是L2网络(当然,可以包含多个VLAN,VLAN之间通过核心交换机做路由进行连通)。大二层的网络架构如下图所示: 相对于之前的基础架构而言,具有如下特点: ①资源池化——硬件服务器通过虚拟化技术进行部分硬件资源的整合,构造计算资源池化②统一管理——在虚拟化平台上建立虚拟机,在虚拟机里部署业务,实现平台上虚拟机的统一维护和管理③横向扩展——计算资源不够,可以直接补充硬件服务器达到资源扩展然而,传统大二层的缺点也和明显,共享的L2广播域带来的BUM(二层数据链路层的报文)风暴随着网络规模的增加而明显增加,最终将影响正常的网络流量。 同时,虚拟机可以迁移,但是如何达到迁移过程中用户无感知,IP地址等不改变呢?即实现动态迁移。 云计算技术的发展的不仅仅依托于虚拟化,还有一个非常重要虚拟化管理软件平台,典型的如openstack。 通过x86服务器和二层交换机的连接,将网络功能、计算功能、存储功能和安全功能全部虚拟化,以虚拟机的形式实现我们传统数据中心硬件堆积所完成的一切功能,全部组件融合在一套虚拟化管理软件平台中,对外提供虚拟存储、网络、计算等资源,这就是所谓的”超融合”平台。 04 数据中心流量丰富化带来的挑战互联网这几年发展的特别快,然而,互联网公司本质上来讲也是数据公司,数据承载着公司绝大部分的价值,于是数据安全性以及可靠性也变的越发重要。 在早期,小规模数据中心主要是南北流量,而互联网爆发式的数据增长带来的数据中心虚拟化也要求更高的东西流量,甚至跨数据中心流量。 南北向流量:数据中心之外的客户端到数据中心服务器之间的流量,或者数据中心服务器访问互联网的流量。 ...

May 27, 2019 · 1 min · jiezi

京东网络开放之路自研交换机探索与实践

相比传统商业交换机,白盒交换机具有更好的开放性和灵活性,解决了运维管理方面的诸多痛点,随着SONiC的不断完善和白盒交换机市场的成熟,京东基于SONiC研发了自己的白盒交换机,更加适合京东数据中心的应用场景,为整体基础设施提供更好的服务和支持。白盒交换机的出现自从软件定义网络(SDN)出现以后,市场对白盒交换机的需求越来越大,特别是超大规模云服务提供商的出现,其自建云数据中心将需要大量的白盒交换机。白盒交换是SDN的副产品,它是将物理网络交换机硬件和网络操作系统(NOS)进行解耦的结果。 白盒交换机主要可分为支持OpenFlow协议的OpenFlow白盒交换机和裸白盒交换机。其中,OpenFlow白盒交换硬件开放程度并不高,其网络操作系统往往也被厂商绑定,相对比较封闭,该类交换机通过支持主流的OpenFlow协议如OpenFlow1.3版本,连接控制器实现SDN网络的转发与控制分离。OpenFlow交换机只负责根据OpenFlow流表进行匹配转发,本身没有控制功能,所以也可以被称为白盒。 目前,白盒交换机产业打造出了一个相对完整的生态圈。通过通用的硬件设备,消除对特定厂商的依赖,降低成本。通过开放的软件,增强网络的灵活性与敏捷性。 自研交换机探索与实践——JDNOSSONiC(Software for Open Networking in the Cloud),是由微软主导的一款开源交换机操作系统。该系统由多个容器化组件组成,这样一种创新方案使得增加新的组件和功能变得非常方便。 SONiC引入了Redis数据库,存储配置数据及运行状态,提高了数据的可视化,大大降低了定位解决问题的难度。进程故障的时候,交换芯片继续保持转发,进程恢复后从数据库重新获取状态继续运行,不但可以保障系统的稳定运行,还可以实现单进程升级功能。 SONiC定义了SAI(Switch Abstraction Interface),这是一套独立于硬件平台的交换机芯片控制抽象接口。SAI的存在使得SONiC可以支持多个厂商的芯片,只需关注上层网络应用,不需要考虑各芯片SDK的差异性。 京东云基于SONiC架构,开发了适用于京东数据中心场景的交换机操作系统JDNOS。 配置平台优化在网络中运行的交换机,通常是设备商提供的,专有且闭源。由于不同商业交换机的命令行和配置方式都不相同,监控接口标准不统一等因素,给网络运维带来了很大的复杂性,而且不便于管理。 针对以上问题,JDNOS自研统一配置平台定义了统一的配置模型,实现了配置管理的统一化和标准化,大大提升了运维效率。 ARP协议针对TOR的应用场景,尤其是去堆叠方案,JDNOS改进了原SONiC的ARP实现,增加了ARP探测,可以做到秒级的ARP探活。SONiC中上层软件ARP表项是从kernel中获取,JDNOS的方案中,上层ARP表项状态是单独维护的,并反过来控制kernel中的ARP状态。对链路异常,MAC老化等事件,可以做到ARP快速探测,转发快速收敛。 上线策略JDNOS的上线采用了异构去堆叠方案(具体方案可参考《异构去堆叠 | 一种完美提升网络高可用SLA的方案》) 交换机完全独立,支持异构,完全解耦降低上线风险,增强可靠性推动自研交换机快速上线硬件组件接口标准化JDNOS需要适配多家ODM/OEM硬件厂商的白盒交换机。针对每家厂商硬件各组件驱动实现方式的差异性,JDNOS定义了统一的sysfs接口,监控并控制各硬件组件。针对数据中心对光模块的高规格监控需求,JDNOS定义了详细的光模块信息接口,如电源、电压、温度、功率以及各项阈值等,以及风扇、电源、各传感器温度等相关接口,实时监控其状态,出现异常的情况下能及时告警,并上报监控系统。 自主研发监控内容JDNOS支持Telemetry,由于Telemetry可以实现主动推送任何需要监控的系统运行状态到监控服务器,因此代替了原有的SNMP、日志等的方式,实现监控的统一化,同时也带来了更高的效率。JDNOS将更多的监控内容写入数据库,供telemetry实时采集并推送,给监控提供更精细的诊断探测。 结语未来我们即将上线自动化部署服务,更好提升效率;支持warm reboot,软件升级不中断业务;继续丰富完善监控内容,支持网络可视化;对LEAF交换机的研发部署;对特定场景的功能支持,例如RDMA,EVPN,SR等;对于京东,自研交换机属于起步阶段,我们也在不断尝试和探索,积累储备,为技术的标准化和降低运维成本做出自己的贡献,努力做出更好的产品, 通过技术驱动和创新,为业务带来更大的价值。

May 22, 2019 · 1 min · jiezi

Linux网络命令必知必会之瑞士军刀-ncnetcat

本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫。nc,全名叫 netcat,它可以用来完成很多的网络功能,譬如端口扫描、建立TCP/UDP连接,数据传输、网络调试等等,因此,它也常被称为网络工具的 瑞士军刀 。 使用方式我们可以这样来使用它: nc [-46DdhklnrStUuvzC] [-i interval] [-p source_port] [-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_protocol] [-x proxy_address[:port]] [hostname] [port[s]]常用选项: -4:只使用 IPv4 地址-6:只使用 IPv6 地址-l:启动本地监听-n:不使用 DNS 解析-p:指定源端口-s:指定源 IP 地址-u:使用 UDP,默认是 TCP-v:显示详细信息-w:设定超时时间(只适合用在 Client 端)-d:禁止从标准输入读取数据,也就是客户端输入数据不会发送到服务端-k:让服务端保持连接,不断开Linux 系统默认没有安装 nc,可以用下面的方法安装: # centosyum install nc# ubuntuapt-get install netcat建立 C/S 聊天室nc 的本质是在两台机器之间建立连接,之后就可以基于这个连接做很多事情,数据传输是其中一个最为基本的。我们下面就使用 nc 来建立一个 C/S 的聊天室。 模拟 Server 端: # -v :输出详细信息# -l :指定监听地址和端口nc -v -l 127.0.0.1 6000模拟 Client 端: ...

May 21, 2019 · 2 min · jiezi

威尼斯人新葡京维护审核风控不能提现出来该怎么办

被黑咨询企鹅【78541466】网赌赢钱不给提款怎么办?网赌被黑如何解决?简单介绍因为你的盈利超出平台底线,或者是平台觉得你已经没有继续压榨的价值了,那么他们就会盯上你号里的最后的那些分,找各种借口不给你出,这个时候正常的方法已经是不管用了,坦然的我随便的简述一些技巧,①藏分②欺骗③威胁至于怎么去使用,可以到我的企鹅 78-54-14-66 日志上看笔记或是一对一的了解详情。 人的一生中无论在生活中还是在工作中都会遇到这样那样的困难,我觉得从以下几点着手去面对困难。 1、要保持良好的心态:要知道人的一生中遇到困难是必然的,当你遇到困难时,良好的心态是解决问题的根本,要相信没有跨不过去的坎。 2、仔细分析问题的实质:要清楚困难产生的原因,看到问题的实质而不仅仅是表面现象。 3、冷静面对积极应对:不要慌张,不要愁怅,根据分析的原因,找到应对的办法。 4、求助别人:将遇到的问题好好的和身边的人说说,总会有遇到过相同问题的人帮你找到解决的办法。 5、吸取教训:把遇到的困难当成是人生的经历,并从中举一反三,总结原因,避免再一次遇到相同的困难。 以上只是个人意见,仅供参考!最好的办法就戒掉,不再踏上这条路,也就不会有机可乘。

May 15, 2019 · 1 min · jiezi

公司入网框架

本篇介绍下工程相关入口网络部署(整体工程建设篇见:)。稳定性建设离不开网络,性能建设相关:通用负载均衡,对流量的动静分离静态缓存,网络本身性能优化比如长连接等也都需要对网络有整体了解。 到业务机器前 1.到机房外网ip1(smartdns外网LVS的VIP)httpdns获取配置(配置一个获取配置的地址到smartdns) 域名 广州移动 机房ip1域名 广州联通 机房ip1域名 广州电信 机房ip1一个IP怎么直接连接三个运营商。申请INC的IP。路由用BGP协议对应。而不是家里移动分配静态IP后,联通加入还需要先打到移动网络,再访问IP2.外网核心交换机/外网接入交换机外网核心交换机(与所有外网接入层交换机相连)外网接入层交换机,只有48个插口,只与自己下面子网相连。下面挂的不是业务机器,是LVS和BIGNAT(由内向外的,LVS见:https://segmentfault.com/a/11...)。LVS/BIGNAT是个集群,一个IP可以到任何机器上用的OSPF协议。 3.外网LVS/BIGNAT外网LVS和BIGNAT的这个机器有两个网口,一个连外网的接入层交换机,一个连内网接入层交换机外网LVS,配置好每个域名对应的router的IP列表,选一台,=》找到具体IP。先在一台接入层交换机下的服务器内网上找,找不到再到内网核心,在到接入层交换机。 4.内网交换机若内网配置VIP,走内网LVS集群内,选内网管ip重新发到内网交换机(再次寻址,也是到接入层=》核心=》再找不到走BD系统=》专线夸机房)否则直接到业务服务器(自己做7层负载均衡)再到内网交换机。返回的请求会回到这儿转回也通过内网交换机再出去 其中:交换机ARP协议 机器上记了子网的IP和mac对应关系。。交换机上记了MAC和出口,交换机出口有限,分接入层和核心扩大接入ip个数vip就是LVS实现的。LVS是一个集群。httpdns中配置域名对应VIP。打到LVS的一台机器上后,配置VIP到IP的。选一台后。 整体端到业务机器过程1.域名 外部多层DNS=》smartDNS(取配置)或 端上启动时直接HTTPDNS到smartDNS获取到域名对应VIP(外网LVS,有缓存)2.1端上开启长连接后,会公共的拦截短连接,转为长连接的域名和数据格式。到外网LVS后先到长连接的机器。(长连接域名VIP)长连接解密后再转为短连接(这里做个配置,每个域名对应内网VIP写死)发到内网LVS。再根据内网VIP负载均衡正常到业务机器。具体长连接见:https://segmentfault.com/a/11...外网=》外网LVS=>长连接=》内网LVS=>业务服务器.2.2未开启长连接,走正常流程 外网=》外网LVS=》业务服务器。 业务机器后内部网络外部routernginx负载均衡,配置域名对应业务机器ip 内部1.内部服务配置inrouters的VIP。lvs找到inrouter后再请求具体内部服务机器2.直接rpc+服务发现找到具体ip建立连接

May 14, 2019 · 1 min · jiezi

威尼斯人新葡京维护审核不给提现该怎么挽回

被黑咨询扣扣78541466,近年来,因读博而发生的家破人亡的案例不在少数。多少人因为抱着“一夜暴富”的侥幸心理迷恋上读博,最终落得妻离子散、欠了巨债的下场。随着网络时代的到来,网络上涌现了众多读博平台,这些读博平台以“低风险、高回报”的口号吸引了众多网民的追捧。因为其操作方便,只需要一个app,足不出户即可参与读博,很快,一大批人纷纷在读博平台上疯狂下注,开始做起了当富翁的美梦。殊不知,在这些光鲜亮丽的现象背后,藏着不为人知的秘密。我想说的是,当我们遇到嘿钱网站,一般都会遇到这样的过程情况:第一就是进入体验期:就是网友们刚刚进入网站的时候,心态处于体验状态,自然不会充值大额,所以这个阶段提款就是正常的,不会有什么情况。 第二就是网站考量期:这个阶段是网友们已经玩了一段时间了,网站就会通过网友们这些天的投注情况来考量这个客户的质量,假如是大客户的话,那你就算赢10个8个网站还是会给你提款的,因为你后面还可以给网站带来更大的利益。如果我们的账号还没有到网站黑钱的最后一个阶段,只是出款需要审核,总是提不了款,但账号还可以正常登录,额度可以正常转换的时候,通过一些方法技巧其实出款几率还是很大的有一位朋友跟我说,他有时候不敢看像这类的文章,因为这里说的情况太触动他了,我不觉得是这样,我觉得是你没找对能帮到你的人,所以你才会觉得这里懂你,你的那些沉浸在黑夜里的等待,你的那些仰望天空时的一片空白,你的那些期盼得到回应时的心情。解决方法:①.心平气和的和平台客服给他问清楚原因。②.就是在网站客服还回你相信的时候还有机会,套路客服让客服觉得你很有钱,尽量把自己的朋友圈说的有很有钱,网站看的你身上的利益之后就有可能把账号解冻! ③.藏分方法,这方法是可行的,通过实践过的!最后希望各位能够远离读博,珍爱家庭,没有哪个人是可以靠读博发家致富的,真正想发家致富还是要靠我们的劳动,远离读博,珍爱家庭,从我做起在这里我想真诚的对你们说几句,当你们提款平台以系统维护,注单异常,财务系统升级,暂停结算业务,平台风控诸如此类的话唐塞你们的时候你们就是已经被黑了,当你们还在半信半疑的时候去联系客服骚扰客服,客服自然会以各种理由告诉你为什么出不了款。当过了十天半个月后,你自己觉得没有希望的时候胡乱下注把分输完了平台当然会很乐意的,或者你选择与平台耗下去,所以出现这样的情况的时候千万别抱有太多幻想了这只是拖延时间的办法,当时间长了平台会认为你没有利用价值,接下来换回就是额度不能转换。账号冻结。但是当还没有到达这种地步的时候你自己就要给自己争取时间了。所谓是跟时间赛跑用在这上面还是比较恰当的,一旦过了时间那就等同于游戏币。所以这时候就该找专业的出黑人员帮你挽回损失,现在自称出黑的人员太多了无形中就会让你变得徘徊不定犹豫不决就会导致时间浪费错过最佳出款时机。那么问题来了到底该选谁这一点尤为重要,那么既然你看到这里了相信你大概也都明白了!加扣: 78-54-14-66空间日志网站技巧方法。

May 14, 2019 · 1 min · jiezi

你需要知道的网络冷知识

你需要知道的网络冷知识为什么你应该知道网络冷知识?为了吹牛灌水? 当然不系,了解这些冷知识有利于我们对体系知识差缺补漏,建立建全知识体系。 废话不多说,让我们来看下哪些是平常不易被注意到的冷知识。 端口端口分类1~1023的端口都是被系统使用的(由 Internet 号分配机构(Internet Assigned Numbers Authority, IANA)来管理),为了防止冲突我们一般使用大于10000的端口号。看起来似乎有些不对,那之间的端口号干什么用了? 1024~5000的端口号是用于临时分配给服务器与客户端的。 大于5000的端口用于分配给一些知名的服务器。(如:tomcat 8080等) 标准简单服务这些标准服务从Unix时代开始就被规定好了,但是在现实中却并没有发现它们被使用过。可能的原因是过于简单实际中没什么用,那么我为什么要介绍它。因为是个冷知识。。。也不全是,我觉得如果将这些服务作为TCP与UDP的测试服务,就不需要自己费力的编写一个测试服务了,直接掌握他们就好了。 名字TCP端口号UDP端口号描述echo77服务器返回客户发送的所有内容discard99服务器丢弃客户发送消息的所有内容daytime1313服务器以可读形式返回时间和日期chargen1919当客户发送一个数据报时:TCP服务器发送一串连续的字符流,直到客户中断连接;UDP服务器发送一个随机长度的数据报time3737服务器返回一个二进制形式的32bit数,表示从UTC时间1900年1月1日午夜至今的秒数然而使用Linux查询端口占用情况命令netstat -ntulp却发现这些服务都不存在,原因是这些服务都没有被内置到Linux系统中。在CentOS下需要安装xinetd(wiki:一个运行于类Unix操作系统的开放源代码的超级服务器守护进程),然后进行相关的配置后即可使用服务,步骤如下: 安装sudo yum install xinetd修改目录/etc/xinetd.d/中的配置文件(stream代表tcp配置,dgram代表udp配置),将其中的disable的yes修改为no即可。启动服务service xinetd start做完以上的步骤后,使用tcp或udp进行访问云服务器,你可能会发现并不成功。原因是云服务器为了保证安全只开放了一些特定的端口(类似于防火墙的功能),要想这些服务能被访问到,需要将这些端口配置到安全规则中才行。 以下是实验需要用到的TCP与UDP客户端,使用nodejs编写。代码比较简单就不介绍了。 TCP客户端 var net = require('net');var client = new net.Socket();//19代表端口号,xxx请换成自己的服务器端地址client.connect(19, 'xxx.xxx.xxx.xxx', function() { console.log('Connected'); client.write("Hello, server! I'm Client.");});client.on('data', function(data) { console.log('Received: ' + data); client.destroy(); // kill client after server's response});client.on('close', function() { console.log('Connection closed');});UDP客户端 var dgram = require('dgram');var mess = Buffer.from("Hello, server! I'm Client.");var client = dgram.createSocket('udp4');//19代表端口号,xxx请换成自己的服务器端地址client.send(mess,0,mess.length,19,'xxx.xxx.xxx.xxx',function (err, bytes) { if(err) console.log('Send Err!');});client.on('message',function (msg, rinfo) { console.log('Received:%s',msg); console.log('Server address:%s',rinfo.address); console.log('Server port:%s',rinfo.port); client.close();});client.on('close',function () { console.log('onClose');});以下是访问标准服务器的结果,能够被预测到的echo和discard就不写出来了 ...

May 14, 2019 · 1 min · jiezi

搞定计算机网络面试看这篇就够了

点击上方“程序员江湖”,选择“置顶或者星标” 你关注的就是我关心的! 文章目录结构:  一 OSI与TCP/IP各层的结构与功能,都有哪些协议 运输层主要使用以下两种协议:UDP的主要特点:TCP的主要特点:域名系统(Domain Name System缩写DNS,Domain Name被译为域名)HTTP协议五层协议的体系结构1 应用层(application layer)2 运输层(transport layer)3 网络层(network layer)4 数据链路层(data link layer)5 物理层(physical layer)二 TCP三次握手和四次挥手(面试常客) 为什么要三次握手?为什么要传回SYN(发起一个新链接)?传了SYN,为啥还要传ACK(确认序号有效)?为什么要四次挥手?三 TCP、UDP协议的区别四 TCP协议如何保证可靠传输 超时重传停止等待协议滑动窗口流量控制拥塞控制五 在浏览器中输入url地址 ->> 显示主页的过程(面试常客)六 状态码七 各种协议与HTTP协议之间的关系八 HTTP长连接、短连接写在最后 计算机网络常见问题回顾建议一 OSI与TCP/IP各层的结构与功能,都有哪些协议五层协议的体系结构 学习计算机网络时我们一般采用折中的办法,也就是中和OSI和TCP/IP的优点,采用一种只有五层协议的体系结构,这样既简洁又能将概念阐述清楚。 结合互联网的情况,自上而下地,非常简要的介绍一下各层的作用。 1 应用层应用层(application-layer)的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通信和交互的规则。对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如域名系统DNS,支持万维网应用的HTTP协议,支持电子邮件的SMTP协议等等。我们把应用层交互的数据单元称为报文。 域名系统 域名系统(Domain Name System缩写DNS,Domain Name被译为域名)是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。(百度百科)例如:一个公司的Web网站可看作是它在网上的门户,而域名就相当于其门牌地址,通常域名都使用该公司的名称或简称。例如上面提到的微软公司的域名,类似的还有:IBM公司的域名是www.ibm.com、Oracle公司的域名是www.oracle.com、Cisco公司的域名是www.cisco.com等。HTTP协议 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。(百度百科)2 运输层运输层(transport layer)的主要任务就是负责向两台主机进程之间的通信提供通用的数据传输服务。应用进程利用该服务传送应用层报文。“通用的”是指并不针对某一个特定的网络应用,而是多种应用可以使用同一个运输层服务。由于一台主机可同时运行多个线程,因此运输层有复用和分用的功能。所谓复用就是指多个应用层进程可同时使用下面运输层的服务,分用和复用相反,是运输层把收到的信息分别交付上面应用层中的相应进程。 运输层主要使用以下两种协议 传输控制协议TCP(Transmisson Control Protocol)--提供面向连接的,可靠的数据传输服务。用户数据协议UDP(User Datagram Protocol)--提供无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)。UDP的主要特点 UDP是无连接的;UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态(这里面有许多参数);UDP是面向报文的;UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等);UDP支持一对一、一对多、多对一和多对多的交互通信;UDP的首部开销小,只有8个字节,比TCP的20个字节的首部要短。TCP的主要特点 TCP是面向连接的。(就好像打电话一样,通话前需要先拨号建立连接,通话结束后要挂机释放连接);每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的(一对一);TCP提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复、并且按序到达;TCP提供全双工通信。TCP允许通信双方的应用进程在任何时候都能发送数据。TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双方通信的数据;面向字节流。TCP中的“流”(stream)指的是流入进程或从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。3 网络层网络层(network layer)负责为分组交换网上的不同主机提供通信服务。在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。在TCP/IP体系结构中,由于网络层使用IP协议,因此分组也叫IP数据报,简称数据报。 这里要注意:不要把运输层的“用户数据报UDP”和网络层的“IP数据报”弄混。另外,无论是哪一层的数据单元,都可笼统地用“分组”来表示。 网络层的另一个任务就是选择合适的路由,使源主机运输层所传下来的分株,能通过网络层中的路由器找到目的主机。 这里强调指出,网络层中的“网络”二字已经不是我们通常谈到的具体网络,而是指计算机网络体系结构模型中第三层的名称. 互联网是由大量的异构(heterogeneous)网络通过路由器(router)相互连接起来的。互联网使用的网络层协议是无连接的网际协议(Intert Prococol)和许多路由选择协议,因此互联网的网络层也叫做网际层或IP层。 4 数据链路层数据链路层(data link layer)通常简称为链路层。两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。 在两个相邻节点之间传送数据时,数据链路层将网络层交下来的IP数据报组装程帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。 ...

May 4, 2019 · 1 min · jiezi

虚拟机中的网络连接方式

VirtualBox中有4中网络连接方式: NATBridged AdapterInternalHost-only Adapter4种方式的区别: NATNAT:Network Address Translation,网络地址转换 NAT模式是最简单的实现虚拟机上网的方式,你可以这样理解: Guest访问网络的所有数据都是由主机提供的,Guest并不真实存在于网络中,主机与网络中的任何机器都不能查看和访问到Guest的存在。 Guest可以访问主机能访问到的所有网络,但是对于主机以及主机网络上的其他机器,Guest又是不可见的,甚至主机也访问不到Guest。 虚拟机与主机的关系:只能单向访问,虚拟机可以通过网络访问到主机,主机无法通过网络访问到虚拟机。 虚拟机与网络中其他主机的关系:只能单向访问,虚拟机可以访问到网络中其他主机,其他主机不能通过网络访问到虚拟机。 虚拟机与虚拟机的关系:相互不能访问,虚拟机与虚拟机各自完全独立,相互间无法通过网络访问彼此。 Bridged Adapter(网桥模式网桥模式,你可以这样理解: 它是通过主机网卡,架设了一条桥,直接连入到网络中了。因此,它使得虚拟机能被分配到一个网络中独立的IP,所有网络功能完全和在网络中的真实机器一样。 网桥模式下的虚拟机,你把它认为是真实计算机就行了。 虚拟机与主机的关系:可以相互访问,因为虚拟机在真实网络段中有独立IP,主机与虚拟机处于同一网络段中,彼此可以通过各自IP相互访问。 虚拟机于网络中其他主机的关系:可以相互访问,同样因为虚拟机在真实网络段中有独立IP,虚拟机与所有网络其他主机处于同一网络段中,彼此可以通过各自IP相互访问。 虚拟机与虚拟机的关系:可以相互访问,原因同上。 Internal(内网模式)内网模式,顾名思义就是内部网络模式: 虚拟机与外网完全断开,只实现虚拟机于虚拟机之间的内部网络模式。 虚拟机与主机的关系:不能相互访问,彼此不属于同一个网络,无法相互访问。 虚拟机与网络中其他主机的关系:不能相互访问,理由同上。 虚拟机与虚拟机的关系:可以相互访问,前提是在设置网络时,两台虚拟机设置同一网络名称。如上配置图中,名称为intnet。 Host-only Adapter(主机模式)主机模式,这是一种比较复杂的模式,需要有比较扎实的网络基础知识才能玩转。可以说前面几种模式所实现的功能,在这种模式下,通过虚拟机及网卡的设置都可以被实现。 我们可以理解为Guest在主机中模拟出一张专供虚拟机使用的网卡,所有虚拟机都是连接到该网卡上的,我们可以通过设置这张网卡来实现上网及其他很多功能,比如(网卡共享、网卡桥接等)。 虚拟机与主机的关系:默认不能相互访问,双方不属于同一IP段,host-only网卡默认IP段为192.168.56.X 子网掩码为255.255.255.0,后面的虚拟机被分配到的也都是这个网段。通过网卡共享、网卡桥接等,可以实现虚拟机于主机相互访问。 虚拟机与网络主机的关系:默认不能相互访问,原因同上,通过设置,可以实现相互访问。 虚拟机与虚拟机的关系:默认可以相互访问,都是同处于一个网段。 NAT这种方式下,虚拟机的网卡连接到宿主的 VMnet8 上。此时系统的 VMWare NAT Service 服务就充当了路由器的作用,负责将虚拟机发到 VMnet8 的包进行地址转换之后发到实际的网络上,再将实际网络上返回的包进行地址转换后通过 VMnet8 发送给虚拟机。VMWare DHCP Service 负责为虚拟机提供 DHCP 服务。 Bridged这种方式下,虚拟机就像一台真正的计算机一样,直接连接到实际的网络上,与宿主机没有任何联系。 Host-only这种方式下,虚拟机的网卡连接到宿主的 VMnet1 上,但系统并不为虚拟机提供任何路由服务,因此虚拟机只能和宿主机进行通信,而不能连接到实际网络上。

May 3, 2019 · 1 min · jiezi

搞定PHP面试-HTTP协议知识点整理

HTTP协议知识点整理一、HTTP协议的工作特点和工作原理工作特点基于B/S模式通信开销小、简单快速、传输成本低使用灵活、可试用超文本传输协议节省传输时间无状态工作原理客户端发送请求给服务器,创建一个TCP链接,指定端口号,默认80,连接到服务器,服务器监听浏览器请求,一旦监听到客户端请求,分析请求类型后,服务器会向客户端放回状态信息和数据内容。 二、HTTP协议请求方法1. GET:获取资源GET 方法用来请求访问已被 URI 识别的资源。指定的资源经服务器端解析后返回响应内容。 2. POST:传输实体主体POST 方法用来传输实体的主体。 虽然用 GET 方法也可以传输实体的主体,但一般不用 GET 方法进行传输,而是用 POST 方法。虽说 POST 的功能与 GET 很相似,但POST 的主要目的并不是获取响应的主体内容。 3. PUT:传输文件PUT 方法用来传输文件。就像 FTP 协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求 URI 指定的位置。 但是,鉴于 HTTP/1.1 的 PUT 方法自身不带验证机制,任何人都可以上传文件 , 存在安全性问题,因此一般的 Web 网站不使用该方法。若配合 Web 应用程序的验证机制,或架构设计采用 REST(REpresentationalState Transfer,表征状态转移)标准的同类 Web 网站,就可能会开放使用 PUT 方法。 4. HEAD:获得报文首部HEAD 方法和 GET 方法一样,只是不返回报文主体部分。用于确认URI 的有效性及资源更新的日期时间等。 5. DELETE:删除文件DELETE 方法用来删除文件,是与 PUT 相反的方法。DELETE 方法按请求 URI 删除指定的资源。 但是,HTTP/1.1 的 DELETE 方法本身和 PUT 方法一样不带验证机制,所以一般的 Web 网站也不使用 DELETE 方法。当配合 Web 应用程序的验证机制,或遵守 REST 标准时还是有可能会开放使用的。 ...

May 2, 2019 · 2 min · jiezi

端口对应的服务

1 tcpmux TCP 端口服务多路复用 5 rje 远程作业入口 7 echo Echo 服务 9 discard 用于连接测试的空服务 11 systat 用于列举连接了的端口的系统状态 13 daytime 给请求主机发送日期和时间 17 qotd 给连接了的主机发送每日格言 18 msp 消息发送协议 19 chargen 字符生成服务;发送无止境的字符流 20 ftp-data FTP 数据端口 21 ftp 文件传输协议(FTP)端口;有时被文件服务协议(FSP)使用 22 ssh 安全 Shell(SSH)服务 23 telnet Telnet 服务 25 smtp 简单邮件传输协议(SMTP) 37 time 时间协议 39 rlp 资源定位协议 42 nameserver 互联网名称服务 43 nicname WHOIS 目录服务 49 tacacs 用于基于 TCP/IP 验证和访问的终端访问控制器访问控制系统 50 re-mail-ck 远程邮件检查协议 53 domain 域名服务(如 BIND) NOTE:其实就是DNS域名解析服务 63 whois++ WHOIS++,被扩展了的 WHOIS 服务 67 bootps 引导协议(BOOTP)服务;还被动态主机配置协议(DHCP)服务使用 68 bootpc Bootstrap(BOOTP)客户;还被动态主机配置协议(DHCP)客户使用 69 tftp 小文件传输协议(TFTP) 70 gopher Gopher 互联网文档搜寻和检索 71 netrjs-1 远程作业服务 72 netrjs-2 远程作业服务 73 netrjs-3 远程作业服务 73 netrjs-4 远程作业服务 79 finger 用于用户联系信息的 Finger 服务 80 http 用于万维网(WWW)服务的超文本传输协议(HTTP) 88 kerberos Kerberos 网络验证系统 95 supdup Telnet 协议扩展 101 hostname SRI-NIC 机器上的主机名服务 102 iso-tsap ISO 开发环境(ISODE)网络应用 105 csnet-ns 邮箱名称服务器;也被 CSO 名称服务器使用 107 rtelnet 远程 Telnet 109 pop2 邮局协议版本2 110 pop3 邮局协议版本3 111 sunrpc 用于远程命令执行的远程过程调用(RPC)协议,被网络文件系统(NFS)使用 113 auth 验证和身份识别协议 115 sftp 安全文件传输协议(SFTP)服务 117 uucp-path Unix 到 Unix 复制协议(UUCP)路径服务 119 nntp 用于 USENET 讨论系统的网络新闻传输协议(NNTP) 123 ntp 网络时间协议(NTP) 137 netbios-ns 在红帽企业 Linux 中被 Samba 使用的 NETBIOS 名称服务 138 netbios-dgm 在红帽企业 Linux 中被 Samba 使用的 NETBIOS 数据报服务 139 netbios-ssn 在红帽企业 Linux 中被 Samba 使用的NET BIOS 会话服务 143 imap 互联网消息存取协议(IMAP) 161 snmp 简单网络管理协议(SNMP) 162 snmptrap SNMP 的陷阱 163 cmip-man 通用管理信息协议(CMIP) 164 cmip-agent 通用管理信息协议(CMIP) 174 mailq MAILQ 177 xdmcp X 显示管理器控制协议 178 nextstep NeXTStep 窗口服务器 179 bgp 边界网络协议 191 prospero Cliffod Neuman 的 Prospero 服务 194 irc 互联网中继聊天(IRC) 199 smux SNMP UNIX 多路复用 201 at-rtmp AppleTalk 选路 202 at-nbp AppleTalk 名称绑定 204 at-echo AppleTalk echo 服务 206 at-zis AppleTalk 区块信息 209 qmtp 快速邮件传输协议(QMTP) 210 z39.50 NISO Z39.50 数据库 213 ipx 互联网络分组交换协议(IPX),被 Novell Netware 环境常用的数据报协议 220 imap3 互联网消息存取协议版本3 245 link LINK 347 fatserv Fatmen 服务器 363 rsvp_tunnel RSVP 隧道 369 rpc2portmap Coda 文件系统端口映射器 370 codaauth2 Coda 文件系统验证服务 372 ulistproc UNIX Listserv 389 ldap 轻型目录存取协议(LDAP) 427 svrloc 服务位置协议(SLP) 434 mobileip-agent 可移互联网协议(IP)代理 435 mobilip-mn 可移互联网协议(IP)管理器 443 https 安全超文本传输协议(HTTP) 加密的超文本协议https 444 snpp 小型网络分页协议 445 microsoft-ds 通过 TCP/IP 的服务器消息块(SMB) 464 kpasswd Kerberos 口令和钥匙改换服务 468 photuris Photuris 会话钥匙管理协议 487 saft 简单不对称文件传输(SAFT)协议 488 gss-http 用于 HTTP 的通用安全服务(GSS) 496 pim-rp-disc 用于协议独立的多址传播(PIM)服务的会合点发现(RP-DISC) 500 isakmp 互联网安全关联和钥匙管理协议(ISAKMP) 535 iiop 互联网内部对象请求代理协议(IIOP) 538 gdomap GNUstep 分布式对象映射器(GDOMAP) 546 dhcpv6-client 动态主机配置协议(DHCP)版本6客户 547 dhcpv6-server 动态主机配置协议(DHCP)版本6服务 554 rtsp 实时流播协议(RTSP) 563 nntps 通过安全套接字层的网络新闻传输协议(NNTPS) 565 whoami whoami 587 submission 邮件消息提交代理(MSA) 610 npmp-local 网络外设管理协议(NPMP)本地 / 分布式排队系统(DQS) 611 npmp-gui 网络外设管理协议(NPMP)GUI / 分布式排队系统(DQS) 612 hmmp-ind HMMP 指示 / DQS 631 ipp 互联网打印协议(IPP) 636 ldaps 通过安全套接字层的轻型目录访问协议(LDAPS) 674 acap 应用程序配置存取协议(ACAP) 694 ha-cluster 用于带有高可用性的群集的心跳服务 749 kerberos-adm Kerberos 版本5(v5)的“kadmin”数据库管理 750 kerberos-iv Kerberos 版本4(v4)服务 765 webster 网络词典 767 phonebook 网络电话簿 873 rsync rsync 文件传输服务 992 telnets 通过安全套接字层的 Telnet(TelnetS) 993 imaps 通过安全套接字层的互联网消息存取协议(IMAPS) 994 ircs 通过安全套接字层的互联网中继聊天(IRCS) 995 pop3s 通过安全套接字层的邮局协议版本3(POPS3) 表 C-1. 著名端口 以下端口是 UNIX 特有的,涉及了从电子邮件到验证不等的服务。在方括号内的名称(如 [service])是服务的守护进程名称或它的常用别名。 端口号码 / 层 名称 注释 512/tcp exec 用于对远程执行的进程进行验证 512/udp biff [comsat] 异步邮件客户(biff)和服务(comsat) 513/tcp login 远程登录(rlogin) 513/udp who [whod] 登录的用户列表 514/tcp shell [cmd] 不必登录的远程 shell(rshell)和远程复制(rcp) 514/udp syslog UNIX 系统日志服务 515 printer [spooler] 打印机(lpr)假脱机 517/udp talk 远程对话服务和客户 518/udp ntalk 网络交谈(ntalk),远程对话服务和客户 519 utime [unixtime] UNIX 时间协议(utime) 520/tcp efs 扩展文件名服务器(EFS) 520/udp router [route, routed] 选路信息协议(RIP) 521 ripng 用于互联网协议版本6(IPv6)的选路信息协议 525 timed [timeserver] 时间守护进程(timed) 526/tcp tempo [newdate] Tempo 530/tcp courier [rpc] Courier 远程过程调用(RPC)协议 531/tcp conference [chat] 互联网中继聊天 532 netnews Netnews 533/udp netwall 用于紧急广播的 Netwall 540/tcp uucp [uucpd] Unix 到 Unix 复制服务 543/tcp klogin Kerberos 版本5(v5)远程登录 544/tcp kshell Kerberos 版本5(v5)远程 shell 548 afpovertcp 通过传输控制协议(TCP)的 Appletalk 文件编制协议(AFP) 556 remotefs [rfs_server, rfs] Brunhoff 的远程文件系统(RFS) 表 C-2. UNIX 特有的端口 表 C-3列举了由网络和软件社区向 IANA 提交的要在端口号码列表中正式注册的端口。 端口号码 / 层 名称 注释 1080 socks SOCKS 网络应用程序代理服务 1236 bvcontrol [rmtcfg] Garcilis Packeten 远程配置服务器[a] 1300 h323hostcallsc H.323 电话会议主机电话安全 1433 ms-sql-s Microsoft SQL 服务器 1434 ms-sql-m Microsoft SQL 监视器 1494 ica Citrix ICA 客户 1512 wins Microsoft Windows 互联网名称服务器 1524 ingreslock Ingres 数据库管理系统(DBMS)锁定服务 1525 prospero-np 无特权的 Prospero 1645 datametrics [old-radius] Datametrics / 从前的 radius 项目 1646 sa-msg-port [oldradacct] sa-msg-port / 从前的 radacct 项目 1649 kermit Kermit 文件传输和管理服务 1701 l2tp [l2f] 第2层隧道服务(LT2P) / 第2层转发(L2F) 1718 h323gatedisc H.323 电讯守门装置发现机制 1719 h323gatestat H.323 电讯守门装置状态 1720 h323hostcall H.323 电讯主持电话设置 1758 tftp-mcast 小文件 FTP 组播 1759 mtftp 组播小文件 FTP(MTFTP) 1789 hello Hello 路由器通信端口 1812 radius Radius 拨号验证和记帐服务 1813 radius-acct Radius 记帐 1911 mtp Starlight 网络多媒体传输协议(MTP) 1985 hsrp Cisco 热备用路由器协议 1986 licensedaemon Cisco 许可管理守护进程 1997 gdp-port Cisco 网关发现协议(GDP) 2049 nfs [nfsd] 网络文件系统(NFS) 2102 zephyr-srv Zephyr 通知传输和发送服务器 2103 zephyr-clt Zephyr serv-hm 连接 2104 zephyr-hm Zephyr 主机管理器 2401 cvspserver 并行版本系统(CVS)客户 / 服务器操作 2430/tcp venus 用于 Coda 文件系统(codacon 端口)的 Venus 缓存管理器 2430/udp venus 用于 Coda 文件系统(callback/wbc interface 界面)的 Venus 缓存管理器 2431/tcp venus-se Venus 传输控制协议(TCP)的副作用 2431/udp venus-se Venus 用户数据报协议(UDP)的副作用 2432/udp codasrv Coda 文件系统服务器端口 2433/tcp codasrv-se Coda 文件系统 TCP 副作用 2433/udp codasrv-se Coda 文件系统 UDP SFTP 副作用 2600 hpstgmgr [zebrasrv] HPSTGMGR;Zebra 选路 ...

May 2, 2019 · 5 min · jiezi

网络编程理论篇

对于初学者,或者没有接触过网络编程的程序员,会觉得网络编程涉及的知识很高深,很难,其实这是一种误解,当你的语法熟悉以后,其实基本的网络编程现在已经被实现的异常简单了。 网络通信作为互联网的技术支持,已被广泛应用在软件开发中,无论是Web,服务端,客户端还是桌面应用,都是必须掌握的一门技术。 网络编程是什么?在软件开发层面实现远程数据交换的编程技术。网络编程的本质是两个设备之间的数据交换,当然,在计算机网络中,设备主要指计算机。数据传递本身没有多大的难度,不就是把一个设备中的数据发送给另外一个设备,然后接受另外一个设备反馈的数据。 OSI参考模型OSI参考模型,也可以叫做OSI七层模型,在学习网络编程的时候,都会接触到OSI七层模型,我们一般使用的网络数据传输由下而上分为七层,这是一个理论的模型。分别是物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。如下表所示: 层数名称描述第七层应用层应用层是 OSI 参考模型的最高层,负责为用户的应用程序提供网络服务。与 OSI 其他层不同的是,它不为任何其他 OSI 层提供服务,而只是为 OSI 模型以外的应用程序提供服务。包括为相互通信的应用程序或进行之间建立连接、进行同步,建立关于错误纠正和控 制数据完整性过程的协商等。应用层还包含大量的应用协议,如分布式数据库的访问、文件的交换、电子邮件、虚拟终端等。第六层表示层表示层以下的各层只关心可靠的数据传输,而表示层关心的是所传输数据的语法和语义。它主要涉及处理在两个通信系统之间所交换信息的表示方式,包括数据格式变换、数据加密与解密、数据压缩与恢复等功能。第五层会话层会话层的功能是在两个节点间建立、维护和释放面向用户的连接。它是在传输连接的基础上建立会话连接,并进行数据交换管理,允许数据进行单工、半双工和全双工的传送。会话层提供了令牌管理和同步两种服务功能。第四层传输层传输层是OSI七层模型中唯一负责端到端节点间数据传输和控制功能的层。传输层是OSI七层模型中承上启下的层,它下面的三层主要面向网络通信,以确保信息被准确有效地传输;它上面的三个层次则面向用户主机,为用户提供各种服务。传输层通过弥补网络层服务质量的不足,为会话层提供端到端的可靠数据传输服务。它为会话层屏蔽了传输层以下的数据通信的细节,使会话层不会受到下三层技术变化的影响。但同时,它又依靠下面的三个层次控制实际的网络通信操作,来完成数据从源到目标的传输。传输层为了向会话层提供可靠的端到端传输服务,也使用了差错控制和流量控制等机制。第三层网络层网络中的两台计算机进行通信时,中间可能要经过许多中间结点甚至不同的通信子网。 网络层的任务就是在通信子网中选择一条合适的路径,使发送端传输层所传下来的数据能 够通过所选择的路径到达目的端。网络层必须使用寻址方案来确定存在哪些网络以及设备在这些网络中所处的位置,不同网络层协议所采用的寻址方案是不同的。在确定了目标结点的位置后, 网络层还要负责引导数据包正确地通过网络,找到通过网络的最优路径,即路由选择。如果子网中同时出现过多的分组,它们将相互阻塞通路并可能形成网络瓶颈,所以网络层还需要提供拥塞控制机制以避免此类现象的出现。第二层数据链路层数据链路层涉及相邻节点之间的可靠数据传输,数据链路层通过加强物理层传输原始比特的功能,使之对网络层表现为一条无错线路。为了能够实现相邻节点之间无差错的数据传送,数据链路层在数据传输过程中提供了确认、差错控制和流量控制等机制。第一层物理层物理层位于OSI参考模型的最低层,它直接面向原始比特流的传输。为了实现原始比特流的物理传输,物理层必须解决好包括传输介质、信道类型、数据与信号之间的转换、信号传输中的衰减和噪声等在内的一系列问题。另外,物理层标准要给出关于物理接口的机械、 电气、功能和规程特性,以便于不同的制造厂家既能够根据公认的标准各自独立地制造设备,又能使各个厂家的产品能够相互兼容。为什么OSI要采用分层的形式?因为一个软件逻辑的实现,就是对其进行分层处理。最熟悉不过的就是MVC,如把后台的代码会分为,数据层,表现层,业务逻辑层,还有现在的前后台分离这种,其实都是分层的一种表现形式,让每一部分的工作都变的跟加的精确和具体。 但是在项目中不会像IOS参考模型中那样分层那么细致,比较常用的可能就是TCP/IP协议,那么说到这,什么又是TCP/IP协议: TCP/IP提供点对点的链接机制,将数据应该如何封装、定址、传输、路由以及在目的地如何接收,都加以标准化。它将软件通信过程抽象化为四个抽象层,采取协议堆栈的方式,分别实现出不同通信协议。协议族下的各种协议,依其功能不同,被分别归属到这四个层次结构之中,常被视为是简化的七层OSI模型。 层数名称涵盖协议第四层应用层TELNET/SSH/HTTP/SMTP/POP/MIB/SIP/HTML(超文本传输协议)...第三层传输层TCP/UDP/SCTP/DCCP...第二层网际层ARP/IPv4/ICMP...第一层物理层以太网/无线LAN/PPP...通过上表中可以看出各个层级所包含的协议,可以把第一层和第二层看作为底层协议,然而在编写软件过程中很少的时候会用到这两层,因为这辆层一般用到会涉及到物理设备,例如链路、无线这些东西,很少会涉及到软件的逻辑。第三层是在软件开发过程中比较常用的,比如TCP,UDP之后会详细介绍。应用层会更加的熟悉,在做远程登录,数据传输时会频繁的使用到。 DNS解析DNS解析的过程就是寻找哪台机器上有你需要资源的过程。当你在浏览器中输入一个地址时,例如www.google.com,其实不是百度网站真正意义上的地址。互联网上每一台计算机的唯一标识是它的IP地址,但是IP地址并不方便记忆。用户更喜欢用方便记忆的网址去寻找互联网上的其它计算机,也就是上面提到的百度的网址。所以互联网设计者需要在用户的方便性与可用性方面做一个权衡,这个权衡就是一个网址到IP地址的转换,这个过程就是DNS解析。它实际上充当了一个翻译的角色,实现了网址到IP地址的转换。网址到IP地址转换的过程是如何进行的? 首先在本地域名服务器中查询IP地址,如果没有找到的情况下,本地域名服务器会向根域名服务器发送一个请求,如果根域名服务器也不存在该域名时,本地域名会向com顶级域名服务器发送一个请求,依次类推下去。直到最后本地域名服务器得到google的IP地址并把它缓存到本地,供下次查询使用。从上述过程中,可以看出网址的解析是一个从右向左的过程: com -> google.com -> www.google.com。但是你是否发现少了点什么,根域名服务器的解析过程呢?事实上,真正的网址是www.google.com.,并不是我多打了一个.,这个.对应的就是根域名服务器,默认情况下所有的网址的最后一位都是.,既然是默认情况下,为了方便用户,通常都会省略,浏览器在请求DNS的时候会自动加上,所有网址真正的解析过程为: . -> .com -> google.com. -> www.google.com。 浏览器缓存 - 当用户通过浏览器访问某域名时,浏览器首先会在自己的缓存中查找是否有该域名对应的IP地址(若曾经访问过该域名且没有清空缓存便存在);系统缓存 - 当浏览器缓存中无域名对应IP则会自动检查用户计算机系统Hosts文件DNS缓存是否有该域名对应IP;路由器缓存 - 当浏览器及系统缓存中均无域名对应IP则进入路由器缓存中检查,以上三步均为客服端的DNS缓存;ISP(互联网服务提供商)DNS缓存 - 当在用户客服端查找不到域名对应IP地址,则将进入ISP DNS缓存中进行查询。比如你用的是电信的网络,则会进入电信的DNS缓存服务器中进行查找;根域名服务器 - 当以上均未完成,则进入根服务器进行查询。全球仅有13台根域名服务器,1个主根域名服务器,其余12为辅根域名服务器。根域名收到请求后会查看区域文件记录,若无则将其管辖范围内顶级域名(如.com)服务器IP告诉本地DNS服务器;顶级域名服务器 - 顶级域名服务器收到请求后查看区域文件记录,若无则将其管辖范围内主域名服务器的IP地址告诉本地DNS服务器;主域名服务器 - 主域名服务器接受到请求后查询自己的缓存,如果没有则进入下一级域名服务器进行查找,并重复该步骤直至找到正确纪录;保存结果至缓存 - 本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时将该结果反馈给客户端,客户端通过这个IP地址与web服务器建立链接。TCP连接HTTP协议是使用TCP作为其传输层协议的,当TCP出现瓶颈时,HTTP也会受到影响。我不知道把HTTPS放在这个部分是否合适,但是放在这里好像又说的过去。HTTP报文是包裹在TCP报文中发送的,服务器端收到TCP报文时会解包提取出HTTP报文。但是这个过程中存在一定的风险,HTTP报文是明文,如果中间被截取的话会存在一些信息泄露的风险。那么在进入TCP报文之前对HTTP做一次加密就可以解决这个问题了。HTTPS协议的本质就是HTTP+SSL(orTLS)。在HTTP报文进入TCP报文之前,先使用SSL对HTTP报文进行加密。从网络的层级结构看它位于HTTP协议与TCP协议之间。 原理:Net模块提供一个异步API能够创建基于流的TCP服务器,客户端与服务端简历连接后,服务器可以获得一个全双工Socket对象,服务器可以保存Socket对象列表,在接收某客户端消息时,推送给客户端。 dome 服务端: const net = require("net");const chatServer = net.createServer();const clientList = [];chatServer.on("connection",client => { client.write("Hi!\n"); clientList.push(client); client.on("data",data => { console.log("receive:",data.toString()); clientList.forEach(v => { v.write(data); }) })});chatServer.listen(9000);TCP特性 ...

April 25, 2019 · 1 min · jiezi

TCP/IP学习笔记

先上知识点 敲黑板,划重点:两种协议模型,IP,TCP,UDP,HTTP 总结TCP/IP(Transmission Control Protocol / Internet Protocol)(传输控制协议/网际协议)是指以TCP和IP协议为核心的互联网协议簇。具体内容可参考以下图片。 1.基础知识IP地址网络节点都有一个32bit的IP地址,如192.168.1.1,根据网络拓扑分配,可变 域名IP地址别名,域名与IP对应,如github.com与192.30.255.113对应 DNS域名服务系统,存储域名与IP的映射关系 MAC地址计算机的物理地址,48bit,前24位为组织唯一标志符,标识厂家,后24位为扩展标识符,由厂家分配,同一厂家的生产的网卡仅后24位不同,如00-23-5A-15-99-42 端口号因为IP 地址与网络服务的关系是一对多的关系。实际上是通过“IP地址+端口号”来区 分不同的服务的,端口号16bit,范围0~65535常用端口号: IIS(HTTP):80 SQLServer:1433 Oracle:1521 MySQL:3306 FTP:21 SSH:22 Tomcat:8080 封装与分用当应用发送数据的时候,数据在协议层次自顶向下通过每一层,每一层都会对数据增加增加一些首部或者尾部信息,这样的信息称之为协议单元(Protocol Date Unit,PDU) 物理层(一层)PDU指数据位(Bit)数据链路层(二层)PDU指数据帧(Frame)网络层(三层)PDU指数据包(Packet)传输层(四层)PDU指数据段(Segment)第五层以上位数据(Data)分用:当主机收到一个数据帧时,数据就从协议层底往上,检查并去掉对应层次的报文首部或尾部,与封装过程正好相反。 2数据链路层网络层的PDU是IP数据包,数据链路层将其封装为帧(Frame),主要任务有: 向网络层体工良好的的服务接口处理传输错误调节数据流,确保慢速的接收方不会被快速的发送方淹没2.1控制帧的传输2.1.1差错控制反馈重发接收方通过对差错编码(奇偶检验码或CRC码)的检查,向发送方反馈是否收到正确信息,正确则发送完毕,错误则重新发送。 计时器接收方计时器内未收到帧,则发送反馈信息。发送方计时器内为收到反馈,则重新发送。 序号防止同一帧被重复发送,使接收方能从序号区分是新发送的帧还是重发的帧,以确定要不要将收到的帧递交给网络层 2.1.2 流量控制控制发送方数据流,使其发送速率不超过接收方接受速率。 2.2主要协议Ethernet,PPP,SLIP MTU数据帧的最大长度,又称最大传输单元,netstat -in查看 3 网络层3.1 IP协议TCP UDP ICMP等协议都以IP数据包格式传输,提供不可靠,无连接的数据包传输服务不可靠:不保证能到达目的地,仅提供传输服务,可靠性由上层保证无连接:每个数据报的处理相互独立,IP数据报不能按顺序发送 3.2 IP数据报 版本号:4位,0100代表IPV4,0110代表IPV6首部长度:4位,表使IP报头的长度一般位5 4=20字节,首部长度如图所是必须为4字节的倍数,所以长度最大值为15 4=60字节。服务类型:最小延时,最大吞吐量,最高可靠性,最小花费,4个标志位只有一个可以被置1总长度:数据报总长度,最大值为2^16-1标识:16位接收方确定分段属于哪一个数据包,同一个数据包的分段具有相同的标识。标志:是否分段偏移:13位,接收方重组时用来标识分段的顺序生存时间:8位,数据报经过的最多的路由器的个数,一般为32或者64协议:8位,代表哪个协议向IP传送数据,TCP为6,UDP为17首部检验和:16位,根据IP首部计算的校验和码源IP和目的IP:各占32位选项:可选变长的信息,不常用,多用于安全和军事领域sudo tcpdump -ntx -c 1 抓包 3.3 IP地址A 类地址0开头A 类地址网络号范围:1.0.0.0---127.0.0.0A 类 IP 地址范围:1.0.0.0---127.255.255.255A 类 IP 的私有地址范围:10.0.0.0---10.255.255.255 (所谓的私有地址就是在互联网上不使用,而被用在局域网络中的地址)127.X.X.X 是保留地址,用做循环测试用的因为主机号有 24 位,所以一个 A 类网络号可以容纳 2^24-2=16777214 个主机号 ...

April 22, 2019 · 1 min · jiezi

Linux 网络命令必知必会之 tcpdump,一份完整的抓包指南请查收!

本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫。[TOC] 这篇文章我总结得比较详尽,可以当字典查,建议收藏,不过别光顾着收藏,点赞什么的鼓励我一下,这能让我更有动力给大家输出更好的内容。 01 简介tcpdump 是一款 Linux 平台的抓包工具。它可以抓取涵盖整个 TCP/IP 协议族的数据包,支持针对网络层、协议、主机、端口的过滤,并提供 and、or、not 等逻辑语句来过滤无用的信息。 tcpdump 是一个非常复杂的工具,掌握它的方方面面实属不易,也不推荐,能够用它来解决日常工作问题才是关系。 02 tcpdump 命令选项tcpdump 有很多命令选项,想了解所有选项可以 Linux 命令行输入 tcpdump -h,man tcpdump 查看每个选项的意思。 [root@by ~]# tcpdump -htcpdump version 4.9.2libpcap version 1.5.3OpenSSL 1.0.2k-fips 26 Jan 2017Usage: tcpdump [-aAbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c count ] [ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ] [ -i interface ] [ -j tstamptype ] [ -M secret ] [ --number ] [ -Q|-P in|out|inout ] [ -r file ] [ -s snaplen ] [ --time-stamp-precision precision ] [ --immediate-mode ] [ -T type ] [ --version ] [ -V file ] [ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z postrotate-command ] [ -Z user ] [ expression ]下面列举一些常用选项: ...

April 22, 2019 · 4 min · jiezi

【网络】get与post的区别 - w3c用法区别/从HTTP来看实质的区别

w3c对于区别做出的定义:(用法上)(1)对参数的数据类型,GET只接受ASCII字符,而POST没有限制,允许二进制。(2)GET在浏览器回退/刷新时是无害的,而POST会再次提交请求。(3)GET请求只能进行url编码(application/x-www-form-urlencoded),而POST支持多种编码方式(application/x-www-form-urlencoded 或 multipart/form-data),可以为二进制使用多重编码 - HTML标准对HTTP协议的用法的约定,是浏览器拦截不让发(4)POST 比 GET 更安全,因为GET参数直接暴露在URL上,POST参数在HTTP消息主体中,而且不会被保存在浏览器历史或 web 服务器日志中。- GET提交数据还可能会造成Cross-site request forgery攻击+对于用户名等敏感信息暴露(5)对参数数据长度的限制,GET方法URL的长度是受限制的,最大是2048个字符,POST参数数据是没有限制的。- 浏览器/服务器行为,http没有做出限制:恶意伪造大额content-length让服务器响应时间变长(6)GET请求会被浏览器主动缓存,POST不会,除非手动设置。(7)GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。(8)GET请求可被收藏为书签,POST不能。常见答案:1. GET使用URL或Cookie传参,而POST将数据放在BODY中。 2. GET方式提交的数据有长度限制,则POST的数据则可以非常大。 3. POST比GET安全,因为数据在地址栏上不可见。在HTTP上看辟谣:HTTP规范定义:GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。 方法都只是规定:使用哪个Method与应用层的数据如何传输是没有相互关系的,get一样可以发送bodyHTTP协议对GET和POST都没有对长度的限制本质区别:GET幂等,POST不幂等http的method的定义,只是对行为的定义,幂等(有无副作用)的定义,没有强制定义,对其约束很低,为了服务器/浏览器的压力和安全,才对http的method做出了一些限制,且对于不用浏览器和服务器这些限制是不同,其两者本质都是基于TCP传输,区别只是幂等幂等 定义:是指同一个请求方法执行多次和仅执行一次的效果完全相同。 1.按照RFC规范,PUT,DELETE和安全方法都是幂等的。虽说是规范,但服务端实现是否幂等是无法确保的。 2.引入幂等主要是为了处理同一个请求重复发送的情况,比如在请求响应前失去连接,如果方法是幂等的,就可以放心地重发一次请求。这也是浏览器在后退/刷新时遇到POST会给用户提示的原因:POST语义不是幂等的,重复请求可能会带来意想不到的后果。 3.比如在微博这个场景里,GET的语义会被用在「看看我的Timeline上最新的20条微博」这样的场景,而POST的语义会被用在「发微博、评论、点赞」这样的场景中。总结:GET的语义是请求获取指定的资源。GET方法是安全、幂等、可缓存的(除非有 Cache-Control Header的约束),GET方法的报文主体没有任何语义。POST的语义是根据请求负荷(报文主体)对指定的资源做出处理,具体的处理方式视资源类型而不同。POST不安全,不幂等,(大部分实现)不可缓存。参考:https://www.jianshu.com/p/8fd…

April 16, 2019 · 1 min · jiezi

异构去堆叠 | 一种完美提升网络高可用SLA的方案

行业内接入网络去堆叠已经逐步成为主流方向,在大型互联网公司也已经批量部署。但由于京东集团不同的业务需求及历史原因,没有条件完全复制目前主流的ARP转主机路由方式的去堆叠方案,这促使我们设计一种尽可能满足各类业务需求的方案。近几年来云市场迅速发展,越来越多的用户把关键应用甚至全部应用部署到公有云上。云服务商在产品收入快速增长同时,也深刻体会到产品的高可用性对用户发展和用户留存的重要性。面向用户的产品SLA的实现效果取决于其依赖的各个环节,而基础网络是所有产品需要依赖的一个重要环节,因此,提升网络高可用SLA对整体提升产品整体SLA有着重要促进作用。今天我们要谈的异构去堆叠就是京东云在提高网络高可用SLA方面的新技术研究。用户自有网络其实也面临同样的问题,有提高网络可靠性需求的用户可以考虑在自有网络中使用类似方案。网络高可用通用解决方案首先,让我们先来看一下为了实现网络高可用,当下的四种服务器连接主流方案:由上图可以看出,双网卡/交换机堆叠和双网卡/去交换机堆叠提供了更好的高可用保证。通用堆叠方式 V.S 通用去堆叠方式01 堆叠方案优势服务器双网卡捆绑,无需特别改造交换机控制面统一,支持服务器BGP路由方式接入劣势多设备统一控制面,可靠性低升级困难横向连接浪费端口02 去堆叠方案常见的去堆叠方案有以下两种:去堆叠方案-路由方式优势交换机完全独立支持异构路由方式接入的服务器无需特别改造劣势2层方式接入的服务器需要进行改造服务器除网卡IP外需配置单独业务IP服务器多IP增加业务方运维复杂度静态路由方式不适合VM或Docker漂移动态路由方式要求全部服务器运行路由协议2.去堆叠方案-ARP转主机路由方式优势交换机完全独立服务器网卡捆绑方式不变,便于运维服务器网卡捆绑方式不变,便于运维劣势一组交换机要求同厂商,不支持异构需要修改服务器Linux内核ARP处理部分不支持服务器BGP路由方式接入通过以上对比,可以发现堆叠与去堆叠方式其实都可以实现网络的高可用,但各有利弊。针对这样的情况,京东云提出了一种理想的去堆叠方式,可以满足下图中的所有需求。异构去堆叠方案01 实现方法交换机侧IP配置/24掩码,两台交换机可配置相同IP或者不同IP;启用ARP代理及转主机路由功能;配置ARP超时时间为5s以便在服务器不响应ARP时快速撤回主机路由。服务器侧服务器双网卡配置相同IP地址(掩码/32);采用onlink方式配置目的为交换机IP的静态路由指向对应网卡;采用onlink方式配置缺省路由同时指向两块网卡;需要运行Ifplugd进程监控物理连接,物理连接发生UP/DOWN时执行相应ARP Ping和路由修改操作。02 冗余测试从上图中的测试拓扑和结果中可以看出,不论是软件操作上的禁用还是硬件拔出,在设定的收敛时间内,服务器的网络一直保持高可用。03 异构去堆叠方案小结异构去堆叠方案优势交换机完全独立异构避免单一厂商风险异构推动自研交换机快速上线服务器侧支持2层方式或BGP路由方式不修改Linux内核注意事项需要内核版本支持L4 HASH方式ECMP(Centos 7.4以上)需要运行Ifplugd进程监控物理连接总结综上所述,异构去堆叠有助于实现苛刻的网络SLA和极致的用户体验。京东云在设计去堆叠方案时首先考虑了异构,一方面因为单一厂商对网络高可用SLA还是一个重要风险点,另一方面异构方式可以促进京东正在进行的自研交换机实现快速部署。众所周知,自研交换机在各大互联网公司都是重点项目,但软件和硬件的稳定性一直是批量部署的重大障碍。而异构去堆叠利用自研和商用交换机1+1的方式可以大大降低自研交换机稳定性的影响。·END·

April 11, 2019 · 1 min · jiezi

面试经典之http中get与post的区别

GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二。最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数。你可能自己写过无数个GET和POST请求,或者已经看过很多权威网站总结出的他们的区别,你非常清楚知道什么时候该用什么。1、常规答案当你在面试中被问到这个问题,你的内心充满了自信和喜悦。你轻轻松松的给出了一个“标准答案”:-GETPOST后退按钮/刷新无害数据会被重新提交(浏览器应该告知用户数据会被重新提交)。书签可收藏为书签不可收藏为书签缓存能被缓存不能缓存编码类型application/x-www-form-urlencoded 只能进行url编码application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。历史参数保留在浏览器历史中。参数不会保存在浏览器历史中。对数据长度的限制是的。当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。无限制。对数据类型的限制只允许 ASCII 字符。没有限制。也允许二进制数据。安全性与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。在发送密码或其他敏感信息时绝不要使用 GET !POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。可见性数据在 URL 中对所有人都是可见的。数据不会显示在 URL 中。“很遗憾,这不是我们要的回答!”请告诉我真相。。。2、本质区别如果我告诉你GET和POST本质上没有区别你信吗? 让我们扒下GET和POST的外衣,坦诚相见吧!GET和POST是什么?HTTP协议中的两种发送请求的方法。HTTP是什么?HTTP是基于TCP/IP的关于数据如何在万维网中如何通信的协议。HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP链接。GET和POST能做的事情是一样一样的。你要给GET加上request body,给POST带上url参数,技术上是完全行的通的。2.1 那么,“标准答案”里的那些区别是怎么回事?在我大万维网世界中,TCP就像汽车,我们用TCP来运输数据,它很可靠,从来不会发生丢件少件的现象。但是如果路上跑的全是看起来一模一样的汽车,那这个世界看起来是一团混乱,送急件的汽车可能被前面满载货物的汽车拦堵在路上,整个交通系统一定会瘫痪。为了避免这种情况发生,交通规则HTTP诞生了。HTTP给汽车运输设定了好几个服务类别,有GET, POST, PUT, DELETE等等,HTTP规定,当执行GET请求的时候,要给汽车贴上GET的标签(设置method为GET),而且要求把传送的数据放在车顶上(url中)以方便记录。如果是POST请求,就要在车上贴上POST的标签,并把货物放在车厢里。当然,你也可以在GET的时候往车厢内偷偷藏点货物,但是这是很不光彩;也可以在POST的时候在车顶上也放一些数据,让人觉得傻乎乎的。HTTP只是个行为准则,而TCP才是GET和POST怎么实现的基本。但是,我们只看到HTTP对GET和POST参数的传送渠道(url还是requrest body)提出了要求。2.2、“标准答案”里关于参数大小的限制又是从哪来的呢?在我大万维网世界中,还有另一个重要的角色:运输公司。不同的浏览器(发起http请求)和服务器(接受http请求)就是不同的运输公司。 虽然理论上,你可以在车顶上无限的堆货物(url中无限加参数)。但是运输公司可不傻,装货和卸货也是有很大成本的,他们会限制单次运输量来控制风险,数据量太大对浏览器和服务器都是很大负担。业界不成文的规定是,(大多数)浏览器通常都会限制url长度在2K个字节,而(大多数)服务器最多处理64K大小的url。超过的部分,恕不处理。如果你用GET服务,在request body偷偷藏了数据,不同服务器的处理方式也是不同的,有些服务器会帮你卸货,读出数据,有些服务器直接忽略,所以,虽然GET可以带request body,也不能保证一定能被接收到哦。好了,现在你知道,GET和POST本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。2.3、最终boss你以为本文就这么结束了?我们的大BOSS还等着出场呢。。。这位BOSS有多神秘?当你试图在网上找“GET和POST的区别”的时候,那些你会看到的搜索结果里,从没有提到他。他究竟是什么呢。。。GET和POST还有一个重大区别,简单的说:GET产生一个TCP数据包;POST产生两个TCP数据包。也就是说,GET只需要汽车跑一趟就把货送到了,而POST得跑两趟,第一趟,先去和服务器打个招呼“嗨,我等下要送一批货来,你们打开门迎接我”,然后再回头把货送过去。因为POST需要两步,时间上消耗的要多一点,看起来GET比POST更有效。因此Yahoo团队有推荐用GET替换POST来优化网站性能。但这是一个坑!跳入需谨慎。为什么?GET与POST都有自己的语义,不能随便混用。据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。好了,看到这里之后再也不怕面试官问get与post请求的区别了。

April 9, 2019 · 1 min · jiezi

ArchLinux使用nmcl代替图形网络管理

任务栏在Archlinux上,我使用的是Bspwm窗口管理器和Polybar任务栏。Polybar可以自定义需要显示的模块,比如wifi,电池,网络上传和下载速率等等。但是由于基于大量的自定义也是提高了它的使用门槛,好在网络上已经有一些现成的模块,可以根据脚本加以修改或者直接使用即可。模块的选择在Polybar的一些模块上,一些网上现成模块功能还是相对简陋的,比如只能显示不能利用鼠标按键来选择弹出及选择对应的功能等。所以这些模块可以通过Polybar来加载外部的命令实现,比如加载bluetooh功能等等。但是问题加载外部的脚本或者命令来实现的任务栏功能,是不能和Polylar的任务栏无缝的在在一起的,而是在Polybar的任务栏后面追加显示功能。好在我的任务栏背景是黑色的,也就弥补了这个视觉上的缺陷了。从图形功能转向命令功能我现在是越是倾向于命令行工具和脚本了,不借助GUI显示。相对图形工具而言,命令行工具更加的轻量级而且在跨平台上面更加的占优势。通过外部的GUI往往鼠标点击来实现功能,而命令行都可以通过键盘来实现的。这也是我近些年来选择上的一些改变把,尽量追求一些小而精的东西来实现相同的功能。 命令行有个好处是不占用任务栏的空间大小,我之前添加的一些模块由于数量过多在任务栏上显示的比较拥挤。 久而久之,发现在自己的电脑越来月私人化了,别人想用的话…(非常不友好的界面对不熟悉的人而言简直是个灾难)nmcl来接管网络控制查看已经保存的网络连接(<SavedWiFiConn>)nmcli c查看可用的WIFI热点(<WiFiSSID>)nmcli d wifi list#或者是下面这个sudo iwlist wlan0 scanning列出网络接口(<WifiInterface>)ifconfig -a断开连接nmcli d disconnect <WifiInterface>连接网络nmcli d connect <WifiInterface>或者nmcli c up <SavedWiFiConn>断开连接nmcli d disconnect iface <WifiInterface>#或者nmcli c down <SavedWiFiConn>连接wifinmcli d wifi connect <WiFiSSID> password <WiFiPassword> iface <WifiInterface>断开连接nmcli c down id <SavedWiFiConn>连接wifnmcli c up id <SavedWiFiConn>密码没有自动识别nmcli -a c up <SavedWiFiConn>

April 6, 2019 · 1 min · jiezi

网卡也能虚拟化?网卡虚拟化技术 macvlan 详解

本文首发于我的公众号 cloud_dev,专注于干货分享,号内有大量书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫。01 macvlan 简介前面的文章讲过了几种 Linux 虚拟网络设备:tap/tun、veth-pair、bridge,它们本质上是 Linux 系统 提供的网络虚拟化解决方案,今天要讲的 macvlan 也是其中的一种,准确说这是一种网卡虚拟化的解决方案。因为 macvlan 这种技术能将 一块物理网卡虚拟成多块虚拟网卡 ,相当于物理网卡施展了 多重影分身之术 ,由一个变多个。02 macvlan 的工作原理macvlan 是 Linux kernel 支持的新特性,支持的版本有 v3.9-3.19 和 4.0+,比较稳定的版本推荐 4.0+。它一般是以内核模块的形式存在,我们可以通过以下方法判断当前系统是否支持:# modprobe macvlan# lsmod | grep macvlanmacvlan 24576 0如果第一个命令报错,或者第二个命令没有返回,说明当前系统不支持 macvlan,需要升级内核。macvlan 这种技术听起来有点像 VLAN,但它们的实现机制是完全不一样的。macvlan 子接口和原来的主接口是完全独立的,可以单独配置 MAC 地址和 IP 地址,而 VLAN 子接口和主接口共用相同的 MAC 地址。VLAN 用来划分广播域,而 macvlan 共享同一个广播域。通过不同的子接口,macvlan 也能做到流量的隔离。macvlan 会根据收到包的目的 MAC 地址判断这个包需要交给哪个虚拟网卡,虚拟网卡再把包交给上层的协议栈处理。03 四种模式根据 macvlan 子接口之间的通信模式,macvlan 有四种网络模式:private 模式vepa(virtual ethernet port aggregator) 模式bridge 模式passthru 模式默认使用的是 vepa 模式。3.1 private这种模式下,同一主接口下的子接口之间彼此隔离,不能通信。即使从外部的物理交换机导流,也会被无情地丢掉。3.2 vepa这种模式下,子接口之间的通信流量需要导到外部支持 802.1Qbg/VPEA 功能的交换机上(可以是物理的或者虚拟的),经由外部交换机转发,再绕回来。注:802.1Qbg/VPEA 功能简单说就是交换机要支持 发夹(hairpin) 功能,也就是数据包从一个接口上收上来之后还能再扔回去。3.3 bridge这种模式下,模拟的是 Linux bridge 的功能,但比 bridge 要好的一点是每个接口的 MAC 地址是已知的,不用学习。所以,这种模式下,子接口之间就是直接可以通信的。3.4 passthru这种模式,只允许单个子接口连接主接口,且必须设置成混杂模式,一般用于子接口桥接和创建 VLAN 子接口的场景。3.5 mactap和 macvlan 相似的技术还有一种是 mactap。和 macvlan 不同的是,mactap 收到包之后不是交给协议栈,而是交给一个 tapX 文件,然后通过这个文件,完成和用户态的直接通信。04 实践在 Linux 系统下,创建 macvlan 的命令形式如下:ip link add link DEVICE name NAME type { macvlan | macvtap } mode { private | vepa | bridge | passthru [ nopromisc ] }通常,单独使用 macvlan 毫无意义,一般都是结合 VM 和容器来构建网络。下面我们就简单使用 namespace 来看看 Linux 是怎么使用 macvlan 的。实验拓扑如下:在我的系统中,以接口 enp0s8 为例创建两个 macvlan 子接口(使用 bridge 模式),配置 IP 并将其挂到两个 namespace 中,测试连通性。# 创建两个 macvlan 子接口ip link add link enp0s8 dev mac1 type macvlan mode bridgeip link add link enp0s8 dev mac2 type macvlan mode bridge# 创建两个 namespaceip netns add ns1ip netns add ns2# 将两个子接口分别挂到两个 namespace 中ip link set mac1 netns ns1ip link set mac2 netns ns2# 配置 IP 并启用ip netns exec ns1 ip a a 192.168.56.122/24 dev mac1ip netns exec ns1 ip l s mac1 upip netns exec ns1 ip a a 192.168.56.123/24 dev mac2ip netns exec ns2 ip l s mac2 up注:enp0s8 的 IP 是 192.168.56.110/24,配置的子接口 IP 也必须是同一网段的。完了两个子接口 ping 一下:root@ubuntu:# ip netns exec ns1 ip a show mac19: mac1@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1 link/ether 2e:6e:d9:08:c5:05 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 192.168.56.122/24 scope global mac1 valid_lft forever preferred_lft forever inet6 fe80::2c6e:d9ff:fe08:c505/64 scope link valid_lft forever preferred_lft foreverroot@ubuntu:# ip netns exec ns1 ping 192.168.56.123PING 192.168.56.123 (192.168.56.123) 56(84) bytes of data.64 bytes from 192.168.56.123: icmp_seq=1 ttl=64 time=0.052 ms64 bytes from 192.168.56.123: icmp_seq=2 ttl=64 time=0.028 ms^C— 192.168.56.123 ping statistics —2 packets transmitted, 2 received, 0% packet loss, time 1000msrtt min/avg/max/mdev = 0.028/0.040/0.052/0.012 ms可以看到,能够 ping 通,如果把上面的 mode 换成其他模式就行不通了,这个就留给大家去实验了(默认是 vepa 模式)。另外,在 docker 中,macvlan 是一种较为重要的跨主机网络模型,这块的内容就留作下篇文章再做讲解了。05 总结macvlan 是一种网卡虚拟化技术,能够将一张网卡虚拟出多张网卡。macvlan 的四种通信模式,常用模式是 bridge。思考一下:macvlan bridge 和 bridge 的异同点还有一种类似的技术,多张虚拟网卡共享相同 MAC 地址,但有独立的 IP 地址,这是什么技术?这两个问题大家可以留言互动一下。我的公众号 cloud_dev,号内有大量书籍和视频资源,后台回复「1024」即可领取,分享的内容包括但不限于云计算虚拟化、容器、OpenStack、K8S、雾计算、网络、工具、SDN、OVS、DPDK、Linux、Go、Python、C/C++编程技术等内容,欢迎大家关注。 ...

April 2, 2019 · 2 min · jiezi

Linux 虚拟网络设备 veth-pair 详解,看这一篇就够了

本文首发于我的公众号 cloud_dev,专注于干货分享,号内有大量书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫。前面这篇文章介绍了 tap/tun 设备之后,大家应该对虚拟网络设备有了一定的了解,本文来看另外一种虚拟网络设备 veth-pair。01 veth-pair 是什么顾名思义,veth-pair 就是一对的虚拟设备接口,和 tap/tun 设备不同的是,它都是成对出现的。一端连着协议栈,一端彼此相连着。如下图所示:正因为有这个特性,它常常充当着一个桥梁,连接着各种虚拟网络设备,典型的例子像“两个 namespace 之间的连接”,“Bridge、OVS 之间的连接”,“Docker 容器之间的连接” 等等,以此构建出非常复杂的虚拟网络结构,比如 OpenStack Neutron。02 veth-pair 的连通性我们给上图中的 veth0 和 veth1 分别配上 IP:10.1.1.2 和 10.1.1.3,然后从 veth0 ping 一下 veth1。理论上它们处于同网段,是能 ping 通的,但结果却是 ping 不通。抓个包看看,tcpdump -nnt -i veth0root@ubuntu:# tcpdump -nnt -i veth0tcpdump: verbose output suppressed, use -v or -vv for full protocol decodelistening on veth0, link-type EN10MB (Ethernet), capture size 262144 bytesARP, Request who-has 10.1.1.3 tell 10.1.1.2, length 28ARP, Request who-has 10.1.1.3 tell 10.1.1.2, length 28可以看到,由于 veth0 和 veth1 处于同一个网段,且是第一次连接,所以会事先发 ARP 包,但 veth1 并没有响应 ARP 包。经查阅,这是由于我使用的 Ubuntu 系统内核中一些 ARP 相关的默认配置限制所导致的,需要修改一下配置项:echo 1 > /proc/sys/net/ipv4/conf/veth1/accept_localecho 1 > /proc/sys/net/ipv4/conf/veth0/accept_localecho 0 > /proc/sys/net/ipv4/conf/all/rp_filterecho 0 > /proc/sys/net/ipv4/conf/veth0/rp_filterecho 0 > /proc/sys/net/ipv4/conf/veth1/rp_filter完了再 ping 就行了。root@ubuntu:# ping -I veth0 10.1.1.3 -c 2PING 10.1.1.3 (10.1.1.3) from 10.1.1.2 veth0: 56(84) bytes of data.64 bytes from 10.1.1.3: icmp_seq=1 ttl=64 time=0.047 ms64 bytes from 10.1.1.3: icmp_seq=2 ttl=64 time=0.064 ms— 10.1.1.3 ping statistics —2 packets transmitted, 2 received, 0% packet loss, time 3008msrtt min/avg/max/mdev = 0.047/0.072/0.113/0.025 ms我们对这个通信过程比较感兴趣,可以抓包看看。对于 veth0 口:root@ubuntu:# tcpdump -nnt -i veth0tcpdump: verbose output suppressed, use -v or -vv for full protocol decodelistening on veth0, link-type EN10MB (Ethernet), capture size 262144 bytesARP, Request who-has 10.1.1.3 tell 10.1.1.2, length 28ARP, Reply 10.1.1.3 is-at 5a:07:76:8e:fb:cd, length 28IP 10.1.1.2 > 10.1.1.3: ICMP echo request, id 2189, seq 1, length 64IP 10.1.1.2 > 10.1.1.3: ICMP echo request, id 2189, seq 2, length 64IP 10.1.1.2 > 10.1.1.3: ICMP echo request, id 2189, seq 3, length 64IP 10.1.1.2 > 10.1.1.3: ICMP echo request, id 2244, seq 1, length 64对于 veth1 口:root@ubuntu:# tcpdump -nnt -i veth1tcpdump: verbose output suppressed, use -v or -vv for full protocol decodelistening on veth1, link-type EN10MB (Ethernet), capture size 262144 bytesARP, Request who-has 10.1.1.3 tell 10.1.1.2, length 28ARP, Reply 10.1.1.3 is-at 5a:07:76:8e:fb:cd, length 28IP 10.1.1.2 > 10.1.1.3: ICMP echo request, id 2189, seq 1, length 64IP 10.1.1.2 > 10.1.1.3: ICMP echo request, id 2189, seq 2, length 64IP 10.1.1.2 > 10.1.1.3: ICMP echo request, id 2189, seq 3, length 64IP 10.1.1.2 > 10.1.1.3: ICMP echo request, id 2244, seq 1, length 64奇怪,我们并没有看到 ICMP 的 echo reply 包,那它是怎么 ping 通的?其实这里 echo reply 走的是 localback 口,不信抓个包看看:root@ubuntu:~# tcpdump -nnt -i lotcpdump: verbose output suppressed, use -v or -vv for full protocol decodelistening on lo, link-type EN10MB (Ethernet), capture size 262144 bytesIP 10.1.1.3 > 10.1.1.2: ICMP echo reply, id 2244, seq 1, length 64IP 10.1.1.3 > 10.1.1.2: ICMP echo reply, id 2244, seq 2, length 64IP 10.1.1.3 > 10.1.1.2: ICMP echo reply, id 2244, seq 3, length 64IP 10.1.1.3 > 10.1.1.2: ICMP echo reply, id 2244, seq 4, length 64为什么?我们看下整个通信流程就明白了。首先 ping 程序构造 ICMP echo request,通过 socket 发给协议栈。由于 ping 指定了走 veth0 口,如果是第一次,则需要发 ARP 请求,否则协议栈直接将数据包交给 veth0。由于 veth0 连着 veth1,所以 ICMP request 直接发给 veth1。veth1 收到请求后,交给另一端的协议栈。协议栈看本地有 10.1.1.3 这个 IP,于是构造 ICMP reply 包,查看路由表,发现回给 10.1.1.0 网段的数据包应该走 localback 口,于是将 reply 包交给 lo 口(会优先查看路由表的 0 号表,ip route show table 0 查看)。lo 收到协议栈的 reply 包后,啥都没干,转手又回给协议栈。协议栈收到 reply 包之后,发现有 socket 在等待包,于是将包给 socket。等待在用户态的 ping 程序发现 socket 返回,于是就收到 ICMP 的 reply 包。整个过程如下图所示:03 两个 namespace 之间的连通性namespace 是 Linux 2.6.x 内核版本之后支持的特性,主要用于资源的隔离。有了 namespace,一个 Linux 系统就可以抽象出多个网络子系统,各子系统间都有自己的网络设备,协议栈等,彼此之间互不影响。如果各个 namespace 之间需要通信,怎么办呢,答案就是用 veth-pair 来做桥梁。根据连接的方式和规模,可以分为“直接相连”,“通过 Bridge 相连” 和 “通过 OVS 相连”。3.1 直接相连直接相连是最简单的方式,如下图,一对 veth-pair 直接将两个 namespace 连接在一起。给 veth-pair 配置 IP,测试连通性:# 创建 namespaceip netns a ns1ip netns a ns2# 创建一对 veth-pair veth0 veth1ip l a veth0 type veth peer name veth1# 将 veth0 veth1 分别加入两个 nsip l s veth0 netns ns1ip l s veth1 netns ns2# 给两个 veth0 veth1 配上 IP 并启用ip netns exec ns1 ip a a 10.1.1.2/24 dev veth0ip netns exec ns1 ip l s veth0 upip netns exec ns2 ip a a 10.1.1.3/24 dev veth1ip netns exec ns2 ip l s veth1 up# 从 veth0 ping veth1[root@localhost ~]# ip netns exec ns1 ping 10.1.1.3PING 10.1.1.3 (10.1.1.3) 56(84) bytes of data.64 bytes from 10.1.1.3: icmp_seq=1 ttl=64 time=0.073 ms64 bytes from 10.1.1.3: icmp_seq=2 ttl=64 time=0.068 ms— 10.1.1.3 ping statistics —15 packets transmitted, 15 received, 0% packet loss, time 14000msrtt min/avg/max/mdev = 0.068/0.084/0.201/0.032 ms3.2 通过 Bridge 相连Linux Bridge 相当于一台交换机,可以中转两个 namespace 的流量,我们看看 veth-pair 在其中扮演什么角色。如下图,两对 veth-pair 分别将两个 namespace 连到 Bridge 上。同样给 veth-pair 配置 IP,测试其连通性:# 首先创建 bridge br0ip l a br0 type bridgeip l s br0 up # 然后创建两对 veth-pairip l a veth0 type veth peer name br-veth0ip l a veth1 type veth peer name br-veth1# 分别将两对 veth-pair 加入两个 ns 和 br0ip l s veth0 netns ns1ip l s br-veth0 master br0ip l s br-veth0 upip l s veth1 netns ns2ip l s br-veth1 master br0ip l s br-veth1 up# 给两个 ns 中的 veth 配置 IP 并启用ip netns exec ns1 ip a a 10.1.1.2/24 dev veth0ip netns exec ns1 ip l s veth0 upip netns exec ns2 ip a a 10.1.1.3/24 dev veth1ip netns exec ns2 ip l s veth1 up# veth0 ping veth1[root@localhost ~]# ip netns exec ns1 ping 10.1.1.3PING 10.1.1.3 (10.1.1.3) 56(84) bytes of data.64 bytes from 10.1.1.3: icmp_seq=1 ttl=64 time=0.060 ms64 bytes from 10.1.1.3: icmp_seq=2 ttl=64 time=0.105 ms— 10.1.1.3 ping statistics —2 packets transmitted, 2 received, 0% packet loss, time 999msrtt min/avg/max/mdev = 0.060/0.082/0.105/0.024 ms3.3 通过 OVS 相连OVS 是第三方开源的 Bridge,功能比 Linux Bridge 要更强大,对于同样的实验,我们用 OVS 来看看是什么效果。如下图所示:同样测试两个 namespace 之间的连通性:# 用 ovs 提供的命令创建一个 ovs bridgeovs-vsctl add-br ovs-br# 创建两对 veth-pairip l a veth0 type veth peer name ovs-veth0ip l a veth1 type veth peer name ovs-veth1# 将 veth-pair 两端分别加入到 ns 和 ovs bridge 中ip l s veth0 netns ns1ovs-vsctl add-port ovs-br ovs-veth0ip l s ovs-veth0 upip l s veth1 netns ns2ovs-vsctl add-port ovs-br ovs-veth1ip l s ovs-veth1 up# 给 ns 中的 veth 配置 IP 并启用ip netns exec ns1 ip a a 10.1.1.2/24 dev veth0ip netns exec ns1 ip l s veth0 upip netns exec ns2 ip a a 10.1.1.3/24 dev veth1ip netns exec ns2 ip l s veth1 up# veth0 ping veth1[root@localhost ~]# ip netns exec ns1 ping 10.1.1.3PING 10.1.1.3 (10.1.1.3) 56(84) bytes of data.64 bytes from 10.1.1.3: icmp_seq=1 ttl=64 time=0.311 ms64 bytes from 10.1.1.3: icmp_seq=2 ttl=64 time=0.087 ms^C— 10.1.1.3 ping statistics —2 packets transmitted, 2 received, 0% packet loss, time 999msrtt min/avg/max/mdev = 0.087/0.199/0.311/0.112 ms总结veth-pair 在虚拟网络中充当着桥梁的角色,连接多种网络设备构成复杂的网络。veth-pair 的三个经典实验,直接相连、通过 Bridge 相连和通过 OVS 相连。参考http://www.opencloudblog.com/…https://segmentfault.com/a/11…我的公众号 cloud_dev,号内有大量书籍和视频资源,后台回复「1024」即可领取,分享的内容包括但不限于云计算虚拟化、容器、OpenStack、K8S、雾计算、网络、工具、SDN、OVS、DPDK、Linux、Go、Python、C/C++编程技术等内容,欢迎大家关注。 ...

April 1, 2019 · 5 min · jiezi

一篇带你读懂TCP之“滑动窗口”协议

前言你现在的努力,是为了以后有更多的选择。在上一篇文章通过“表白”方式,让我们快速了解网络七层协议 了解了网络七层协议。接下来我们要把重心放在网络传输的可靠性上面。一起来看TCP协议,它是如何解决网络传输不可靠的问题。这其中有个很关键的部分,就是我们的滑动窗口协议。从工程学角度上,我们来看一看滑动窗口协议,它到底解决了一个怎样的问题?滑动窗口协议:TCP协议的使用维持发送方/接收方缓冲区缓冲区是 用来解决网络之间数据不可靠的问题,例如丢包,重复包,出错,乱序在TCP协议中,发送方和接受方通过各自维护自己的缓冲区。通过商定包的重传机制等一系列操作,来解决不可靠的问题。问题一:如何保证次序?提出问题:在我们滑动窗口协议之前,我们如何来保证发送方与接收方之间,每个包都能被收到。并且是按次序的呢?发送方发送一个包1,这时候接收方确认包1。发送包2,确认包2。就这样一直下去,知道把数据完全发送完毕,这样就结束了。那么就解决了丢包,出错,乱序等一些情况!同时也存在一些问题。问题:吞吐量非常的低。我们发完包1,一定要等确认包1.我们才能发送第二个包。问题二:如何提高吞吐量?提出问题:那么我们就不能先连发几个包等他一起确认吗?这样的话,我们的速度会不会更快,吞吐量更高些呢?如图,这个就是我们把两个包一起发送,然后一起确认。可以看出我们改进的方案比之前的好很多,所花的时间只是一个来回的时间。接下来,我们还有一个问题:改善了吞吐量的问题问题三:如何实现最优解?问题:我们每次需要发多少个包过去呢?发送多少包是最优解呢?我们能不能把第一个和第二个包发过去后,收到第一个确认包就把第三个包发过去呢?而不是去等到第二个包的确认包才去发第三个包。这样就很自然的产生了我们"滑动窗口"的实现。在图中,我们可看出灰色1号2号3号包已经发送完毕,并且已经收到Ack。这些包就已经是过去式。4、5、6、7号包是黄色的,表示已经发送了。但是并没有收到对方的Ack,所以也不知道接收方有没有收到。8、9、10号包是绿色的。是我们还没有发送的。这些绿色也就是我们接下来马上要发送的包。 可以看出我们的窗口正好是11格。后面的11-16还没有被读进内存。要等4号-10号包有接下来的动作后,我们的包才会继续往下发送。正常情况可以看到4号包对方已经被接收到,所以被涂成了灰色。“窗口”就往右移一格,这里只要保证“窗口”是7格的。 我们就把11号包读进了我们的缓存。进入了“待发送”的状态。8、9号包已经变成了黄色,表示已经发送出去了。接下来的操作就是一样的了,确认包后,窗口往后移继续将未发送的包读进缓存,把“待发送“状态的包变为”已发送“。丢包情况有可能我们包发过去,对方的Ack丢了。也有可能我们的包并没有发送过去。从发送方角度看就是我们没有收到Ack。发生的情况:一直在等Ack。如果一直等不到的话,我们也会把读进缓存的待发送的包也一起发过去。但是,这个时候我们的窗口已经发满了。所以并不能把12号包读进来,而是始终在等待5号包的Ack。如果我们这个Ack始终不来怎么办呢?超时重发这时候我们有个解决方法:超时重传这里有一点要说明:这个Ack是要按顺序的。必须要等到5的Ack收到,才会把6-11的Ack发送过去。这样就保证了滑动窗口的一个顺序。这时候可以看出5号包已经接受到Ack,后面的6、7、8号包也已经发送过去已Ack。窗口便继续向后移动。文末从我们为了增加网络的吞吐量,想讲数据包一起发送过去,这时候便产生了“滑动窗口”这种协议。有了“滑动窗口”这个概念,我们又解决了其中出现的一些问题。例如丢包,我们又通过重发的机制去解决了。以上来自ccmouse老师教学视频,作为学习记录整理。如果文章对你有用的话,欢迎关注公众号:Coder编程获取最新原创技术文章和相关免费学习资料,随时随地学习技术知识!

March 30, 2019 · 1 min · jiezi

通过“表白”的方式,让我们快速了解网络协议

本章主要介绍网络协议,这个协议就叫做OSI协议(一系列协议),按照功能不同,分工不同,人为的分层七层。实际上这个七层是不存在的。没有这七层的概念,只是人为的划分而已。我们谈到在任何联网的协议时,就会谈到OSI(网络七层协议模型),必须遵循这个协议模型,我们的手机和电脑才可以联网通信,接下来我们就一起来看一下OSI(网络七层协议模型)七层协议OSI层功能TCP/IP协议应用层文本传输,电子邮件,文件服务,虚拟终端FTP,HTTP,SNMP,DNS等表示层数据格式化,代码转换,数据加密没有协议会话层解除或建立与其他节点的联系没有协议传输层提供端对端的接口TCP,UDP网络层为数据包选择路由IP,ICMP,RIP,OSPF,BGP,IGMP数据链路层传输有地址的帧,错误检测功能SLIP,CSLIP,PPP,ARP,RARP,MTU物理层以二进制数据形式在物理媒体上传输数据ISO2110,IEEE802,IEEE802.2以上是七层协议,业界还产生出了一些其他协议模型。例如TCP/IP四层协议以及五层协议。TCP/IP四层协议模型:主要包括:应用层传输层网络层物理链路层五层协议模型主要包括:应用层传输层网络层数据链路层物理层来自网图通过看上面硬性的概念,可能我们很难理解网络七层协议到底都是怎么一回事。接下来我会用一个小故事来帮助大家一起来理解记忆这网络七层协议。小故事我们的故事以五层协议为基础,小明表白小红为主线。小明暗恋小红很久了,可是却羞于当面表达爱意。于是他决定写一份email发给小红,来表白。万里长城第一步:小明从商店买了一堆物理线、网线接口、光纤等。一头连自己家,另一头连小红家。小明想到的第一个问题是:怎么才能让这个两个物理硬件之间进行通信呢?于是小明发明了比特流,通过 1与 0之间转化为电流的强弱进行信号的传输也就人们常说的数模转换与模数转换。这时候已经完成了第一步,两个物理硬件之间的通信。这也就是我们通常所说的物理层万里长城第二步:小明想啊:我这两个物理硬件之间已经完成了通信,但是我怎么确保传输的数据是可靠的、安全的呢?因为小明想要求这封信是可靠的,安全的。他不想别人知道他喜欢小红。因为在我们实际生活当中物理线路往往是不可靠,不安全的。可能会被别人偷听到,网线被别人挖了等等。于是小明发明了数据链路层。通过数据链路层来确保数据的正确传输。当中就有一个叫数据包的家伙,通过一个个数据包来传输数据。数据包通过奇偶校验的形式或者其他的形式来校验数据是不是正确的。这个时候我们就完成了一个节点到另外一个节点数据包的传递。万里长城第三步:小明心想,这时候我已经可以把信发送到小红家了,可是万一小红不在家呢?在学校或者在其他某个地方旅游呢?那岂不是看不到我的信了?这时候小明发明了网络层,即路由器。这时候小明会先把他的数据包发送给路由器,然后路由器发送给路由器,一路传过去,最后发送到了小红所在的电脑上,这就是网络层。同时,小明为了标识网络层的各个节点,他定义了Ip协议。因此每个节点都会有个IP。万里长城第四步:小明心想,这时候在我们数据链路层,能保证数据是否是正确的,但是不能保证我们的数据是不是可靠的。这个时候,我们需要一个能够保证我们数据传输出错后,能够自动重传机制。自动校验数据是否是发对了。这时候小明发明了传输层。在传输层里面小明又制定了TCP/UDP协议。TCP协议是基于连接的,会在小明和小红电脑之间建立连接,在这个连接上去传输数据。万里长城第五步:这时候小明该做的也做了。可是我们的数据是为哪个应用服务的呢?是一个HTTP?还是一个FTP?还是一个Email的协议呢?这个就是小明发明的最后一个协议——应用层协议。这样小明就完成了从不可靠、不安全的一层到应用层,可靠又安全的五层协议。最后小明如愿的像小红表了白。至于小明有没有和小红在没在一起,那我不知道了。这也就是我们后来所熟知的OSI(网络七层协议模型)在七层协议中会有两层会被淡化,所以我们这里只讨论五层协议。不可靠丢包,重复包出错(只能通过重传来解决)乱序不安全容易被窃取信息(在网络层,通过路由打电话,随时都可能被黑客监听)窃取篡改文末本章节主要介绍了OSI(网络七层协议模型)如有不对的地方还望大家在下方留言欢迎关注公众号:Coder编程获取最新原创技术文章和相关免费学习资料,随时随地学习技术知识!Github个人主页目录Gitee个人主页目录参考文章:https://www.cnblogs.com/carlo…https://blog.csdn.net/taotong…

March 30, 2019 · 1 min · jiezi

最普及的开源SDN控制器OpenDaylight发布Neon版本庆祝成立六周年

作者:Jill Lovato仅用了6年时间,OpenDaylight拥有10个版本、1000多个作者/提交者、100K+提交、以及1B+全球订阅者的强大网络Neon版本加强了SDN控制器功能,并推动了对边缘、云原生和下游项目(如ONAP,Kubernetes和OpenStack)的支持旧金山 - 2019年3月26日 - LFN(LF Networking)促进网络项目的协作和卓越运营,今天宣布OpenDaylight(ODL),这个最普遍的开源软件定义网络(SDN)控制器,庆祝成立六周年发布OpenDaylight Neon版本。作为Linux基金会的第一个网络项目,现在是LFN的一部分,OpenDaylight于2013年成立,是一个开源框架,旨在加速采用、促进创新、并为SDN创建更加开放和透明的方法。如今,ODL已经成为最普及的开源SDN控制器,帮助支持1B全球网络用户。其第10版本OpenDaylight Neon展示了业界致力于培养开放、可扩展和可互操作的网络解决方案,并支持开发者、集成商和用户的生态系统。“这在很大程度上归功于模块化和可扩展的软件架构,这使得OpenDaylight可以在各种用例中使用。”OpenDaylight技术指导委员会主席Abhijit Kumbhare说。“Neon展示OpenDaylight的长寿以及与其他项目的集成,如Kubernetes、ONAP、OPNFV和OpenStack。”Linux基金会运营、网络和协调副总裁Phil Robb说。“社区在提供平台版本方面的凝聚力给我留下了深刻的印象,这些版本的更新和功能可以增强不断发展的SDN用例。”最普及的开源SDN控制器范围、多样性和部署:在短短六年时间里,OpenDaylight已经在1000多位作者/提交者的帮助下提供了10个版本,这些作者/提交者在数十个不同的组织中贡献了100K+提交。此外,基于ODL的解决方案可为超过1B的全球网络用户提供支持。来自顶级供应商和最终用户的支持:随着时间的推移,ODL社区的贡献已从一组精选的初始创建者转移到各种各样的全球用户和供应商,所有这些都构建和利用基于ODL的解决方案。按需贡献上游:作为一个强大的开源SDN控制器,ODL继续受到跨网络堆栈层的关键下游项目的追捧,包括Akraino Edge Stack、Kubernetes、OpenStack、ONAP、OPNFV等。更多行业合作伙伴继续部署ODL平台,实现开放式SDN/NFV的强大功能。最近的例子包括:Coweaver是韩国最大的光网络系统制造商之一,它使用ODL建立其网络管理服务(NMS),供韩国和全球供应商使用FRINX的UniConfig,现在由PANTHEON.tech的lighty.io提供支持,基于OpenDaylight,使供应商能够更快地构建和部署应用程序浪潮基于OpenDaylight的SDN控制器用于管理企业和政府云环境的虚拟和物理设备NoviFlow与Lumina Networks之间的合作伙伴关系是基于OpenDaylight的SDN控制器解决方案提供商,他们共同使用OpenDaylight作为解决方案的一部分,以创建和交付基于意图的Terabit规模网络,从而降低成本和网络复杂性。Lumina Networks还刚刚发布了Lumina扩展和适应平台(Lumina Extension & Adaptation Platform,LEAP),该平台将OpenDaylight的优势扩展到传统设备以及高级模型到模型转换,以及云原生应用(或微服务)开发环境。Telecom Argentina已选择OpenDaylight用于各种用例,包括启用CDN流量优化功能,以改善客户体验并降低数据传输成本与其他开源社区的整合继续增长,包括与OpenStack、Kubernetes、OPNFV和ONAP的合作。 ONAP在其APP-C、SDN-C和SDN-R项目中使用OpenDaylight,用于5G和CCVPN等用例与此同时,包括AT&T、CableLabs、中国移动、爱立信、Globo.com、Orange、腾讯、Verizon等在内的SDN采用者继续在其网络和解决方案中利用OpenDaylight。有关OpenDaylight用户故事的更多详细信息,请到此处。OpenDaylight Neon为关键的SDN用例带来了一流的功能Neon包括对网络用例非常重要的更新功能,例如光传输网络、WAN连接和路由、以及云和边缘环境中的虚拟网络。Neon还具有新的稳定性和可扩展性增强功能,巩固了该项目在与其他开源社区合作以加速下一代网络解决方案方面的领导地位。具体增强包括:云端/边缘网络虚拟化功能已通过Neon版本得到强化,进一步增强了OpenDaylight在生产网络中的适用性光传输基础设施控制现在提供新功能,确保使用开放的北桥API与更高级别的控制器互操作WAN连接。基于Fluorine成熟的BGP堆栈,Neon带来了增强功能,可改善错误报告、重启和网络稳定性提高稳定性和可靠性。除了功能增强和错误修复之外,Neon还包括稳定性和扩展性方面的改进。OpenDaylight继续进行基础架构增强,使供应商和下游开源项目更容易快速整合和部署依赖OpenDaylight的产品和平台。有关OpenDaylight Neon的更多详细信息,请到:https://www.opendaylight.org/…展望未来与4月3日至5日在加利福尼亚州圣何塞举行的开放网络峰会(ONS)一起,OpenDaylight将于2019年4月1日至2日举办一个开发者论坛,用于下一版“Sodium”。更多详情请点击此处: https://wiki.opendaylight.org…:Sodium_Dev_Forum。还将在ONS的LFN展位上展示OpenDaylight与Network Service Mesh的集成。定于2019年中期的ONAP Dublin版本将包括支持SDN-C和APP-C模块的OpenDaylight Fluorine版本。持续对OpenDaylight的支持AT&T“我们很高兴祝贺OpenDaylight六岁生日。”AT&T实验室技术人员杰出会员Brian Freeman说。“AT&T自从Hydrogen版本开始使用OpenDaylight,自2015年以来一直在进行生产部署。今天,我们使用BGPCEP和NETCONF在L3应用程序上进行全球部署。我们的部署从L0 OpenROADM设备的控制范围到L7移动PNF和VNF。毋庸置疑,我们期待试驾Neon版本并将其部署到生产中。“思科“OpenDaylight在短短六年内已经大规模发展,我从一开始就成为社区的一员,我感到非常自豪。”思科工程首席技术官兼首席架构师Dave Ward说。“随着一个庞大的、可永续发展的社区展示了各种开发者、供应商和最终用户之间的强大协作,它成为业界事实上的开源SDN控制器。很高兴看到有多少其他影响巨大的OSS项目正在使用ODL作为核心。我很高兴看到它向未来发展。生日快乐ODL!”爱立信“恭喜OpenDaylight社区关于Neon发布以及它成立六周年。”爱立信解决方案系列NFVi负责人Eric Ericsson表示。“爱立信继续积极向OpenDaylight社区上游贡献,并在我们的商用NFVi解决方案中使用ODL开源软件,使电信运营商能够发展5G,提高生产力,降低OPEX和CAPEX支出。这包括针对云服务的解决方案,以及提供云内和云间网络自动化、多租户和其他高级网络用例。迄今为止,爱立信已向全球50多家服务供应商部署了ODL软件。”浪潮“热烈祝贺OpenDaylight社区发布Neon和项目六周年。”浪潮云服务集团首席技术官Max Zhang表示。“浪潮的Cloud Engine SDN Controller 2.0基于OpenDaylight Nitrogen SR2版本,已在政府和企业云环境中部署。它可以帮助我们的客户快速灵活地部署业务,自动化网络管理,并显着降低运营和维护成本。未来的浪潮云引擎SDN控制器版本将继续使用最新、最稳定的OpenDaylight版本,为我们的客户提供更多功能。”Lumina Networks“OpenDaylight支持和制造的数字化转型并非易事。”Lumina Networks首席执行官Andrew Coward说。“但在六年之后,社区创新的这一令人印象深刻的努力,已经成功地开始向服务供应商重返网络控制和服务创新。能够为我们的共同目标做出贡献,并继续实现这些发布里程碑,我感到很荣幸。”红帽“OpenDaylight项目在六年多前开始实施一系列雄心勃勃的目标,从头开始创建一个社区,以构建一个不断发展、灵活和开源的软件定义网络平台。”Red Hat首席技术官Chris Wright说。“在这六年中,我们已经看到社区驱动创新的力量,将OpenDaylight从渴望转变为SDN开发者和用户的蓬勃发展的开源生态系统。祝贺ODL社区在推出Neon版本方面继续取得成功。”KubeCon + CloudNativeCon + Open Source Summit大会日期:会议日程通告日期:2019 年 4 月 10 日会议活动举办日期:2019 年 6 月 24 至 26 日KubeCon + CloudNativeCon + Open Source Summit赞助方案KubeCon + CloudNativeCon + Open Source Summit多元化奖学金现正接受申请KubeCon + CloudNativeCon和Open Source Summit即将首次合体落地中国KubeCon + CloudNativeCon + Open Source Summit购票窗口,立即购票!CNCF邀请你加入最终用户社区 ...

March 27, 2019 · 1 min · jiezi

手把手教你 Linux 是如何实现 VLAN 的

本文首发于我的公众号 cloud_dev,专注于干货分享,号内有大量书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫。01 准备环境环境:ubuntu 16.04 环境(物理 or 虚拟)确认 CPU 是否支持虚拟化:# egrep -o ‘(vmx|svm)’ /proc/cpuinfo# vmx如果不支持,开启 KVM 嵌套虚拟化之后再重启。1.1 安装 KVM 环境sudo apt-get install -y qemu-kvm qemu-system libvirt-bin virt-manager bridge-utils vlan1.2 安装 Ubuntu 图形化界面sudo apt-get install -y xinit gdm kubuntu-desktop02 创建 KVM 虚拟机使用 virt-manager 创建 KVM 虚拟机,方法比较简单,由于篇幅有限,大家可以查阅相关资料自行了解。创建完之后用 virsh list –all 查看创建的 VM:Id Name State—————————————————- - kvm1 shut off - kvm2 shut off - kvm3 shut off我们的实验拓扑如下:图中创建了 2 个 Linux Bridge:brvlan1 和 brvlan2,宿主机的物理网卡 eth0 抽象出两个虚拟设备 eth0.1 和 eth0.2,也就是两个 VLAN 设备,它们分别定义了两个 VLAN:VLAN1 和 VLAN2。挂接到两个 Bridge 上的网络设备自动加入到相应的 VLAN 中。VLAN1 接两个 VM,VLAN 接一个 VM。实验的目的是要验证属于同一个 VLAN1 中 VM1 和 VM2 能 ping 通,而属于不同 VLAN 中的 VM ping 不通。03 实验开始3.1 配置 VLAN编辑 /etc/network/interfaces,加入两个 Bridge 和两个 VLAN 设备的配置,如下:# The primary network interfaceauto ens33iface ens33 inet dhcpauto ens33.1iface ens33.1 inet manual vlan-raw-device ens33auto brvlan1iface brvlan1 inet manual bridge_stp off bridge_waitport 0 bridge_fd 0 bridge_ports ens33.1auto ens33.2iface ens33.2 inet manual vlan-raw-device ens33auto brvlan2iface brvlan2 inet manual bridge_stp off bridge_waitport 0 bridge_fd 0 bridge_ports ens33.2注意,这里务必和自己电脑的接口名称统一,比如我这里叫 ens33,就配 ens33.1 和 ens33.2 的 VLAN 设备,当然你也可以改成 eth0 的形式。重启宿主机,ifconfig 查看网络接口:用 brctl show 查看当前 Linux Bridge 的配置,ens33.1 和 ens33.2 分别挂载 brvlan1 和 brvlan2 上了。# brctl showbridge name bridge id STP enabled interfacesbrvlan1 8000.000c298c57e8 no ens33.1brvlan2 8000.000c298c57e8 no ens33.2virbr0 8000.000000000000 yes3.2 配置 VM我们先配置 VM1,启动 virt-manager,在图形界面中将 VM1 的虚拟网卡挂到 brvlan1 上:同样的方式配置 VM2 和 VM3,VM2 也配到 brvlan1 上,VM3 配到 brvlan2 上。3.3 查看 VM 配置用 virsh start xxx 启动 3 个 VM:# virsh start kvm1# virsh start kvm2# virsh start kvm3再通过 brctl show 查看 Bridge,这时发现 brvlan1 下接了 vnet0 和 vnet1,brvlan2 下接了 vnet2:# brctl showbridge name bridge id STP enabled interfacesbrvlan1 8000.000c298c57e8 no ens33.1 vnet0 vnet1brvlan2 8000.000c298c57e8 no ens33.2 vnet2virbr0 8000.000000000000 yes通过 virsh domiflist xxx 确认这就是 VM 的虚拟网卡:# virsh domiflist kvm1Interface Type Source Model MAC——————————————————-vnet0 bridge brvlan1 rtl8139 52:54:00:b3:dd:3a# virsh domiflist kvm2Interface Type Source Model MAC——————————————————-vnet1 bridge brvlan1 rtl8139 52:54:00:b7:4f:ef# virsh domiflist kvm3Interface Type Source Model MAC——————————————————-vnet2 bridge brvlan2 rtl8139 52:54:00:d8:b8:2a04 验证为了验证相同 VLAN 之间的连通性和不同 VLAN 之间的隔离性,我们为 3 个 VM 都配置同一网段的 IP。使用 virt-manager 进入 VM console 控制面。配置 VM1 的 IP:ifconfig eth0 192.168.100.10 netmask 255.255.255.0配置 VM2 的 IP:ifconfig eth0 192.168.100.20 netmask 255.255.255.0配置 VM3 的 IP:ifconfig eth0 192.168.100.30 netmask 255.255.255.0使用 VM1 ping VM2 能 ping 通,VM2 ping VM3 不能 ping 通。验证完毕。大家如果有兴趣,可以抓个包看看,在发送 ping 包之前,需要知道对方的 MAC 地址,所以会先在网络中广播 ARP 包。ARP 是二层协议,VLAN 的作用就是隔离二层的广播域,ARP 包自然就不能在不同 VLAN 中流通,所以在相同 VLAN 中,通信双方能够拿到对方的 MAC 地址,也就能 ping 通,不同 VLAN 反之。我的公众号 cloud_dev,号内有大量书籍和视频资源,后台回复「1024」即可领取,分享的内容包括但不限于云计算虚拟化、容器、OpenStack、K8S、雾计算、网络、工具、SDN、OVS、DPDK、Linux、Go、Python、C/C++编程技术等内容,欢迎大家关注。 ...

March 26, 2019 · 2 min · jiezi

虚拟机网络模型详解,看这篇就够了(图文并茂)

本文首发于我的公众号 cloud_dev,专注于干货分享,号内有大量书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫。01 从物理网络到虚拟网络著名的「六度分隔定理」说到,世界上任何两个互不相识的人,只需要最多六个人就能够建立起联系。这个定理成立的前提就是依托于庞大的网络结构。在虚拟化技术没出现之前,构成网络的元素都是实体的物理设备,比如交换机、路由器、网线等等,人们想要构建一个小型的局域网自己玩玩,都要买各种设备,成本高还不灵活。虚拟化技术普及之后,云计算开始大行其道,我们在自己的单机上就可以建各种虚拟机,想怎么玩就怎么玩。随之而来的就是网络变得更复杂了,由以前看得见摸得着的物理网络一下变成玄乎的虚拟网络了,好不容易建了几台虚拟机,发现网络不通,或者网络通了,但并不知道是怎么通的,这难言的苦水哽在喉咙实在令人不适。这篇文章就来说说虚拟机世界里的几种网络模型,我们主要以 VirtualBox 和 VMware Workstation 这两款目前最主流的桌面虚拟化软件作为例子。总的来说,目前有四种常见的网络模型:桥接(Bridge Adapter)NAT主机(Host-only Adapter)内部网络(Internal)这也是 VirtualBox 支持的四种模型,对于 VMware,则只有前三种。下图显示了 VirtualBox 支持的几种网络模型:02 桥接(Bridge Adapter)虚拟机桥接网络模型就是使用虚拟交换机(Linux Bridge),将虚拟机和物理机连接起来,它们处于同一个网段,IP 地址是一样的。如下图所示:图一在这种网络模型下,虚拟机和物理机都处在一个二层网络里面,所以有:虚拟机之间彼此互通虚拟机与主机彼此可以互通只要物理机可以上网,那么虚拟机也可以。我们来验证下:桥接网络的好处是简单方便,但也有一个很明显的问题,就是一旦虚拟机太多,广播就会很严重。所以,桥接网络一般也只适用于桌面虚拟机或者小规模网络这种简单的形式。03 NAT另一种模型是 NAT,即网络地址转换(Network Address Translatation)。这种模型严格来讲,又可以分为 NAT 和 NAT 网络两种,我们看上面的图 1 也可以看到。根据 NAT 的原理,虚拟机所在的网络和物理机所在的网络不在同一个网段,虚拟机要访问物理所在网络必须经过一个地址转换的过程,也就是说在虚拟机网络内部需要内置一个虚拟的 NAT 设备来做这件事。但其中 NAT 和 NAT 网络 两者还有些许的不同:NAT:主机上的虚拟机之间是互相隔离的,彼此不能通信(它们有独立的网络栈,独立的虚拟 NAT 设备)NAT 网络:虚拟机之间共享虚拟 NAT 设备,彼此互通。如下图,展示了两者细微的差别:PS:NAT 网络模式中一般还会内置一个虚拟的 DHCP 服务器来进行 IP 地址的管理。下面我们通过实验来验证一下两种模式的区别,首先是 NAT 模式:访问外网没问题:访问其他虚拟机:可以看到,两个虚拟机由于有隔离的网络栈,所以它们的 IP 地址并不在一个网段,所以 ping 不通。再来看 NAT 网络,访问外网同样没问题,我们来看下 VM 之间的互通:可以看到,差别体现出来了,NAT 网络 虚拟机之间共享网络栈,它们的 IP 地址处于同一个网段,所以彼此是互通的。总结一下,以上两种 NAT 模式,如果不做其他配置,那么有:虚拟机可以访问主机,反之不行如果主机可以上外网,那么虚拟机也可以对于 NAT,同主机上的虚拟机之间不能互通对于 NAT 网络,虚拟机之间可以互通PS:如果做了 端口映射 配置,那么主机也可以访问虚拟机。04 主机网络(Host-only Adapter)主机网络顾名思义,就是只限于主机内部访问的网络,虚拟机之间彼此互通,虚拟机与主机之间彼此互通。但是默认情况下虚拟机不能访问外网(注意:这里说的是默认情况下,如果稍作配置,也是可以的)。主机网络看似简单,其实它的网络模型是相对比较复杂的,可以说前面几种模式实现的功能,在这种模式下,都可以通过虚拟机和网卡的配置来实现,这得益于它特殊的网络模型。主机网络模型会在主机中模拟出一块虚拟网卡供虚拟机使用,所有虚拟机都连接到这块网卡上,这块网卡默认会使用网段 192.168.56.x(在主机的网络配置界面可以看到这块网卡),如下是基本的拓扑图示:默认情况下,虚拟机之间可以互通,虚拟机只能和主机上的虚拟网卡互通,不能和不同网段的网卡互通,更不能访问外网,如果想做到这样,那么需要如图中 红虚线 所示,将物理网卡和虚拟网卡桥接或共享。在主机上做如下设置即可:通过以上配置,我们来验证一下,虚拟机可以访问主机物理网卡和外网了:05 内部网络(internal)最后一种网络模型是内部网络,这种模型是相对最简单的一种,虚拟机与外部环境完全断开,只允许虚拟机之间互相访问,这种模型一般不怎么用,所以在 VMware 虚拟机中是没有这种网络模式的。这里我们就不多说了。06 总结虚拟机的四种网络模型:桥接、NAT、主机和内网模型。下面以一张表来描述它们之间的通信行为:ModelVM -> hosthost -> VMVM <-> VMVM -> InternetInternet -> VMBridged+++++NAT+Port Forwarding-+Port ForwardingNAT Network+Port Forwarding++Port ForwardingHost-only+++–Internal–+–参考:https://technology.amis.nl/20…https://blog.csdn.net/niqinwe…我的公众号 cloud_dev,号内有大量书籍和视频资源,后台回复「1024」即可领取,分享的内容包括但不限于云计算虚拟化、容器、OpenStack、K8S、雾计算、网络、工具、SDN、OVS、DPDK、Linux、Go、Python、C/C++编程技术等内容,欢迎大家关注。 ...

March 25, 2019 · 1 min · jiezi

Linux 虚拟网络设备详解之 “vRouter”

本文首发于我的公众号 cloud_dev,专注于干货分享,号内有大量书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫。这篇文章继上篇文章 Linux 虚拟网络设备详解之 Bridge,上篇发表之后,有读者问我这样一个问题:我的回答基本上是一句废话,因为只要你知道点网络的基础知识,肯定知道这种情况要走三层路由。但知道归知道,不实践永远不知道自己是不是真的知道(有点绕),我相信那位读者也是希望我能讲讲这其中具体是怎么路由的,今天这篇文章就来说说这个。Linux 本身就是一台路由器前面的文章我们学习了多种虚拟的网络设备,包括网卡、交换机等,也了解了怎么用工具来操作这些设备,那么,回到今天的主题,路由器有没有对应的虚拟设备,能不能也用相关工具来操作呢,这个答案如果要深究的话,也是有的,比如 OpenStack 的 DVR、一些开源的虚拟路由器实现等等。不过我们不做那么深究的讨论,简化问题,Linux 系统实际上没有实现相关的虚拟路由器设备,自然也没有工具可以操作路由器,因为 Linux 本身就是一台路由器。(这也是我文章的标题对 vRouter 打双引号的原因)Linux 提供一个开关来操作路由功能,就是 /proc/sys/net/ipv4/ip_forward,默认这个开关是关的,打开只需:echo 1 > /proc/sys/net/ipv4/ip_forward但这种打开方式只是临时的,如果要一劳永逸,可以修改配置文件 /etc/sysctl.conf,添加或修改项 net.ipv4.ip_forward 为:net.ipv4.ip_forward = 1即可。实践为了降低大家实践的难度,我们就不创建虚拟机了,直接使用 namespace,一条 ip 命令就可以搞定所有的操作。我们按照下面的图示进行操作(NS1 和 NS2 分布在不同网段):创建两个 namespace:ip netns add ns1ip netns add ns2创建两对 veth-pair,一端分别挂在两个 namespace 中:ip link add v1 type veth peer name v1_rip link add v2 type veth peer name v2_rip link set v1 netns ns1ip link set v2 netns ns2分别给两对 veth-pair 端点配上 IP 并启用:ip a a 10.10.10.1/24 dev v1_rip l s v1_r upip a a 10.10.20.1/24 dev v2_rip l s v2_r upip netns exec ns1 ip a a 10.10.10.2/24 dev v1ip netns exec ns1 ip l s v1 upip netns exec ns2 ip a a 10.10.20.2/24 dev v2ip netns exec ns2 ip l s v2 up验证一下: v1 ping v2,结果不通。看下 ip_forward 的值:[root@by ~]# cat /proc/sys/net/ipv4/ip_forward0没开路由怎么通,改为 1 再试,还是不通。看下 ns1 的路由表:[root@by ~]# ip netns exec ns1 route -nKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface10.10.10.0 0.0.0.0 255.255.255.0 U 0 0 0 v1只有一条直连路由,没有去往 10.10.20.0/24 网段的路由,怎么通?那就给它配一条:[root@by ~]# ip netns exec ns1 route add -net 10.10.20.0 netmask 255.255.255.0 gw 10.10.10.1[root@by ~]# ip netns exec ns1 route -nKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface10.10.10.0 0.0.0.0 255.255.255.0 U 0 0 0 v110.10.20.0 10.10.10.1 255.255.255.0 UG 0 0 0 v1同理也给 ns2 配上去往 10.10.10.0/24 网段的路由。最后再 ping,成功了![root@by ~]# ip netns exec ns1 ping 10.10.20.2PING 10.10.20.2 (10.10.20.2) 56(84) bytes of data.64 bytes from 10.10.20.2: icmp_seq=1 ttl=63 time=0.071 ms64 bytes from 10.10.20.2: icmp_seq=2 ttl=63 time=0.070 ms^C— 10.10.20.2 ping statistics —2 packets transmitted, 2 received, 0% packet loss, time 1000msrtt min/avg/max/mdev = 0.070/0.070/0.071/0.008 ms总结Linux 本身是一台路由器。上面的实验使用 namespace 效果和使用虚拟机是一样的,关键是知道有这个功能,知道怎么用就差不多了。我的公众号 cloud_dev,号内有大量书籍和视频资源,后台回复「1024」即可领取,分享的内容包括但不限于云计算虚拟化、容器、OpenStack、K8S、雾计算、网络、工具、SDN、OVS、DPDK、Linux、Go、Python、C/C++编程技术等内容,欢迎大家关注。 ...

March 20, 2019 · 2 min · jiezi

对libuv的C++封装

libuv_cpp11是一个基于libuv的C++封装网络库。接口较为简单易用,并对libuv一些特性做了扩展及优化。压力测试结果稳定、高效。未发现内存泄漏及崩溃。为什么需要封装libuv截至目前,C++没有标准网络库,常见的有ACE和boost.asio。ACE较为庞大臃肿,封装复杂,个人不推荐。boost.asio是boost库的一部分,需要依赖boost的部分实现,使用asio需要在项目引入较为庞大的boost库。而C语言的网络库主要有libevent、libev及libuv。libuv是nodejs的底层,较为成熟。所以如果在项目需要一套轻量级,且没有太多依赖的网络组件,最好的办法,还是自己封装一套。libuv_cpp11功能简介1.实现了C++功能的回调首先libuv是一个C语言库,意味着回调函数是C语言的回调,所以直接使用libuv网络消息回调,相关对象必须是全局的或者static对象,这是令人难以容忍的。这里通过libuv的用户数据功能实现了C++风格的回调,回调函数可以类成员函数,或者lambda。同时封装了TcpServer及TcpClient等类,简化编程。2.对线程安全做了优化libuv是一个非线程安全的库,跨线程发送数据数不允许的。libuv_cpp11中实现了线程安全的跨线程write数据操作。基于libuv的async异步机制实现,同时在跨线程调用时候会检查当前调用线程,如果在该loop线程中则直接发送,减少了不必要的性能损耗。实现如下:void uv::EventLoop::runInThisLoop(const std::function<void()>& func){ if (nullptr == func) return; if (isRunInLoopThread()) { func(); return; } async_->runInThisLoop(func);}同时libuv的aysnc接口存在多次调用一次执行的可能(问题),比如有些操作需要在回调里面释放数据,这样就会内存泄漏。libuv_cpp11中的Async类优化这个问题,确保每次调用一定会被执行。3.实现了定时器及时间轮对libuv定时器做了一层封装,并实现了一个时间复杂度O(1)的时间轮,用于检测心跳超时。4.实现整包发送/接受协议机制实现了ListBuffer和CycleBuffe两种缓存机制,用于解决TCP的粘包及残包。数据会重新组成完整的包数据用于读取。性能测试显示CycleBuffe会损失20%~30%的性能。5日志接口libuv_cpp11没有实现日志功能,但是保留了接口,可以注册/绑定到自定义日志库中使用。libuv_cpp11的使用详见example文件夹:https://github.com/wlgq2/libu…

March 19, 2019 · 1 min · jiezi

ONS的社区演示突出LFN项目的协调

作者:Brandon Wick自LFN(LF Networking)成立一年多以来,该项目继续展示战略增长,Telstra于11月加入,该项目占全球移动用户的70%左右。与技术项目的服务供应商并肩工作,对确保LFN满足其要求至关重要。这些集成和创新的一小部分,将在4月3日至5日,在加利福尼亚州圣何塞举行的ONS(开放网络峰会)活动的LFN展台再次展出。我们很高兴今年能回到湾区,并提供Day Pass和Hall Pass选项。立即注册!由于社区的需求,我们将演示站的数量从8个增加到10个,并涵盖了开放式网络堆栈中的许多区域,来自LF Networking伞内的项目(FD.io、OpenDaylight、ONAP、OPNFV和Tungsten Fabric),以及相邻项目Consul、Docker、Envoy、Istio、Ligato、Kubernetes、Openstack和SkyDive等。我们欢迎你花一些时间与技术社区的这些专家交流学习。来自iConectiv、华为和沃达丰的成员将展示LFN对项目协调的承诺,他们将重点介绍ONAP的测试虚拟网络功能(VNF)的入职流程,与OPNFV的Dovetail项目集成,支持不断扩展的OPNFV验证计划(OVP),为未来的合规性和认证测试铺平了道路。项目协调的另一个例子是使用通用基础设施进行LFN项目测试,UNH-IOL的人员将随时为用户讲解实验室即服务,通过托管硬件和提供社区链接便利开发和测试。其他重点领域包括网络切片、服务网格、SDN性能、测试、集成和分析。下面列出的是完整的网络演示阵容,你可以在此处阅读每个演示的详细说明。展示服务供应商特定测试和验证要求(OPNFV,ONAP) - 沃达丰提出并由沃达丰/华为/iConectiv演示ODL和NSM的集成(OpenDaylight,Network Service Mesh) - 由Lumina Networks演示多数据路径之间的SDN性能比较(Tungsten Fabric,FD.io) - 由ATS和Sofioni Networks演示ONAP BBS(Broadband Service,宽带服务)用例(ONAP,OPNFV) - 由Swisscom,华为和诺基亚演示零停机应用的OpenStack滚动升级(OPNFV,OpenStack) - 由诺基亚和德国电信演示Skydive和VPP集成:拓扑分析仪(FD.io,Ligato,Skydive,Docker) - 由PANTHEON.tech演示VSPERF:超越绩效指标,走向因果分析(OPNFV) - 由思博伦通信和AT&T演示基于ONAP生命周期管理(ONAP)的网络切片 - 由AT&T和爱立信演示服务网格和SDN:大规模集群负载均衡(Tungsten Fabric,Linux OS,Istio,Consul,Envoy,Kubernetes,HAProxy) - 由Tungsten Fabric社区演示实验室即服务2.0演示(OPNFV) - 由UNH-IOL演示我们希望在展会上见到你!立即注册!KubeCon + CloudNativeCon + Open Source Summit大会日期:会议日程通告日期:2019 年 4 月 10 日会议活动举办日期:2019 年 6 月 24 至 26 日KubeCon + CloudNativeCon + Open Source Summit赞助方案KubeCon + CloudNativeCon + Open Source Summit多元化奖学金现正接受申请KubeCon + CloudNativeCon和Open Source Summit即将首次合体落地中国KubeCon + CloudNativeCon + Open Source Summit购票窗口,立即购票!CNCF邀请你加入最终用户社区 ...

March 19, 2019 · 1 min · jiezi

如何优雅地定位外网问题?

本文由云+社区发表作者:elson现状分析在定位外网问题时,最怕的是遇到无法复现或者是偶现的问题,我们无法在用户的设备上通过抓包、打断点或日志来分析问题,只能靠仅有的页面截图和用户的片面描述作为线索。此时,也只能结合“猜想法”和“排除法”进行分析定位,排查了半天也很有可能没有结果,最后只能回复“可能是缓存或者app的原因,请清下缓存或者重新安装app试试”。导致我们定位外网问题时效率低下,主要还是因为缺乏定位线索;其次由于用户并不了解技术层面的前因后果,他们可能会忽略掉一些关键信息,或者提供了带有误导性的线索。常见的外网问题成因从笔者实际上所遇到的外网问题进行归类,主要有以下成因:后台数据返回异常,或部分数据为空;针对边界情况,页面未做相对应的容错措施,导致页面报错;用户的网络环境、APP版本问题;通过上一级入口进入页面时,漏传部分参数;与用户特定的操作步骤相关所引发。针对页面JS报错,我们已有脚本异常上报监控机制,业界也不乏相关的优秀开源产品,如sentry。但往往很多情况下的用户反馈以及外网异常并不是脚本异常引起的,此时无法触发异常上报。因此针对这部分场景,我们需要有另一套机制进行上报监控,辅助我们定位分析。用户的行为轨迹的重要性从上面的问题成因可以得出,如果我们能采集到并结合以下几方面数据,那外网异常的定位自然会事半功倍:页面的运行环境页面所加载的数据页面JS报错信息用户的操作日志(时间线)我们可以通过时间戳将以上数据串联起来,形成时间线。这样一来,页面的运行环境、页面中每个动作相关的数据、动作之间先后关系就会一目了然,就像一部案发现场的录像。因此这里强调“轨迹”的重要性,能够把散乱的数据串联起来,这对我们分析定位问题非常有帮助。基于上面的分析结论,我们搭建了一套用户行为轨迹追踪系统,大致工作流程为:在页面中加载JS SDK用于数据记录和上报,服务器接收并处理数据,再以接口的方式提供数据给内部查询系统,支持通过用户UIN以及页面地址进行查询。下面我们从报什么、怎么报、服务器如何处理数据、数据怎样展示四方面具体谈一下整体的设计思路。设计思路报什么:确定上报内容及协议根据上面的分析,我们已经初步得出了需要上报的数据内容。上报的内容最终需要落地到查询系统中,因此首先需要确定怎样查询。我们将用户在某页面的单次访问作为基本查询单位,假设某用户访问了3次A页面,那么在查询平台中就可以查出3条记录,每条记录可以包含多条不同类型的子记录,它们共用“基础信息”。大致的数据结构如下:const log = { baseInfo: {}, childLogs: [{…}, {…}, …]};基础信息baseInfo中记录的是页面的运行环境,可以称为“基础信息”,具体包括以下字段:字段名描述可选参数FtraceId某次页面访问的唯一标识(自动生成) Fuanavigator.userAgent FclientType客户端类型0:未知 1:qqmusic 2:weixin 3:mqqFos系统0:未知 1:ios 2:androidFurl页面地址 navigator.userAgent Frefer页面上级入口 document.referrer FloginType帐号类型0:wx 1:qqFuin用户帐号 childLogs中保存所有子记录,以下是子记录的公用字段以及三种不同类型。子记录公共字段每条子记录需要记录时间戳、标识上报类型,因此需要定义以下的公共字段:字段名描述可选参数/格式备注Flogtype上报类型0: ajax通信 1:用户操作 2:报错异常 FtimeStamp时间戳 串联不同类型的上报记录,形成轨迹Forder数字顺序Number当前记录在整条轨迹中的自增序号Forder的作用在于当两条记录的 FtimeStamp 值相同时,作为辅助的排序依据。子记录类型1:ajax通信记录页面中所有ajax通信的数据,方便排查异常是否与后台数据有关。字段名描述可选参数FajaxSendTimeajax请求发起时间点 FajaxReceiveTimeajax数据接收到时间点 FajaxMethodajax请求类型0:get 1:postFajaxParamajax请求参数 FajaxUrlajax请求链接 FajaxReceiveDataajax请求到的数据 FajaxHttpCodehttp返回码(200, 404) FajaxStateCode后台返回的业务相关code码 子记录类型2:用户操作行为记录打点数据以及用户点击操作的DOM上的数据字段名描述可选参数/格式FtraceContent自定义上报内容StringFdomPath操作目标DOM的xpath Fattr目标DOM的所有data-attr属性及其值{att1: ‘123’, att2: ‘234’}子记录类型3:报错异常记录JS报错信息以及我们手动抛出的异常信息字段名描述可选参数/格式备注FerrorType错误类型0:原生错误 1:手动抛出的异常 FerrorStack错误堆栈 仅原生错误报FerrorFilename出错文件 FerrorLineNo出错行 FerrorColNo出错列位置 FerrorMessage错误描述原生错误的errmsg或者开发自定义 怎么报:SDK的数据采集及上报策略上述的数据需要通过页面加载SDK进行采集,那么怎样采集,如何上报?数据采集方式从业务场景以及常见的外网问题考虑,我们只关注带有登录态的场景。对于未登录或获取不到登录态的场景,SDK不做任何数据采集和上报。( 1 ) 基础信息FtraceId可以直接搜 uuid 的生成算法,用户每进入页面时自动生成一个,后续采集的子记录共用此 ID。其他字段则可以从 cookie 或者原生 API 中获取,这里不再赘述。( 2 ) ajax 通信数据这里用到了一个开源组件 Ajax-hook ,源码很简练,GZIP 后只有 639 字节。主要原理是通过代理 XMLHttpRequest 以及相关实例属性和方法,提供各个阶段的钩子函数。hookAjax({ open: this.handleOpen, onreadystatechange: this.handleStage});一次 ajax 通信包含 open,send,readyStateChange 等阶段,因此需要在不同阶段的钩子函数中采集从请求发起到接收到请求响应的各方面数据。具体来说在 open 中可以采集:请求发起时间点、请求方法、请求参数等。需要注意过滤掉无用的请求,如数据采集后的上报请求。send 中主要用于采集 POST 请求的请求参数。handleOpen(arg, xhr) { const urlPath = arg[1] && arg[1].split(’?’); xhr.urlPath = urlPath[0]; // 过滤掉上报请求 if (/stat.y.qq.com/.test(urlPath[0])) { return; } curAjaxFields = $.extend({}, ajaxFields, { FtimeStamp: getNowDate(), FajaxSendTime: getNowDate(), FajaxMethod: arg[0] ? methodMap[arg[0].toUpperCase()] : ‘’, FajaxUrl: urlPath[0], FajaxParam: urlPath[1], Forder: logger.order++ }); xhr.curAjaxFields = curAjaxFields; const _oriSend = xhr.send.bind(xhr); xhr.send = function(body) { // POST请求 获取请求体中的参数 if (body) { curAjaxFields.FajaxParam = body; } _oriSend && _oriSend(body); }; }在 readyStateChange 中,当 xhr.readyState 为 2(HEADERS_RECEIVED) 或 4(DONE) 时,分别采集 FajaxReceiveTime 和 响应数据相关数据。这里需要注意的,为了把前期从 open 和 send 中采集到的数据传递下来,我们将数据对象挂载在当前 xhr 对象上: xhr.curAjaxFields = curAjaxFields; 。handleStage({ xhr }) { // 过滤掉上报请求 if (/stat.y.qq.com/.test(xhr.urlPath)) { return; } switch (+xhr.readyState) { case 2: // HEADERS_RECEIVED $.extend(xhr.curAjaxFields, { FajaxReceiveTime: getNowDate(), FajaxHttpCode: xhr.status }); break; case 4: // DONE const xhrResponse = xhr.response || xhr.responseText; let jsonRes; try { // 如果回包不是json格式的话会报错 jsonRes = xhrResponse ? JSON.parse(xhrResponse) : ‘’; … } catch (e) { console.error(e); } $.extend(xhr.curAjaxFields, { FajaxReceiveData: xhrResponse, FajaxStateCode: jsonRes ? getStateCode(jsonRes).join(’,’) : ’’ }); break; } }( 3 ) 用户操作行为通过事件代理,在 document 上监听指定类 .js_qm_tracer 的事件回调。在回调中通过event.path 取到当前 dom 的路径;通过 event.currentTarget.attributes 取到当前 dom 上的所有属性。同时还提供 API 实现自行上报 action.report(data)。$(document).on(‘click’, ‘.js_qm_trace’, e => { const target = e.currentTarget; // 时间戳 let FtimeStamp = getNowDate(); // Dom的xpath let FdomPath = getDomPath(e.path); // dom的所有data-attr属性以及值 let Fattr, FtraceContent = null; if (target.hasAttributes()) { let processedData = processAttrMap(target.attributes); Fattr = processedData.Fattr; FtraceContent = processedData.FtraceContent; } ……});上报策略上面的数据,如果我们记录一条就上报一条,这无疑是给自己制造DDOS攻击。此外,我们的初衷在于帮助排查外网问题,因此在我们需要用的时候再报上来就行了。所以需要引入本地缓存和用户白名单机制,采集完先在本地缓存起来,需要的时候再根据用户白名单“捞取”。本地缓存机制我们选用的是 IndexedDB,它容量大( 500M ),异步读写的特性保证其不会对页面渲染产生阻塞,此外还支持建立自定义索引,易于检索,更适合管理采集到的数据。用户白名单机制则是通过一个后台服务,SDK初始化后都会先查询当前用户和页面URL是否均在白名单中,是的话则将之前缓存的数据进行上报,而之后的用户行为操作也会直接上报,不再先缓存。但如果遇到JS错误报错,属于紧急情况,这时则不再遵循“缓存优先”,而是直接上报错误信息以及当前采集到的其他数据。上报策略流程图:白名单机制流程图:获取到白名单用户的数据需要用户再次访问页面,一方面从性能和开发成本考虑,另一方面反馈外网问题的用户很大概率是会再次访问当前页面的。只需要再次进入页面,无需额外操作,这样对用户来说也没有沉重的操作成本和沟通成本,简单易操作。数据处理:服务器对数据的处理策略( 1 ) 首先,数据上报请求经过 nginx 服务器后,会生成 access.log。http { log_format trace ‘$request_body’; server { location /trace/ { client_body_buffer_size 1000m; client_max_body_size 1000m; proxy_pass http://127.0.0.1:6699/env; access_log /data/qmtrace/log/access.log trace; } } server { listen 6699; location /env/ { client_max_body_size 1000m; alias /data/qmtrace/; } }}使用 nginx 日志进行记录,主要是因为 nginx 优异的性能,能抗住高并发;此外其接入和维护成本也较低。这里在处理 POST 请求的日志时,遇到一个坑。如果不经过 proxy_pass 转发一次的话,nginx 无法对 POST 请求产生日志记录。此外需要注意的是缓冲区的大小, client_body_buffer_size 默认只有 8K 或 16K,如果实际请求体大小超过了它,那就会被忽略,无法产生日志记录。( 2 ) 通过 crontab 每五分钟定期处理一次 access.log将 access.log 移动到相应的以年月日小时命名的目录下,生成 access${minute}.log。移走 access.log 之后,此时需要执行以下命令,发送通知给 nginx,收到通知后会重新生成新的 access.log。kill -USR1 cat ${nginx_pid}最后用node脚本,对 access${minute}.log 进行解析处理后入库。数据展示:搭建查询平台查询平台采集到的数据,在内部查询平台通过用户 UIN 进行检索,同时支持输入特定的页面 URL,进一步聚焦检索结果。在之前我们提到,将用户在某页面的单次访问作为基本查询单位,假设某用户访问了3次A页面,那么在左侧就会检索出3条记录(每条记录都有唯一标识 FtraceId )。为了查询平台的性能考虑,每次查询只会返回左侧的记录列表以及第一条记录的详细信息。点击其他记录再根据 FtraceId 进行异步查询。右侧展示的是某条记录的详细信息,通过时间线的形式将用户在某次页面访问期间的行为轨迹直观地展示出来。通过客观且直观的用户轨迹数据,我们就可以更高效更有针对性地分析定位外网问题。总结我们通过报什么(上报内容及协议)、怎么报(SDK采集及上报策略)、数据如何处理、数据怎样展示,四个方面介绍了如何搭建用户行为轨迹追踪系统。目前只是个初级版本,有很多地方需要继续完善和改进。有了追踪用户轨迹数据,能够从很大程度上有效灵活地应对用户反馈和外网异常,从而也很好地提升了我们的工作效率。参考前端异常监控解决方案研究监控平台前端SDK开发实践浏览器数据库 IndexedDB 入门教程Ajax-hook 原理解析此文已由腾讯云+社区在各渠道发布获取更多新鲜技术干货,可以关注我们腾讯云技术社区-云加社区官方号及知乎机构号 ...

March 19, 2019 · 2 min · jiezi

Linux 虚拟网络设备详解之 Bridge 网桥

本文首发于我的公众号 CloudDeveloper(ID: cloud_dev),专注于干货分享,号内有大量书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫。前面几篇文章介绍了 tap/tun、veth-pair,今天这篇来看看 Bridge。Bridge 是什么同 tap/tun、veth-pair 一样,Bridge 也是一种虚拟网络设备,所以具备虚拟网络设备的所有特性,比如可以配置 IP、MAC 等。除此之外,Bridge 还是一个交换机,具有交换机所有的功能。对于普通的网络设备,就像一个管道,只有两端,数据从一端进,从另一端出。而 Bridge 有多个端口,数据可以从多个端口进,从多个端口出。Bridge 的这个特性让它可以接入其他的网络设备,比如物理设备、虚拟设备、VLAN 设备等。Bridge 通常充当主设备,其他设备为从设备,这样的效果就等同于物理交换机的端口连接了一根网线。比如下面这幅图通过 Bridge 连接两个 VM 的 tap 虚拟网卡和物理网卡 eth0。VM 同主机通信以这个图来简单说明下,借助 Bridge 来完成同主机两台 VM 的之间的通信流程。首先准备一个 centos 或 ubuntu 虚拟机,然后创建一个 bridge:ip link add br0 type bridgeip link set br0 up然后通过 virt-manager 创建两个 kvm 虚拟机:kvm1 和 kvm2(前提得支持嵌套虚拟化),将它们的 vNIC 挂到 br0 上,如下图:kvm 虚机会使用 tap 设备作为它的虚拟网卡,我们验证下:# ps -ef | grep kvm1libvirt+ 3549 1 87 ? 00:22:09 qemu-system-x86_64 -enable-kvm -name kvm1 … -netdev tap,fd=26,id=hostnet0,vhost=on,vhostfd=28 …可以看到,其中网络部分参数,-netdev tap,fd=26 表示的就是连接主机上的 tap 设备。创建的 fd=26 为读写 /dev/net/tun 的文件描述符。使用 lsof -p 3549 验证下:# lsof -p 3549COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME…qemu-system 3549 libvirt-qemu 26u CHR 10,200 0t107 135 /dev/net/tun…可以看到,PID 为 3549 的进程打开了文件 /dev/net/tun,分配的文件描述符 fd 为 26。因此,我们可以得出以下结论:在 kvm 虚机启动时,会向内核注册 tap 虚拟网卡,同时打开设备文件 /dev/net/tun,拿到文件描述符 fd,然后将 fd 和 tap 关联,tap 就成了一端连接着用户空间的 qemu-kvm,一端连着主机上的 bridge 的端口,促使两者完成通信。下面分别给两虚机配上 IP:10.1.1.2/24 和 10.1.1.3/24,ping 一下:在 bridge 上抓个包看看:可以看到,br0 上抓到 ping 的 ICMP echo 包和 ARP 包。Bridge 常用使用场景Bridge 设备通常就是结合 tap/tun、veth-pair 设备用于虚拟机、容器网络里面。这两种网络,在数据传输流程上还有些许不同,我们简单来看下:首先是虚拟机网络,虚拟机一般通过 tap/tun 设备将虚拟机网卡同宿主机里的 Bridge 连接起来,完成同主机和跨主机的通信。如下图所示:【图片来源于网络,侵权必删】虚拟机发出的数据包通过 tap 设备先到达 br0,然后经过 eth0 发送到物理网络中,数据包不需要经过主机的的协议栈,效率是比较高的。其次是容器网络(容器网络有多种引申的形式,这里我们只说 Bridge 网络),容器网络和虚拟机网络类似,不过一般是使用 veth-pair 来连接容器和主机,因为在主机看来,容器就是一个个被隔离的 namespace,用 veth-pair 更有优势。如下图所示:【图片来源于网络,侵权必删】容器的 Bridge 网络通常配置成内网形式,要出外网需要走 NAT,所以它的数据传输不像虚拟机的桥接形式可以直接跨过协议栈,而是必须经过协议栈,通过 NAT 和 ip_forward 功能从物理网卡转发出去,因此,从性能上看,Bridge 网络虚拟机要优于容器。总结Linux Bridge 是虚拟交换机,功能和物理交换机一样,用于连接虚拟机和容器。虚拟机网络和容器网络的区别。Bridge 是偏低级的工具,更高级的工具是 Open vSwitch,这个工具后面再详说。我的公众号 CloudDeveloper(ID: cloud_dev),号内有大量书籍和视频资源,后台回复「1024」即可领取,分享的内容包括但不限于云计算虚拟化、容器、OpenStack、K8S、雾计算、网络、工具、SDN、OVS、DPDK、Linux、Go、Python、C/C++编程技术等内容,欢迎大家关注。 ...

March 19, 2019 · 1 min · jiezi

ONS演进:给运营商和企业的云、边缘和技术内容

作者:Arit Joshipura,Linux基金会网络、Edge&IoT总经理。第一届开放网络峰会(Open Networking Summit)于2011年10月在斯坦福大学举行,被称为“关于OpenFlow和软件定义网络(SDN)的首要活动”。七年半之后,我们到了现在,我一直惊讶从那时起已经走了多远,而且像电信这样一个传统的缓慢发展的行业,正在以多么快的速度接受由开放源码驱动的变革和创新。去年秋天在阿姆斯特丹举行的ONS峰会上,Network World将开放源码网络描述为“新的规范”,事实上,开放平台已经成为事实上的网络标准。与技术一样,ONS作为一项活动也在不断发展,以满足行业需求,旨在帮助你利用这场网络革命。今年活动的主题是“支持协作发展和创新”,我们通过探索企业、服务供应商和云供应商,在SDN、NFV、VNF、CNF/云原生网络、编排、云自动化、核心网络、边缘、接入、物联网服务等关键领域的协作开发和创新来实现这一目标。ONS的一个独特之处,在于它促进在活动中把令人兴奋的主题、行业和业务讨论同时,进行深入的技术讨论。来自网络项目社区的最新创新,包括LF Networking(ONAP、OpenDaylight、OPNFV、Tungsten Fabric)都会参与该活动,以及LFN UnConference Track和LFN Networking Demos等。各种活动经验确保与会者有充分的机会在会议、博览会大厅和社交活动中会面和互动。今年的新安排是专题结构旨在深入涵盖关键主题,以满足CIO/CTO/架构师和开发者、系统管理员、NetOps和DevOps团队的需求:运营商和云开发者(DevOps)云原生网络(适用于运营商和企业)企业IT和运营(开发和业务)新边缘开放创新的世界及其对网络的影响ONS的日程安排现已上线,查找将帮助你学习如何参与将对你的网络生涯产生影响的开放源码社区和生态系统的课程和教程。如果你需要帮助说服你的老板,这会帮助你立案。标准价格3月17日到期,所以赶快在今天登记吧!请务必查看Day Passes和Hall Passes。我希望在那里见到你!KubeCon + CloudNativeCon + Open Source Summit大会日期:会议日程通告日期:2019 年 4 月 10 日会议活动举办日期:2019 年 6 月 24 至 26 日KubeCon + CloudNativeCon + Open Source Summit赞助方案KubeCon + CloudNativeCon + Open Source Summit多元化奖学金现正接受申请KubeCon + CloudNativeCon和Open Source Summit即将首次合体落地中国KubeCon + CloudNativeCon + Open Source Summit购票窗口,立即购票!CNCF邀请你加入最终用户社区

March 15, 2019 · 1 min · jiezi

一文掌握 Linux 性能分析之网络篇

本文首发于我的公众号 CloudDeveloper(ID: cloud_dev),专注于干货分享,号内有大量书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫。这是 Linux 性能分析系列的第四篇,前三篇在这里:一文掌握 Linux 性能分析之 CPU 篇一文掌握 Linux 性能分析之内存篇一文掌握 Linux 性能分析之 I/O 篇比较宽泛地讲,网络方向的性能分析既包括主机测的网络配置查看、监控,又包括网络链路上的包转发时延、吞吐量、带宽等指标分析。包括但不限于以下分析工具:ping:测试网络连通性ifconfig:接口配置ip:网络接口统计信息netsat:多种网络栈和接口统计信息ifstat:接口网络流量监控工具netcat:快速构建网络连接tcpdump:抓包工具sar:统计信息历史traceroute:测试网络路由pathchar:确定网络路径特征dtrace:TCP/IP 栈跟踪iperf / netperf / netserver:网络性能测试工具perf 性能分析神器本文先来看前面 7 个。pingping 发送 ICMP echo 数据包来探测网络的连通性,除了能直观地看出网络的连通状况外,还能获得本次连接的往返时间(RTT 时间),丢包情况,以及访问的域名所对应的 IP 地址(使用 DNS 域名解析),比如:我们 ping baidu.com,-c 参数指定发包数。可以看到,解析到了 baidu 的一台服务器 IP 地址为 220.181.112.244。RTT 时间的最小、平均、最大和算术平均差分别是 40.732ms、40.762ms、40.791ms 和 0.248。ifconfigifconfig 命令被用于配置和显示 Linux 内核中网络接口的统计信息。通过这些统计信息,我们也能够进行一定的网络性能调优。1)ifconfig 显示网络接口配置信息其中,RX/TX packets 是对接收/发送数据包的情况统计,包括错误的包,丢掉多少包等。RX/TX bytes 是接收/发送数据字节数统计。其余还有很多参数,就不一一述说了,性能调优时可以重点关注 MTU(最大传输单元) 和 txqueuelen(发送队列长度),比如可以用下面的命令来对这两个参数进行微调:ifconfig eth0 txqueuelen 2000ifconfig eth0 mtu 1500 2)网络接口地址配置ifconfig 还常用来配置网口的地址,比如:为网卡配置和删除IPv6地址:ifconfig eth0 add 33ffe:3240:800:1005::2/64 #为网卡eth0配置IPv6地址ifconfig eth0 del 33ffe:3240:800:1005::2/64 #为网卡eth0删除IPv6地址修改MAC地址:ifconfig eth0 hw ether 00:AA:BB:CC:dd:EE配置IP地址:ifconfig eth0 192.168.2.10ifconfig eth0 192.168.2.10 netmask 255.255.255.0ifconfig eth0 192.168.2.10 netmask 255.255.255.0 broadcast 192.168.2.255IPip 命令用来显示或设置 Linux 主机的网络接口、路由、网络设备、策略路由和隧道等信息,是 Linux 下功能强大的网络配置工具,旨在替代 ifconfig 命令,如下显示 IP 命令的强大之处,功能涵盖到 ifconfig、netstat、route 三个命令。netstatnetstat 可以查看整个 Linux 系统关于网络的情况,是一个集多钟网络工具于一身的组合工具。常用的选项包括以下几个:默认:列出连接的套接字-a:列出所有套接字的信息-s:各种网络协议栈统计信息-i:网络接口信息-r:列出路由表-l:仅列出有在 Listen 的服务状态-p:显示 PID 和进程名称各参数组合使用实例如下:netstat -at 列出所有 TCP 端口netstat -au 列出所有 UDP 端口netstat -lt 列出所有监听 TCP 端口的 socketnetstat -lu 列出所有监听 UDP 端口的 socketnetstat -lx 列出所有监听 UNIX 端口的 socketnetstat -ap | grep ssh 找出程序运行的端口netstat -an | grep ‘:80’ 找出运行在指定端口的进程1)netstat 默认显示连接的套接字数据整体上来看,输出结果包括两个部分:Active Internet connections :有源 TCP 连接,其中 Recv-Q 和 Send-Q 指的是接收队列和发送队列,这些数字一般都是 0,如果不是,说明请求包和回包正在队列中堆积。Active UNIX domain sockets:有源 UNIX 域套接口,其中 proto 显示连接使用的协议,RefCnt 表示连接到本套接口上的进程号,Types 是套接口的类型,State 是套接口当前的状态,Path 是连接到套接口的进程使用的路径名。2)netstat -i 显示网络接口信息接口信息包括网络接口名称(Iface)、MTU,以及一系列接收(RX-)和传输(TX-)的指标。其中 OK 表示传输成功的包,ERR 是错误包,DRP 是丢包,OVR 是超限包。这些参数有助于我们对网络收包情况进行分析,从而判断瓶颈所在。3)netstat -s 显示所有网络协议栈的信息可以看到,这条命令能够显示每个协议详细的信息,这有助于我们针对协议栈进行更细粒度的分析。4)netstat -r 显示路由表信息这条命令能够看到主机路由表的一个情况。当然查路由我们也可以用 ip route 和 route 命令,这个命令显示的信息会更详细一些。ifstatifstat 主要用来监测主机网口的网络流量,常用的选项包括:-a:监测主机所有网口-i:指定要监测的网口-t:在每行输出信息前加上时间戳-b:以 Kbit/s 显示流量数据,而不是默认的 KB/s-delay:采样间隔(单位是 s),即每隔 delay 的时间输出一次统计信息-count:采样次数,即共输出 count 次统计信息比如,通过以下命令统计主机所有网口某一段时间内的流量数据:可以看出,分别统计了三个网口的流量数据,前面输出的时间戳,有助于我们统计一段时间内各网口总的输入、输出流量。netcatnetcat,简称 nc,命令简单,但功能强大,在排查网络故障时非常有用,因此它也在众多网络工具中有着“瑞士军刀”的美誉。它主要被用来构建网络连接。可以以客户端和服务端的方式运行,当以服务端方式运行时,它负责监听某个端口并接受客户端的连接,因此可以用它来调试客户端程序;当以客户端方式运行时,它负责向服务端发起连接并收发数据,因此也可以用它来调试服务端程序,此时它有点像 Telnet 程序。常用的选项包括以下几种:-l:以服务端的方式运行,监听指定的端口。默认是以客户端的方式运行。-k:重复接受并处理某个端口上的所有连接,必须与 -l 一起使用。-n:使用 IP 地址表示主机,而不是主机名,使用数字表示端口号,而不是服务名称。-p:当以客户端运行时,指定端口号。-s:设置本地主机发出的数据包的 IP 地址。-C:将 CR 和 LF 两个字符作为结束符。-U:使用 UNIX 本地域套接字通信。-u:使用 UDP 协议通信,默认使用的是 TCP 协议。-w:如果 nc 客户端在指定的时间内未检测到任何输入,则退出。-X:当 nc 客户端与代理服务器通信时,该选项指定它们之间的通信协议,目前支持的代理协议包括 “4”(SOCKS v.4),“5”(SOCKS v.5)和 “connect” (HTTPs Proxy),默认使用 SOCKS v.5。-x:指定目标代理服务器的 IP 地址和端口号。下面举一个简单的例子,使用 nc 命令发送消息:首先,启动服务端,用 nc -l 0.0.0.0 12345 监听端口 12345 上的所有连接。然后,启动客户端,用 nc -p 1234 127.0.0.1 12345 使用 1234 端口连接服务器 127.0.0.1::12345。接着就可以在两端互发数据了。这里只是抛砖引玉,更多例子大家可以多实践。tcpdump最后是 tcpdump,强大的网络抓包工具。虽然有 wireshark 这样更易使用的图形化抓包工具,但 tcpdump 仍然是网络排错的必备利器。tcpdump 选项很多,我就不一一列举了,大家可以看文章末尾的引用来进一步了解。这里列举几种 tcpdump 常用的用法。1)捕获某主机的数据包比如想要捕获主机 200.200.200.100 上所有收到和发出的所有数据包,使用:tcpdump host 200.200.200.1002)捕获多个主机的数据包比如要捕获主机 200.200.200.1 和主机 200.200.200.2 或 200.200.200.3 的通信,使用:tcpdump host 200.200.200.1 and (200.200.200.2 or )同样要捕获主机 200.200.200.1 除了和主机 200.200.200.2 之外所有主机通信的 IP 包。使用:tcpdump ip host 200.200.200.1 and ! 200.200.200.23)捕获某主机接收或发出的某种协议类型的包比如要捕获主机 200.200.200.1 接收或发出的 Telnet 包,使用:tcpdump tcp port 23 host 200.200.200.14)捕获某端口相关的数据包比如捕获在端口 6666 上通过的包,使用:tcpdump port 66665)捕获某网口的数据包比如捕获在网口 eth0 上通过的包,使用:tcpdump -i eth0下面还是举个例子,抓取 TCP 三次握手的包:(具体抓包的过程请移步到我的公众号进一步了解,那里阅读体验好一点,谢谢。)总结:本文总结了几种初级的网络工具,基本的网络性能分析,通过组合以上几种工具,基本都能应付,但对于复杂的问题,以上工具可能就无能为力了。更多高阶的工具将在下文送上,敬请期待。参考:基础 http://kuring.me/post/linux_n… 讲 ip 和 ifconfig 很强大的一篇文章:https://blog.csdn.net/freekin…https://www.alibabacloud.com/…性能之巅:Linux网络性能分析工具http://www.infoq.com/cn/artic…抓包工具tcpdump用法说明 https://www.cnblogs.com/f-ck-...https://www.shiyanlou.com/cou...http://linuxtools-rst.readthe...https://www.shiyanlou.com/cou…我的公众号 CloudDeveloper(ID: cloud_dev),号内有大量书籍和视频资源,后台回复「1024」即可领取,分享的内容包括但不限于云计算虚拟化、容器、OpenStack、K8S、雾计算、网络、工具、SDN、OVS、DPDK、Linux、Go、Python、C/C++编程技术等内容,欢迎大家关注。 ...

March 15, 2019 · 2 min · jiezi

我在Paris-Saclay举行的ONAP和OPNFV活动中所学到了什么

作者:Linux基金会网络与协调运营副总裁Phil RobbONAP和OPNFV项目于2019年早些时候,在法国的诺基亚Paris-Saclay设施举办了一个开发活动。来自这些社区的200多名开发者聚集在一起,讨论他们的下一个版本,计划更长期的策略重点,并且有史以来第一次共同探讨了两个团队之间的进一步合作。与往常一样,通过参与这些讨论和计划会议,从这些社区中每个人都散发著对卓越的热情让我充满活力。此活动在四天内分别举办了约150场会议,以及由诺基亚主办方设立的OPNFV Plugfest和2场演示。我要感谢诺基亚主办此次活动。他们一直是这些社区中令人难以置信的支持者,也是Linux Foundation Networking(LFN)基金的杰出白金会员。现在可以获得完整的报告,但我想分享一篇快速的博客文章,以捕捉我个人在一周内感兴趣的内容。会话幻灯片和录音将在LFN Wiki页面发布。LFN最终用户咨询小组我要提到的第一件事是我在本周开始时(重新)启动了LFN最终用户咨询小组(EUAG),我在电子邮件和活动上都看到人们对这的兴趣。我们计划在1月底举行第一次会议,如果你是LFN内任何项目的最终用户,我强烈建议你填写会员申请表并参加。EUAG既是向技术社区提供反馈的好方法,也是向同行学习如何最好地利用LFN项目发布的当前功能的好方法。我期待今年一个非常活跃的EUAG,特别是根据我在活动中听到的内容中的ONAP和OPNFV工作流程。OPNFV认证计划(OVP)整个2018年,Dovetail-OVP项目在OPNFV内完成的工作扩展到包括VNF验证和NFV基础设施。VNF验证工作的自然受益人和合作者是ONAP项目,特别是VNF要求项目和VNF SDK项目。这些团体在过去的几个月里一直在合作,这次活动使他们有机会在一周内多次坐在一起,并向更广泛的OPNFV和ONAP社区解释他们的目标以及其他人如何参与。如果你想了解更多信息,或有兴趣帮助确定在ONAP环境中运行VNF的基本要求,请按照上述链接之一获取更多信息。利用OPNFV和ONAP的测试工具和基础设施该活动有几个会议讨论了ONAP如何利用OPNFV小组多年开发的测试工具和系统测试配置和部署。此外,Orange的社区成员提供了有关他们的OpenLab和工具的更多详细信息,他们已经创建了系统地分层和测试ONAP下的不同云和NFVI组件,然后安装和测试ONAP环境,然后最终分层他们想要的VNF在特定的环境中测试。它们还具有不同“口味”的实现,包括Core、Small、Medium和Full,允许测试团队仅部署特定VNF/Environment测试所需的部分ONAP。Orange最近开源了这些工具,并将它们在Github上提供,直到在LFN项目中为他们找到一个家。在这些会议期间,我对ONAP的成对集成和系统测试需求有一个顿悟。通常,对于提供一个或相对较小耦合的可执行文件集的开源项目,集成测试相对简单,可以站起来交互组件并测试新的或修改过的交互。最终目标是在发行版上执行集成测试的项目,即具有数百甚至数千个组件的大型复杂系统,所有这些都在不同的发布计划中花费了大量精力来构建工具以纠正一致,可重复的部署和配置这样的系统使他们能够成功地对它们进行测试,以产生一致和有意义的结果。开源生态系统中最常见的发行版是Linux操作系统和它附带的数千个程序/软件包,如Debian、Red Hat或Ubuntu发行版。然而,OPNFV构建工具来部署、配置和测试能够运行NFV工作负载的开源分发。它实际上是典型Linux发行版的超集。顿悟对我来说是因为认识到完整的ONAP实施所带来的重大复杂性。虽然该项目创建了自己的可执行文件集,但它还依赖于数千个其他开源组件,包括OpenStack、OpenDaylight、Ceph和Hadoop(所有这些组件在其自身上都很重要)。这种复杂性的结果是难以生成、部署和配置允许可靠的成对集成测试的环境,这反过来又减慢了系统测试的速度。ONAP将通过与OPNFV测试项目以及Orange的团队及其最新工具的整合和合作而受益匪浅。这个对话在巴黎认真开始,我很高兴看到它从那里开始。ONAP与其他编排器的互操作性一些ONAP社区成员提供了一个会议,最初旨在探索与Open Source Mano(OSM)项目的潜在互操作性机会。随着讨论的演变,我们将重点放在ONAP需要做些什么来支持其他一般的编排器。在过去的18个月里,我从运营商那里听说,他们希望在网络的不同部分与ONAP一起探讨各种部署方案,其中包括遗留组件,其中一些是现有的编排器。巴黎的讨论,结束于那些在房间里感觉好像在NFV-SDK项目中,添加将ETSI NFV-ISG定义的SOL-006 YANG模型,转换为SOL-001 TOSCA模型的能力,将允许在ETSI NFV中,选择那些不同路径的编排器之间的通用互操作性-ISG规格集。此外,为了以东西方的方式与其他编排器进行适当的互动,会议室内的小组认为继续支持SOL-005是一项重要的工作。本次讨论的参与者采取行动向ONAP技术指导委员会(TSC)提出这些建议,供社群进一步考虑。探索ONAP与其他编排器之间更深层次的互动也是一种可能性。如果社区有兴趣从事此类工作,我鼓励有兴趣的人与TSC联系进一步讨论。ONAP小组委员会会议在ONS前几天举行下一次ONAP社区成员有机会进行面对面会议,将在加利福尼亚州圣何塞举行的开源网络峰会(ONS)之前举行。我的目标是那周的周一和周二,4月1日和2日,但计划尚未最终确定。会议将仅限于TSC和TSC小组委员会的讨论,以便为即将于5月发布Dublin版ONAP后即将开始的El Alto开发周期做准备。在巴黎期间,我们有机会计划ONAP和ETSI工作组之间的潜在联合会议,该工作组主要关注零接触网络和服务管理(ZSM)。ONAP内部的一些社区成员也在ZSM中工作,这两个小组目前似乎适合会面,分享他们的工作和计划,并探讨合作的方式。对此的计划仍在不断发展,但希望在ONS的一周内有一个3或4小时的研讨会,以便进行此类介绍。总而言之,我们在法国度过了愉快的一周,ONAP和OPNFV在2019年将会有一个非常好的合作年。有关我们学到的知识的详细信息,请参阅完整报告。希望四月份在ONS见到你!KubeCon + CloudNativeCon和Open Source Summit大会日期:会议日程通告日期:2019 年 4 月 10 日会议活动举办日期:2019 年 6 月 24 至 26 日KubeCon + CloudNativeCon和Open Source Summit赞助方案KubeCon + CloudNativeCon和Open Source Summit多元化奖学金现正接受申请KubeCon + CloudNativeCon和Open Source Summit即将首次合体落地中国KubeCon + CloudNativeCon和Open Source Summit购票窗口,立即购票!CNCF邀请你加入最终用户社区

March 11, 2019 · 1 min · jiezi

一文总结虚拟网络设备 eth, tap/tun, veth-pair(多图)

本文首发于我的公众号 CloudDeveloper(ID: cloud_dev),专注于干货分享,号内有大量书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫。本文翻译自:https://www.fir3net.com/Netwo…Linux 虚拟网络的背后都是由一个个的虚拟设备构成的。虚拟化技术没出现之前,计算机网络系统都只包含物理的网卡设备,通过网卡适配器,线缆介质,连接外部网络,构成庞大的 Internet。然而,随着虚拟化技术的出现,网络也随之被虚拟化,相较于单一的物理网络,虚拟网络变得非常复杂,在一个主机系统里面,需要实现诸如交换、路由、隧道、隔离、聚合等多种网络功能。而实现这些功能的基本元素就是虚拟的网络设备,比如 tap、tun 和 veth-pair。tap/tuntap/tun 提供了一台主机内用户空间的数据传输机制。它虚拟了一套网络接口,这套接口和物理的接口无任何区别,可以配置 IP,可以路由流量,不同的是,它的流量只在主机内流通。tap/tun 有些许的不同,tun 只操作三层的 IP 包,而 tap 操作二层的以太网帧。veth-pairveth-pair 是成对出现的一种虚拟网络设备,一端连接着协议栈,一端连接着彼此,数据从一端出,从另一端进。它的这个特性常常用来连接不同的虚拟网络组件,构建大规模的虚拟网络拓扑,比如连接 Linux Bridge、OVS、LXC 容器等。一个很常见的案例就是它被用于 OpenStack Neutron,构建非常复杂的网络形态。总结最后,总结一下,我们提到几种网络设备,eth0、tap、tun、veth-pair,这些都构成了如今云网络必不可少的元素。我的公众号 CloudDeveloper(ID: cloud_dev),号内有大量书籍和视频资源,后台回复「1024」即可领取,分享的内容包括但不限于云计算虚拟化、容器、OpenStack、K8S、雾计算、网络、工具、SDN、OVS、DPDK、Linux、Go、Python、C/C++编程技术等内容,欢迎大家关注。

March 8, 2019 · 1 min · jiezi

了解网络最新发展:LF Networking将在ONS北美大会提供的10个演示

ONS(Open Networking Summit,开放网络峰会)是业界首屈一指的开放式网络活动,支持跨企业、服务提供商和云提供商的协作开发和创新,并讨论开源网络的未来,包括SDN、NFV、VNF、CNF/云原生网络、编排、云自动化、核心网、边缘、接入和物联网服务。LF Networking的演示通过LF Networking展台的10个社区驱动演示,让你沉浸在开源网络堆栈的最新创新中!展示服务供应商特定测试和验证要求(OPNFV,ONAP) - 沃达丰提出并由沃达丰/华为/iConectiv演示此演示旨在演示ONAP入职流程(通过SDC)与VTP(VNF测试平台)交互的能力,并在入职之前请求在VNF上执行特定的测试场景。该演示将使用标准和OPEN API与VTP进行交互,这也将使未来可以与认证存储库(Certification Repositories,例如OVP)进行交互,以检索给定VNF所经历的认证列表。这种集成将为动态DevOps环境下的更多E2E合规性和认证流程打开大门。作为平台的VTP允许与OPNFV测试工具(例如Dovetail),以及可以承载运营商特定测试场景的第三方测试工具(或第三方实验室)进行交互。ODL和NSM的集成(OpenDaylight,Network Service Mesh) - 由Lumina Networks演示NSM(Network Service Mesh)在CNCF世界中获得了很大的吸引力,并且正在重塑云原生网络。该演示旨在通过gRPC机制展示ODL和NSM的集成。它将展示NSM如何利用ODL网络模型,以及集成如何解决许多混合网络方案。多数据路径之间的SDN性能比较(Tungsten Fabric,FD.io) - 由ATS和Sofioni Networks演示该演示将显示对VPP(Vector Packet Processing,矢量数据包处理)与DPDK(Data Plane Development Kit,数据平面开发工具包)vRouter性能的观察,两者均由同一Tungsten Fabric控制器控制。它将一个Tungsten Fabric控制平面连接到运行VPP的计算作为数据路径而不是常规内核模块或DPDK vRouter,所有服务器连接到相同的机架顶部以确保类似的环境。它将通过改变注入网络的后台流的数量,通过后台流生成器调整网络条件来演示两个数据平面的并排性能。ONAP BBS(Broadband Service,宽带服务)用例(ONAP,OPNFV) - 由Swisscom,华为和诺基亚演示BBS用例团队将展示使用ONAP Dublin版本的首次实施使用ONAP用于宽带服务的设计、供应、生命周期管理和保证。该用例涵盖了新的方案,例如游牧ONT(Optical Network Terminal,光网络终端)和服务订阅计划的变化,显示了ONAP平台支持跨不同位置(例如,中央办公室、核心)和技术领域(例如,Access、Edge)的服务编排方面的可扩展性。注意:BBS实现/测试CloudCO(Cloud Central Office,云中心办公室),技术报告TR-384等架构框架中定义的一些规范。零停机应用的OpenStack滚动升级(OPNFV,OpenStack) - 由诺基亚和德国电信演示在本演示中,我们将通过OPNFV Doctor测试框架利用OpenStack Fenix工作流程进行滚动OpenStack升级。通过VNFM交互,我们还可以保证VNF的停机时间为零。该演示旨在实现Fenix滚动升级CI作业,因此我们还可以看到修改后的DevStack脚本如何用于升级节点。因此,我们将为任何人提供处理和测试OpenStack升级的强大工具。Skydive和VPP集成:拓扑分析仪(FD.io,Ligato,Skydive,Docker) - 由PANTHEON.tech演示Skydive是一个开源实时网络拓扑和协议分析器,旨在提供一种全面的方法来了解网络基础架构中发生的情况。此演示包含使用Ligato VPPAgent Docker容器运行的VPP(Vector Packet Processing,矢量数据包处理)实例,以自动启动VPP实例,并实时检测网络拓扑的更改。此演示的重要性在于从VPP中提取数据的需求,并通过Skydive提供网络的鸟瞰图。VSPERF:超越绩效指标,走向因果分析(OPNFV) - 由思博伦通信和AT&T演示本演示将展示VSPERF和其他工具如何收集、分析和可视化每个测试用例的各种结果数据,以促进因果关系分析。VSPERF架构的优势是在所有结果数据上具有统一的时间戳,同时测量支持相关性和因果关系分析的不同配置。对于每次测试运行,我们计划演示以下内容:相关性热图实时结果的趋势分析EOT结果的趋势分析描述拓扑中的瓶颈关键指标的详细统计测试环境表示:可用、提供、配置等在测试运行期间表示所有事件基于ONAP生命周期管理(ONAP)的网络切片 - 由AT&T和爱立信演示该ONAP演示将利用ONAP架构的许多组件/功能元件,在MBB(Mobile Broadband,移动宽带)服务用例中提供具有特定特征的e2e网络片。它将实例化和配置多个虚拟网络功能,并演示服务创建、实例化和服务配置的整个生命周期。该演示将使用ONAP组件远程配置新泽西州的AT&T/Ericsson网络,并显示5G网络的LCM并创建e2e网络片。服务网格和SDN:大规模集群负载均衡(Tungsten Fabric,Linux OS,Istio,Consul,Envoy,Kubernetes,HAProxy) - 由Tungsten Fabric社区演示从服务网格到入口,到网络政策,再到加密等等,网络和安全性已向左移动,更早推进到DevOps时间范围。在本演示中,你将看到Tungsten Fabric,一个合适Kubernetes使用的SDN,如何超越CNI的基础,为Istio和Consul等服务网格提供了良好的基础和补充。此演示将展示Tungsten Fabric与Kubernetes的云中立的服务负载均衡器实现,以及在处理遗留和云原生工作负载的情况下比较和对比Tungsten Fabric与Istio和Consul的集成。我们还将讨论从网关到入口,到服务代理的横向扩展负载平衡。实验室即服务2.0演示(OPNFV) - 由UNH-IOL演示LaaS 2.0项目旨在支持LFN社区,目前正由OPNFV和ONAP团队使用。随着LaaS 2.0的推出,开源网络项目领导者现在可以预订多节点资源,为他们的团队提供资源,以便跨多个裸机服务器部署更大的项目。预订过程已更新,允许在服务器之间配置不同的操作系统映像和网络,从而创建一个可由LF Networking项目利用的灵活工具。此演示将有助于让社区了解可用资源,并向用户显示预订流程和后端工具。请在此处查看LaaS仪表板:https://labs.lfnetworking.org。KubeCon + CloudNativeCon和Open Source Summit大会日期:会议日程通告日期:2019 年 4 月 10 日会议活动举办日期:2019 年 6 月 24 至 26 日KubeCon + CloudNativeCon和Open Source Summit赞助方案KubeCon + CloudNativeCon和Open Source Summit多元化奖学金现正接受申请KubeCon + CloudNativeCon和Open Source Summit即将首次合体落地中国KubeCon + CloudNativeCon和Open Source Summit购票窗口,立即购票! ...

March 7, 2019 · 1 min · jiezi

云计算底层技术之高性能集群趣谈

本文首发于我的公众号 CloudDeveloper(ID: cloud_dev),专注于干货分享,号内有大量书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫。在孙悟空的七十二变中,我觉得最厉害的是分身能力,这也是他百试不得其爽的终极大招,每每都能打得妖怪摸不着北。集群,学名叫 Cluster,可以翻译为簇、聚类、集群等多种意思,不同的翻译,在技术世界里所表示的意思都不尽相同,但都有一个共同的指向,即群体。集群就是由一组计算机所组成的实体,通常作为一个整体向用户提供资源和服务。集群的研究和发展离不开人们对高性能计算的追求,像我们熟悉的向量机、对称多处理机、工作站、超级计算机等等都是对高性能计算追求下的产物。这些系统要么是提高 CPU 的主频和总线带宽来提高系统性能,要么是增加 CPU 个数和内存容量来提高性能,但这些手段对性能的提高都是有限的。有人做过实验,当 CPU 个数超过某一阈值时,系统的性能反而会变差。其主要的瓶颈就在于 CPU 访问内存的带宽并不能随着 CPU 个数的增加而有效增加。相反,集群系统的性能可扩展能力是线性增长的。我们可以简单通过增加机器数来增加集群的运算能力,相比购买高性能的大型计算机,同等运算能力下,我们可以获得更高的性价比。同时,系统的可靠性也得到了增强。历史早在七十年代计算机厂商和研究机构就开始了对集群系统的研究和开发,首先创造性发明集群的是 Seymour Cray(西摩·克雷)—— 超级计算机之父。Seymour 是一位美国工程师,在 1960 年代,CDC 公司开始涉足高性能计算领域,彼时还是大型机的天下,这些大型机设计非常复杂,生产周期漫长,价格还非常昂贵。于是,当时在 CDC 公司担任总设计师的 Seymour 就决心建造出一台他心目中的高性能计算机。Seymour 出于工程师的直觉,很快想到并行是提高计算机性能的有效方式。他使用廉价的方式来获得跟大型机一样的运算能力。他将多个普通的处理器连接起来,使它们能够协同工作,这就是高性能计算机的原型。后来,IBM、HP 等公司学习了 Seymour 的这套架构,高性能计算机开始迅速推广,逐步取代原有的大型机。高性能计算机为当时的登月计划等大型科研项目作出了非常重要的贡献。然后进入八十年代,在摩尔定律的指导下,CPU 频率不断提高,芯片不断降价,个人计算机强势崛起。苹果、微软等公司借助这股东风成为个人计算机时代的王者。随之而来的就是高性能计算机市场遭到了吞噬,被迫只能退守公司服务器市场。但很快,随着互联网的普及,高性能计算机又迎来新的一波热潮。互联网上用户量庞大,普通 PC 难以应付如此众多的网络请求,必须要依赖由高性能计算机组成的服务器集群。在 2000 年左右的网络泡沫时期,成就了很多像 Sun 这样的服务器生产商。如今,IT 行业向云计算冲击,诸如 Google、Apple、Amazon 等很巨头纷纷建立起了自己的数据中心。集群的规模在不断扩大,为海量的数据提高基础设施提供了支撑。根据不同的应用场景,集群也演变出多种形态,比如高性能集群、高可用集群、负载均衡集群等等。集群元素集群不是简单的硬件堆叠,而是硬件和软件的结合。从软件上说,集群至少需要:构建于 TCP/IP 协议上的通信软件,用于集群中节点之间的通信。一套中心管理软件,用于统一管理集群中节点的资源、任务和容错等等。这两点比较好理解,集群的规模往往是比较庞大的,对于管理员来说,需要随时能够知晓集群中各节点的业务正常与否,出问题了应该怎么保证业务能够不中断,遇到流量高峰和低谷的时候,又该怎么响应,这些操作如果纯靠人工来完成那必将很惨烈。依靠软件和网络来完成自动化的管理方式,可以将管理员解放出来。当然,以上说的两点是比较宽泛的,用户可以根据自身需求来部署不同的集群元素。一个比较经典的集群模型当属 Beowulf 集群,它通过一个节点统一将来自网络的请求分配给各个节点进行计算处理。集群与分布式集群与分布式像一对孪生兄弟,傻傻分不清楚。在我看来,它们之间没有特别明确的分界线,集群离不开分布式,分布式也需要集群。如果一定要做个区分,可以套用一个比喻来描述两者的区别:一家餐厅刚开业,由于成本限制招了一个厨师,慢慢地,餐厅生意越做越好,一个厨师已经很难应付过来,于是又招了一个,这两个厨师水平相当,都能做同样的事,两个厨师之间的关系就是集群。两厨师除了炒菜,还要负责洗菜、配菜等等的活,工作负荷已经严重超标,为了让厨师能专心炒菜,把菜做到极致,餐厅又招了配菜师来辅助厨师,厨师和配菜师之间的关系就是分布式。这个例子比较形象,在网站开发中也有类似的关系,两个全栈工程师之间就是集群的关系,前端工程师和后端工程师之间就属于分布式的关系。所以,一定要有区分的话就是:集群是一个业务部署在多个服务器上,而分布式是一个业务拆分成多个子业务部署在不同的服务器上。但在实际部署中,为了高性能,需要分布式部署,为了高可用,需要集群部署,这两者都是业务所必须的指标。所以,集群和分布式之间的关系是相互补充的。虚拟化随着虚拟化技术的发展,一台服务器可以虚拟出多个虚拟机,对外提供业务,这种方式大大提高了资源的利用率,集群的部署也逐步从物理机过渡到虚拟机,灵活性大大提高。但同时也带来了更多新的研究课题。虚拟化计算、虚拟化存储、虚拟化网络、虚拟化安全等等这些课题共同推动着云计算产业迈出一个又一个的台阶。数据中心数据中心是集中存放和运行服务器的地方,是规模最大的集群。随着云计算和大数据概念的风起云涌,Google、Amazon 等这些明星公司幕后的数据中心也开始走入大众的视野。数据中心要求有优秀的架构设计、电路设计、空间设计等等,还要有机制能够应对各种各样的意外,否则一点小小的失误,公司的股价恐怕就要跳水。地理位置的选择也是数据中心考虑的一个指标,随着绿色数据中心概念的兴起,越来越多人关注数据中心所带来的能源问题和环境问题,选择一个远离市区,并且能利用天然水源和气温的地方,将会为数据中心的建设节约大量的成本。Google 等大公司的数据中心就有意放在高纬度、高海拔的地区,以及有湖泊、河流流经地区,以享受天然的空调和冷却水。参考[1] 分布式与集群的区别是什么?[2] 数据中心网络架构演讲 [3] Linux 高性能计算集群[4] 高性能计算机传奇我的公众号 CloudDeveloper(ID: cloud_dev),号内有大量书籍和视频资源,后台回复「1024」即可领取,分享的内容包括但不限于云计算虚拟化、容器、OpenStack、K8S、雾计算、网络、工具、SDN、OVS、DPDK、Linux、Go、Python、C/C++编程技术等内容,欢迎大家关注。

March 6, 2019 · 1 min · jiezi

5G美洲白皮书:5G开源的现状(pdf)

(2019年2月)这份5G美洲白皮书概述了5G架构,重点介绍了基于3GPP Release 15定义的5G系统架构的开源原则的应用。本文旨在呼吁5G社区的运营商、解决方案供应商和开发商,参与适用于5G的现有开源工作,或在“基础设施”和“管理和控制”等领域启动新的工作,这是5G生态系统可能受益最多的地方。社区参与对于帮助实现项目的关键支持,以避免一次性解决方案非常重要。5G开源的现状白皮书由Sprint的联合负责人Lyle Bertz和Mavenir的Bejoy Pankajakshan以及参与本报告开发的5G美洲理事会成员公司的代表撰写。点击下载白皮书。KubeCon + CloudNativeCon和Open Source Summit大会日期:会议日程通告日期:2019 年 4 月 10 日会议活动举办日期:2019 年 6 月 24 至 26 日KubeCon + CloudNativeCon和Open Source Summit赞助方案KubeCon + CloudNativeCon和Open Source Summit多元化奖学金现正接受申请KubeCon + CloudNativeCon和Open Source Summit即将首次合体落地中国KubeCon + CloudNativeCon和Open Source Summit购票窗口,立即购票!

March 5, 2019 · 1 min · jiezi

详解云计算网络底层技术——Linux network namespace 原理与实践

本文首发于我的公众号 CloudDeveloper(ID: cloud_dev),专注于干货分享,号内有大量书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫。本文通过 IP 命令操作来简单介绍 network namespace 的基本概念和用法。深入了解可以看看我之前写的两篇文章 Docker 基础技术之 Linux namespace 详解 和 Docker 基础技术之 Linux namespace 源码分析。和 network namespace 相关的操作的子命令是 ip netns 。1. ip netns add xx 创建一个 namespace# ip netns add net1# ip netns lsnet12. ip netns exec xx yy 在新 namespace xx 中执行 yy 命令# ip netns exec net1 ip addr 1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00# ip netns exec net1 bash // 在 net1 中打开一个shell终端# ip addr // 在net1中的shell终端1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00# exit // 退出net1上面 bash 不好区分是当前是在哪个 shell,可以采用下面的方法解决:# ip netns exec net1 /bin/bash –rcfile <(echo “PS1="namespace net1> "")namespace net1> ping www.baidu.com每个 namespace 在创建的时候会自动创建一个回环接口 lo ,默认不启用,可以通过 ip link set lo up 启用。3. network namespace 之间的通信新创建的 namespace 默认不能和主机网络,以及其他 namespace 通信。可以使用 Linux 提供的 veth pair 来完成通信。下面显示两个 namespace 之间通信的网络拓扑:3.1 ip link add type veth 创建 veth pair# ip link add type veth# ip link3: veth0@veth1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether 1a:53:39:5a:26:12 brd ff:ff:ff:ff:ff:ff4: veth1@veth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether 46:df:46:1f:bf:d6 brd ff:ff:ff:ff:ff:ff使用命令 ip link add xxx type veth peer name yyy 指定 veth pair 的名字。3.2 ip link set xx netns yy 将 veth xx 加入到 namespace yy 中# ip link set veth0 netns net0# ip link set veth1 netns net1## ip netns exec net0 ip addr1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:0010: veth0@if11: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000 link/ether 1a:53:39:5a:26:12 brd ff:ff:ff:ff:ff:ff link-netnsid 13.3 给 veth pair 配上 ip 地址# ip netns exec net0 ip link set veth0 up# ip netns exec net0 ip addr1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever10: veth0@if11: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN group default qlen 1000 link/ether 1a:53:39:5a:26:12 brd ff:ff:ff:ff:ff:ff link-netnsid 1# ip netns exec net0 ip addr add 10.1.1.1/24 dev veth0# ip netns exec net0 ip route10.1.1.0/24 dev veth0 proto kernel scope link src 10.1.1.1 linkdown## ip netns exec net1 ip link set veth1 up# ip netns exec net1 ip addr add 10.1.1.2/24 dev veth1可以看到,在配完 ip 之后,还自动生成了对应的路由表信息。3.4. ping 测试两个 namespace 的连通性# ip netns exec net0 ping 10.1.1.2PING 10.1.1.2 (10.1.1.2) 56(84) bytes of data.64 bytes from 10.1.1.2: icmp_seq=1 ttl=64 time=0.069 ms64 bytes from 10.1.1.2: icmp_seq=2 ttl=64 time=0.054 ms64 bytes from 10.1.1.2: icmp_seq=3 ttl=64 time=0.053 ms64 bytes from 10.1.1.2: icmp_seq=4 ttl=64 time=0.053 msDone!4. 多个不同 namespace 之间的通信2 个 namespace 之间通信可以借助 veth pair ,多个 namespace 之间的通信则可以使用 bridge 来转接,不然每两个 namespace 都去配 veth pair 将会是一件麻烦的事。下面就看看如何使用 bridge 来转接。拓扑图如下:4.1 使用 ip link 和 brctl 创建 bridge通常 Linux 中和 bridge 有关的操作是使用命令 brctl (yum install -y bridge-utils ) 。但为了前后照应,这里都用 ip 相关的命令来操作。// 建立一个 bridge# ip link add br0 type bridge# ip link set dev br0 up9: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000 link/ether 42:55:ed:eb:a0:07 brd ff:ff:ff:ff:ff:ff inet6 fe80::4055:edff:feeb:a007/64 scope link valid_lft forever preferred_lft forever4.2 创建 veth pair//(1)创建 3 个 veth pair# ip link add type veth# ip link add type veth# ip link add type veth4.3 将 veth pair 的一头挂到 namespace 中,一头挂到 bridge 上,并设 IP 地址// (1)配置第 1 个 net0# ip link set dev veth1 netns net0# ip netns exec net0 ip link set dev veth1 name eth0# ip netns exec net0 ip addr add 10.0.1.1/24 dev eth0# ip netns exec net0 ip link set dev eth0 up## ip link set dev veth0 master br0# ip link set dev veth0 up// (2)配置第 2 个 net1# ip link set dev veth3 netns net1# ip netns exec net1 ip link set dev veth3 name eth0# ip netns exec net1 ip addr add 10.0.1.2/24 dev eth0# ip netns exec net1 ip link set dev eth0 up## ip link set dev veth2 master br0# ip link set dev veth2 up// (3)配置第 3 个 net2# ip link set dev veth5 netns net2# ip netns exec net2 ip link set dev veth5 name eth0# ip netns exec net2 ip addr add 10.0.1.3/24 dev eth0# ip netns exec net2 ip link set dev eth0 up# # ip link set dev veth4 master br0# ip link set dev veth4 up这样之后,竟然通不了,经查阅 参见 ,是因为原因是因为系统为bridge开启了iptables功能,导致所有经过br0的数据包都要受iptables里面规则的限制,而docker为了安全性(我的系统安装了 docker),将iptables里面filter表的FORWARD链的默认策略设置成了drop,于是所有不符合docker规则的数据包都不会被forward,导致你这种情况ping不通。解决办法有两个,二选一:关闭系统bridge的iptables功能,这样数据包转发就不受iptables影响了:echo 0 > /proc/sys/net/bridge/bridge-nf-call-iptables为br0添加一条iptables规则,让经过br0的包能被forward:iptables -A FORWARD -i br0 -j ACCEPT第一种方法不确定会不会影响docker,建议用第二种方法。我采用以下方法解决:iptables -A FORWARD -i br0 -j ACCEPT结果:# ip netns exec net0 ping -c 2 10.0.1.2PING 10.0.1.2 (10.0.1.2) 56(84) bytes of data.64 bytes from 10.0.1.2: icmp_seq=1 ttl=64 time=0.071 ms64 bytes from 10.0.1.2: icmp_seq=2 ttl=64 time=0.072 ms— 10.0.1.2 ping statistics —2 packets transmitted, 2 received, 0% packet loss, time 999msrtt min/avg/max/mdev = 0.071/0.071/0.072/0.008 ms# ip netns exec net0 ping -c 2 10.0.1.3PING 10.0.1.3 (10.0.1.3) 56(84) bytes of data.64 bytes from 10.0.1.3: icmp_seq=1 ttl=64 time=0.071 ms64 bytes from 10.0.1.3: icmp_seq=2 ttl=64 time=0.087 ms— 10.0.1.3 ping statistics —2 packets transmitted, 2 received, 0% packet loss, time 1000msrtt min/avg/max/mdev = 0.071/0.079/0.087/0.008 msDone!我的公众号 CloudDeveloper(ID: cloud_dev),号内有大量书籍和视频资源,后台回复「1024」即可领取,分享的内容包括但不限于云计算虚拟化、容器、OpenStack、K8S、雾计算、网络、工具、SDN、OVS、DPDK、Linux、Go、Python、C/C++编程技术等内容,欢迎大家关注。 ...

March 5, 2019 · 4 min · jiezi

Linux 网络工具详解之 ip tuntap 和 tunctl 创建 tap/tun 设备

本文首发于我的公众号 CloudDeveloper(ID: cloud_dev),专注于干货分享,号内有大量书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫。在前面一篇文章中,我们已经介绍了 tap/tun 的基本原理,本文将介绍如何使用工具 tunctl 和 ip tuntap 来创建并使用 tap/tun 设备。tunctl安装首先在 centos 的环境中安装 tunctl。[root@localhost ~]# vim /etc/yum.repos.d/nux-misc.repo[nux-misc]name=Nux Miscbaseurl=http://li.nux.ro/download/nux/misc/el7/x86_64/enabled=0gpgcheck=1gpgkey=http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.roubuntu 是 apt-get install uml-utilities。man tunctl 查看 tunctl 手册,用法如下:Synopsistunctl [ OPTIONS ] [ -u owner ] [-g group] [ -t device-name ]-u 参数指定用户名,表明这个接口只受该用户控制,这个接口发生的事不会影响到系统的接口。-g 指定一组用户-t 指定要创建的 tap/tun 设备名。[OPTIONS] 部分:-b 简单打印创建的接口名字-n 创建 tun 设备-p 创建 tap 设备,默认创建该设备-f tun-clone-device 指定 tun 设备对应的文件名,默认是 /dev/net/tun,有些系统是 /dev/misc/net/tun。-d interfacename 删除指定接口使用常见用法:默认创建 tap 接口:tunctl以上等价于 tunctl -p为用户 user 创建一个 tap 接口:# tunctl -u user创建 tun 接口:tunctl -n为接口配置 IP 并启用:# ifconfig tap0 192.168.0.254 up为接口添加路由:# route add -host 192.168.0.1 dev tap0删除接口:# tunctl -d tap0ip tuntap安装命令行输入 ip help 查看 ip 命令是否支持 tuntap 工具,支持的话就会显示 tuntap 选项:[root@localhost ~]# ip helpUsage: ip [ OPTIONS ] OBJECT { COMMAND | help } ip [ -force ] -batch filenamewhere OBJECT := { link | addr | addrlabel | route | rule | neigh | ntable | tunnel | tuntap | maddr | mroute | mrule | monitor | xfrm | netns | l2tp | tcp_metrics | token }不支持就请升级或下载最新的 iproute2 工具包,或者使用上面介绍的 tunctl 工具。使用输入 ip tuntap help 查看详细使用命令:[root@localhost ~]# ip tuntap helpUsage: ip tuntap { add | del } [ dev PHYS_DEV ] [ mode { tun | tap } ] [ user USER ] [ group GROUP ] [ one_queue ] [ pi ] [ vnet_hdr ] [ multi_queue ]Where: USER := { STRING | NUMBER } GROUP := { STRING | NUMBER }常见用法:创建 tap/tun 设备:ip tuntap add dev tap0 mod tap # 创建 tap ip tuntap add dev tun0 mod tun # 创建 tun删除 tap/tun 设备:ip tuntap del dev tap0 mod tap # 删除 tap ip tuntap del dev tun0 mod tun # 删除 tunPS: user 和 group 参数和 tunctl 的 -u、 -g 参数是一样的。以上两个工具,我们更推荐使用 ip tuntap,一个是因为 iproute2 更全更新,已经逐步在替代老旧的一些工具,另一个是因为 tunctl 在某些 Debian 类的系统上支持不全。总结tunctl 和 ip tuntap 的常见使用方式。更推荐使用 ip tuntap 工具。我的公众号 CloudDeveloper(ID: cloud_dev),号内有大量书籍和视频资源,后台回复「1024」即可领取,分享的内容包括但不限于云计算虚拟化、容器、OpenStack、K8S、雾计算、网络、工具、SDN、OVS、DPDK、Linux、Go、Python、C/C++编程技术等内容,欢迎大家关注。 ...

March 1, 2019 · 2 min · jiezi

用 tap/tun 做虚拟机的网卡

本文首发于我的公众号 CloudDeveloper(ID: cloud_dev),专注于干货分享,号内有大量书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫。在云计算时代,虚拟机和容器已经成为标配。它们背后的网络管理都离不开一样东西,就是虚拟网络设备,或者叫虚拟网卡,tap/tun 就是在云计算时代非常重要的虚拟网络网卡。tap/tun 是什么tap/tun 是 Linux 内核 2.4.x 版本之后实现的虚拟网络设备,不同于物理网卡靠硬件网路板卡实现,tap/tun 虚拟网卡完全由软件来实现,功能和硬件实现完全没有差别,它们都属于网络设备,都可以配置 IP,都归 Linux 网络设备管理模块统一管理。作为网络设备,tap/tun 也需要配套相应的驱动程序才能工作。tap/tun 驱动程序包括两个部分,一个是字符设备驱动,一个是网卡驱动。这两部分驱动程序分工不太一样,字符驱动负责数据包在内核空间和用户空间的传送,网卡驱动负责数据包在 TCP/IP 网络协议栈上的传输和处理。用户空间与内核空间的数据传输在 Linux 中,用户空间和内核空间的数据传输有多种方式,字符设备就是其中的一种。tap/tun 通过驱动程序和一个与之关联的字符设备,来实现用户空间和内核空间的通信接口。在 Linux 内核 2.6.x 之后的版本中,tap/tun 对应的字符设备文件分别为:tap:/dev/tap0tun:/dev/net/tun设备文件即充当了用户空间和内核空间通信的接口。当应用程序打开设备文件时,驱动程序就会创建并注册相应的虚拟设备接口,一般以 tunX 或 tapX 命名。当应用程序关闭文件时,驱动也会自动删除 tunX 和 tapX 设备,还会删除已经建立起来的路由等信息。tap/tun 设备文件就像一个管道,一端连接着用户空间,一端连接着内核空间。当用户程序向文件 /dev/net/tun 或 /dev/tap0 写数据时,内核就可以从对应的 tunX 或 tapX 接口读到数据,反之,内核可以通过相反的方式向用户程序发送数据。tap/tun 和网络协议栈的数据传输tap/tun 通过实现相应的网卡驱动程序来和网络协议栈通信。一般的流程和物理网卡和协议栈的交互流程是一样的,不同的是物理网卡一端是连接物理网络,而 tap/tun 虚拟网卡一般连接到用户空间。如下图的示意图,我们有两个应用程序 A、B,物理网卡 eth0 和虚拟网卡 tun0 分别配置 IP:10.1.1.11 和 192.168.1.11,程序 A 希望构造数据包发往 192.168.1.0/24 网段的主机 192.168.1.1。基于上图,我们看看数据包的流程:应用程序 A 构造数据包,目的 IP 是 192.168.1.1,通过 socket A 将这个数据包发给协议栈。协议栈根据数据包的目的 IP 地址,匹配路由规则,发现要从 tun0 出去。tun0 发现自己的另一端被应用程序 B 打开了,于是将数据发给程序 B.程序 B 收到数据后,做一些跟业务相关的操作,然后构造一个新的数据包,源 IP 是 eth0 的 IP,目的 IP 是 10.1.1.0/24 的网关 10.1.1.1,封装原来的数据的数据包,重新发给协议栈。协议栈再根据本地路由,将这个数据包从 eth0 发出。后续步骤,当 10.1.1.1 收到数据包后,会进行解封装,读取里面的原始数据包,继而转发给本地的主机 192.168.1.1。当接收回包时,也遵循同样的流程。在这个流程中,应用程序 B 的作用其实是利用 tun0 对数据包做了一层隧道封装。其实 tun 设备的最大用途就是用于隧道通信的。tap/tun 的区别看到这里,你可能还不大明白 tap/tun 的区别。tap 和 tun 虽然都是虚拟网络设备,但它们的工作层次还不太一样。tap 是一个二层设备(或者以太网设备),只能处理二层的以太网帧;tun 是一个点对点的三层设备(或网络层设备),只能处理三层的 IP 数据包。tap/tun 的应用从上面的数据流程中可以看到,tun 设备充当了一层隧道,所以,tap/tun 最常见的应用也就是用于隧道通信,比如 VPN,包括 tunnel 和应用层的 IPsec 等,其中比较有名的两个开源项目是 openvpn 和 VTun。总结tun/tap 虚拟网卡,对应于物理网卡,如 eth0。tun/tap 驱动包括字符设备驱动和网卡驱动。tun/tap 常用于隧道通信。我的公众号 CloudDeveloper(ID: cloud_dev),号内有大量书籍和视频资源,后台回复「1024」即可领取,分享的内容包括但不限于云计算虚拟化、容器、OpenStack、K8S、雾计算、网络、工具、SDN、OVS、DPDK、Linux、Go、Python、C/C++编程技术等内容,欢迎大家关注。 ...

February 28, 2019 · 1 min · jiezi

使用Netty,我们到底在开发些什么?

在java界,netty无疑是开发网络应用的拿手菜。你不需要太多关注复杂的nio模型和底层网络的细节,使用其丰富的接口,可以很容易的实现复杂的通讯功能。和golang的网络模块相比,netty还是太过臃肿。不过java类框架就是这样,属于那种离了IDE就无法存活的编码语言。最新的netty版本将模块分的非常细,如果不清楚每个模块都有什么内容,直接使用netty-all即可。单纯从使用方面来说,netty是非常简单的,掌握ByteBuf、Channel、Pipeline、Event模型等,就可以进行开发了。你会发现面试netty相关知识,没得聊。但Netty与其他开发模式很大不同,最主要的就是其异步化。异步化造成的后果就是编程模型的不同,同时有调试上的困难,对编码的要求比较高,因为bug的代价与业务代码的bug代价不可同日而语。但从项目来说,麻雀虽小五脏俱全,从业务层到服务网关,以及各种技术保障,包括监控和配置,都是需要考虑的因素。netty本身占比很小。本文将说明使用netty开发,都关注哪些通用的内容,然后附上单机支持100w连接的linux配置。本文并不关注netty的基础知识。协议开发网络开发中最重要的就是其通讯格式,协议。我们常见的protobuf、json、avro、mqtt等,都属于此列。协议有语法、语义、时序三个要素。我见过很多中间件应用,采用的是redis协议,而后端落地的却是mysql;也见过更多的采用mysql协议实现的各种自定义存储系统,比如proxy端的分库分表中间件、tidb等。我们常用的redis,使用的是文本协议;mysql等实现的是二进制协议。放在netty中也是一样,实现一套codec即可(继承Decoder或Encoder系列)。netty默认实现了dns、haproxy、http、http2、memcache、mqtt、redis、smtp、socks、stomp、xml等协议,可以说是很全了,直接拿来用很爽。一个可能的产品结构会是这样的,对外提供一致的外观,核心存储却不同:文本协议在调试起来是比较直观和容易的,但安全性欠佳;而二进制协议就需要依赖日志、wireshark等其他方式进行分析,增加了开发难度。传说中的粘包拆包,就在这里处理。而造成粘包的原因,主要是由于缓冲区的介入,所以需要约定双方的传输概要等信息,netty在一定程度上解决了这个问题。每一个想要开发网络应用的同学,心里都埋了一颗重新设计协议的梦想种子。但协议的设计可以说是非常困难了,要深耕相应业务,还要考虑其扩展性。如没有特别的必要,建议使用现有的协议。连接管理功能做Netty开发,连接管理功能是非常重要的。通信质量、系统状态,以及一些黑科技功能,都是依赖连接管理功能。无论是作为服务端还是客户端,netty在创建连接之后,都会得到一个叫做Channel的对象。我们所要做的,就是对它的管理,我习惯给它起名叫做ConnectionManager。管理类会通过缓存一些内存对象,用来统计运行中的数据。比如面向连接的功能:包发送、接收数量;包发送、接收速率;错误计数;连接重连次数;调用延迟;连接状态等。这会频繁用到java中concurrent包的相关类,往往也是bug集中地。但我们还需要更多,管理类会给予每个连接更多的功能。比如,连接创建后,想要预热一些功能,那这些状态就可以参与路由的决策。通常情况下,将用户或其他元信息也attach到连接上,能够多维度的根据条件筛选一些连接,进行批量操作,比如灰度、过载保护等,是一个非常重要的功能。管理后台可以看到每个连接的信息,筛选到一个或多个连接后,能够开启对这些连接的流量录制、信息监控、断点调试,你能体验到掌控一切的感觉。管理功能还能够看到系统的整个运行状态,及时调整负载均衡策略;同时对扩容、缩容提供数据依据。心跳检测应用协议层的心跳是必须的,它和tcp keepalive是完全不同的概念。应用层协议层的心跳检测的是连接双方的存活性,兼而连接质量,而keepalive检测的是连接本身的存活性。而且后者的超时时间默认过长,完全不能适应现代的网络环境。心跳就是靠轮训,无论是服务端,还是客户端比如GCM等。保活机制会在不同的应用场景进行动态的切换,比如程序唤起和在后台,轮训的策略是不一样的。Netty内置通过增加IdleStateHandler产生IDLE事件进行便捷的心跳控制。你要处理的,就是心跳超时的逻辑,比如延迟重连。但它的轮训时间是固定的,无法动态修改,高级功能需要自己定制。在一些客户端比如Android,频繁心跳的唤起会浪费大量的网络和电量,它的心跳策略会更加复杂一些。边界优雅退出机制Java的优雅停机通常通过注册JDK ShutdownHook来实现。Runtime.getRuntime().addShutdownHook();一般通过kill -15进行java进程的关闭,以便在进程死亡之前进行一些清理工作。注意:kill -9 会立马杀死进程,不给遗言的机会,比较危险。虽然netty做了很多优雅退出的工作,通过EventLoopGroup的shutdownGracefully方法对nio进行了一些状态设置,但在很多情况下,这还不够多。它只负责单机环境的优雅关闭。流量可能还会通过外层的路由持续进入,造成无效请求。我的通常做法是首先在外层路由进行一次本地实例的摘除,把流量截断,然后再进行netty本身的优雅关闭。这种设计非常简单,即使没有重试机制也会运行的很好,前提是在路由层需要提前暴露相关接口。异常处理功能netty由于其异步化的开发方式,以及其事件机制,在异常处理方面就显得异常重要。为了保证连接的高可靠性,许多异常需要静悄悄的忽略,或者在用户态没有感知。netty的异常会通过pipeline进行传播,所以在任何一层进行处理都是可行的,但编程习惯上,习惯性抛到最外层集中处理。为了最大限度的区别异常信息,通常会定义大量的异常类,不同的错误会抛出不同的异常。发生异常后,可以根据不同的类型选择断线重连(比如一些二进制协议的编解码紊乱问题),或者调度到其他节点。功能限制指令模式网络应用就该干网络应用的事,任何通讯都是昂贵的。在《Linux之《荒岛余生》(五)网络篇》中,我们谈到百万连接的服务器,广播一个1kb消息,就需要1000M的带宽,所以并不是什么都可以放在网络应用里的。 一个大型网络应用的合理的思路就是值发送相关指令。客户端在收到指令以后,通过其他方式,比如http,进行大型文件到获取。很多IM的设计思路就是如此。指令模式还会让通讯系统的扩展性和稳定性得到保证。增加指令可以是配置式的,立即生效,服务端不需要编码重启。稳定性保证网络应用的流量一般都是非常大的,并不适合全量日志的开启。应用应该只关注主要事件的日志,关注异常情况下的处理流程,日志要打印有度。网络应用也不适合调用其他缓慢的api,或者任何阻塞I/O的接口。一些实时的事件,也不应该通过调用接口吐出数据,可以走高速mq等其他异步通道。缓存可能是网络应用里用的最多的组件。jvm内缓存可以存储一些单机的统计数据,redis等存储一些全局性的统计和中间态数据。网络应用中会大量使用redis、kv、高吞吐的mq,用来快速响应用户请求。总之,尽量保持通讯层的清爽,你会省去很多忧虑。单机支持100万连接的Linux配置单机支持100万连接是可行的,但带宽问题会成为显著的瓶颈。启用压缩的二进制协议会节省部分带宽,但开发难度增加。和《LWP进程资源耗尽,Resource temporarily unavailable》中提到的ES配置一样,优化都有类似的思路。这份配置,可以节省你几天的时间,请收下!操作系统优化更改进程最大文件句柄数ulimit -n 1048576修改单个进程可分配的最大文件数echo 2097152 > /proc/sys/fs/nr_open修改/etc/security/limits.conf文件* soft nofile 1048576* hard nofile 1048576* soft nproc unlimitedroot soft nproc unlimited记得清理掉/etc/security/limits.d/*下的配置网络优化打开/etc/sysctl.conf,添加配置然后执行,使用sysctl生效#单个进程可分配的最大文件数fs.nr_open=2097152#系统最大文件句柄数fs.file-max = 1048576#backlog 设置net.core.somaxconn=32768net.ipv4.tcp_max_syn_backlog=16384net.core.netdev_max_backlog=16384#可用知名端口范围配置net.ipv4.ip_local_port_range=‘1000 65535’#TCP Socket 读写 Buffer 设置net.core.rmem_default=262144net.core.wmem_default=262144net.core.rmem_max=16777216net.core.wmem_max=16777216net.core.optmem_max=16777216net.ipv4.tcp_rmem=‘1024 4096 16777216’net.ipv4.tcp_wmem=‘1024 4096 16777216’#TCP 连接追踪设置net.nf_conntrack_max=1000000net.netfilter.nf_conntrack_max=1000000net.netfilter.nf_conntrack_tcp_timeout_time_wait=30#TIME-WAIT Socket 最大数量、回收与重用设置net.ipv4.tcp_max_tw_buckets=1048576# FIN-WAIT-2 Socket 超时设置net.ipv4.tcp_fin_timeout = 15总结netty的开发工作并不集中在netty本身,更多体现在保证服务的高可靠性和稳定性上。同时有大量的工作集中在监控和调试,减少bug修复的成本。深入了解netty是在系统遇到疑难问题时能够深入挖掘进行排查,或者对苛刻的性能进行提升。但对于广大应用开发者来说,netty的上手成本小,死挖底层并不会产生太多收益。它只是个工具,你还能让它怎样啊。0.jpeg

February 27, 2019 · 1 min · jiezi

CNCF推出云原生网络功能(CNF)Testbed

开源计划验证了在Kubernetes上运行ONAP网络功能对电信运营商的好处巴塞罗那,2019年2月25日 - 移动世界大会 - 支持Kubernetes®和Prometheus™等开源技术的的CNCF®(云原生计算基金会®)今天宣布与LF Networking(LFN)合作的开源云原生网络功能(CNF)Testbed。在巴塞罗那举行的移动世界大会上,CNCF正在演示相同的网络代码,在OpenStack上以虚拟网络功能(VNF)方式运行,以及在Kubernetes上以CNF方式运行,通过避免虚拟化开销来展示性能改进。“CNF正在成为未来的网络架构,其原因与容器和Kubernetes成为企业计算的标准平台的原因相同。”CNCF执行总监Dan Kohn说。“我们很高兴继续与LF Networking合作,为电信公司及其供应商提供一种在VNF和CNF之间进行可复制比较的方法。”CNF Testbed使组织能够可靠地测试ONAP或其自己的网络代码的网络功能,以VNF和CNF的方式,在相同底层硬件上比较运行在Kubernetes和OpenStack之间的性能和容错性。随着电信架构从VNF演变为CNF,其优势包括通过改进的打包节省成本,提高开发速度,以及单个CNF、机器甚至数据中心的故障恢复能力。ONAP作为LF Networking的一部分,为实时、政策驱动的物理和虚拟网络功能的编排和自动化提供了全面的平台。在去年宣布了ONAP现在是cncf.ci项目涵盖的一部分,CNCF运行该项目以在裸机上运行的K8集成、测试和部署CNCF和LF项目。CNF Testbed使用ONAP虚拟客户端设备(vCPE)用例中的几个开源VNF,并将代码重新打包为CNF容器。“很高兴看到ONAP和Kubernetes这两个增长最快的Linux基金会项目的协作,作为支持下一代架构的网络和云平台。”Linux基金会网络、边缘和物联网总经理Arpit Joshipura表示。“我们很高兴能够协助CNF Testbed展示行业从VNF转向CNF的道路。”CNF Testbed利用社区基础设施实验室(Community Infrastructure Lab),该实验室利用裸机托管公司Packet慷慨提供的信用额度。Testbed继续关注持续集成(CI)和可复制性,这些都是Kubernetes发展的标志。Kubernetes项目每个工作日运行超过10,000个CI工作,这是通过去年从Google向CNCF捐赠的900万美元谷歌云平台信用额度来实现。不需要信任CNF Testbed的初始结果,任何人都可以使用开源CNF Testbed存储库的副本和用于访问Packet的API密钥来复制结果。有兴趣了解更多关于CNF的组织,可以参与每月两次的BoF会议。详细信息在CNF Testbed仓库可以找到。KubeCon + CloudNativeCon和Open Source Summit大会日期:会议日程通告日期:2019 年 4 月 10 日会议活动举办日期:2019 年 6 月 24 至 26 日KubeCon + CloudNativeCon和Open Source Summit赞助方案KubeCon + CloudNativeCon和Open Source Summit多元化奖学金现正接受申请KubeCon + CloudNativeCon和Open Source Summit即将首次合体落地中国

February 26, 2019 · 1 min · jiezi

搞搞, 超星尔雅;

前奏目前正在读书的兄弟们, 一定很熟悉超星尔雅, 没错就是那个,看视屏不能快进的超星尔雅;不爱学习的我, 怎么能被这个耽误时间, 因此今天, 我们来,试试能不能跳过, 视频。正文尝试一一开始我们先试试, 能不能从video入手, 结果可想而知。 调动currentTime 视频会自动跳转到开始。尝试二不能调动进度条,那肯定是某个函数的功能,此方法不通。 但我们这样想,视频放完肯定要,发送数据给,超星的服务器,ok, 打开fiddler开始抓包。我们在想, 那发送放完的 数据肯定,是在视频最后, 所以第一个视频,在放到最后的时候。 我发现了这个可疑的接口, /multimedia/log/a/ ,就搞它, 打开form 可以看到playingTime, 这大概就是播放时间了吧,内心有些小激动,再看看下面server返回的JSON { isPassed=False } 当然,这大概就是判断视频是否确定了接口 ok 打开postman, 来模拟个包。把刚才fiddler 的链接复制上去。 postman 会自动解析?XX=XX& 把playTime 设置成 当时视频的时长=<video/>.duration先把cookie 全部带上, (因为不确定,cookie的功能)发送包, 但结果发现, server返回了405,这时我们把POST方法换成get/head 结果什么都没有返回返回网页, 发现任务点变成了已完成, 但视频还没放完。 刷新一下,还是一样。就这样^_^

February 24, 2019 · 1 min · jiezi

计算机网络

计算机网络应用进程之间的通信是端到端的通信常用的端口号: FTP(21,20) SMTP(25),DNS(53),HTTP(80),SSH(22),MYSQl(3306)在计算机网络协议体系: OSI体系结构(应用层,表示层,会话层,传输层,网络层,数据链路层,物理层) TCP/IP体系结构:应用层,传输层,网络层,数据链路层,物理层. IP地址是给主机(路由器)的每个接口分配一个全世界范围内的唯一的32位的标识符,第一个字段是网络号,第二个是主机号. HTTPS:在HTTP的基础上增加了SSL/TLS协议安全协议,这些协议由加密算法和哈希算法组成。TLS协议是在SSL的基础上发展起来的更安全的协议,HTTPS是明文协议,HTTPS遵循一套传输的严格标准规范,传输之前先进行身份验证(各大CA厂商提供),传输过程中数据保密包括对话密钥传输的时候和数据加密的传送,传输过程中所有数据都是明文(HTTP)收发,收发的是加密后的明文,在传输过程中防止被篡改采用哈希算法(MD5,SHA2)等。

February 18, 2019 · 1 min · jiezi

这个情人节,工程师用阿里云来试着表达不一样的爱意

年轻的时候谈的恋爱就像TCP链接,恋爱时三次握手即可,可分手时却分了四次。而常常久久的爱情,更像是icmp协议,无论对方身在何处,无论是否是可靠连接,无论你何时去ping她/他,她/他都默默地响应你。这篇文章就是说说,如何在内核中增加几行代码,让你的女神/男神当ping你(的服务器)的时候,来传达表达你的爱。效果如下(左边为ping的结果,需要破解ascii码转换为对应字符,右边为使用tcpdump抓包直接读取的信息):对于UNIX_LIKE系统来说,如果ping的发送内容与接收内容不同,会显示不同的部分,那么就让你的女神或者男神,慢慢将ASCII码解析成你想告诉她/他的话吧。或者告诉她/他,使用tcpdump来直接抓包隐藏在ping中的悄悄话。(对于windows来说本人没有充分测试,只是知道不会像unix_like系统一样直接显示出请求消息和回显消息的不同,所以需要大家抓包认真提取信息)一、ICMP协议这些你需要了解:学过计算机网络的一定知道,一个网络包的封装主要由多个属于不同网络协议层的报文头和用户数据共同组成:链路层报文头+网络层IP报文头+传输层报文头+携带的内容+帧尾。而ICMP报文在整个以太帧位于如下位置: 上图显示的是一个未分片ICMP报文或者是一个较长ICMP报文的第一个IP分片的报文(被分片的报文中不会带有ICMP报头)。RFC792(https://tools.ietf.org/html/r…)中定义了11种ICMP报文类型,通过ICMP报头8bit"类型"字段进行区分。并且每种"类型“会和其”代码"字段以及报文头的最后4字节,共同表达每种报文类型所表示的信息。这些ICMP报文类型被主要分为差错报文和查询报文:查询报文主要包括:回送请求(TYPE8),回送应答(TYPE0),地址掩码或时间戳的请求/应答等差错报文主要包括:目标主机不可达(TYPE3),超时,源抑制,路由重定向等 ping作为ICMP协议最为典型的运用,主要和回送请求,和回送应答这两个类型相关,这也是本文主要关心的两个类型。当然,当主机不可达或者网络路由不可达出现的时候,ping会收到路由器传来的TYPE为3的目标主机不可达的报文(我们可以通过tcpdump抓包获取)。对于其他的类型,有兴趣的同学可以自行学习,如icmp重定向攻击,洪水攻击都是利用了ICMP协议进行的网络攻击。二、动手写一个简单的ping,了解Linux ping作为本文的主角之一ping,有必要动手写一个简单的ping,帮助我们更好的理解整个请求应答的过程。我本人的测试机器centos 7中使用的是iputils这个工具进行ping操作,所以我们可以从iputils源码入手学习如何写一个简单的ping。学习过c网络编程的一定都了解socket套接字这个概念。对于ping来说发送请求和接受应答也同样是通过套接字来完成。只不过,ICMP协议虽然在内核中和TCP、UDP相似属于L4层协议,但是本质是附属于IP协议的网络层协议,所以需要使用原始套接字(SOCK_RAW)构建套接字,而非TCP或UDP使用的流式套接字(SOCK_STREAM)和数据包式套接字(SOCK_DGRAM)。SOCK_RAW的用途在于用户可以自定义填充IP报文头,并且对于ICMP报文自定义填充ICMP报文头。下面一张图,展示了代码中整个ping的逻辑发送以及处理应答的逻辑。具体代码可以参考这个:https://github.com/xiaobaidemu/myping/blob/master/ping.c 整个流程非常简单,需要说明的是,对于ping 127.0.0.1来说,程序极有可能先收到type为0的回显请求报文,再收到type为8的回显应答报文。这是因为icmp报文可以同时被内核接收处理,也会被原始套接字接收处理,如下为Understanding Linux Network Internals书中所述。三、添加内核代码前,你只需要知道一个结构体和icmp.c理解了ping的整个过程,接下来就是需要修改内核来传达你想说的话。但是最重要的是,需要分析出修改的位置,即回显应答可能发送的字节在内核代码中的位置。这里有一个非常重要的结构体——struct sk_buff,其定义位于<include/linux/skbuff.h>。内核中sk_buff结构体做到了可以不使用拷贝或删除的方式,使得数据在各层协议之间传输——即移动指针头的方式,具体为在处理不同的协议头时,代表协议头的指针,指向的是不同数据区域(如从L2到L4层协议,分别指向二层mac头,三层IP头,四层传输头)。以下是几个比较重要和混淆的字段说明,结合示意图说明: 上图简单说明了四个指针和指向区域之间的关系。另外对于data_len和len的关系,如果假设icmp报文比较小,ip层不会对其分片,那么data_len即为0,而len即为当前协议头长度+数据报文长度。关于data_len和len之间的关系涉及到skb_shared_info这个结构体的相关内容,因为和文章中心关系不大,有兴趣的同学可以自行查阅一下文章来学习http://blog.51cto.com/weiguozhihui/1586777https://0x657573.wordpress.com/2010/11/22/the-relation-between-skb-len-and-skb-data_len-and-what-they-represent/https://blog.csdn.net/farmwang/article/details/54233975 上述内容中data指针和表征协议层数据长度的len,和后文中修改的sk_buff指向的数据直接相关。另外sk_buff关联了众多其他结构体,这里只简要的讲解部分重要的字段含义,更为具体详细的说明可以参考Understanding Linux Network Internal第二章或者https://blog.csdn.net/YuZhiHui_No1/article/details/38666589系列文章进行更深入学习。 了解了sk_buff结构体,之后需要定位处理icmp协议的文件在哪里。icmp.c位于内核目录中net/ipv4/icmp.c中,且ICMP协议通常是静态编译至内核中,而非通过模块配置的。这里我从Understanding Linux Network Internal这本书中抠出来一张Big Picture,来简要说明一下对于ping发出的回显请求,sk_buff结构体对象是如何在icmp中众多函数中传递。首先ip_local_deliver_finish会传递ICMP消息到icmp_rcv, icmp_rcv会解析icmp报头中类型字段,对于属于查询报文的类型(如type8)会传递给icmp_reply, 而对于差错报文会传递给icmp_send处理,并且ICMP协议也会和其他诸如TCP/UDP协议进行交互传递信息。对于ping进程发出的请求,会先传递给icmp_echo函数进行处理。而icmp_echo正是处理ping请求很重要的一步,内核会把请求中附带的数据报文部分原封不动的拷贝并发送回源主机。因此我们可以在icmp_echo函数中,添加进我们"爱的语句"。static bool icmp_echo(struct sk_buff skb){ struct net net; net = dev_net(skb_dst(skb)->dev); if (!net->ipv4.sysctl_icmp_echo_ignore_all) { struct icmp_bxm icmp_param; icmp_param.data.icmph = icmp_hdr(skb); icmp_param.data.icmph.type = ICMP_ECHOREPLY; icmp_param.skb = skb; //———–添加开始———– char sentence1[] = “I LOVE U, xxxx.”; char sentence2[] = “I MISS U, xxxx.”; char sentence3[] = “Happy Valentine’s Day!”; int sentence_len_list[] = {sizeof(sentence1), sizeof(sentence2), sizeof(sentence3)}; char sentence_list[] = {sentence1, sentence2, sentence3}; int sentence_index = icmp_param.data.icmph.un.echo.sequence % 3; if(skb->len >= 16 + sentence_len_list[sentence_index]) { char tmp = (char)(skb->data+16); char* target_sentence = sentence_list[sentence_index]; int i=0; for(;i<sentence_len_list[sentence_index];++i) { tmp[i] = target_sentence[i]; } for(;i < skb->len-16;++i) { tmp[i] = 0; } } //———–添加结束———— icmp_param.offset = 0; icmp_param.data_len = skb->len; icmp_param.head_len = sizeof(struct icmphdr); icmp_reply(&icmp_param, skb); } /* should there be an ICMP stat for ignored echos? */ return true;}上述代码中icmp_bxm结构体包含了在后续icmp消息传递过程中的所有需要的信息,包括icmp报文头,sk_buff对象,icmp 报文payload大小等。需要注意的是,由于icmp_rcv已经解析过sk_buff中属于icmp协议的报文头部分,所以参数中skb->data指向的是icmp数据部分,即不包含报文头,而skb->len也只有icmp数据部分的长度。假设ping请求中所带的数据部分为56字节,则此时skb->len大小为56。由于ping数据部分的前16字节为携带的是发送是struct timeval对象——发送时的时间,所以在真实替换时,从data指向的数据部分的第16个字节开始,用memcpy复制到对应区域,或者如上例子傻傻的循环赋值即可。上面代码所表示的就是根据echo请求中seq_id循环回复上述三句话。当然有创意的小伙伴可以增加更多表达难度。四、创建一个阿里云ECS服务器,十分钟完成所有修改分析完了整个icmp处理流程,和修改方法,我们只需要创建一个阿里云ECS,并简单编译修改后的内核即可。具体流程如下:阿里云创建任意规格服务器(大规格可以加快内核编译速度,此处创建一个4vcpu服务器),使用centos作为os下载linux内核代码,并解压放置到/usr/src/kernels目录下,本文使用的是4.20.6内核版本。编译前基于原centos系统中/boot目录下的config文件,生成编译配置项,根据此编译项来定制内核。拷贝原配置文件至内核文件目录 sudo cp /boot/config-3.10.0-693.el7.x86_64 ./.config;执行make oldconfig,生成新的.config文件编译源码:make -j 4 ,可能编译过程中缺少某些库,此时yum安装缺少的库,如openssl-devel, elfutils-libelf-devel安装内核模块:make modules_install -j 4拷贝内核和配置文件至/boot目录,并生成System.map文件:make install -j 4更新引导:grub2-mkconfig -o /boot/grub2/grub.cfg修改默认默认启动引导内核:修改/etc/default/grub文件,将GRUB_DEFAULT设为0,0表示第一个启动项,即为最新编译的内核。重启服务器:reboot 至此告诉你的女神/男神,你想说的话都在ping中。部分参考文章:Understanding Linux Network Internal 第2章&第25章https://www.geeksforgeeks.org/ping-in-c/https://medium.freecodecamp.org/building-and-installing-the-latest-linux-kernel-from-source-6d8df5345980https://github.com/iputils/ip…本文作者:贺小白同学阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

February 18, 2019 · 1 min · jiezi

带你了解TCP/IP协议族

一.TCP/IP协议族的四层模型应用层(HTTP FTP),传输层(TCP UDP),网络层(IP),链路层。二.为什么要分层?因为网络传输的过程中网络是不稳定的。如图: 其实在我们的网络传输过程中从客户端发送消息的服务端的过程中网络并不是只沿着一条直线可以直接顺利传达到的,它再传输的过程中会经过很多的中间节点,但每一个节点都是有可能是会突然出问题的。如图所示:举一个极端的例子我在传数据的过程中突然停电了或者某一个节点的路由坏了,这时我们的数据就相当于传输失败了,那么这时候我们就需要重新传输数据。但是如果传输的是一个非常大的数据呢?那么我们每次重新传输这个数据的时候必然会造成流量的浪费和速率的降低。如图:每次传输失败我都需要将数据 ABCDEFGH 从新发送,效率很低!!!这也就是为什么需要传输层的原因。三.传输层:TCP协议, UDP协议传输层主要做的是将你应用层的数据分块编号传输,同时还要确认你的数据到达,如果某一块的数据没有到达那么我只需要再次传输传输失败的内容即可。这样就保证了我只需要传输失败的部分而不是每次都整体重新传输。如图:我们将原数据拆分为四组数据当我们传输数据的过程中每次将数据传到服务端的TCP层时,它都会确认并通知客户端对应的编号数据已到达。这时比如3号的传输过程中传输失败了那么客户端是迟迟不能收到服务端回应的,对此我们要做的只是再重新传输失败的3号即可而不是像之前一样整体重新传输。1.TCP协议所做的事情:保证可靠性和拆块数据客户端TCP层将HTTP层数据拆块。传输数据完成后服务端需要向客户端发送收到信息,如果在规定时间内客户端没有收到服务端发送的回应(ACK)则客户端将重新发送没有收到的数据。(超时重传,保证可靠性)。所有数据传输完成后服务端TCP层将拆块的数据组合成原有数据交给HTTP层处理。2.TCP UDP的区别什么叫做连接?通信双方建立确认「可以通信」,不会将对方的消息丢弃,即为「建立连接」UDP是面向无连接的、不可靠的数据报服务、有序;只需找到目标端口号就可以直接开始发送数据,即发送数据之前不需要建立连接而TCP要经过3次握手创建连接。UDP不需要确认数据是否丢失是否到达,只管传就可以。使用场景: 游戏、视频会议等不需要确认数据有效性且需要快速传输的场景。比如游戏吃鸡,我卡顿两秒后恢复了,我不需要知道这卡顿的两秒发生了什么不需要知道它的数据是什么,我只关心2秒后恢复网络的这最新一帧的画面是什么。TCP是面向连接的、可靠、有序的字节流服务。3.TCP 协议被认为是稳定的协议TCP 协议被认为是稳定的协议,因为它有以下特点:(都是为了确保数据不丢失,所有数据都传输成功)面向连接,“三次握手”双向通信( 客户端发送,服务端接收同时告知客户端接收完成)保证数据按序发送,按序到达超时重传4.滑动窗口协议为了不浪费网络资源高效的发送数据,保证可靠性和有序性滑动窗口协议,是TCP使用的一种流量控制方法。该协议允许发送方在停止并等待确认前可以连续发送多个分组。由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输。 只有在接收窗口向前滑动时(与此同时也发送了确认),发送窗口才有可能向前滑动。 收发两端的窗口按照以上规律不断地向前滑动,因此这种协议又称为滑动窗口协议。 当发送窗口和接收窗口的大小都等于1时,就是停止等待协议。上图中分成了四个部分,分别是:(其中那个黑模型就是滑动窗口)已收到ack确认的数据。已收到ack确认的数据。发还没收到ack的。在窗口中还没有发出的(接收方还有空间)。窗口以外的数据(接收方没空间)下面是个滑动后的示意图(收到36的ack,并发出了46-51的字节):要注意的是TCP并不是每一个报文段都会回复ACK的,可能会对两个报文段发送一个ACK,也可能会对多个报文段发送1个ACK【累计ACK】,比如说发送方有1/2/3 3个报文段,先发送了2,3 两个报文段,但是接收方期望收到1报文段,这个时候2,3报文段就只能放在缓存中等待报文1的空洞被填上,如果报文1,一直不来,报文2/3也将被丢弃,如果报文1来了,那么会发送一个ACK对这3个报文进行一次确认。4.1 拥塞机制对发送端窗口的发送数据量做控制,可以认为是对发送窗口的大小不断地调整防止流量的浪费。(如当前网络情况不好,服务端只能处理50个数据但客户端传了100个数据,这时剩下的50个数据相当于没有处理,那么客户端会触发超时重传机制重新传输这50个数据,这样的话就造成了一个资源的浪费情况的发生,因为这50个资源是完全没有必要去传输的)。慢启动,拥塞控制 快重传,快恢复 5.TCP的三次握手、四次挥手过程 (连接、断开)这里我们要先认识几个标志位ACK:收到。 SYN:发起一个连接。 FIN:释放一个连接。 5.1 三次握手简化三步握手的流程就是C发给S我要跟你通信。S告诉C你可以跟我通信同时我也要跟你通信。C告诉S你可以跟我通信,咱们可以开始通信了。需要三次握手的原因在于S端在第二次握手(发出消息)后并不知道C端是否能接收它发送的消息,如果发送的SYN对方没有收到而直接通信的话会造成只能C到S单方通信(C会收不到S发送的确认消息收到的信息),而TCP连接是需要双端都可以通信的。5.2 四次挥手第一次挥手:客户端发送一个FIN=1,用来关闭客户端到服务器端的数据传送,客户端进入FIN_WAIT_1状态。意思是说”我客户端没有数据要发给你了”,但是如果你服务器端还有数据没有发送完成,则不必急着关闭连接,可以继续发送数据。第二次挥手:服务器端收到FIN后,先发送ack=u+1,告诉客户端,你的请求我收到了,但是我还没准备好,请继续你等我的消息(服务端会等待没有发送的数据发送完毕)。这个时候客户端就进入FIN_WAIT_2 状态,继续等待服务器端的FIN报文。第三次挥手:当服务器端确定数据已发送完成,则向客户端发送FIN=1报文,告诉客户端,好了,我这边数据发完了,准备好关闭连接了。服务器端进入LAST_ACK状态。第四次挥手:客户端收到FIN=1报文后,就知道可以关闭连接了,但是他还是不相信网络,怕服务器端不知道要关闭,所以发送ack=w+1后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。服务器端收到ACK后,就知道可以断开连接了。客户端等待了2MSL(2倍最大报文存活时间)后依然没有收到回复,则证明服务器端已正常关闭,那好,我客户端也可以关闭连接了。最终完成了四次握手。注意:是第四次握手2端才分别关闭的!而不是第三次! S端收到ACK后会关闭连接,同时C端发送ACK后在等待2MSL(2倍最大报文存活时间)后C端连接也会关闭。如果第三次挥手S端直接关闭的话那么如果C端因为网络因素没有收到FIN的话那么C端会一直等待FIN,这时S端已经关闭了将导致C端无法关闭的情况发生。等待2MSL的原因是S端可能不会收到C端的ACK标志位,那么S端会超时重传重新发送FIN给C端,如果C端不等待2MSL而直接关闭的话会造成C端收不到FIN而S端一直重传FIN导致S端无法关闭的情况发生。(一切都是为了保证四次挥手更加可靠)。5.3 长连接为什么要长连接?因为移动网络并不在 Internet 中,而是在运营商的内网,并不具有真正的公网 IP,因此当某个 TCP 连接在一段时间不通信之后,网关会出于网络性能考虑而关闭这条 TCP 连接和公网的连接通道,导致这个TCP端不再能收到外部通信消息,即 TCP 连接被动关闭(比如推送接收不到了,聊天场景中的S端给C端发信息由于连接关闭导致的C端接收不到了)。 长连接的实现方式心跳。即在一定间隔时间内,使用 TCP 连接发送超短无意义消息来让网关不能将自己定义为「空闲连接」,从而防止网关将自己的连接关闭(防止TCP连接通道被被动的关闭)。TCP的keep alive是检查当前TCP连接是否活着;HTTP的Keep-alive是要让一个TCP连接活久点。它们是不同层次的概念。四.网络层 IP网络层的作用是在复杂的网络环境中为要发送的数据报找到一个合适的路径进行传输。(也就是从众多的路由节点中选出一条效率最高的路径去传输)网络层不能保证数据报的可靠性传输,可靠性是由网络主机中的传输层(TCP)来进行保证的。也就是说网络层不管传的数据是什么,也不管你传没传送到达,只管一味的传输。(闷头楞传~)如图:图a就是有连接(TCP,有序)的传输:由主机A向主机B传输数据时,提前建立一条连接:主机A->节点1->节点3->主机B。则在由A向B传输多个数据报时,均只能使用这条路线进行传输。图b是无连接(UDP,无序)的传输:当由A向B发送数据报1时,从主机A开始发现由A到节点1的网络比较空闲,就使用这条路径发送,到达节点1时,发现可以使用节点1到节点3的路径,于是就走这条路径,同理再走到主机B;当发送数据报2时,此时发现由A到节点2的网络比较空闲,就使用这条路线发送,之后同理。五.链路层网络层传输数据需要建立在物理设备的基础上, 链路层就是我们平时接触的网卡和网卡的驱动程序(以太网,WIFI)。上层(比如网络层,传输层等等)不知道也不需要知道数据在物理上是如何传输的。比如数据究竟是用双绞线传输的还是用同轴电缆,到底是有线的网络接口还是无线的网络接口传输,这些细节统统不需要链路层的上层去操心,这样的好处就是比如一会使用有线,一会使用无线,这对于处于网络层的IP实现,或者是传输层的TCP实现来讲,是不需要有任何变化的。

February 16, 2019 · 1 min · jiezi

如何使用MTR诊断网络问题

前言MTR 是一款强大的网络诊断工具,网络管理员使用 MTR 可以诊断和隔离网络问题,并且为上游 ISP 提供有用的网络状态报告。MTR 是传统 traceroute 命令的进化版,并且可以提供强大的数据样本,因为他集合了 traceroute 和 ping 这两个命令的精华。本文带您深入了解 MTR ,从数据如何生成,到如果正确理解报告样本并得出相应的结论。使用 MTR 诊断网络问题更新历史2019年01月22日 - 初稿阅读原文 - https://wsgzao.github.io/post…扩展阅读MTR - http://www.bitwizard.nl/mtr/Diagnosing Network Issues with MTR - https://www.linode.com/docs/n…网络诊断相关的背景知识Networking diagnostic tools including ping, traceroute, and mtr use Internet Control Message Protocol (ICMP) packets to test contention and traffic between two points on the Internet. When a user pings a host on the Internet, a series of ICMP packets are sent to the host, which responds by sending packets in return. The user’s client is then able to compute the round trip time between two points on the Internet.In contrast, tools such as traceroute and MTR send ICMP packets with incrementally increasing TTLs in order to view the route or series of hops that the packet makes between the origin and its destination. The TTL, or time to live, controls how many hops a packet will make before “dying” and returning to the host. By sending a series of packets and causing them to return after one hop, then two, then three, MTR is able to assemble the route that traffic takes between hosts on the Internet.Rather than provide a simple outline of the route that traffic takes across the Internet, MTR collects additional information regarding the state, connection, and responsiveness of the intermediate hosts. Because of this additional information, MTR can provide a complete overview of the connection between two hosts on the Internet. The following sections outline how to install the MTR software and how to interpret the results provided by this tool.网络诊断工具 例如 ping traceroute mtr 都使用的 “ICMP” 包来测试 Internet 两点之间的网络连接状况。当用户使用 ping 命令 ping 网络上的主机后, ICMP 包将会发送到目的主机,然后在目的主机返回响应。这样,就可以得知本机到目的主机 ICMP 包传输所使用的往返时间。相对于其他命令仅仅收集传输路径或响应时间,MTR 工具会收集更多的信息,比如 连接状态,连接可用性,以及传输路径中主机的响应性。由于这些额外的信息,我们建议您尽可能完整的展现 Internet 两个主机之间的网络连接信息。接下来我们讲述如何安装 MTR 软件,以及如何看懂这款软件的输出结果。Diagnostics and Testing - https://www.linode.com/docs/n…名词解释ICMP(Internet Control Message Protocol)IP 协议族的一员,主要用于网络设备间发送错误指示信息, 一般不用于传输数据,常见部署在用户端网络程序中,诸如 traceroute 或 ping 等程序TTL(Time To Live)此处的 Time 表示的是次数,而不是时间,表达的是一个包在结束之前还能经过的跳数Hop跳数: 网络中两个端路径上的节点,路由器的数目ISP(Internet Service Provider)互联网服务提供商pingping send ICMP ECHO_REQUEST to network hostsICMP 是(Internet Control Message Protocol)Internet 控制报文协议。它是 TCP/IP 协议族的一个子协议,用于在 IP 主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。使用 ping 检查连通性有六个步骤:使用 ifconfig 观察本地网络设置是否正确;ping 127.0.0.1,127.0.0.1 回送地址 Ping 回送地址是为了检查本地的 TCP/IP 协议有没有设置好;ping 本机 IP 地址,这样是为了检查本机的 IP 地址是否设置有误;ping 本网网关或本网 IP 地址,这样的是为了检查硬件设备是否有问题,也可以检查本机与本地网络连接是否正常;(在非局域网中这一步骤可以忽略)ping 本地 DNS 地址,这样做是为了检查 DNS 是否能够将 IP 正确解析。注: /etc/resolv.conf文件,“nameserver 8.8.8.8” 指定了 dns 服务器的地址,如果启用了NetworkManager要注意网卡重启或服务器重启配置被覆盖的问题;ping 远程 IP 地址,这主要是检查本网或本机与外部的连接是否正常。安装 MTR# CentOSyum install mtr# Ubuntuapt-get install mtr# macOSbrew install mtr# WindowsBestTrace - https://www.ipip.net/product/client.htmlUsage: mtr [options] hostname -F, –filename FILE read hostname(s) from a file -4 use IPv4 only -6 use IPv6 only -u, –udp use UDP instead of ICMP echo -T, –tcp use TCP instead of ICMP echo -a, –address ADDRESS bind the outgoing socket to ADDRESS -f, –first-ttl NUMBER set what TTL to start -m, –max-ttl NUMBER maximum number of hops -U, –max-unknown NUMBER maximum unknown host -P, –port PORT target port number for TCP, SCTP, or UDP -L, –localport LOCALPORT source port number for UDP -s, –psize PACKETSIZE set the packet size used for probing -B, –bitpattern NUMBER set bit pattern to use in payload -i, –interval SECONDS ICMP echo request interval -G, –gracetime SECONDS number of seconds to wait for responses -Q, –tos NUMBER type of service field in IP header -e, –mpls display information from ICMP extensions -Z, –timeout SECONDS seconds to keep probe sockets open -r, –report output using report mode -w, –report-wide output wide report -c, –report-cycles COUNT set the number of pings sent -j, –json output json -x, –xml output xml -C, –csv output comma separated values -l, –raw output raw format -p, –split split output -t, –curses use curses terminal interface –displaymode MODE select initial display mode -n, –no-dns do not resove host names -b, –show-ips show IP numbers and host names -o, –order FIELDS select output fields -y, –ipinfo NUMBER select IP information in output -z, –aslookup display AS number -h, –help display this help and exit -v, –version output version information and exit如何读懂 MTR 报告因为 MTR 报告包括了丰富的信息,新手第一次阅读有点困难。下面是我本地到 google.com 的测试报告[root@sg-gop-10-65-200-186 wangao]# mtr -r google.comStart: Wed Jan 23 16:00:30 2019HOST: sg-gop-10-65-200-186 Loss% Snt Last Avg Best Wrst StDev 1.|– 10.65.200.20 0.0% 10 0.3 0.3 0.3 0.5 0.0 2.|– ns9.webhostsg.com 0.0% 10 1.0 0.9 0.9 1.0 0.0 3.|– 192.168.3.33 0.0% 10 0.9 0.9 0.8 0.9 0.0 4.|– vlan242-s4rsm.starhub.net 0.0% 10 1.6 1.8 1.6 1.9 0.0 5.|– ancoretl02.starhub.net.sg 0.0% 10 2.0 2.0 1.9 2.1 0.0 6.|– anutli12.starhub.net.sg 0.0% 10 1.9 2.1 1.9 3.1 0.3 7.|– 72.14.194.0 0.0% 10 2.5 2.7 2.4 4.3 0.5 8.|– 74.125.242.35 0.0% 10 2.5 2.5 2.4 2.7 0.0 9.|– 216.239.49.74 0.0% 10 3.4 4.4 3.3 12.0 2.6 10.|– 74.125.252.254 0.0% 10 3.7 3.7 3.5 3.9 0.0 11.|– 108.170.233.49 0.0% 10 4.4 4.2 4.0 4.7 0.0 12.|– ??? 100.0 10 0.0 0.0 0.0 0.0 0.0返回结果各列数据说明:第一列: 显示的是 IP 地址或本机域名,这点和 traceroute 很像第二列: Loss% 到达此节点的数据包丢包率,显示的每个对应 IP 的丢包率。第三列: Snt:100 设置发送数据包的数量,默认值是 10 通过参数 -c 来自定义数量。第四列: Last 显示的最近一次的返回时延第五列: Avg 平均值这个应该是发送 ping 包的平均时延第六列: Best 最好或者说时延最低的第七列: Wrst 最差或者说时延最大的第八列: StDev 是标准偏差使用 mtr –report google.com 命令来输出这篇报告。使用 report 选项可以给 google.com 主机发送 10 个 ICMP 包,然后输出报告。如果我们不使用 –report 参数, mtr 会不断的动态运行。在动态模式下, mtr 的输出结果表述每个主机的往返时间。大多数情况下,使用 –report 参数就可以提供足够的数据了。在命令下面,就是 MTR 产生的输出报告 。在通常情况下, MTR 需要几秒钟的时间来输出报告,但是偶尔可能需要更长的时间。MTR 报告是由一系列跳数组成的(在上述例子中是 12 跳)。“跳”意味着节点,或路由器,数据包通过它们才能到达目的主机。在上面例子中,数据包经过本地网络的 “内层” 和“外层”,然后再到一系列的域名主机。主机的域名是通过反向 DNS 查找确定的。如果您想忽略 DNS 查找,您可以使用 –no-dns 参数,使用 –no-dns 参数后,报告结果如下:[root@sg-gop-10-65-200-186 wangao]# mtr -rn google.comStart: Wed Jan 23 16:01:02 2019HOST: sg-gop-10-65-200-186 Loss% Snt Last Avg Best Wrst StDev 1.|– 10.65.200.20 0.0% 10 0.2 0.3 0.2 0.3 0.0 2.|– 203.117.178.28 0.0% 10 0.8 0.9 0.8 1.1 0.0 3.|– 192.168.3.33 0.0% 10 0.8 0.8 0.7 0.9 0.0 4.|– 203.117.6.21 0.0% 10 1.8 1.8 1.6 1.9 0.0 5.|– 203.118.15.177 0.0% 10 1.8 1.9 1.8 2.1 0.0 6.|– 203.118.12.10 0.0% 10 1.9 1.9 1.8 2.1 0.0 7.|– 72.14.194.0 0.0% 10 2.4 2.5 2.4 2.7 0.0 8.|– 74.125.242.35 0.0% 10 2.6 4.7 2.5 12.6 3.8 9.|– 216.239.49.74 0.0% 10 3.5 3.5 3.3 4.0 0.0 10.|– 74.125.252.254 0.0% 10 3.7 4.1 3.7 6.6 0.8 11.|– 108.170.233.49 0.0% 10 4.3 4.4 4.2 4.7 0.0 12.|– ??? 100.0 10 0.0 0.0 0.0 0.0 0.0当我们研究 MTR 报告时候,最好找出每一跳的任何问题。除了可以查看两个服务器之间的路径之外,MTR 在它的七列数据中提供了很多有价值的数据统计报告。 Loss% 列展示了数据包在每一跳的丢失率。 Snt 列记录的多少个数据包被送出。 使用 –report 参数默认会送出 10 个数据包。如果使用 –report-cycles=[number-of-packets] 选项,MTR 就会按照 [number-of-packets] 指定的数量发出 ICMP 数据包。Last, Avg, Best 和 Wrst 列都标识数据包往返的时间,使用的是毫秒( ms )单位表示。 Last 表示最后一个数据包所用的时间, Avg 表示评价时间, Best 和 Wrst 表示最小和最大时间。在大多数情况下,平均时间( Avg)列需要我们特别注意。最后一列 StDev 提供了数据包在每个主机的标准偏差。如果标准偏差越高,说明数据包在这个节点的延时越不相同。标准偏差会让您了解到平均延时是否是真的延时时间的中心点,或者测量数据受到某些问题的干扰。例如,如果标准偏差很大,说明数据包的延迟是不确定的。一些数据包延迟很小(例如:25ms),另一些数据包延迟很大(例如:350ms)。当 10 个数据包全部发出后,得到的平均延迟可能是正常的,但是平均延迟是不能很好的反应实际情况的。如果标准偏差很高,使用最好和最坏的延迟来确定平均延迟是一个较好的方案。在大多数情况下,您可以把 MTR 的输出分成三大块。根据配置,第二或第三跳一般都是您的本地 ISP,倒数第二或第三跳一般为您目的主机的 ISP。中间的节点是数据包经过的路由器。分析 MTR 报告核心的两个参数:loss 丢包率latency 延迟确定丢包率当分析 MTR 的输出时,您需要注意两点: loss 和 latency。首先,让我们讨论一下 loss。如果您在任何一跳上看到 loss 的百分比,这就说明这一跳上可能有问题了。当然,很多服务提供商人为限制 ICMP 发送的速率,这也会导致此问题。那么如何才能指定是人为的限制 ICMP 传输还是确定有丢包的现象?我们需要查看下一跳。如果下一跳没有丢包现象,说明上一条是人为限制的。如下示例:root@localhost:# mtr –report www.google.comHOST: example Loss% Snt Last Avg Best Wrst StDev1. 63.247.74.43 0.0% 10 0.3 0.6 0.3 1.2 0.32. 63.247.64.157 50.0% 10 0.4 1.0 0.4 6.1 1.83. 209.51.130.213 0.0% 10 0.8 2.7 0.8 19.0 5.74. aix.pr1.atl.google.com 0.0% 10 6.7 6.8 6.7 6.9 0.15. 72.14.233.56 0.0% 10 7.2 8.3 7.1 16.4 2.96. 209.85.254.247 0.0% 10 39.1 39.4 39.1 39.7 0.27. 64.233.174.46 0.0% 10 39.6 40.4 39.4 46.9 2.38. gw-in-f147.1e100.net 0.0% 10 39.6 40.5 39.5 46.7 2.2在此例中,第二跳发生了丢包现象,但是接下来几条都没任何丢包现象,说明第二跳的丢包是人为限制的。如果在接下来的几条中都有丢包,那就可能是第二跳有问题了。请记住,ICMP 包的速率限制和丢失可能会同时发生。如果发生包的丢失情况,我们要用最低百分比来衡量时间情况。为什么这么说呢?请看如下示例:root@localhost:# mtr –report www.google.comHOST: localhost Loss% Snt Last Avg Best Wrst StDev1. 63.247.74.43 0.0% 10 0.3 0.6 0.3 1.2 0.32. 63.247.64.157 0.0% 10 0.4 1.0 0.4 6.1 1.83. 209.51.130.213 60.0% 10 0.8 2.7 0.8 19.0 5.74. aix.pr1.atl.google.com 60.0% 10 6.7 6.8 6.7 6.9 0.15. 72.14.233.56 50.0% 10 7.2 8.3 7.1 16.4 2.96. 209.85.254.247 40.0% 10 39.1 39.4 39.1 39.7 0.27. 64.233.174.46 40.0% 10 39.6 40.4 39.4 46.9 2.38. gw-in-f147.1e100.net 40.0% 10 39.6 40.5 39.5 46.7 2.2在这个例子中,您可以看打 第 3 跳和第 4 跳都有 60% 的丢包率,从接下来的几跳都有丢包现象,所以不像是人为限制 ICMP 速率的原因。但是最后几跳都是 40% 的丢包率,我们可以猜测到 60% 的丢包率除了网络糟糕的原因之前还有人为限制 ICMP。所以,当我们看到不同的丢包率时,通常要以最后几跳为准。还有很多时候问题是在数据包返回途中发生的。数据包可以成功的到达目的主机,但是返回过程中遇到 “困难” 了。所以,当问题发生后,我们通常需要收集反方向的 MTR 报告。此外,互联网设施的维护或短暂的网络拥挤可能会带来短暂的丢包率,当出现短暂的 10% 丢包率时候,不必担心,应用层的程序会弥补这点损失。读懂网络延迟除了可以通过 MTR 报告看到丢包率,我们还可以看到本地到目的主机之间的延时。因为不同的物理位置,延迟通常随着跳数的增加而增加。所以,延迟通常取决于节点之间的物理距离和线路质量。例如,在同样的传输距离下,dial-up 连接比 cable modem 连接有更大的延迟。如下示例中显示 MTR 报告:root@localhost:# mtr –report www.google.comHOST: localhost Loss% Snt Last Avg Best Wrst StDev1. 63.247.74.43 0.0% 10 0.3 0.6 0.3 1.2 0.32. 63.247.64.157 0.0% 10 0.4 1.0 0.4 6.1 1.83. 209.51.130.213 0.0% 10 0.8 2.7 0.8 19.0 5.74. aix.pr1.atl.google.com 0.0% 10 388.0 360.4 342.1 396.7 0.25. 72.14.233.56 0.0% 10 390.6 360.4 342.1 396.7 0.26. 209.85.254.247 0.0% 10 391.6 360.4 342.1 396.7 0.47. 64.233.174.46 0.0% 10 391.8 360.4 342.1 396.7 2.18. gw-in-f147.1e100.net 0.0% 10 392.0 360.4 342.1 396.7 1.2在这份报告中,从第三跳到第四跳的延迟猛增,直接导致了后面的延迟也很大。这可能是因为第四跳的路由器配置不当,或者线路很拥堵的原因。然而,高延迟并不一定意味着当前路由器有问题。这份报告虽然看到第四跳有点问题,但是数据仍然可以正常达到目的主机并且返回给主机。延迟很大的原因也有可能是在返回过程中引发的。我这份报告我们看不到返回的路径,返回的路径可能是完全不同的线路,所以我们一般要进行双向测试了。ICMP 速率限制也可能会增加延迟,如下:root@localhost:# mtr –report www.google.comHOST: localhost Loss% Snt Last Avg Best Wrst StDev 1. 63.247.74.43 0.0% 10 0.3 0.6 0.3 1.2 0.3 2. 63.247.64.157 0.0% 10 0.4 1.0 0.4 6.1 1.8 3. 209.51.130.213 0.0% 10 0.8 2.7 0.8 19.0 5.7 4. aix.pr1.atl.google.com 0.0% 10 6.7 6.8 6.7 6.9 0.1 5. 72.14.233.56 0.0% 10 254.2 250.3 230.1 263.4 2.9 6. 209.85.254.247 0.0% 10 39.1 39.4 39.1 39.7 0.2 7. 64.233.174.46 0.0% 10 39.6 40.4 39.4 46.9 2.3 8. gw-in-f147.1e100.net 0.0% 10 39.6 40.5 39.5 46.7 2.2乍一看,第 4 跳和第 5 跳直接的延迟很大。但是第 5 跳之后,延迟又恢复正常了。最后的延迟差不多为 40ms。像这种情况,是不影响实际情况的。因为可能仅仅是第 5 跳设备限制了 ICMP 传输速率的原因。所以我们一般要用最后一跳的实际延迟为准。常见的 MTR 报告类型很多网络问题十分麻烦,并且需要上级网络提供商来帮助。然而,这里有很多常见的 MTR 报告所描述的网络问题。如果您正在经历一些网络问题,并且想诊断出原因,可以参考如下示例:目的主机网络配置不当在下面这个例子中,数据包在目的地出现了 100% 的丢包。乍一看是数据包没有到达,其实未必,很有可能是路由器或主机配置不当。root@meiriyitie.com:# mtr –report www.google.comHOST: localhost Loss% Snt Last Avg Best Wrst StDev 1. 63.247.74.43 0.0% 10 0.3 0.6 0.3 1.2 0.3 2. 63.247.64.157 0.0% 10 0.4 1.0 0.4 6.1 1.8 3. 209.51.130.213 0.0% 10 0.8 2.7 0.8 19.0 5.7 4. aix.pr1.atl.google.com 0.0% 10 6.7 6.8 6.7 6.9 0.1 5. 72.14.233.56 0.0% 10 7.2 8.3 7.1 16.4 2.9 6. 209.85.254.247 0.0% 10 39.1 39.4 39.1 39.7 0.2 7. 64.233.174.46 0.0% 10 39.6 40.4 39.4 46.9 2.3 8. gw-in-f147.1e100.net 100.0 10 0.0 0.0 0.0 0.0 0.0MTR 报告数据包没有到达目的主机是因为目的主机没有发送任何应答。这可能是目的主机防火墙的原因,例如: iptables 配置丢掉 ICMP 包所致。家庭或办公室路由器的原因有时候家庭路由器的原因导致 MTR 报告看起来有点误导。% mtr –no-dns –report google.comHOST: deleuze Loss% Snt Last Avg Best Wrst StDev 1. 192.168.1.1 0.0% 10 2.2 2.2 2.0 2.7 0.2 2. ??? 100.0 10 8.6 11.0 8.4 17.8 3.0 3. 68.86.210.126 0.0% 10 9.1 12.1 8.5 24.3 5.2 4. 68.86.208.22 0.0% 10 12.2 15.1 11.7 23.4 4.4 5. 68.85.192.86 0.0% 10 17.2 14.8 13.2 17.2 1.3 6. 68.86.90.25 0.0% 10 14.2 16.4 14.2 20.3 1.9 7. 68.86.86.194 0.0% 10 17.6 16.8 15.5 18.1 0.9 8. 75.149.230.194 0.0% 10 15.0 20.1 15.0 33.8 5.6 9. 72.14.238.232 0.0% 10 15.6 18.7 14.1 32.8 5.9 10. 209.85.241.148 0.0% 10 16.3 16.9 14.7 21.2 2.2 11. 66.249.91.104 0.0% 10 22.2 18.6 14.2 36.0 6.5不要为 100% 的丢包率所吓到,这并不表明这里有问题。你可以看打在接下来几跳是没有任何丢包的。运营商的路由器没有正确配置有时候您的运营商的路由器配置原因,导致 ICMP 包永远不能到达目的地,例如:root@meiriyitie.com:# mtr –report www.google.comHOST: localhost Loss% Snt Last Avg Best Wrst StDev 1. 63.247.74.43 0.0% 10 0.3 0.6 0.3 1.2 0.3 2. 63.247.64.157 0.0% 10 0.4 1.0 0.4 6.1 1.8 3. 209.51.130.213 0.0% 10 0.8 2.7 0.8 19.0 5.7 4. aix.pr1.atl.google.com 0.0% 10 6.7 6.8 6.7 6.9 0.1 5. ??? 0.0% 10 0.0 0.0 0.0 0.0 0.0 6. ??? 0.0% 10 0.0 0.0 0.0 0.0 0.0 7. ??? 0.0% 10 0.0 0.0 0.0 0.0 0.0 8. ??? 0.0% 10 0.0 0.0 0.0 0.0 0.0 9. ??? 0.0% 10 0.0 0.0 0.0 0.0 0.0 10. ??? 0.0% 10 0.0 0.0 0.0 0.0 0.0当没有额外的路由信息时,将会显示问号(???),下面例子也一样:root@meiriyitie.com:# mtr –report www.google.comHOST: localhost Loss% Snt Last Avg Best Wrst StDev 1. 63.247.74.43 0.0% 10 0.3 0.6 0.3 1.2 0.3 2. 63.247.64.157 0.0% 10 0.4 1.0 0.4 6.1 1.8 3. 209.51.130.213 0.0% 10 0.8 2.7 0.8 19.0 5.7 4. aix.pr1.atl.google.com 0.0% 10 6.7 6.8 6.7 6.9 0.1 5. 172.16.29.45 0.0% 10 0.0 0.0 0.0 0.0 0.0 6. ??? 0.0% 10 0.0 0.0 0.0 0.0 0.0 7. ??? 0.0% 10 0.0 0.0 0.0 0.0 0.0 8. ??? 0.0% 10 0.0 0.0 0.0 0.0 0.0 9. ??? 0.0% 10 0.0 0.0 0.0 0.0 0.0 10. ??? 0.0% 10 0.0 0.0 0.0 0.0 0.0有时候,一个错误配置的路由器,将会在一个环路中不断发送数据包,如下:root@meiriyitie.com:# mtr –report www.google.comHOST: localhost Loss% Snt Last Avg Best Wrst StDev 1. 63.247.74.43 0.0% 10 0.3 0.6 0.3 1.2 0.3 2. 63.247.64.157 0.0% 10 0.4 1.0 0.4 6.1 1.8 3. 209.51.130.213 0.0% 10 0.8 2.7 0.8 19.0 5.7 4. aix.pr1.atl.google.com 0.0% 10 6.7 6.8 6.7 6.9 0.1 5. 12.34.56.79 0.0% 10 0.0 0.0 0.0 0.0 0.0 6. 12.34.56.78 0.0% 10 0.0 0.0 0.0 0.0 0.0 7. 12.34.56.79 0.0% 10 0.0 0.0 0.0 0.0 0.0 8. 12.34.56.78 0.0% 10 0.0 0.0 0.0 0.0 0.0 9. 12.34.56.79 0.0% 10 0.0 0.0 0.0 0.0 0.0 10. 12.34.56.78 0.0% 10 0.0 0.0 0.0 0.0 0.0 11. 12.34.56.79 0.0% 10 0.0 0.0 0.0 0.0 0.0 12. ??? 0.0% 10 0.0 0.0 0.0 0.0 0.0 13. ??? 0.0% 10 0.0 0.0 0.0 0.0 0.0 14. ??? 0.0% 10 0.0 0.0 0.0 0.0 0.0通过报告可以看打第 4 跳的路由器没有正确配置。如果这种状况发生了,您可以连接当地的网络管理员或 ISP 解决问题。ICMP 速率限制ICMP 速率限制可引起数据包的丢失。如果数据包在这一跳有丢失,但是下面几条都正常,我们可以判断是 ICMP 速率限制的原因。如下:root@meiriyitie.com:# mtr –report www.google.com HOST: localhost Loss% Snt Last Avg Best Wrst StDev 1. 63.247.74.43 0.0% 10 0.3 0.6 0.3 1.2 0.3 2. 63.247.64.157 0.0% 10 0.4 1.0 0.4 6.1 1.8 3. 209.51.130.213 0.0% 10 0.8 2.7 0.8 19.0 5.7 4. aix.pr1.atl.google.com 0.0% 10 6.7 6.8 6.7 6.9 0.1 5. 72.14.233.56 60.0% 10 27.2 25.3 23.1 26.4 2.9 6. 209.85.254.247 0.0% 10 39.1 39.4 39.1 39.7 0.2 7. 64.233.174.46 0.0% 10 39.6 40.4 39.4 46.9 2.3 8. gw-in-f147.1e100.net 0.0% 10 39.6 40.5 39.5 46.7 2.2这种状况是没关系的。ICMP 速率限制是一种常见的手段,这样可以减少网络数据的负载,让更重要的流量先通过。超时在很多种情况下会发生超时现象。例如:很多路由器可能会直接丢弃 ICMP 包,这时就会导致超时(???)。另外,也有可能在数据返回的路上出现了问题。root@meiriyitie.com:# mtr –report www.google.comHOST: localhost Loss% Snt Last Avg Best Wrst StDev 1. 63.247.74.43 0.0% 10 0.3 0.6 0.3 1.2 0.3 2. 63.247.64.157 0.0% 10 0.4 1.0 0.4 6.1 1.8 3. 209.51.130.213 0.0% 10 0.8 2.7 0.8 19.0 5.7 4. aix.pr1.atl.google.com 0.0% 10 6.7 6.8 6.7 6.9 0.1 5. ??? 0.0% 10 7.2 8.3 7.1 16.4 2.9 6. ??? 0.0% 10 39.1 39.4 39.1 39.7 0.2 7. 64.233.174.46 0.0% 10 39.6 40.4 39.4 46.9 2.3 8. gw-in-f147.1e100.net 0.0% 10 39.6 40.5 39.5 46.7 2.2超时不一定是数据包被丢失。如上例,数据包还是安全的到达目的地并且返回。中间节点的超时可能是路由器配置丢弃 ICMP 包,或者 QoS 设置引起的原因,这个是没关系的。MTR 使用小结mtr 的功能是检查在目的地址有丢包的情况下,查出具体在哪一跳丢包,然后反馈给机房,机房再反馈给运营商;看 mtr 的截图,先看最后的目的地址是否有丢包,若最后一跳没有丢包,说明线路 ok,若最后一跳有丢包,往下看;再看在路由情况,第一次丢包发生在哪一跳,对应的查这一跳的丢包情况即可;如果有条件建议双向测试抓取 mtr 返回结果,对比路由是否对等;整理邮件发送机房联系本地网络服务商ISP或者云主机服务商请求技术支持。 ...

January 23, 2019 · 10 min · jiezi

网络协议

计算机网络的基本组成硬件系统:计算机、传输介质、网络设备 软件系统:网络操作系统、通信协议、网络软件计算机网络的分类1.按网络覆盖的地理范围分类局域网(LAN)城域网(MAN)广域网(WAN)2.按网络中计算机所处的地位分类对等网客户机/服务器网络3.网络拓扑结构:计算机网络的拓扑结构就是指网络中的计算机、线缆以及其他组件的物理布局。基本的网络拓扑结构主要有4种模式:总线型,星型,环型,混合拓扑结构。URI与URLURI: uniform resource identifier统一资源标识符URL: uniform resource locator统一资源定位符,是通过web浏览器访问资源的URN: uniform resource name,统一资源命名详细说明:标识互联网上的内容URL是URI的一种,不仅标识了Web 资源,还指定了操作或者获取方式,同时指出了主要访问机制和网络位置。URN是URI的一种,用特定命名空间的名字标识资源。使用URN可以在不知道其网络位置及访问方式的情况下讨论资源。URI格式:在浏览器中输入url地址 ->> 显示主页的过程计算机网络体系结构计算机网络体系结构分为3种:OSI体系结构、TCP / IP体系结构、五层体系结构。主要讲解TCP / IP体系结构:网络接口层用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NTC(网络适配器,即网卡),及光纤等物理可见部分。硬件上的范畴均在链路层的作用范围之内。交换机Swtich也成为网桥(MAC bridge),意为将多个MAC地址集中互联,组成网络。其面向的是MAC地址一层,属于数据链路层。路由器用于在不同网络之间进行分组交换,其面向的是IP地址一层,属于网络层。因此相对交换机而言,最大的不同是各自面向的层级。网际层用来处理在网络上流动的数据包。数据包是网络传输的最小数据单位。该层规定了通过怎样的路径(所谓的传输路线)到达对方的计算机,比把数据包传送给对方。IP协议作用:把各种数据包传送给接收方,其中IP地址和MAC地址用于确定接收方的位置。ARP(Adress Resolution Protocol)是一种用以解析地址的协议,可以根据IP地址反查出对应的MAC地址IP地址(IPv4地址)连接在Internet中的每一台主机(或 路由器)的全球唯一的标识符。组成 IP地址 = 32位 = 网络号 + 主机号其中: 网络号:标志主机(或路由器)所连接到的网络。一个网络号在整个因特网范围内必须是唯一的。 主机号:标志该主机(或路由器)。一个主机号在它面前的网络号所指明的网络范围必须是唯一的。 不同类型的IP地址,其主机号 & 网络号所占字节数不同;故:一个IP地址在整个网络范围内是唯一的子网掩码A类即:255.0.0.0B类即:255.255.0.0C类即:255.255.255.0分类传统的IP地址是分类的地址,分为A,B,C,D,E五类。传输层"传输层"的功能,就是建立"端口到端口"的通信。传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输。在传输层有2个性质不同的协议TCP和UDP。TCP协议TCP位于传输层,提供可靠的字节流服务。字节流服务是指为了方便传输,将大块数据分割成以报文段为单位的数据包进行管理。三次握手为了确保数据准确送达目标处,TCP采用三次握手策略。第一次:建立连接时,客户端发送syn(synchronize)包到服务器,并进入SYN_SEND状态,等待服务器确认;第二次:服务器收到syn包,必须确认客户的SYN,同时自己也发送一个SYN包,即SYN+ACK(acknowledgement)包,此时服务器进入SYN_RECV状态;第三次:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK,此包发送完毕,客户端和服务器进入 ESTABLISHED状态,完成三次握手。UDP协议User Datagram Protocol,即 用户数据报协议。TCP、UDP协议的区别:应用层决定了向用户提供应用服务时通信的活动。TCP/IP协议族内预存了各类通用的应用服务。如:HTTP,FTP(文件传输协议)和DNS(域名系统)。DNSDNS( Domain Name System)是“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络,它所提供的服务是用来将主机名和域名转换为IP地址的工作。HTTPHTTP协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准。HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。HTTP是在网络上传输HTML的协议,用于浏览器和服务器的通信。HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。通信进行通信时,会通过分层顺序与对方进行通信。发送端从应用层往下走,接收端则往应用层往上走。数据包的结构,基本上是下面这样:我们用http举例来说:

January 22, 2019 · 1 min · jiezi

从拼多多优惠券事件看到的一些反思

本文由云+社区发表作者:颜国平摘要:最近几年,电商行业飞速发展,各种创业公司犹如雨后春笋大量涌现,商家通过各种活动形式的补贴来获取用户、培养用户的消费习惯,即将到来的“ 购物狂欢节”尤其明显。但任何一件事情都具有两面性,高额的补贴、优惠同时了也催生了“羊毛党”。“羊毛党”的行为距离欺诈只有一步之遥,他们的存在严重破环了活动的目的,侵占了活动的资源,使得正常的用户享受不到活动的直接好处。这篇文章主要分享下腾讯自己是如何通过大数据、用户画像、建模来防止被刷、恶意撞库的。黑产“羊毛党”现状介绍“羊毛党”一般先利用自动机注册大量的目标网站账号,当目标网站搞促销、优惠等活动的时候,利用这些账号参与活动刷取较多的优惠,最后通过某宝等电商平台转卖获益。一.“羊毛党”分工据初步估计,全国“羊毛党”在20万人左右,他们往往有着明确的分工,已形成了几大团伙:1.软件制作团伙:专门制作各种自动、半自动的黑产工具,比如注册自动机、刷单自动机等;他们主要靠出售各种黑产工具、提供升级服务等形式来获利。2.短信代接平台:实现手机短信的自动收发。这其中,有一些短信平台是亦正亦邪,不但提供给正常的商家使用,一些黑产也会购买相关的服务。3.账号出售团伙:他们主要是大量注册各种账号,通过转卖账号来获利;该团伙与刷单团伙往往属于同一团伙。4.刷单团伙:到各种电商平台刷单,获取优惠,并且通过第三方的电商平台出售优惠,实现套现。也就是说,这些“羊毛党“在电商促销或优惠活动中,已逐步形成了相对完善的刷单及变现工作流程(见图1:电商刷单团伙工作流程):图1:电商刷单团队的工作流程二.“羊毛党”从业特点从“羊毛党“的分工与工作流程看,他们具有以下从业特点:1.专业化:有专业团队、人员、机器来做。2.团伙化:已经形成一定规模的团伙,而且分工明确;从刷单软件制作、短信代收发平台、电商刷单到变卖套现等环节,已经形成完整的刷单团伙。3.地域化:刷单黑产团伙基本分布在沿海的一些经济发达城市,比如,北京、上海、广东等城市,这或许跟发达城市更加容易接触到新事物、新观念有关。下图2显示了我们TOP5的黑产刷单团伙分别位于:北京、上海、广州、江苏、浙江这些沿海较发达的经济区域。图2 TOP5黑产刷单团伙的地域分布三.对抗刷单的思路面对黑产刷单,我们有什么对抗思路呢?一般来讲,对抗刷单主要从注册、登陆、活动三个环节入手:1.注册环节:识别虚假注册、减少“羊毛党”能够使用的账号量。在注册环节识别虚假注册的账号,并进行拦截和打击。2.登录场景:提高虚假账号登录门槛,从而减少能够到达活动环节的虚假账号量。比如,登录环节通过验证码、短信验证码等手段来降低自动机的登录效率,从而达到减少虚假账号登录量、减轻活动现场安全压力的目的。3.活动环节:这个是防刷单对抗的主战场,也是减少“羊毛党”获利的直接战场;这里的对抗措施,一般有两个方面: 1)通过验证码(短信、语音)降低黑产刷单的效率。
2)大幅度降低异常账号的优惠力度。电商防刷架构一. 腾讯防刷总体架构面对疯狂的黑产刷单,按照对抗刷单的思路,基于腾讯的多维度大数据,腾讯专门设计并构建了电商防刷技术体系。总体防刷架构见下图3:图3:腾讯防刷单技术架构从上面的总体架构我们可以看到,整个系统分三层:接入层、实时计算层、存储&挖掘层。整个系统充分利用了腾讯海量业务生态中的多维度大数据,以及全方位的风控经验与能力。接下来我们详细介绍其中的一些核心模块。二.防刷单技术架构核心模块与框架介绍1.风险学习引擎对于风险学习引擎而言,效率问题非常关键。该模块线上采用的都是C++实现的DBScan等针对大数据的快速聚类算法,性能卓越;而且主要的工作都是线下进行,所以线上系统也不存在学习的效率问题。风险学习引擎采用了黑/白双分类器风险判定机制,可以很好地减少对正常用户的误伤。例如,某个IP是恶意的IP,那么该IP上可能会有一些正常的用户,比如大网关IP。再比如,黑产通过ADSL拨号上网,那么就会造成恶意与正常用户共用一个IP的情况。其中,黑分类器风险判定是根据特征、机器学习算法、规则/经验模型,来判断本次请求异常的概率。而白分类器风险判定则是判断属于正常请求的概率。见下图4示意:图4 风险引擎的宏观构成2.分类器逻辑框架如何实现风险评估的判定呢?我们以黑分类器为例,来详细剖析下分类器的逻辑框架。系统总体是采用一种矩阵式的逻辑框架。黑分类器最初设计是整体检测判定,即按需随意地建立一个个针对黑产的检测规则、模型。但这种设计出来的结果,发现不是这个逻辑漏过了,而是那个逻辑误伤量大,要对某一类的账号加强安全打击力度,改动起来也非常麻烦。因此,我们最终设计出一套矩阵式的框架(见下图5),较好地解决上述问题。图5 黑分类器的矩阵逻辑框架矩阵的横向采用了Adaboost方法,该方法是一种迭代算法,其核心思想是针对同一个训练集训练不同的弱分类器,然后把这些分类器集合起来,构成一个最终的分类器。而我们这里每一个弱分类器都只能解决一种帐号类型的安全风险判断,集中起来才能解决所有账户的风险检测。这个矩阵逻辑的横向方法,在工程实现上也带来三个好处:1.便于实现轻重分离。比如某平台虚假账号集中在邮箱账号,策略就可以加大对邮箱账号的打击力度,影响范围也局限在邮箱帐号,而不是该平台所有的账号。2.减少模型训练的难度。模型训练最大的难度在于样本的均衡性问题,拆分成子问题,就不需要考虑不同账号类型之间的数据配比、均衡性问题,大大降低了模型训练时正负样本比率的问题。3.逻辑的健壮性。某一个分类器的训练出现了问题,受影响的范围不至于扩展到全局。矩阵纵向则采用了Bagging方法,该方法是一种用来提高学习算法准确度的方法。它在同一个训练集合上构造预测函数系列,然后设法将他们组合成一个预测函数,从而来提高预测结果的准确性。腾讯大数据处理平台-魔方毫无疑问,对抗黑产刷单离不开大数据。大数据一直在安全对抗领域发挥着重要的作用,从我们的对抗经验来看,大数据不仅仅是数据规模很大,而且还包括两个方面:1.数据广度:要有丰富的数据类型。比如,不仅仅要有社交领域的数据、还要有游戏、支付、自媒体等领域的数据,这样就提供了一个广阔的视野让我们来看待黑产的行为特点。2.数据深度:黑产的对抗,我们一直强调纵深防御。不仅仅要有注册数据,还要有登录,以及账号的使用的数据,这样我们才能更好的识别恶意。所以想要做风控和大数据的团队,一定要注意在自己的产品上多埋点,拿到足够多的数据,先沉淀下来。腾讯安全团队研发了一个叫魔方的大数据处理和分析的平台,底层集成了MySQL、MongoDB,Spark、Hadoop等技术,在用户层面我们只需要写一些简单的SQL语句、完成一些配置就可以实现例行分析。这里我们收集了社交、电商、支付、游戏等场景的数据,针对这些数据我们建立一些模型,发现哪些是恶意的数据,并且将数据沉淀下来。沉淀下来的对安全有意义的数据,一方面就存储在魔方平台上,供线下审计做模型使用;另一方面会做成实时的服务,提供给线上的系统查询使用。一.腾讯用户画像沉淀方法用户画像,本质上就是给账号、设备等打标签。但我们这里主要从安全的角度出发来打标签,比如IP画像,我们会标注IP是不是代理IP,这些对我们做策略是有帮助的。我们看看腾讯的IP画像,目前沉淀的逻辑如下图6:图6 IP画像系统构成一般的业务都有针对IP的频率、次数限制的策略,那么黑产为了对抗,必然会大量采用代理IP来绕过限制。既然代理IP的识别如此重要,那我们就以代理IP为例来谈下腾讯识别代理IP的过程。识别一个IP是不是代理IP,技术不外乎就是如下四种:1.反向探测技术:扫描IP是不是开通了80,8080等代理服务器经常开通的端口,显然一个普通的用户IP不太可能开通如上的端口。2.HTTP头部的X_Forwarded_For:开通了HTTP代理的IP可以通过此法来识别是不是代理IP;如果带有XFF信息,该IP是代理IP无疑。3.Keep-alive报文:如果带有Proxy-Connection的Keep-alive报文,该IP毫无疑问是代理IP。4.查看IP上端口:如果一个IP有的端口大于10000,那么该IP大多也存在问题,普通的家庭IP开这么大的端口几乎是不可能的。以上代理IP检测的方法几乎都是公开的,但是盲目去扫描全网的IP,被拦截不说,效率也是一个很大的问题。因此,我们的除了利用网络爬虫爬取代理IP外,还利用如下办法来加快代理IP的收集:通过业务建模,收集恶意IP(黑产使用代理IP的可能性比较大)然后再通过协议扫描的方式来判断这些IP是不是代理IP。每天腾讯都能发现千万级别的恶意IP,其中大部分还是代理IP。二.腾讯用户画像类别概览腾讯用户画像的维度与类别很多,这里仅举部分用户画像数据来说明。比如用户画像其中有手机画像和QQ画像这两个重要类别。涉及画像的标签见下图7:以QQ的画像为例,比如,一个QQ只登录IM、不登录其他腾讯的业务、不聊天、频繁的加好友、被好友删除、QQ空间要么没开通、要么开通了QQ空间但是评论多但回复少,这种号码我们一般会标注QQ养号(色情、营销),类似的我们也会给QQ打上其他标签。标签的类别和明细,需要做风控的人自己去设定,比如:地理位置,按省份标记。性别,按男女标记。其他细致规则以此规律自己去设定。三. 风险判定的基础逻辑有了用户画像的基础数据,我们就可以进行风险判定了。腾讯风险判定的系统现已开放为腾讯云的能力,即天御系统。我们来看一下风险判定的基础逻辑,见下图8:图8 腾讯云天御系统防御逻辑示意图实时防御系统使用C/C++开发实现,所有的数据通过共享内存的方式进行存储,相比其他的系统,安全系统更有他自己特殊的情况,因此这里我们可以使用“有损”的思路来实现,大大降低了开发成本和难度。但这里在安全策略方面,可能会面临一个挑战:多台机器,使用共享内存,如何保障数据一致性?其实,安全策略不需要做到强数据一致性。从安全本身的角度看,风险本身就是一个概率值,不确定,所以有一点数据不一致,不影响全局。但是安全系统也有自己的特点,安全系统一般突发流量比较大,我们这里就需要设置各种应急开关,而且需要微信号、短信等方式方便快速切换,避免将影响扩散到后端系统。电商企业接入天御系统,启用带防刷能力的业务架构通过剖析腾讯对抗“羊毛党”刷单的防刷系统技术架构与原理,我们了解到了天御系统可以帮助咱们电商企业在促销、优惠活动时,有效打击黑产刷单团伙。特别是马上到来的双十一“购物狂欢节”,该系统将让广大电商企业更好地服务用户,真正为用户带来贴心的实惠与好处。天御系统可适应的场景包括但不限于:电商o2o刷单、刷券、刷红包防止虚假账号注册防止用户名、密码被撞库防止恶意登录那么如何接入并使用天御系统呢?其实,电商企业接入天御系统仅需要四步,见下图9:其中:第一步离线数据分析与第二步搭建实时模型为前期的准备工作,第三步正式接入其实并不耗费多少时间,不过第四步上线后,还需要持续的优化,以进一步提高对抗的能力。图9 企业接入天御系统步骤业务接入天御系统后的架构图,见下图10:图10 业务接入天御防刷后的架构图从上图可以看到,接入天御防刷是旁路接入,不需要调整现有业务任何核心逻辑、关键流程,可以快速上线。另外,运行过程中,即使天御防刷有任何异常也不会影响业务主逻辑。Q&AQ:风险学习引擎是自研的,还是使用的开源库?风险学习引擎包括两个部分,线上和线下两部分:线上:自己利用c/c++来实现。线下:涉及利用python开源库来做的,主要是一些通用算法的训练和调优。Q:请问魔方平台中用到的MongDB是不是经过改造?因为MongDB一直不被看好,出现问题也比较多。我们做了部分改造,主要是DB的引擎方面。Q:请问黑分类器和白分类器有什么区别?白分类器主要用来识别正常用户,黑分类器识别虚假用户。Q:风险概率的权重指标是如何考虑的?先通过正负样本进行训练,并且做参数显著性检查;然后,人工会抽查一些参数的权重,看看跟经验是否相符。Q:安全跟风控职责如何区分呢?相比安全,风控的外延更丰富,更注重宏观全局;针对一个公司来讲,风控是包括安全、法务、公关、媒体、客服等在内一整套应急处理预案。Q:如果识别错了,误伤了正常用户会造成什么后果么?比如影响单次操作还是会一直失败。如果识别错了正常用户不会被误伤,但是会导致体验多加了一个环节,如弹出验证码、或者人工客服核对等。作者:颜国平,原腾讯云-天御系统研发负责人。一直负责腾讯自有验证码、业务安全、防刷、账号安全等研发工作。内部支持的产品(游戏、电商、腾讯投资的O2O企业)非常广泛。在业务安全领域项目经验丰富,并且具备深度学习、大数据架构搭建等实战经验。此文已由腾讯云+社区在各渠道发布获取更多新鲜技术干货,可以关注我们腾讯云技术社区-云加社区官方号及知乎机构号

January 21, 2019 · 1 min · jiezi

tcp没用吗?为什么MOBA、“吃鸡”游戏不推荐用tcp协议

本文由云+社区发表作者:腾讯云游戏行业资深架构师 余国良MOBA类和“吃鸡”游戏为什么对网络延迟要求高?我们知道,不同类型的游戏因为玩法、竞技程度不一样,采用的同步算法不一样,对网络延迟的要求也不一样。例如,MOBA类游戏多使用帧同步为主要同步算法,竞技性也较高,无论从流畅性,还是从公平性要求来说,对响应延迟的要求都最高,根据业内经验,当客户端与服务器的网络延迟超过150ms时,会开始出现卡顿,当延迟超过250ms时,会对玩家操作造成较大影响,游戏无法公平进行。类似地,“吃鸡”游戏(如《绝地求生》)玩法对玩家坐标、动作的同步要求极高,延迟稍大导致的数据不一致对体验都会造成较大影响,其实时性要求接近MOBA类游戏。而对于传统mmorpg来说,多采用状态同步算法,以属性养成和装备获取为关注点,也有一定竞技性,出于对游戏流畅性的要求,对延迟也有一定要求,同步算法的优化程度不一样,这一要求也不一样,一般情况下为保证游戏正常进行,需要响应延迟保持在300ms以下。相比之下,对于炉石传说、斗地主、梦幻西游等回合制游戏来说,同时只有一个玩家在操作双方数据,无数据竞争,且时间粒度较粗,甚至可通过特效掩盖延迟,因此对网络延迟的要求不高,即便延迟达到500ms~1000ms,游戏也能正常进行。这里,我们不对同步算法做进一步说明,重点说一下协议的问题。传输层协议和延迟不同传输层协议在可靠性、流量控制等方面都有差别,而这些技术细节会对延迟造成影响。tcp追求的是完全可靠性和顺序性,丢包后会持续重传直至该包被确认,否则后续包也不会被上层接收,且重传采用指数避让策略,决定重传时间间隔的RTO(retransmission timeout)不可控制,linux内核实现中最低值为200ms,这样的机制会导致丢包率短暂升高的情况下应用层消息响应延迟急剧提高,并不适合实时性高、网络环境复杂的游戏。加速方案基于udp定制传输层协议,引入顺序性和适当程度或者可调节程度的可靠性,修改流控算法。适当放弃重传,如:设置最大重传次数,即使重传失败,也不需要重新建立连接。比较知名的tcp加速开源方案有:quic、enet、kcp、udt。其中,quic是源自google的tcp替代方案,其主要目的是为了整合TCP协议的可靠性和udp协议的速度和效率,其主要特性包括:避免前序包阻塞、减少数据包、向前纠错、会话重启和并行下载等,然而QUIC对标的是TCP+TLS+SPDY,相比其他方案更重,目前国内用于网络游戏较少。kcp的作者是国内优秀开发者,社区也发展良好,kcp的作者和社区开发者对enet、kcp、udt做了性能测试,详情可参见:https://github.com/skywind300…, 从测试情况可以看到,kcp表现不错,其次是enet,表现最差的是udt。不过,这里也提出一个问题,原始enet保留了tcp重传的指数避让特性,每次重传间隔还是乘以2,默认rto也较高,这可能是测试中enet表现不如kcp的主要原因,如果对enet代码稍作调整,结果又当如何?这里,我们先排除传输性能,从其他方面对enet和kcp做一对比(满分5分):我们对libenet略微做一些调整——默认rtt从500ms调整成50ms, 去除超时重传的指数避让策略。Linux下用TC命令模拟网络延迟和丢包率,控制延迟分别为30ms, 50ms, 70ms,控制丢包率分别为1%, 3%, 5%, 7%, 10%,在模拟出的不同网络环境下,对tcp, 原始enet和改进后的enet进行了对比测试。测试中考察两个性能指标:1)平均响应时间;2)响应时间超过300ms的包的比例。libenet的代码调整: 图 1 调整默认RTT为50ms 图 2 取消指数避让tc命令如下:模拟延迟100ms(rtt为200ms): tc qdisc add dev eth0 root netem delay 100ms模拟1%丢包率:tc qdisc add dev eth0 root netem loss 1%对比结果数据如下:图 3 不同丢包率和网络延迟下TCP协议、ENET、优化后ENET的平均响应时间对比图 4 不同丢包率和网络延迟下TCP协议、ENET、优化后ENET的超时响应比例对比从图中可见,在平均响应方面,TCP协议的劣势不明显,在延迟为30ms,丢包率为1%时,改进后的ENET平均RTT为69ms, 原始ENET平均RTT为67ms, TCP平均RTT为67ms;但是从响应时间超过300ms的比例看,在延迟为30ms,丢包率为1%时,改进后的ENET RTT超过300ms的包为0,而TCP RTT超过300ms的比例则超过了2%,如果是在游戏中,这个表现已经能明显影响游戏体验了。结果表明,TCP在网络稍不稳定的情况下就已经有比较大的问题了,改进后的ENET有明显优势。总结测试结果符合预期,在实时性方面,TCP协议的网络抗性欠佳,对MOBA类或其他实时性要求较高的游戏,我们不建议使用TCP作为协议载体。事实上,王者荣耀,乱斗西游的通信协议也确实是基于UDP封装的,别问我是怎么知道的。后话对于开发人员来说,优化协议和同步算法是在已有网络环境下提升用户体验的可用方法,也是较平民化的方法,在网络抖动有限、丢包并不频繁、网络环境不至于太差的情况下,的确能有效提高游戏体验;然而这种方法也存在局限性,在网络环境超出可控范围,如在地铁上、商场里等人潮拥挤、存在网络热点,延迟或丢包率极高的环境中,还是无法解决问题,所谓“巧妇难为无米之炊”,再牛X的协议和算法,也无法点石成金,要从根本上解决问题,最终还是要回到网络质量上。此文已由作者授权腾讯云+社区在各渠道发布获取更多新鲜技术干货,可以关注我们腾讯云技术社区-云加社区官方号及知乎机构号v

January 9, 2019 · 1 min · jiezi

网络之旅总览

传输层TCPTCP协议之旅总览链路层链路层是做什么的?websocketwebsocket简介待续

December 31, 2018 · 1 min · jiezi

【芝士整理】网络请求相关

计算机网络结构物理层定义物理设备标准,起到传输比特流的作用。数据链路层提供可靠的通过物理介质传输数据的方法。通过差错控制、流量控制方法将有差错的物理链路(物理链路容易受到干扰)变为无差错的数据链路将物理层的比特流数据封装成数据帧传递给上层,将上层的数据帧转换为比特流给物理层。提供MAC地址(物理地址),可作为局域网内一个网卡的唯一标识。网络层解决不同子网间的通信问题:逻辑寻址,规定不同的信息交换方式,路由算法,连接服务。IP协议网络上每一个节点都有一个独立的逻辑地址——IP地址IP协议负责将数据包传送到目的地,没有提供一种数据未传达以后的处理机制(这被认为是上层协议需要做的事情),是不可靠的协议。传输层提供可靠的端到端的差错和流量控制,保证报文的正确传输UDP协议没有建立连接,直接向对象发包,不可靠但快速高效。应用:ping命令、实时音视频通信TCP协议三次握手建立连接发送方给接受方TCP数据报,然后等待对方的确认TCP数据报,如果没有,就重新发,如果有,就发送下一个数据报。接受方等待发送方的数据报,如果得到数据报并检验无误,就发送ACK(确认)数据报,并等待下一个TCP数据报的到来。直到接收到FIN(发送完成数据报)四次挥手中止连接会话层建立和管理应用程序之间的通信,保证应用程序自动收发包和寻址表示层解释不同系统之间的通信语法应用层直接面向用户的程序或服务HTTP协议什么是HTTP协议?基于TCP/IP协议基础的一个应用层协议,用于从Web服务器传输超文本到本地浏览器的传送协议,由请求和响应构成。HTTP协议的特点无状态:请求相互独立,通信状态不被保存HTTP报文的组成HTTP报文包括请求报文和响应报文两大部分,其中请求报文由请求行(request line)、请求头(header)、空行和请求体四个部分组成。而响应报文由状态行、响应头部、空行和响应体四个部分组成。HTTP请求方式GET, HEAD, POST, PUT, DELETE,OPTIONSHEAD:获取报头。OPTIONS:获取请求资源的选项、需求或服务器支持,并非资源请求。ajax请求跨域资源时,使用OPTIONS方法发送嗅探请求,以判断是否有对指定资源的访问权限。GET和POST的区别GET安全性低,会被缓存GET请求在URL中显示参数,POST请求在send中传递参数状态码1xx:表示请求已接收,继续处理2xx:成功,操作被成功接收并处理3xx:重定向,需要进一步的操作以完成请求4xx:客户端错误,请求有语法错误或请求无法实现5xx:服务端错误,服务器端错误–服务器未能实现合法的请求200 请求正常处理204 请求正常处理但没有资源返回301永久性重定向302 临时性重定向304 指采用GET方法的请求报文中包含if-matched,if-modified-since,if-none-match,if-range,if-unmodified-since任一个首部)服务器端允许请求访问资源,但因发生请求未满足条件的情况后,直接返回304Modified400 请求报文中有语法错误401 表示未授权403 请求被服务器拒绝404 服务器上无法找到请求的资源500 服务器在执行时发生错误503 服务器暂时处于超负载或正在进行停机维护请求APIAjaxvar xhr = null;if (window.XMLHttpRequest) { xhr = new XMLHttpRequest(); xhr.open(“POST”,“test.html”,true); xhr.setRequestHeader(“Content-type”,“application/x-www-form-urlencoded”); xhr.send(“fname=Henry&lname=Ford”); xhr.onreadystatechange = function () { if (xhr.readyState === 4 && xhr.status === 200) { console.log(xhr.responseText); } } xhr.onerror = function (e) { console.log(e) }}readyState0:未初始化,尚未调用open1:已经调用open,尚未调用send2:已经send,但尚未收到响应3:已接收到部分响应4:已收到所有响应error事件Network error,只有发生网络层的错误才会出发error事件, 应用层的错误不会进入erroronload事件当请求成功完成时触发,此时xhr.readyState=4onabort事件调用xhr.abort()后触发withCredentials在跨域请求中,客户端必须手动设置xhr.withCredentials=true,且服务器端也必须允许亲贵能携带认证信息(即响应头中包含Access-Control-Allow-Credentials:true),这样浏览器才会自动将cookie加在请求头中。另外,要特别注意一点,一旦跨域请求能够携带认证信息,服务器端一定不能将Access-Control-Allow-Origin设置为*,而必须设置为请求页面的域名。XMLHttpRequest的具体介绍FetchFetch API 基于Promise设计,fetch()返回一个Promise对象fetch(url).then(response => response.json()) .then(data => console.log(data)) .catch(e => console.log(“Oops, error”, e))Fetch原生支持率并不高,需要引入各种polyfill由于 IE8 是 ES3,需要引入 ES5 的 polyfill: es5-shim, es5-sham引入 Promise 的 polyfill: es6-promise引入 fetch 探测库:fetch-detector引入 fetch 的 polyfill: fetch-ie8可选:如果你还使用了 jsonp,引入 fetch-jsonp可选:开启 Babel 的 runtime 模式,现在就使用 async/awaitFetch polyfill 的基本原理是探测是否存在 window.fetch 方法,如果没有则用 XHR 实现。这也是 github/fetch 的做法,但是有些浏览器(Chrome 45)原生支持 Fetch,但响应中有中文时会乱码,老外又不太关心这种问题,所以我自己才封装了 fetch-detector 和 fetch-ie8 只在浏览器稳定支持 Fetch 情况下才使用原生 Fetch。这些库现在 每天有几千万个请求都在使用,绝对靠谱 !Fetch 常见坑Fetch 请求默认是不带 cookie 的,需要设置 fetch(url, {credentials: ‘include’})服务器返回 400,500 错误码时并不会 reject,只有网络错误这些导致请求不能完成时,fetch 才会被 reject。引用自传统 Ajax 已死,Fetch 永生axios基于Promise的HTTP封装库,可用于浏览器和node环境浏览器中使用XMLHttpRequestnode.js中使用http模块支持Promise API可拦截请求和响应转换请求和响应数据可取消请求自动转换JSON数据为客户端提供XSRF支持axios项目仓库&文档跨域什么是跨域跨域的解决方法缓存强缓存不会发出请求,直接从缓存中读取数据Expires设置过期时间,缺点使用浏览器时间判断,浏览器时间会随客户端设置修改Cache-Control设置相对时间,以秒为单位Cache-Control优先级大于Expires协商缓存发出请求,与服务端配合判断资源是否过期,需要与Cache-Control共同使用如果命中协商缓存,服务端返回304并通知浏览器从本地缓存读取资源Last-Modified和If-Modified-Since记录和比较资源的修改时间,存在的问题:1. 时间误差 2. 资源修改和时间修改可能不一致ETag和If-None-Match服务端通过哈希算法根据文件内容计算出哈希值记录和比较资源的哈希值ETag优先级大于Last-Modified用户行为对缓存的影响地址栏访问,链接跳转是正常用户行为,将会触发浏览器缓存机制;F5刷新,浏览器会设置max-age=0,跳过强缓存判断,会进行协商缓存判断;ctrl+F5刷新,跳过强缓存和协商缓存,直接从服务器拉取资源。其他响应头no-cache是否使用缓存需要经过协商缓存来验证决定no-store所有内容都不会被缓存,即不使用强制缓存,也不使用协商缓存public所有内容都将被缓存(客户端和代理服务器都可缓存)private所有内容只有客户端可以缓存请求优化资源压缩合并非核心代码异步加载利用浏览器缓存使用CDN预解析DNS页面性能优化办法有哪些 ...

December 31, 2018 · 1 min · jiezi

99%的程序都没有考虑的网络异常

本文由云+社区发表绝大多数程序只考虑了接口正常工作的场景,而用户在使用我们的产品时遇到的各类异常,全都丢在看似 ok 的 try catch 中。如果没有做好异常的兼容和兜底处理,会极大的影响用户体验,严重的还会带来安全和资损风险。接口异常,通常可以分为以下三类:CGI 逻辑出错。如调用方入参缺失类业务逻辑报错;服务不稳定。如服务器不稳定导致 nginx 各类 500、502,cgi 路径调整导致的 404用户网络环境差。如,网络不稳定、网速慢、运营商劫持等那么,我们在写代码时,如何快速的模拟这些接口异常,做好程序的兼容处理呢?今天向大家介绍网络调试神器 whistle 的网络异常调试方法,如果你还没用过 whistle,请参考《8102 年的程序员不需要 Hosts 和 Fiddler》。假设我们有以下前端页面 index.html,放置在自己的本地路径:<p id=“success” style=“color:green;"></p><p id=“fail” style=“color:red;"></p><script> fetch(/mock?r=${Math.random()}) .then(response => { return response.json() }) .then(v => { document.getElementById(‘success’).innerHTML = v.data; }).catch(err => { document.getElementById(‘fail’).innerHTML = err.message; })</script>接下来,打开 whistle Rules 配置面板 http://127.0.0.1:8899/#rules ,配置模拟的 demo page 和 mock CGI:/mock file://({“code”:0,“data”:“success”}) # 配置 mock cgi 为模拟的 json 数据example.com file:///Users/kaiye/Projects/Markdown/20181213/ # 配置任意域名到本地 demo 目录,这里注意替换成自己的路径打开 http://example.com ,正常逻辑下页面展示出了绿色的 success ,现在我们开始加入一些网络异常。1、业务逻辑异常处理例如 CGI 没有返回 data 字段,而是返回了一个错误码 code 和对应的 message,针对这种业务逻辑异常我们只需在第二个 then 中做好 code 值的判断即可(注意,这里的 code、message、data 只是示例,实际业务 CGI 中的 JSON 结构体的字段名很可能不同):fetch(/mock?r=${Math.random()}) .then(response => response.json()) .then((v) => { // 业务逻辑异常处理 if (v.code !== 0) { return Promise.reject(new Error(ERROR_LOGIC_CODE:${v.code})); } document.getElementById(‘success’).innerHTML = v.data; }) .catch((err) => { document.getElementById(‘fail’).innerHTML = err.message; });相应的 whistle 配置如下:/mock file://({“code”:12345,“message”:“some_logic_error”}) # 模拟业务逻辑异常2、服务器异常处理如果服务器直接抛出了 502 错误码,我们希望代码能给用户提示的同时,再做一个异常上报。fetch(/mock?r=${Math.random()}) .then((response) => { // 服务器异常处理 if (response.ok) { return response.json(); } return Promise.reject(new Error(ERROR_STATUS_CODE:${response.status})); }) .then((v) => { // 业务逻辑异常处理 if (v.code !== 0) { return Promise.reject(new Error(ERROR_LOGIC_CODE:${v.code})); } document.getElementById(‘success’).innerHTML = v.data; }) .catch((err) => { const [type, value] = err.message.split(’:’); // 异常类型上报 console.log(type, value); document.getElementById(‘fail’).innerHTML = err.message; });通过 whistle 的模拟配置如下:/mock statusCode://502 # 模拟 HTTP 状态码异常3、接口被劫持注入如果 CGI 被运营商劫持注入,可能导致接口返回一个不合法的 JSON 结构,最前面的 response.json() 会抛异常,我们可以提前 catch 住:fetch(/mock?r=${Math.random()}).then((response) => { // 服务器异常处理 if (response.ok) { return ( response .json() // 接口数据解码异常处理 .catch(err => Promise.reject(new Error(‘ERROR_DECODE_JSON’))) ); } return Promise.reject(new Error(ERROR_STATUS_CODE:${response.status}));});whistle 模拟配置如下:/mock file://(<div>hijacking</div>{“code”:0,“data”:“success”}) # 模拟接口被劫持注入 1借助 htmlAppend 和 values 配置,可以模拟更复杂的注入示例:/mock file://({“code”:0,“data”:“success”}) htmlAppend://{hijacking.html} # 模拟接口被劫持注入 2<script>alert(‘hijacking’)</script>4、用户网络不稳定如果我们要模拟请求发出 10 秒后断网或网络不通的情况,可以通过 whistle 这样配置:/mock reqDelay://10000 enable://abort # 模拟 10 秒超时后网络不通让用户苦苦等待 10 秒,再报错的体验太糟糕。我们可以封装一个能配置超时时间的请求发送函数,同时把上面提到的错误异常都一起配置进来。<p id=“success” style=“color:green;"></p><p id=“fail” style=“color:red;"></p><script> function myFetch(url, configOptions) { const options = Object.assign( { timeout: 3000 }, configOptions ) const { timeout } = options return new Promise((resolve, reject) => { // 超时异常处理 const timer = setTimeout(() => { reject(new Error(ERROR_TIMEOUT:${timeout})) }, timeout) fetch(url, options) .then(data => { clearTimeout(timer) resolve(data) }) .catch(err => { clearTimeout(timer) reject(err) }) }) .then(response => { // 服务器异常处理 if (response.ok) { return ( response .json() // 接口数据解码异常处理 .catch(err => Promise.reject(new Error(‘ERROR_DECODE_JSON’))) ) } else { return Promise.reject( new Error(ERROR_STATUS_CODE:${response.status}) ) } }) .then(v => { // 业务逻辑异常处理 if (v.code !== 0) { return Promise.reject(new Error(ERROR_LOGIC_CODE:${v.code})) } else { return v.data } }) .catch(err => { const [type, value] = err.message.split(’:’) // 异常类型上报 console.log(type, value) return Promise.reject(err) }) } myFetch(/mock?r=${Math.random()}) .then(data => { document.getElementById(‘success’).innerHTML = data }) .catch(err => { document.getElementById(‘fail’).innerHTML = err.message })</script>这样,自定义的 myFetch 只需关注业务具体逻辑,针对不同的 catch error 做对应的处理。除以上提到的协议命令字外,whistle 还支持 resSpeed 用于模拟低网速传输(单位:kb/s),tpl 协议则可以根据请求传入参数来动态模拟不同的数据。在 Frames 面板,还可以对 WebSocket/Socket 请求进行暂停、延迟等网络异常的模拟。小程序 fetch API 实现最后,留一道思考题。近来微信小程序开发非常火,小程序原生提供的 wx.request API 能用于发送 HTTPS 请求,请在它的基础之上进行封装,支持 promise 调用和 timeout 超时时间定义(小程序默认的请求超时定义在 app.json 中,不够灵活),并针对以上提到的 HTTP 状态码异常、接口劫持注入、慢网络、无网络状态等各种网络异常进行兼容处理。欢迎留言分享你的代码实现此文已由作者授权腾讯云+社区发布 ...

December 26, 2018 · 2 min · jiezi

我们来说一说TCP神奇的40ms

本文由云+社区发表TCP是一个复杂的协议,每个机制在带来优势的同时也会引入其他的问题。 Nagel算法和delay ack机制是减少发送端和接收端包量的两个机制, 可以有效减少网络包量,避免拥塞。但是,在特定场景下, Nagel算法要求网络中只有一个未确认的包, 而delay ack机制需要等待更多的数据包, 再发送ACK回包, 导致发送和接收端等待对方发送数据, 造成死锁, 只有当delay ack超时后才能解开死锁,进而导致应用侧对外的延时高。 其他文字已经介绍了相关的机制, 已经有一些文章介绍这种时延的场景。本文结合具体的tcpdump包,分析触发delay ack的场景,相关的内核参数, 以及规避的方案。背景给redis加了一个proxy层, 压测的时候发现, 对写入命令,数据长度大于2k后, 性能下降非常明显, 只有直连redis-server的1/10. 而get请求影响并不是那么明显。分析观察系统的负载和网络包量情况, 都比较低, 网络包量也比较小, proxy内部的耗时也比较短。 无赖只能祭出tcpdump神奇, 果然有妖邪。22号tcp请求包, 42ms后服务端才返回了ack。 初步怀疑是网络层的延时导致了耗时增加。Google和km上找资料, 大概的解释是这样: 由于客户端打开了Nagel算法, 服务端未关闭延迟ack, 会导致延迟ack超时后,再发送ack,引起超时。原理Nagel算法,转自维基百科if there is new data to send if the window size >= MSS and available data is >= MSS send complete MSS segment now else if there is unconfirmed data still in the pipe enqueue data in the buffer until an acknowledge is received else send data immediately end if end ifend if简单讲, Nagel算法的规则是:如果发送内容大于1个MSS, 立即发送;如果之前没有包未被确认, 立即发送;如果之前有包未被确认, 缓存发送内容;如果收到ack, 立即发送缓存的内容。延迟ACK的源码如下:net/ipv4/tcp_input.c基本原理是:如果收到的数据内容大于一个MSS, 发送ACK;如果收到了接收窗口以为的数据, 发送ACK;如果处于quick mode, 发送ACK;如果收到乱序的数据, 发送ACK;其他, 延迟发送ACK其他都比较明确, quick mode是怎么判断的呢? 继续往下看代码:影响quick mode的一个因素是 ping pong的状态。 Pingpong是一个状态值, 用来标识当前tcp交互的状态, 以预测是否是W-R-W-R-W-R这种交互式的通讯模式, 如果处于, 可以用延迟ack, 利用Read的回包, 将Write的回包, 捎带给发送方。如上图所示, 默认pingpong = 0, 表示非交互式的, 服务端收到数据后, 立即返回ACK, 当服务端有数据响应时,服务端将pingpong = 1, 以后的交互中, 服务端不会立即返回ack,而是等待有数据或者ACK超时后响应。问题按照前面的的原理分析,应该每次都有ACK延迟的,为什么我们测试小于2K的数据时, 性能并没有受到影响呢?继续分析tcpdump包:按照Nagel算法和延迟ACK机制, 上面的交互如下图所示, 由于每次发生的数据都包含了完整的请求, 服务端处理完成后, 向客户端返回命令响应时, 将请求的ACK捎带给客户端,节约一次网络包。再分析2K的场景:如下表所示, 第22个包发送的数据小于MSS, 同时,pingpong = 1, 被认为是交互模式, 期待通过捎带ACK的方式来减少网络的包量。 但是, 服务端收到的数据,并不是一个完整的包,不能产生一次应答。服务端只能在等待40ms超时后,发送ACK响应包。 同时,从客户端来看,如果在发送一个包, 也可以打破已收数据 > MSS的限制。 但是,客户端受Nagel算法的限制, 一次只能有一个包未被确认,其他的数据只能被缓存起来, 等待发送。触发场景一次tcp请求的数据, 不能在服务端产生一次响应,或者小于一个MSS规避方案只有同时客户端打开Nagel算法, 服务端打开tcp_delay_ack才会导致前面的死锁状态。 解决方案可以从TCP的两端来入手。服务端:关闭tcp_delay_ack, 这样, 每个tcp请求包都会有一个ack及时响应, 不会出现延迟的情况。 操作方式: echo 1 > /proc/sys/net/ipv4/tcp_no_delay_ack 但是, 每个tcp请求都返回一个ack包, 导致网络包量的增加,关闭tcp延迟确认后, 网络包量大概增加了80%,在高峰期影响还是比较明显。2.设置TCP_QUICKACK属性。 但是需要每次recv后再设置一次。 对应我们的场景不太适合,需要修改服务端redis源码。客户端:关闭nagel算法,即设置socket tcp_no_delay属性。static void _set_tcp_nodelay(int fd) { int enable = 1; setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (void*)&enable, sizeof(enable)); } 避免多次写, 再读取的场景, 合并成一个大包的写;避免一次请求分成多个包发送, 最开始发送的包小于一个MSS,对我们的场景, 把第22号包的1424个字节缓存起来, 大于一个MSS的时候,再发送出去, 服务端立即返回响应, 客户端继续发送后续的数据, 完成交互,避免时延。此文已由作者授权腾讯云+社区发布 ...

December 24, 2018 · 1 min · jiezi

https证书互信解决方案—创建私有CA并申请证书

前言https相较于http而言有很大的安全性,当我们一个服务开启https并与之通信时,往往需要证书的认证,如果是浏览器访问服务,只要在浏览器内设置信任证书即可,而如果是程序内访问服务(如java程序),则需要导入该服务的证书所信任的证书。实际情况中,内部系统的互相通信使用https,往往不可能向公有CA申请证书(申请证书需要很高的费用),故我们需要创建一个私有CA来申请证书实现https通信。名词介绍CA和证书认证详见我的一篇博文:https简单解读实现步骤环境介绍64位 centos 7.X操作系统装有openssl命令构建私有CACA要给别人签发证书,首先自己得有一个作为根证书,我们得在一切工作之前修改好CA的配置文件、序列号、索引等等。输入以下命令更改配置文件:vi /etc/pki/tls/openssl.cnf配置文件更改以下部分:[ CA_default ] dir = /etc/pki/CA # Where everything is keptcerts = $dir/certs # Where the issued certs are keptcrl_dir = $dir/crl # Where the issued crl are keptdatabase = $dir/index.txt # database index file.#unique_subject = no # Set to ’no’ to allow creation of # several ctificates with same subject.new_certs_dir = $dir/newcerts # default place for new certs. certificate = $dir/cacert.pem # The CA certificateserial = $dir/serial # The current serial numbercrlnumber = $dir/crlnumber # the current crl number # must be commented out to leave a V1 CRLcrl = $dir/crl.pem # The current CRLprivate_key = $dir/private/cakey.pem # The private keyRANDFILE = $dir/private/.rand # private random number file…default_days = 3650 # how long to certify for…# For the CA policy[ policy_match ]countryName = matchstateOrProvinceName = optionallocalityName = optionalorganizationName = optionalorganizationalUnitName = optionalcommonName = suppliedemailAddress = optional在/etc/pki/CA目录创建两个文件index.txt和serial:cd /etc/pki/CA && touch index.txt serial && echo 01 > serial仍在当前目录下生成一个CA私钥cakey.pem和自签证书cacert.pem:openssl genrsa -out private/cakey.pem 2048openssl req -new -x509 -key private/cakey.pem -out cacert.pem生成公钥的时候会提示输入一些信息,例子如下:Country Name (2 letter code) []:CN #国家名State or Province Name (full name) []:hangzhou #省份名Locality Name (eg, city) []:hangzhou #地名Organization Name (eg, company) []:company #公司名Organizational Unit Name (eg, section) []:unit #部门名Common Name (eg, your websites domain name) []:localhost #服务域名Email Address []: #电子邮件后面一些信息可按回车略过这里比较重要的是Comman Name填写的是服务的域名地址,即如果该证书用于某个服务则填该服务的域名地址(如用于百度服务器,则填写www.baidu.com)本方案的CA证书不用于某个服务,故可填localhost私有CA签署证书为一个服务生成私钥server.key和一个证书请求文件server.csr:openssl genrsa -out server.key 2048openssl req -new -key server.key -out server.csr生成证书请求文件时,仍会提示输入一些信息,例子如下:Country Name (2 letter code) []:CN #国家名State or Province Name (full name) []:hangzhou #省份名Locality Name (eg, city) []:hangzhou #地名Organization Name (eg, company) []:company #公司名Organizational Unit Name (eg, section) []:unit #部门名Common Name (eg, your websites domain name) []:XXX.XXX.XXX #服务域名Email Address []: #电子邮件这里的Common Name就应该填你实际服务所用的域名了下面将该证书请求文件server.csr由你构建的私有CA签署,生成一个server.crt证书:openssl x509 -req -in server.csr -CA /etc/pki/CA/cacert.pem -CAkey /etc/pki/CA/private/cakey.pem -CAcreateserial -out server.crt到此为止,server.crt证书可用于服务提供https访问,客户端若想访问该服务,导入CA根证书cacert.pem即可。 ...

December 17, 2018 · 2 min · jiezi

最好用的编辑器之一:Vim-Go环境搭建

本文由Librant发表如果说在Linux环境下,什么编辑器最好用,如果我说是VIM,估计会有一大部分人嗤之以鼻,怎么可能。VIM可能是他用过众多编辑器最难用的一个。在我司用的是云虚拟机,说实话吧,这里吐槽一下,是真的卡,没开几个网页,打开几个软件就卡的不要不要的,后来码代码的时候,能用Linux机器我就尽量使用Linux环境,如果读者正好也是一名Gopher的话,那我就强烈建议你使用VIM,Vim-go是当前使用最为广泛的用于搭建Golang开发环境的vim插件。好了,废话不多说,看我搭建好的界面吧。图 Go-Vim界面看到这个界面,读者是不是不认识了,这就对了,是不是觉得很炫酷,其实Vim有很多的插件,可以把Vim打造的非常棒,等读者查阅相关资料,清楚Vim的各种参数的时候,就可以根据自己的喜好,搭建不同风格的Go开发环境啦。So废话不多说,开整。(建议先看完《跟我学Docker》的第一章部分)1.1 环境准备 能成功从gitHub拉取代码,Go编译器安装完成之后,就可以在搭建Go-Vim啦。首先是在当前用户的HOME目录下创建 .vim 目录和 .vimrc 文件:librant@ubuntu:$ mkdir .vimlibrant@ubuntu:$ touch .vimrc创建完成之后,进入到 .vim 中,下载插件 Vim 的插件管理器bundle:librant@ubuntu:/.vim$ mkdir bundle然后进入到 bundle 目录中,安装Vundle.vim:librant@ubuntu:/.vim/bundle$ git clone git clone https://github.com/VundleVim/…下载完成之后,会在当前目录下生成 Vundle.vim 目录同样进入到 bundle 目录中,安装Vim-go:librant@ubuntu:/.vim/bundle$ git clone https://github.com/fatih/vim-…下载完成之后,会在当前目录下生成 vim-go 目录1.2 插件安装/(用户$HOME) 目录下已经有 .vimrc文件就不需要再创建了。(" 为注释部分)。1.2.1 安装Vundle.vim在 .vimrc 文件中添加如下配置:set nocompatiblefiletype offset rtp+=~/.vim/bundle/Vundle.vimcall vundle#begin()Plugin ‘gmarik/Vundle.vim’call vundle#end()filetype plugin indent on保存后,退出。1.2.2 安装Vim-go继续编辑 .vimrc文件,在call vundle#begin()和call vundle#end()之间再添加如下配置:Plugin ‘fatih/vim-go’保存后,重新打开 vim 编辑器,在命令行的模式输入:PluginInstall:PluginInstall执行之后会在左侧出现需要安装的插件列表,右侧是.vimrc文件。如图1-2-2所示:图 1-2-2 Vim插件安装界面刚执行时,左下角会出现 Processing的过程,需要稍微等一会儿,这是在下载代码,安装完成之后,左下角将出现Done!的单词,表示已经安装完成。1.2.3 安装 go.tools Binaries Vim-go安装中需要使用到Go的相关的二进制工具。由于历史的原因,在google上的工具是无法自行下载安装的,在gitHub上的工具是可以安装成功的。首先打开 .vimrc 文件,切换到命令行模式,执行 GoInstallBinaries 命令自行安装。:GoInstallBinaries等待 Vim-go依赖的工具自动安装,如果安装成功后,会在 $GOPATH/bin 目录下生成。安装完成后如图1-2-3所示:图 1-3-2 vim-go依赖的命令文件由于有些命令文件是无法自动安装完成,这就需要手动进行安装啦。首先对比目录,看缺少哪些命令没有安装完成,然后去gitHub上搜索,找到对应的命令源码之后,使用git clone 下载到本地,然后使用 go install命令进行安装即可。前面已经讲解过如何安装啦,这里就不再赘述。相关工具的gitHub路径:golint: https://github.com/golang/lin...gocode: https://github.com/nsf/gocode...errcheck: https://github.com/kisielk/er...gotags: https://github.com/jstemmer/g...(缺少什么工具,基本都可以找到的,这里就不一一列举了)1.3 VIM主题颜色 Vim的主题颜色保存在 /usr/share/vim/vim80/colors 目录下保存,如果目录下没有的主题,就需要自己进行下载了。下载到此目录的颜色主题,将可以被所有用户使用,如果只需要在当前用户下使用,可以将下载的主题放在 /.vim/colors 目录下即可。个人比较喜欢molokai主题风格,下面就简单介绍如何下载这个主题吧。 1)在gitHub上搜索 molokai 主题,找到主题的git仓库 tomasr/molokai 2)进入到 .vim目录下,使用git clone 下载主题librant@ubuntu:/.vim$ git clone https://github.com/tomasr/mol… 3)下载完成之后,拷贝 molokai/colors/molokai.vim 文件到 ~/.vim/colors 目录下 4)配置 .vimrc 文件,在文件中红添加如下信息:set t_Co=256colorscheme molokailet g:molokai_original = 1let g:rehash256 = 1需要配置其他的主题,只需要设置相应的主题名称。1.4 其他插件安装1.4.1 SirVer/ultisnips UltiSnips是Vim的代码片段工具,它只是一个引擎,它需要和vim-snippets搭配使用。vim-snippets预定义了几十种语言常用的代码模板,位于 ~/.vim/bundle/vim-snippets/UltiSnips/,UltiSnips 有一套自己的代码模板语法规则。在 .vimrc中的配置如下:Plugin ‘honza/vim-snippets’Plugin ‘SirVer/ultisnips’“插入模式下直接通过<C-z>键来触发UltiSnips的代码块补全let g:UltiSnipsExpandTrigger="<C-z>““弹出UltiSnips的可用列表,由于不常用, 所以这里设置成了特殊的<C-i>映射let g:UltiSnipsListSnippets="<C-i>”"<C-f>跳转的到下一个代码块可编辑区let g:UltiSnipsJumpForwardTrigger="<C-f>”"<C-b>跳转到上一个代码块可编辑区let g:UltiSnipsJumpBackwardTrigger="<C-b>“增加位置如Go-vim的位置一致,安装过程也是类似的。gitHub的代码路径如下所示:honza/vim-snippets: https://github.com/honza/vim-...SirVer/ultisnips: https://github.com/SirVer/ult...1.4.2 scrooloose/nerdtree NERDTree的作用就是列出当前路径的目录树,一般IDE都是有的。可以方便的浏览项目的总体的目录结构和创建删除重命名文件或文件名。 在 .vimrc中的配置如下:Plugin ‘scrooloose/nerdtree’” 设置NerdTreemap <F7> :NERDTreeMirror<CR>map <F7> :NERDTreeToggle<CR>进入到 vim 后可以按 F7 显示和隐藏 NERDTree区域。gitHub的代码路径如下所示:scrooloose/nerdtree: https://github.com/scrooloose...1.4.3 majutsushi/tagbar tagbar可以将正在编辑的文件生成一个大纲视图,包含接口/方法/变量等, 可以选中快速跳转到目标位置, 编辑大文件特别有用。由于tagbar是基于ctags,需要先安装ctags:root@ubuntu:/# apt-get install ctags 在 .vimrc中的配置如下:“F9触发,设置宽度为30let g:tagbar_width = 30nmap <F9> :TagbarToggle<CR>“开启自动预览(随着光标在标签上的移动,顶部会出现一个实时的预览窗口)let g:tagbar_autopreview = 1"关闭排序,即按标签本身在文件中的位置排序let g:tagbar_sort = 0进入到 vim 后可以按 F9 开启和关闭tagbar功能 。gitHub的代码路径如下所示:majutsushi/tagbar: https://github.com/majutsushi...1.4.4 Raimondi/delimitMate delimitMate是自动补全引号(单引号/双引号/反引号), 括号(()[]{})的插件。 在 .vimrc中的配置如下:Plugin ‘Raimondi/delimitMate’gitHub的代码路径如下所示:Raimondi/delimitMate: https://github.com/Raimondi/d...GO语言调试利器——dlvvim创建程序文件自动添加头部注释附录:VIM参数设置解析set nocompatible:不要使用vi的键盘模式,而是vim自己的set number:显示行号set showcmd:输入的命令显示出来syntax on:开启语法高亮filetype on:检测文件类型 ...

December 5, 2018 · 1 min · jiezi

网络知识面面观

HTTP响应常见状态码博文链接:网络知识面面观状态码描述100-199成功接收请求, 要求客户端继续提交下一次请求才能完成整个处理过程200-299成功接收请求并已完成整个处理过程,常用200300-399为完成请求, 需进一步细化需求: 例如: 请求的资源已经移动一个新地址,常用302(重定向),307 和304(拿缓存)400-499客户端的请求有错误, 包含语法错误或者不能正确执行。 常用404(请求的资源在web服务器中没有),403(服务器拒绝访问, 权限不够)500-599服务器端出现错误200表示一切正常, 返回的是正常请求结果302/307临时重定向,指出请求的文档已被临时移动到别处, 此文档的新的url在location响应头中给出304未修改,表示客户端缓存的版本是最新的, 客户端应该继续使用它403禁止,服务器理解客户端请求,但拒绝处理它,通常用于服务器上文件或目录的权限设置所致404找不到,服务器上不存在客户端所请求的资源500服务器内部错误,服务器端的cgi,asp,jsp等程序发生错误TCP三次握手和四次挥手建立TCP连接需要三次握手:首先Client端发送连接请求报文,Server端接收连接后回复ACK报文,并为这次连接分配资源。Client端接收到 ACK报文后也向Server端发发送ACK报文,并分配资源,这样TCP连接就建立了。第一步:客户端的TCP先向服务器的TCP发送一个连接请求报文。这个特殊的报文中不含应用层数据,其首部中的SYN标志位被置1。另外, 客户端会随机选择一个起始序号seq=x(连接请求报文不携带数据,但要消耗掉一个序号)。第二步:服务器端的TCP收到连接请求报文后,若同意建立连接,就向客户端发送请求,并为该TCP连接分配TCP缓存和变量。在确认报文中,SYN和ACK位都被置为1, 确认好字段的值为x+1,并且服务器随机产生起始序号seq=y(确认报文不携带数据, 但也要消耗掉一个序号)。确认报文同样不包含应用层数据。第三步:当客户端收到确认报文后,还要向服务器给出确认,并且也要给该连接分配缓存和变量。这个报文的ACK标志位被置为1,序号字段为x+1,确认号字段为y+1。四次挥手第一步:客户端打算关闭连接,就向其TCP发送一个连接释放报文,并停止再发送数据,主动关闭TCP连接,该报文的FIN标志位被置1,seq=u,它等于前面已经传送过的数据的最后一个字节的序号加1(FIN报文即使不携带数据,也要消耗掉一个序号)。第二步:服务器接收连接释放报文后即发出确认,确认号是ack=u+1,这个报文自己的序号是v,等于它前面已传送过的数据的最后一个自己的序号加1。此时,从客户端到服务器这个方向的连接就释放了,TCP连接处于半关闭状态。但服务器若发送数据,客户端仍要接收,即从服务器到客户机的连接仍未关闭。第三步:若服务器已经没有了要向客户端发送的数据,就通知TCP释放连接,此时其发出FIN=1的连接释放报文。第四步: 客户端收到连接释放报文后,必须发出确认。在确认报文中,ACK字段被置为1,确认号ack=w+1,序号seq=u+1。此时,TCP连接还没有释放掉,必须经过等待计时器设置的时间2MSL后, A才进入到连接关闭状态。计算机网络体系结构应用层应用层(application-layer)的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通信和交互的规则。对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如域名系统 DNS,支持万维网应用的 HTTP 协议,支持电子邮件的 SMTP 协议等等。我们把应用层交互的数据单元称为报文。域名系统域名系统(Domain Name System 缩写DNS,Domain Name被译为域名)是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。http协议超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的 WWW(万维网) 文件都必须遵守这个标准。运输层运输层(transport layer)的主要任务就是负责向两台主机进程之间的通信提供通用的数据传输服务。应用进程利用该服务传送应用层报文。“通用的”是指并不针对某一个特定的网络应用,而是多种应用可以使用同一个运输层服务。由于一台主机可同时运行多个线程,因此运输层有复用和分用的功能。所谓复用就是指多个应用层进程可同时使用下面运输层的服务,分用和复用相反,是运输层把收到的信息分别交付上面应用层中的相应进程。运输层常用的两种协议TCP UDP传输控制协议TCP(Transmisson Control Protocol)–提供面向连接的,可靠的数据传输服务。用户数据协议UDP(User Datagram Protocol)–提供无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)。TCP的主要特点TCP是面向连接的。(就好像打电话一样,通话前需要先拨号建立连接,通话结束后要挂机释放连接);每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的(一对一);TCP提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复、并且按序到达;TCP提供全双工通信。TCP允许通信双方的应用进程在任何时候都能发送数据。TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双方通信的数据;面向字节流。TCP中的“流”(Stream)指的是流入进程或从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序接下来的数据仅仅看成是一连串的无结构的字节流。UDP的主要特点UDP是无连接的;UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态(这里面有许多参数);UDP是面向报文的;UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如直播,实时视频会议等);UDP支持一对一、一对多、多对一和多对多的交互通信;UDP的首部开销小,只有8个字节,比TCP的20个字节的首部要短。网络层在计算机网络中进行通信的两个计算机之间可能会经过很多个数据链路,也可能还要经过很多通信子网。网络层的任务就是选择合适的网间路由和交换结点, 确保数据及时传送。在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。在TCP/IP体系结构中,由于网络层使用IP协议,因此分组也叫IP数据报 ,简称数据报。互联网是由大量的异构(heterogeneous)网络通过路由器(router)相互连接起来的。互联网使用的网络层协议是无连接的网际协议(Intert Prococol)和许多路由选择协议,因此互联网的网络层也叫做网际层或IP层。数据链路层数据链路层(data link layer)通常简称为链路层。两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。 在两个相邻节点之间传送数据时,数据链路层将网络层接下来的IP数据报组装成帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。在接收数据时,控制信息使接收端能够知道一个帧从哪个比特开始和到哪个比特结束。这样,数据链路层在收到一个帧后,就可从中提取数据部分,上交给网络层。控制信息还使接收端能够检测到所收到的帧中有无差错。如果发现差错,数据链路层就简单地丢弃这个出了差错的帧,以避免继续在网络中传送下去,浪费网络资源。如果需要改正数据在链路层传输时出现差错(这就是说,数据链路层不仅要检错,而且还要纠错),那么就要采用可靠性传输协议来纠正出现的差错。这种方法会使链路层的协议复杂些。物理层在物理层上所传送的数据单位是比特。 物理层(physical layer)的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。使其上面的数据链路层不必考虑网络的具体传输介质是什么。“透明传送比特流”表示经实际电路传送后的比特流没有发生变化,对传送的比特流来说,这个电路好像是看不见的。在互联网使用的各种协中最重要和最著名的就是TCP/IP两个协议。计算机网络的七层体系结构图HTTP与HTTPS的区别HTTP协议运行在TCP之上,明文传输,客户端与服务器端都无法验证对方的身份;HTTPS是身披SSL(Secure Socket Layer)外壳的HTTP,运行于SSL上,SSL运行于TCP之上,是添加了加密和认证机制的HTTP。二者之间存在如下不同:端口不同:HTTPS与HTTP使用不同的连接方式,用的端口也不一样,前者是80,后者是443;资源消耗:和HTTP通信相比,HTTPS通信会由于加减密处理消耗更多的CPU和内存资源;开销:HTTPS通信需要证书,而证书一般需要向认证机构购买;HTTPS的加密机制是一种共享密钥加密和公开密钥加密并用的混合加密机制。对称加密与非对称加密对称密钥加密是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是密钥发送问题,即如何安全地将密钥发给对方;而非对称加密是指使用一对非对称密钥,即公钥和私钥,公钥可以随意发布,但私钥只有自己知道。发送密文的一方使用对方的公钥进行加密处理,对方接收到加密信息后,使用自己的私钥进行解密。由于非对称加密的方式不需要发送用来解密的私钥,所以可以保证安全性;但是和对称加密比起来,它非常的慢,所以我们还是要用对称加密来传送消息,但对称加密所使用的密钥我们可以通过非对称加密的方式发送出去。TCP协议如何保持传输的可靠性TCP提供一种面向连接的、可靠的字节流服务。其中,面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。在一个TCP连接中,仅有两方进行彼此通信;而字节流服务意味着两个应用程序通过TCP链接交换8bit字节构成的字节流,TCP不在字节流中插入记录标识符。对于可靠性,TCP通过以下方式进行保证:数据包校验:目的是检测数据在传输过程中的任何变化,若校验出包有错,则丢弃报文段并且不给出响应,这时TCP发送数据端超时后会重发数据;对失序数据包重排序:既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。TCP将对失序数据进行重新排序,然后才交给应用层;丢弃重复数据:对于重复数据,能够丢弃重复数据;应答机制:当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒;超时重发:当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段;流量控制:TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据,这可以防止较快主机致使较慢主机的缓冲区溢出,这就是流量控制。TCP使用的流量控制协议是可变大小的滑动窗口协议。查找域名对应的IP地址这一步包括DNS具体的查找过程,包括:浏览器缓存->系统缓存->路由器缓存…浏览器搜索自己的DNS缓存(维护一张域名与IP地址的对应表);搜索操作系统中的DNS缓存(维护一张域名与IP地址的对应表);搜索操作系统的hosts文件( Windows环境下,维护一张域名与IP地址的对应表);操作系统将域名发送至LDNS(本地区域名服务器),LDNS查询自己的DNS缓存(一般查找成功率在80%左右),查找成功则返回结果,失败则发起一个迭代DNS解析请求:LDNS向 Root Name Server(根域名服务器,如com、net、org等的解析的顶级域名服务器的地址)发起请求,此处,Root Name Server返回com域的顶级域名服务器的地址;LDNS向com域的顶级域名服务器发起请求,返回baidu.com域名服务器地址;LDNS向baidu.com域名服务器发起请求,得到www.baidu.com的IP地址;LDNS将得到的IP地址返回给操作系统,同时自己也将IP地址缓存起来;操作系统将IP地址返回给浏览器,同时自己也将IP地址缓存起来。从输入URL到页面加载发生了什么总体来说分为以下几个过程:DNS解析TCP连接发送HTTP请求服务器处理请求并返回HTTP报文浏览器解析渲染页面连接结束HTTP的几种请求方法的用途GET方法:发送一个请求来取得服务器上的某一资源POST方法:向URL指定的资源提交数据或附加新的数据PUT方法:跟POST方法很像,也是向服务器提交数据。但是,它们之间有不同。PUT指定了资源在服务器上的位置,而POST没有HEAD方法:只请求页面的首部DELETE方法:删除服务器上的某资源OPTIONS方法:它用于获取当前URL所支持的方法。如果请求成功,会有一个Allow的头包含类似“GET,POST”这样的信息TRACE方法:TRACE方法被用于激发一个远程的,应用层的请求消息回路CONNECT方法:把请求连接转换到透明的TCP/IP通道五类IP地址的范围IP地址分为A,B,C,D,E五类。网络号:用于识别主机所在的网络;主机号:用于识别该网络中的主机。其中A类分配给政府机关使用,B类地址给大中型企业使用,C类地址给个人使用。这三种是主要的。IP地址分为五类,A类保留给政府机构,B类分配给中等规模的公司,C类分配给任何需要的人,D类用于组播,E类用于实验,各类可容纳的地址数目不同。其中A类、B类、和C类这三类地址用于TCP/IP节点,其它两类D类和E类被用于特殊用途。A、B、C三类IP地址的特征:当把IP地址写成二进制形式时,A类地址的第一位总是0,B类地址的前两位总是10,C类地址的前三位总是110。A类地址A类地址第1字节为网络地址,其它3个字节为主机地址。A类地址范围:1.0.0.1—126.155.255.254A类地址中的私有地址和保留地址:10.X.X.X是私有地址(所谓的私有地址就是在互联网上不使用,而被用在局域网络中的地址)127.X.X.X是保留地址,用做循环测试用的B类地址B类地址第1字节和第2字节为网络地址,其它2个字节为主机地址。B类地址范围:128.0.0.1—191.255.255.254。B类地址的私有地址和保留地址:172.16.0.0—172.31.255.255是私有地址169.254.X.X是保留地址。如果你的IP地址是自动获取IP地址,而你在网络上又没有找到可用的DHCP服务器。就会得到其中一个IPC类地址C类地址第1字节、第2字节和第3个字节为网络地址,第4个个字节为主机地址。另外第1个字节的前三位固定为110。C类地址范围:192.0.0.1—223.255.255.254。C类地址中的私有地址:192.168.X.X 是私有地址。D类地址D类地址不分网络地址和主机地址,它的第1个字节的前四位固定为1110。D类地址范围:224.0.0.1—239.255.255.254E类地址E类地址也不分网络地址和主机地址,它的第1个字节的前五位固定为11110。E类地址范围:240.0.0.1—255.255.255.254HTTP长连接、短连接在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP会话。而从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头加入这行代码:Connection:keep-alive在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。如何理解HTTP协议是无状态的HTTP协议是无状态的,指的是协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。也就是说,打开一个服务器上的网页和上一次打开这个服务器上的网页之间没有任何联系。HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)。各种协议与HTTP协议之间的关系Socket连接与HTTP连接的联系与区别通常情况下Socket连接就是TCP连接,因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。但在实际网络应用中,客户端到服务器之间的通信往往需要穿越多个中间节点,例如路由器、网关、防火墙等,大部分防火墙默认会关闭长时间处于非活跃状态的连接而导致Socket连接断连,因此需要通过轮询告诉网络,该连接处于活跃状态。而HTTP连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。很多情况下,需要服务器端主动向客户端推送数据,保持客户端与服务器数据的实时与同步。此时若双方建立的是Socket连接,服务器就可以直接将数据传送给客户端;若双方建立的是HTTP连接,则服务器需要等到客户端发送一次请求后才能将数据传回给客户端,因此,客户端定时向服务器端发送连接请求,不仅可以保持在线,同时也是在“询问”服务器是否有新的数据,如果有就将数据传给客户端。HTTP(TCP) 报文结构例如一个100kb的HTML文档需要传送到另外一台计算机,并不会整个文档直接传送过去,可能会切割成几个部分,比如四个分别为25kb的数据段。而每个数据段再加上一个TCP首部,就组成了TCP报文。TCP报文 (Segment),包括首部和数据部分。首部:源端口 source port目的端口 destination port序号 sequence number确认号 acknowledgment number数据偏移 offset保留 reserved标志位 tcp flags窗口大小 window size检验和 checksum紧急指针 urgent pointer选项 tcp optionsHTTP的缓存机制HTTP的缓存主要利用header里的两个字段来控制:Cache-control主要包含以及几个字段:private:则只有客户端可以缓存public:客户端和代理服务器都可以缓存max-age:缓存的过期时间no-cache:需要使用对比缓存来验证缓存数据no-store:所有内存都不会进行缓存ETag:即用来进行对比缓存,Etag是服务端资源的一个标识码当客户端发送第一次请求时服务端会下发当前请求资源的标识码Etag,下次再请求时,客户端则会通过header里的If-None-Match将这个标识码Etag带上,服务端将客户端传来的Etag与最新的资源Etag做对比,如果一样,则表示资源没有更新,返回304。通过Cache-control和Etag的配合来实现HTTP的缓存机制。CookieCookie就是用来在本地缓存记住一些状态的,一个Cookie一般都包含domain(所属域)、path、Expires(过期时间)等几个属性。服务端可以通过在响应头set-cookies将状态写入客户端的Cookie中。HTTP 2.0与HTTP 1.x相比有什么优点二进制格式:HTTP 1.x是文本协议,而HTTP 2.0是二进制以帧为基本单位,是一个二进制协议,一帧中除了包含数据外同时还包含该帧的标识:Stream Identifier,即标识了该帧属于哪个request,使得网络传输变得十分灵活。多路复用: 一个很大的改进,原先HTTP 1.x一个连接一个请求的情况有比较大的局限性,也引发了很多问题,如建立多个连接的消耗以及效率问题。HTTP 1.x为了解决效率问题,可能会尽量多的发起并发的请求去加载资源,然而浏览器对于同一域名下的并发请求有限制,而优化的手段一般是将请求的资源放到不同的域名下来突破这种限制。而HTTP 2.0支持的多路复用可以很好的解决这个问题,多个请求共用一个TCP连接,多个请求可以同时在这个TCP连接上并发,一个是解决了建立多个TCP连接的消耗问题,一个也解决了效率的问题。那么是什么原理支撑多个请求可以在一个TCP连接上并发呢?基本原理就是上面的二进制分帧,因为每一帧都有一个身份标识,所以多个请求的不同帧可以并发的无序发送出去,在服务端会根据每一帧的身份标识,将其整理到对应的request中。header 头部压缩:主要是通过压缩header来减少请求的大小,减少流量消耗,提高效率。因为之前存在一个问题是,每次请求都要带上 header,而这个header中的数据通常是一成不变的。支持服务端推送流量控制流量控制是对一条通信路径上的流量进行控制,就是发送方通过获取接收方的回馈来动态调整发送的速率,来达到控制流量的效果,其目的是保证发送者的发送速度不超过接收者的接收速度。拥塞控制拥塞控制是对整个通信子网的流量进行控制,属于全局控制。慢开始+拥塞避免快重传+快恢复快重传:重传机制都是等到超时还未收到接收方的回复,才开始进行重传。而快重传的设计思路是:如果发送方收到3个重复的接收方的ACK,就可以判断有报文段丢失,此时就可以立即重传丢失的报文段,而不用等到设置的超时时间到了才开始重传,提高了重传的效率。快恢复:拥塞控制会在网络拥塞时将拥塞窗口降为1,重新慢开始,这样存在的一个问题就是网络无法很快恢复到正常状态。快恢复就是来优化这个问题的,使用快恢复,则出现拥塞时,拥塞窗口只会降低到新的慢开始门阀值(即12),而不会降为1,然后直接开始进入拥塞避免加法增长。原文链接:前后端均适用的网络知识点大全 ...

November 6, 2018 · 1 min · jiezi

吃鸡决赛圈直播却卡屏的我心好痛,立马找来开发刚了一波

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦本文由腾讯云视频发表于云+社区专栏关注公众号“腾讯云视频”,一键获取 技术干货 | 优惠活动 | 视频方案本是一名佛性型吃鸡选手,自从被三个妹子带着躺尸吃鸡之后,便立志要成为一名吃鸡高手,一大早便沉迷于各大网站的吃鸡直播中,正看到决赛圈激动人心的时刻,直播花屏了?然后游戏结束了?我的天,我是谁?我在哪?我错过了什么?作为一名有强迫症的IT小哥哥,怎能让直播花屏现象存在呢?一方面,为了自己能成为一名吃鸡高手。另一方面,不能错过每一个升职加薪的机会。就这样开始了一段漫长的长征之路……对于直播业务,“秒开、卡顿、时延、进房成功率"是我们经常关注的几个指标,这些指标可以说是从"一个用户能够优雅地进入直播间"的角度来考量的,然而进入直播间后"用户究竟看到的什么内容"也是很关键的一环,内容上除了涉及安全的一些指标外,还可能会有内容是否有花屏、绿屏等其他异常内容,这时我们便会考虑如何衡量和发现外网的花屏情况。本文主要针对花屏提出了一种基于CNN网络的检测方案。01花屏检测能力构建 无论是视频还是直播,都是由一帧帧图像组成的,之所以会以一种动态的形式展现到我们眼前,是因为了人类的视觉暂留现象。物体在快速运动时, 当人眼所看到的影像消失后,人眼仍能继续保留其影像0.1-0.4秒左右的图像,这种现象被称为视觉暂留现象。既然如此,检测直播中是否存在花屏,其实可以转换为检测直播中的帧画面是否是花屏的画面,即一个图像识别问题。那么如何识别一个图像是否是花屏呢?通常图像识别总是以特征为基础的,我们会先根据所设定的目标来提取相应的特征,用于我们后面来制定策略。不过好在现在的深度学习卷积神经网络CNN将提取特征和制定决策策略都帮我们完成了。而使用深度学习CNN网络则绕不开数据集和模型训练两大块1.1数据集准备困难要使用深度学习网络,一个门槛是需要足够的带有标签的数据集,否则学习出的网络很容易过拟合,从而泛化能力不强。说其是门槛是因为实际业务中更多情况是缺少数据集,就以现在的花屏为例,目前直播发生花屏的案例非常少,想要通过实际案例来收集足够的花屏图片作为训练集显得异常困难。因此必须探寻其他的路子来收集训练集。人类之所以能够分辨出花屏,是因为人类眼睛能够找到花屏图像的特征,虽然这些特征我们可能用语言都描述不出来,事实上,如果我们能用语言描述出特征,我们也很容易将其翻译成代码来找到花屏图像的特征。制作训练集机器学习其实也是通过特征来工作的,既然如此,我们可以制作一些花屏图像出来,让CNN网络找到它们区别于正常图片的特征,从而学习到花屏图片的检测能力。在使用YUVviewer工具时,发现当设置错误的分辨率来播放视频文件时会出现花屏情况。灵感来源于此,我们完全可以通过使用错误的分辨率从YUV文件中抽取帧,从而拿到花屏图片。整体流程如下:这里需要了解YUV文件的存储格式,从而根据格式来进行抽取对应的帧:YUV,分为三个分量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。YUV采样样式有一下几种,以黑点表示采样该像素点的Y分量,以空心圆圈表示采用该像素点的UV分量,一般情况下我们都使用的是YUV420格式 YUV420格式存储方式如下所示:按照上面存储方式编写代码来提取帧,代码如下:def get_frames_from_YUV(filename, dims, numfrm, startfrm, frmstep): "”" 从给定的YUV文件中抽取对应的帧数据,帧数据格式仍然为YUV :param filename: YUV文件路径 :param dims: YUV文件的分辨率 :param numfrm: 要提取帧的数量 :param startfrm: 从哪一帧开始提取 :param frmstep: 抽取帧的帧间隔,即每隔几帧抽一帧 :return: 返回抽取帧的Y列表,U列表,V列表 """ filesize = os.path.getsize(filename) fp = open(filename, ‘rb’) blk_size = prod(dims) * 3 / 2 # 计算每帧大小 if (startfrm+1+(numfrm-1)*frmstep)*blk_size > filesize: numfrm = (filesize/blk_size - 1 - startfrm)/frmstep +1 util.log(‘文件读取越界–修改为%d’%numfrm) fp.seek(blk_size * startfrm, 0) # 跳转到指定开始帧 Y, U, V= [],[],[] d00 = dims[0] / 2 d01 = dims[1] / 2 for i in range(numfrm): util.log(‘文件读取第%d帧’ % i) Yt = zeros((dims[1], dims[0]), uint8, ‘C’) Ut = zeros((d01, d00), uint8, ‘C’) Vt = zeros((d01, d00), uint8, ‘C’) for m in range(dims[1]): for n in range(dims[0]): # print m,n Yt[m, n] = ord(fp.read(1)) for m in range(d01): for n in range(d00): Ut[m, n] = ord(fp.read(1)) for m in range(d01): for n in range(d00): Vt[m, n] = ord(fp.read(1)) Y = Y + [Yt] U = U + [Ut] V = V + [Vt] fp.seek(blk_size * (frmstep - 1), 1) # 跳出间隔帧 fp.close() return (Y, U, V)这里对分辨率错误的多种情况也做了下研究,发现如下规律:1)分辨率正确2)分辨率width+1情况3)分辨率width+n情况4)分辨率width-1情况5)分辨率width-n情况上面只是针对图片宽来进行错误干扰,可以看出宽变小花屏条纹方向是左下的,宽变大花屏条纹方向时右下的。所以我们队宽和高分别设置不同的错误值,会造成不同类型的花屏,于是可以用这种策略构造大量的花屏。我们用800多个视频,每个视频以一定的间隔来抽10帧,获得了8000多张花屏图片。这些图片标签为花屏,也就是我们的正样本,负样本可选取实际直播中的正常截图。至此,数据集准备差不多了。1.2 模型和训练模型上使用网上一些知名模型即可,这里我们使用了轻量的mobilenet模型,模型结构如下图所示:训练采用基于用imagenet已经训练好的模型来进行finetune训练,最后一层使用随机超参数来训练(这一层也无法读取pretrained模型的超参数,因为分类数不一致)。训练可以快速收敛,因为特征太明显了,而且测试集准确率很高。其实这里训练是一个不断迭代的过程,因为机器学习模型是一张白纸,它要具有怎样的能力完全是你教它的,而教的方式就是通过训练集(数据和标签),而想要让它能够应对更多的情况,你的训练集就要尽可能涵盖各种情况。而我们的训练集总是不足的,你总会有care不到的地方。训练集不足的情况会怎样?举个例子你训练个识别飞机的模型,而大部分关于飞机的图片都有天空,这样你给张天空的图片到模型,它也可能会认为是飞机,因为其实模型很可能学到的是天空的特征。而怎么让模型学到飞机的特征呢,当然需要调整训练集,让训练集里不仅包含背景为天空的飞机,还有陆地上的飞机等等。通过不断低迭代调优,我们在空间场景下检测准确率已经可以达到94%,NOW直播场景检测准确率也已达到90%。02直播检测方案 检测能力具备后想要真正地接入直播业务,还需要将直播流进行分帧,然后把对应的帧图片进行花屏检测。后台整体框架采用分帧截屏的手段,如果每天需要检测2000万张截图,即10s会有一张截图需要检测,而考虑花屏总是出现在很长的一段时间内,因此这里希望能够以更长的时间来抽样从而避免浪费算力。附一张目前业务检测花屏结果的截图:作为一名热爱工作的IT小哥哥,花了一个星期的时间,总算把基于CNN网络的直播花屏检测的工作告一段落了。工作使我开心,游戏使我快乐,终于可以再次流畅的游走在各大网址的吃鸡直播中啦问答游戏体系结构相关阅读团战开黑必备“良药”了解一下!再也不用担心网吧开黑队友听不清了!3行代码,为QQ轻游戏加上语音互动能力 【每日课程推荐】机器学习实战!快速入门在线广告业务及CTR相应知识 ...

October 12, 2018 · 1 min · jiezi

绝对干货!初学者也能看懂的DPDK解析

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~本文由Willko发表于云+社区专栏一、网络IO的处境和趋势从我们用户的使用就可以感受到网速一直在提升,而网络技术的发展也从1GE/10GE/25GE/40GE/100GE的演变,从中可以得出单机的网络IO能力必须跟上时代的发展。1. 传统的电信领域IP层及以下,例如路由器、交换机、防火墙、基站等设备都是采用硬件解决方案。基于专用网络处理器(NP),有基于FPGA,更有基于ASIC的。但是基于硬件的劣势非常明显,发生Bug不易修复,不易调试维护,并且网络技术一直在发展,例如2G/3G/4G/5G等移动技术的革新,这些属于业务的逻辑基于硬件实现太痛苦,不能快速迭代。传统领域面临的挑战是急需一套软件架构的高性能网络IO开发框架。2. 云的发展私有云的出现通过网络功能虚拟化(NFV)共享硬件成为趋势,NFV的定义是通过标准的服务器、标准交换机实现各种传统的或新的网络功能。急需一套基于常用系统和标准服务器的高性能网络IO开发框架。3. 单机性能的飙升网卡从1G到100G的发展,CPU从单核到多核到多CPU的发展,服务器的单机能力通过横行扩展达到新的高点。但是软件开发却无法跟上节奏,单机处理能力没能和硬件门当户对,如何开发出与时并进高吞吐量的服务,单机百万千万并发能力。即使有业务对QPS要求不高,主要是CPU密集型,但是现在大数据分析、人工智能等应用都需要在分布式服务器之间传输大量数据完成作业。这点应该是我们互联网后台开发最应关注,也最关联的。二、Linux + x86网络IO瓶颈在数年前曾经写过《网卡工作原理及高并发下的调优》一文,描述了Linux的收发报文流程。根据经验,在C1(8核)上跑应用每1W包处理需要消耗1%软中断CPU,这意味着单机的上限是100万PPS(Packet Per Second)。从TGW(Netfilter版)的性能100万PPS,AliLVS优化了也只到150万PPS,并且他们使用的服务器的配置还是比较好的。假设,我们要跑满10GE网卡,每个包64字节,这就需要2000万PPS(注:以太网万兆网卡速度上限是1488万PPS,因为最小帧大小为84B《Bandwidth, Packets Per Second, and Other Network Performance Metrics》),100G是2亿PPS,即每个包的处理耗时不能超过50纳秒。而一次Cache Miss,不管是TLB、数据Cache、指令Cache发生Miss,回内存读取大约65纳秒,NUMA体系下跨Node通讯大约40纳秒。所以,即使不加上业务逻辑,即使纯收发包都如此艰难。我们要控制Cache的命中率,我们要了解计算机体系结构,不能发生跨Node通讯。从这些数据,我希望可以直接感受一下这里的挑战有多大,理想和现实,我们需要从中平衡。问题都有这些1.传统的收发报文方式都必须采用硬中断来做通讯,每次硬中断大约消耗100微秒,这还不算因为终止上下文所带来的Cache Miss。2.数据必须从内核态用户态之间切换拷贝带来大量CPU消耗,全局锁竞争。3.收发包都有系统调用的开销。4.内核工作在多核上,为可全局一致,即使采用Lock Free,也避免不了锁总线、内存屏障带来的性能损耗。5.从网卡到业务进程,经过的路径太长,有些其实未必要的,例如netfilter框架,这些都带来一定的消耗,而且容易Cache Miss。三、DPDK的基本原理从前面的分析可以得知IO实现的方式、内核的瓶颈,以及数据流过内核存在不可控因素,这些都是在内核中实现,内核是导致瓶颈的原因所在,要解决问题需要绕过内核。所以主流解决方案都是旁路网卡IO,绕过内核直接在用户态收发包来解决内核的瓶颈。Linux社区也提供了旁路机制Netmap,官方数据10G网卡1400万PPS,但是Netmap没广泛使用。其原因有几个:1.Netmap需要驱动的支持,即需要网卡厂商认可这个方案。2.Netmap仍然依赖中断通知机制,没完全解决瓶颈。3.Netmap更像是几个系统调用,实现用户态直接收发包,功能太过原始,没形成依赖的网络开发框架,社区不完善。那么,我们来看看发展了十几年的DPDK,从Intel主导开发,到华为、思科、AWS等大厂商的加入,核心玩家都在该圈子里,拥有完善的社区,生态形成闭环。早期,主要是传统电信领域3层以下的应用,如华为、中国电信、中国移动都是其早期使用者,交换机、路由器、网关是主要应用场景。但是,随着上层业务的需求以及DPDK的完善,在更高的应用也在逐步出现。DPDK旁路原理:图片引自Jingjing Wu的文档《Flow Bifurcation on Intel® Ethernet Controller X710/XL710》左边是原来的方式数据从 网卡 -> 驱动 -> 协议栈 -> Socket接口 -> 业务右边是DPDK的方式,基于UIO(Userspace I/O)旁路数据。数据从 网卡 -> DPDK轮询模式-> DPDK基础库 -> 业务用户态的好处是易用开发和维护,灵活性好。并且Crash也不影响内核运行,鲁棒性强。DPDK支持的CPU体系架构:x86、ARM、PowerPC(PPC)DPDK支持的网卡列表:https://core.dpdk.org/supported/,我们主流使用Intel 82599(光口)、Intel x540(电口)四、DPDK的基石UIO为了让驱动运行在用户态,Linux提供UIO机制。使用UIO可以通过read感知中断,通过mmap实现和网卡的通讯。UIO原理:要开发用户态驱动有几个步骤:1.开发运行在内核的UIO模块,因为硬中断只能在内核处理2.通过/dev/uioX读取中断3.通过mmap和外设共享内存五、DPDK核心优化:PMDDPDK的UIO驱动屏蔽了硬件发出中断,然后在用户态采用主动轮询的方式,这种模式被称为PMD(Poll Mode Driver)。UIO旁路了内核,主动轮询去掉硬中断,DPDK从而可以在用户态做收发包处理。带来Zero Copy、无系统调用的好处,同步处理减少上下文切换带来的Cache Miss。运行在PMD的Core会处于用户态CPU100%的状态网络空闲时CPU长期空转,会带来能耗问题。所以,DPDK推出Interrupt DPDK模式。Interrupt DPDK:图片引自David Su/Yunhong Jiang/Wei Wang的文档《Towards Low Latency Interrupt Mode DPDK》它的原理和NAPI很像,就是没包可处理时进入睡眠,改为中断通知。并且可以和其他进程共享同个CPU Core,但是DPDK进程会有更高调度优先级。六、DPDK的高性能代码实现1. 采用HugePage减少TLB Miss默认下Linux采用4KB为一页,页越小内存越大,页表的开销越大,页表的内存占用也越大。CPU有TLB(Translation Lookaside Buffer)成本高所以一般就只能存放几百到上千个页表项。如果进程要使用64G内存,则64G/4KB=16000000(一千六百万)页,每页在页表项中占用16000000 * 4B=62MB。如果用HugePage采用2MB作为一页,只需64G/2MB=2000,数量不在同个级别。而DPDK采用HugePage,在x86-64下支持2MB、1GB的页大小,几何级的降低了页表项的大小,从而减少TLB-Miss。并提供了内存池(Mempool)、MBuf、无锁环(Ring)、Bitmap等基础库。根据我们的实践,在数据平面(Data Plane)频繁的内存分配释放,必须使用内存池,不能直接使用rte_malloc,DPDK的内存分配实现非常简陋,不如ptmalloc。2. SNA(Shared-nothing Architecture)软件架构去中心化,尽量避免全局共享,带来全局竞争,失去横向扩展的能力。NUMA体系下不跨Node远程使用内存。3. SIMD(Single Instruction Multiple Data)从最早的mmx/sse到最新的avx2,SIMD的能力一直在增强。DPDK采用批量同时处理多个包,再用向量编程,一个周期内对所有包进行处理。比如,memcpy就使用SIMD来提高速度。SIMD在游戏后台比较常见,但是其他业务如果有类似批量处理的场景,要提高性能,也可看看能否满足。4. 不使用慢速API这里需要重新定义一下慢速API,比如说gettimeofday,虽然在64位下通过vDSO已经不需要陷入内核态,只是一个纯内存访问,每秒也能达到几千万的级别。但是,不要忘记了我们在10GE下,每秒的处理能力就要达到几千万。所以即使是gettimeofday也属于慢速API。DPDK提供Cycles接口,例如rte_get_tsc_cycles接口,基于HPET或TSC实现。在x86-64下使用RDTSC指令,直接从寄存器读取,需要输入2个参数,比较常见的实现:static inline uint64_trte_rdtsc(void){ uint32_t lo, hi; asm volatile ( “rdtsc” : “=a”(lo), “=d”(hi) ); return ((unsigned long long)lo) | (((unsigned long long)hi) << 32);}这么写逻辑没错,但是还不够极致,还涉及到2次位运算才能得到结果,我们看看DPDK是怎么实现:static inline uint64_trte_rdtsc(void){ union { uint64_t tsc_64; struct { uint32_t lo_32; uint32_t hi_32; }; } tsc; asm volatile(“rdtsc” : “=a” (tsc.lo_32), “=d” (tsc.hi_32)); return tsc.tsc_64;}巧妙的利用C的union共享内存,直接赋值,减少了不必要的运算。但是使用tsc有些问题需要面对和解决1) CPU亲和性,解决多核跳动不精确的问题2) 内存屏障,解决乱序执行不精确的问题3) 禁止降频和禁止Intel Turbo Boost,固定CPU频率,解决频率变化带来的失准问题5. 编译执行优化1) 分支预测现代CPU通过pipeline、superscalar提高并行处理能力,为了进一步发挥并行能力会做分支预测,提升CPU的并行能力。遇到分支时判断可能进入哪个分支,提前处理该分支的代码,预先做指令读取编码读取寄存器等,预测失败则预处理全部丢弃。我们开发业务有时候会非常清楚这个分支是true还是false,那就可以通过人工干预生成更紧凑的代码提示CPU分支预测成功率。#pragma once#if !__GLIBC_PREREQ(2, 3)# if !define __builtin_expect# define __builtin_expect(x, expected_value) (x)# endif#endif#if !defined(likely)#define likely(x) (__builtin_expect(!!(x), 1))#endif#if !defined(unlikely)#define unlikely(x) (_builtin_expect(!!(x), 0))#endif2) CPU Cache预取Cache Miss的代价非常高,回内存读需要65纳秒,可以将即将访问的数据主动推送的CPU Cache进行优化。比较典型的场景是链表的遍历,链表的下一节点都是随机内存地址,所以CPU肯定是无法自动预加载的。但是我们在处理本节点时,可以通过CPU指令将下一个节点推送到Cache里。API文档:https://doc.dpdk.org/api/rte…static inline void rte_prefetch0(const volatile void p){ asm volatile (“prefetcht0 %[p]” : : [p] “m” ((const volatile char *)p));}#if !defined(prefetch)#define prefetch(x) __builtin_prefetch(x)#endif…等等3) 内存对齐内存对齐有2个好处:l 避免结构体成员跨Cache Line,需2次读取才能合并到寄存器中,降低性能。结构体成员需从大到小排序和以及强制对齐。参考《Data alignment: Straighten up and fly right》#define __rte_packed attribute((packed))l 多线程场景下写产生False sharing,造成Cache Miss,结构体按Cache Line对齐#ifndef CACHE_LINE_SIZE#define CACHE_LINE_SIZE 64#endif#ifndef aligined#define aligined(a) attribute((aligned(a)))#endif4) 常量优化常量相关的运算的编译阶段完成。比如C++11引入了constexp,比如可以使用GCC的__builtin_constant_p来判断值是否常量,然后对常量进行编译时得出结果。举例网络序主机序转换#define rte_bswap32(x) ((uint32_t)(__builtin_constant_p(x) ? rte_constant_bswap32(x) : rte_arch_bswap32(x)))其中rte_constant_bswap32的实现#define RTE_STATIC_BSWAP32(v) ((((uint32_t)(v) & UINT32_C(0x000000ff)) << 24) | (((uint32_t)(v) & UINT32_C(0x0000ff00)) << 8) | (((uint32_t)(v) & UINT32_C(0x00ff0000)) >> 8) | (((uint32_t)(v) & UINT32_C(0xff000000)) >> 24))5)使用CPU指令现代CPU提供很多指令可直接完成常见功能,比如大小端转换,x86有bswap指令直接支持了。static inline uint64_t rte_arch_bswap64(uint64_t _x){ register uint64_t x = _x; asm volatile (“bswap %[x]” : [x] “+r” (x) ); return x;}这个实现,也是GLIBC的实现,先常量优化、CPU指令优化、最后才用裸代码实现。毕竟都是顶端程序员,对语言、编译器,对实现的追求不一样,所以造轮子前一定要先了解好轮子。Google开源的cpu_features可以获取当前CPU支持什么特性,从而对特定CPU进行执行优化。高性能编程永无止境,对硬件、内核、编译器、开发语言的理解要深入且与时俱进。七、DPDK生态对我们互联网后台开发来说DPDK框架本身提供的能力还是比较裸的,比如要使用DPDK就必须实现ARP、IP层这些基础功能,有一定上手难度。如果要更高层的业务使用,还需要用户态的传输协议支持。不建议直接使用DPDK。目前生态完善,社区强大(一线大厂支持)的应用层开发项目是FD.io(The Fast Data Project),有思科开源支持的VPP,比较完善的协议支持,ARP、VLAN、Multipath、IPv4/v6、MPLS等。用户态传输协议UDP/TCP有TLDK。从项目定位到社区支持力度算比较靠谱的框架。腾讯云开源的F-Stack也值得关注一下,开发更简单,直接提供了POSIX接口。Seastar也很强大和灵活,内核态和DPDK都随意切换,也有自己的传输协议Seastar Native TCP/IP Stack支持,但是目前还未看到有大型项目在使用Seastar,可能需要填的坑比较多。我们GBN Gateway项目需要支持L3/IP层接入做Wan网关,单机20GE,基于DPDK开发。问答如何检查网络连接?相关阅读把报文再扔回内核,DPDK这样做用DPDK rte_ring实现多进程间通信低于0.01%的极致Crash率是怎么做到的? 【每日课程推荐】新加坡南洋理工大学博士,带你深度学习NLP技术 ...

September 5, 2018 · 2 min · jiezi

原来你是这样的http2......

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~本文由mariolu发表于云+社区专栏序言目前HTTP/2.0(简称h2)已经在广泛使用(截止2018年8月根据Alexa流行度排名的头部1千万网站中,h2占比约29%,https://w3techs.com/technolog…)。写此文章的目的是:h2作为较新的技术,并逐渐占有率广泛,虽然目前有更新的QUIC,但其实现思路类似于h2。颠覆以往的HTTP/1.x,H2的创造性的技术值得我们细细品味。此篇文章根据笔者在h2开发经验和思考,向你介绍全面的h2知识以及是非功过。本篇更注重于帮助读者理解h2的设计思路、亦可作为一篇RFC导读或者总结。第一话、追踪溯源图1、HTTP年鉴图早在1991年,伴随WWW诞生之初,HTTP/0.9协议已经提出。HTTP0.9是简单且应用受限的协议。支持去网络主机获取对应路径的资源。但是没有扩展属性。其协议之简单甚至只用下面一个访问谷歌主机的例子概括了HTTP/0.9的全部。如下所示,协议只支持GET,没有http头;响应只能是超文本。telnet google.com 80Connected to x.x.x.xGET /about(Hyper text)(Conection closed)随着人们对富媒体信息的渴望以及浏览器的普及,HTTP/1.0在1996年被提出来。HTTP/1.0的很多特性目前还被广泛使用,但是仍然像HTTP/0.9一样一次请求需要创建一次的tcp连接。随即短短几年时间内,HTTP/1.1以RFC标准形式再次展现在人们眼前。此时的HTTP协议1.1版本已经重新设计了长连接、options请求方法、cache头、upgrade头、range头、transfer-encoding头, 以及pieline(in order)等概念。而我们另一个所熟知的HTTPS的SSL/TLS技术各个版本差不多在后来的十年间逐渐被提出。出于安全考虑,互联网通信间的防火墙路由交换机等设备,这些设备一般仅会开发有限的端口(如80和443)。各种版本的通信协议只能复用这些端口。HTTP1.1的80端口设计了upgrade请求头升级到更高级的协议,而443端口为了避免多消耗个网络RTT,在tls握手过程中使用了NPN/ALPN技术直接在通信之前保持CS两端的协议一致。NPN/ALPN是是TLS协议扩展,其中NPN是Google为实现spdy提出的。由服务端提供可支持的协议,供客户端选择。ALPN则是更接近于HTTP交互的方式,由客户端先发出使用某种协议的请求,由服务端确认是否支持协议。ALPN为了HTTP2诞生做铺垫。另外一个不得不提的是spdy协议。Spdy旨在解决HTTP1.1的线头阻塞问题(后面章节有详细讨论)于2009被google提出。同时分别于2012提出了spdy3.0实现了流控制,2013-2014期间提出了流优先级,server push等概念。Spdy的存在意义更像是http2.0的体验服。它为探索HTTP继续演进道路做了铺垫。第二话、人机交互汇编是效率最高的语言之一,但是又是最晦涩难懂的语言之一。而人脑易懂的编程语言往往牺牲性能作为折衷。简单说,HTTP/1.x协议就是为了人类语言习惯所设计的协议,但是转换成机器执行协议并不是高效的。让我们在回顾下计算机执行解析HTTP1.x的流程。GET / HTTP/1.1<crlf>Host: xxx.aa.com<crlf><crlf>对应的解析伪代码是loop while(! CRLF) read bytes end while if line 1: parse line as Request-Line else if empty line: Break out and We have done else If start with non-whitespace parse header else if space continue with last heade end ifend loop在伪代码解析流程可以看到,肉眼看起来简洁的协议解析起来是这么的费劲。而且在HTTP服务器中还要考虑这种问题:字节行的长度是未知的,也不知道预先分配多大内存。HTTP/2.0使用了计算机易懂的二进制编码信息,而且得向上兼容HTTP的涵义。具体我们来看下他是如何做到的。像大多数通信协议一样,桢是传输最小单位。桢分为数据帧和控制桢。数据帧作为数据的载体,控制桢控制信道的信令。h2桢的通用格式为首部9字节+额外的字符。正如你能想到的那样,桢的第一个部分是描述长度,第二个部分描述了桢的类型,第三个部分描述了标志Flag,第四个部分是唯一序列号。这是所有桢的通用头。通用头紧接的是桢的实体。图4展示了桢的结构。图2、通用桢的格式这样设计有什么好处呢。再来看一下桢的解析流程,你就会发现对计算机来说更简洁。loop read 9 byte payload_Length=first 3 bytes read payload swith type: Take actionend loopHTTP2.0使用header桢表达HTTP header+request line,data桢表达Body。header桢和data桢使用相同的stream id组成一个完整的HTTP请求/响应包。这里的stream描述了一次请求和响应,相当于完成了一次HTTP/1.x的短连接请求和响应。第三话、并行不悖上节讲到我们用h2桢完整表达了HTTP/1.x。但是h2协议抱负远不止于此。它的真正目的是解决之前HTTP1.x的线头阻塞问题、改善网络延迟和页面加载时间。我们知道一个完整的网页包含了主页请求和数次或数十次的子请求。HTTP/1.1已经可以并行发出所有请求.但是HTTP本身是无状态的协议,它依赖于时间的顺序来识别请求和响应直接的对应关系。先来的请求必须先给响应。那么如果后面的响应资源对浏览器构建DOM或者CSSOM更重要。那它必须阻塞等待前者完成。当然这也难不倒我们,我们可以多开几条tcp连接(浏览器规定一个origin(协议+host+port)最多6个)或者合并资源来减少不必要的阻塞。这是有代价的。首先tcp建连的开销,其实合并资源带来一小块子资源过期导致整个合并资源的缓存过期。对此,h2有一揽子的解决方案,接下来一一道来。h2在一个tcp连接创建多个流。每个流可以有从属关系,比如说根据浏览器加载的优先级顺序(主请求>CSS>能改变DOM结构的JS文件>图片和字体资源文件)建立一条依赖关系链。处于同一等级的依赖关系中可以设置权重。权重用于分配传输信道资源多少。图6例子说明了有一次主页请求index.html、一次main.css,一次jq.js以及一些image文件和字体文件qq.tff图3、h2请求的依赖树HTML的优先级最高,在HTML传输完成之前,其他文件不会被传输。HTML传输完成后,JS和CSS根据其分配的权重占比分配信息传输资源。如果CSS传输完成后,TFF和PNG如果是相同权重,那么他们将占有1/4的信道资源。这里抛出3个问题和答案。如果CSS被阻塞了,那么 JS 得到本属于CSS的通信资源如果CSS传输完成但没有被移依赖树, TFF和PNG继承CSS的通信份额 (假设TFF和PNG权重一样,那么各分得1/4通信资源).如果CSS在依赖数被移除,JS, TFF, PNG平分通信资源(假设3个权重一样,那么三者各分得1/3通信资源)第四话、众星捧月HTTP2还设计了一系列方案来改善网络的性能、包括流量控制,HPack压缩,Server Push。什么你说TCP已经有流量控制了,HTTP不是多此一举吗?没错,但是在单条TCP内部,各个流可是没有流量控制。流量控制使用了Update Frame不断告知发送方更新发送的窗口大小(上限)。流量控制一个现实用途是阻塞不重要的请求,以腾出更大的通信资源给重要的请求使用。流量控制是不可以被关闭的,流量大小可以设置2的31次方-1(2GB)。不同的中间网络设备有不一样的吞吐能力。流控的另一个用途在于同步所有的中间设备交换机最小的上限。流量窗口初始大小为65535(2的16次方-1)。就像世界上的大多数财富聚集在少数人身上一样。在一份对48,452,989个请求的统计中,以下11个头占据了99%的数量,依名次递减分别是user-agent、accetp-encoding、accept-language、accept、referer、host、connection、cookie、origin、upgrade-inseure-request、content-type。http header的值也有很大相似性,比如说”/index.html“, “gzip, deflate”。Cookie也携带冗余的信息。这些都组成了http header大量可以压缩的内容。而在一份GET请求和一个304响应或者content-length很少的响应中,这些头占据了很大比例的通信资源。2016年发布的一份HTTP报告中,请求头大约在460bytes,对一个通常的网页,平均会有140个请求对象。这些头总共需要63KB。这些量很有可能会是首屏和页面加载时间优化的瓶颈。可能你会说用gzip等压缩算法这些请求头,不就完了吗?的确spdy就这样干过,直到2013年BREACH攻击暴露了gzip压缩在https应用的安全性,这种攻击让攻击者很容易获得session cookie等数据。于是才有了HPACK。HPACK简单来说就是索引表,包括静态表和动态表。静态表由RFC定义,从不改变,静态表预留了62个表项。每个连接的通信双方维护着动态表。H2协议使用索引号代表http中的name、value或者name-value。假设被索引的是name,value没有索引,那么value还可以用霍夫曼编码压缩。在预定的头字段静态映射表 中已经有预定义的 Header Name 和 Header Value值,这时候的二进制数据格式如图4, 第一位固定为1, 后面7位为映射的索引值。图8的83就是这样的,83的二进制字节标示1000 0011,抹掉首位就是 3 , 对应的静态映射表中的method:POST。图4、index索引name和value图5、抓包示意预定的头字段静态映射表中有 name,需要设置新值。图6所示例子,一个指定 path的Header,首字符 为 44 ,对应的二进制位0100 0100。前两个字符为 01 ,Index 为 4 ,即对应静态映射表中的 path 头。第二个字符为 95对应的二进制位 1001 0101,排除首字符对应的 Value Length 为 十进制的21。即 算上 44,一共23个字符来记录这个信息。图6、index索引name和自定义value图7、抓包示意预定的头字段静态映射表中没有 name,需要设置新name和新值。40 的二进制是0100 0000,02 的二进制是0000 0010,后七位的十进制值是 2,86 的二进制是1000 0110,后7位的十进制值是6。图8、index索引自定义name和自定义value图9、抓包示意明确要求该请求头不做hpack的indexHTTP2.0还有个大杀器是Server Push,Server Push利用闲置的带宽资源可以向浏览器预推送页面展示的关键资源,Server push有效得降低了页面加载时间。具体详情参考笔者的另一篇文章https://cloud.tencent.com/dev…。第五话、庖丁解牛HTTP2相比HTTP1更适合计算机执行。但是其二进制特性不易于人脑理解。这一话我们专门来讲讲关于http2的调试工具。Chrome(qq浏览器)可以按住F12查看h2协议。图13所示为浏览器网络时序图,列出了具体协议名称。chrome还可以在地址栏敲入chrome://net-internals/#http2查看到h2协议细节,如图11所示。点击相应的host就可以看到h2协商过程,如图12所示。图10、浏览器的网络时序图chrome://net-internals/#http2图11、chrome调试h2图12、h2协商过程wireshark(需和chrome或firefox搭配使用)。设置环境变量SSLKEYLOGFILE=c:tempsslkeylog.log。然后在Wireshark->Preferences->Protocols->SSL配置key所在路径。图13、wireshark配置图14、wireshark抓h2包Nghttp2是一个完整的http2协议实现的组件。作者也参与过spdy实现。目前nghttp2库被很多知名软件作为h2协议实现库使用。另外nghttp2也自带了h2协议的分析工具。图18展示了在明文状态使用upgrade头升级到h2c。图19展示了在https基础上升级到h2。图15、明文状态使用upgrade头升级到h2c图16、展示了在https基础上升级到h2Curl的—http2选项(需要和nghttp2一起编译)图17、支持h2的curl客户端调试Github还有些实用的http2工具组件,诸如chrome-http2-log-parser、http2-push-manifest等组件,笔者后续会专门开篇文章介绍这些工具。对于移动端的调试,ios可以用charles proxy做代理,android需要开发者模式使用移动端的chrome,笔者在移动端使用较少,这里就不做展开。第六话、雕栏玉砌H2怎么部署呢,目前主流服务端像nginx、apache都已经支持http2,主流的客户端curl和各种浏览器(包括移动端safari和chrome-android)基本也支持http2。代理服务器如ATS、Varnish,Akamai、腾讯云等CDN服务也支持http2。那么怎么把一套网站部署到h2。或者说部署h2网站和之前h1网站有什么不一样?如果是自己的源站,那么请确保服务器支持TLS1.2已经RFC7540所要求的加密套件,h2需要保证支持alpn。你可以使用ssllabs等网站检查。对于h2服务器的要求是h2必须了解如何设置流的优先级,h2服务器需要支持server push。h2客户端需要尽量多的发送请求。如果你的网站是从http1.x迁移过来的,那么之前对于http1.x所做的优化可能无任何帮助甚至更差。合并小文件不在需要,因为额外的小文件请求在h2看来只是开销很少。并且如果大文件的局部更改使得整个大文件缓存失效。在http1.0时代使用多个域名来并发http连接,在http2也毫无必要,因为http2天生就是并发的。http1.x做的优化比如说图片资源文件不使用cookie来减少请求大小,http2的header压缩功能也减少了这种影响。即使不做这种优化也亦可。像合并css、小图片带来的增益在http2.0也是可忽略的。如果网页使用第三方网站组件,那么请尽可能减少使用第三方网站组件。第三方网站不能保证支持h2,所以它可能成为木桶理论的最大短板。谨慎使用2.0-1.x的部署方案,h2流转化成h1请求。因为这样无法发挥h2性能。图18、2.0-1.x的部署方案CDN代理服务器的h2支持,可以屏蔽h2强制走tls的代理服务器。如图19,代理可以在与各种协议客户端的网络环境下,切断和客户端的tls连接,和服务器新建连接。也可以作为load balancer,相当于HTTP2.0用户和HTTP2.x服务器直接通信。图19、带tls客户端功能的代理图20列举如果绕过proxy到达h2服务器。此时的proxy相当于tcp转发的load balance功能的设备。如果该proxy支持tls的alpn协议,那么它也可以选择HTTP代理功能,和h2服务器可以建立加密连接。如果即不支持alpn,也不支持tcp转发。那么proxy只能用upgrade升级成h2协议。图20、经过代理服务器的H2部署方案第七话、十全九美HTTP2.0是建立在TCP之上,所以TCP的所有缺点他都有,所以H2能发挥最大性能得益于调优的tcp协议栈。TCP的慢启动特性,决定h2一开始的并发流量不会太大,TCP以及SSL的握手连接也会拖慢h2的首包网络耗时。QUIC则完全地抛弃TCP,在UDP基础上实现了HTTP2的一系列特性。同时做了应用层的如TCP的可靠性保障。同时这些TLS1.3传输更快更简洁。这些都为HTTP2.0进化到HTTP3.0提供了一些思路。总结以上内容都来源于笔者的实践经验和理论总结。篇幅所限不能涵盖各个细节。具体可以继续参考RFC7540和RFC7541协议。问答没有“http | https”的网址怎么实现?相关阅读我是怎么一步步用go找出压测性能瓶颈HTTP/2之服务器推送(Server Push)最佳实践低于0.01%的极致Crash率是怎么做到的? 【每日课程推荐】新加坡南洋理工大学博士,带你深度学习NLP技术 ...

September 5, 2018 · 1 min · jiezi