网络中的“回流”

“回流”,光这个名词我听说也没多久的,不知是哪里给的这么一个雅号。 以前知道在映射上,有这么个事情。但一直以来也没个名称,也不好简单直观的描绘,现在总算有个俗称了,虽然只有八成的贴切,也是好的 回流是什么?最简单的一个实例: 网吧内网一台主机192.168.0.2建了个WEB服务站点端口80,然后在网关(其内网地址是192.168.0.1、公网地址为218.4.218.4)上映射80端口到192.168.0.2的80端口,这样INTERNET上就能以http://218.4.218.4:80的地址访问到192.168.0.2的WEB站点了。 然后出现了个问题,在同网吧的另一台电脑192.168.0.3上,键入http://218.4.218.4:80,却无法访问该WEB站点。 就这个现象,我们就称之为“不支持回流”了,这里指的是网关上的映射方式不支持回流,所以说“回流”一说,是针对映射方式而言的。 现在我们来看常规情况下,是为什么会发生这种情况的 我以前对iptables特别感兴趣的时候,曾对这个问题非常迷惑不解,直到去年为了考试,学习网络基础的时候才搞明白这个事情 过程如下: 192.168.0.3要请求访问218.4.218.4的80端口,根据它掌握的路由表,它本身是不知道电脑218.4.218.4在哪里的,所以把将这个数据包发送给它的默认路由,即电脑192.168.0.1。 注意:这个数据包的源地址是192.168.0.3、源端口假设是1025、目标地址是218.4.218.4、目标端口是80、SYN标志位为1、这是建立TCP连接的第一次握手。 如果“把目标地址为218.4.218.4的数据包发给了192.168.0.1”你听起来觉得有点矛盾,那么我解释一下:其实这个数据包的目标IP地址是218.4.218.4,目标MAC地址却是192.168.0.1的 电脑192.168.0.1接收到了这份数据包(因为它的身份是路由器,所以允许接收和转发目标地址不是自已、MAC地址却是自已接口MAC地址的数据包),它分析这个数据包的目标地址,发现这个数据包是需要中转到电脑192.168.0.2:80去的,于是它把这个数据包转发给了电脑192.168.0.2:80。 注意:这个数据包的源地址是192.168.0.3、源端口是1025、目标地址为192.168.0.2、目标端口为80、SYN标志位为1。我们要注意这个数据包在转发后发生了变化了,即目标地址变了。 电脑192.168.0.2顺利接到了数据包,它马上作出回应,发送一个数据包给电脑192.168.0.3。 注意:这个数据包的源地址是192.168.0.2、源端口是80、目标地址192.168.0.3、目标端口为1025、SYN标志位为1、ACK标志位为1、这是建立TCP连接的第二次握手。 电脑192.168.0.3顺利接到了数据包,然而它发现这是一个来自192.168.0.2:80的回应,因为ACK标志位值为1摆在那里呢。它想不起来什么时候给192.168.0.2:80这个目标对象发送过SYN请求,它认为这是一个错误的数据包,于是决定把这个数据包丢弃。然后继续等待218.4.218.4:80的回应,一直等到超时。 而电脑192.168.0.2这边,它等192.168.0.3:1025的第三次握手请求包发送过来,以便建立一个TCP的连接。同样也没有结果,一直等到超时。三次握手在规定的时间内没有完成,访问宣布流产了。 那么怎么样才能正常访问呢?也就是说怎么样形成“回流”呢? 玄机在于电脑192.168.0.1把第一次握手的那个数据包在转发时,不仅要修改目标地址和端口,也要修改源地址和端口,我们来看一下情况会有什么不同: 电脑192.168.0.1接收到了这份数据包(因为它的身份是路由器,所以允许接收和转发目标IP地址不是自已、MAC地址却是自已接口MAC地址的数据包),它分析这个数据包的目标地址,发现这个数据包是需要中转到电脑192.168.0.2:80去的,于是它把这个数据包通过自已的5201端口转发给了电脑192.168.0.2:80,并在内存里面记录下来了,192.168.0.1:5201已定位给了192.168.0.3:1025。 注意:这个数据包的源地址是192.168.0.1、源端口是5201、目标地址为192.168.0.2、目标端口为80、SYN标志位为1。 电脑192.168.0.2顺利接到了数据包,它马上作出回应,发送一个数据包给电脑192.168.0.1。 注意:这个数据包的源地址是192.168.0.2、源端口是80、目标地址192.168.0.1、目标端口为5201、SYN标志位为1、ACK标志位为1、这是建立TCP连接的第二次握手。 电脑192.168.0.1顺利接到了数据包,检查内存记录发现,这个数据包真正的收货人是192.168.0.3:1025,于是它把这个数据包转发给192.168.0.3。… Read More »网络中的“回流”

日常问题总结

当npm安装包的时候,报npm ERR! Command failed: git clone –mirror -q git://github…….之类的错误的时候,可以使用以下方法解决: 方法一: git config –global http.sslverify “false” 方法二: git config –global url.”https://”.insteadOf git:// 最后 npm install –registry=https://registry.npm.taobao.org

雷军:疫情拐点之际,谈谈企业如何度过难关【转】

《五个“过冬锦囊”》 –雷军 “没有一个难关不可逾越,无论面对什么危机,信心比黄金还要珍贵。” 春天已经到来,让我们一同期待。 以下为原文分享: 新冠肺炎疫情来势汹汹,已经在全世界掀起了一场重大战役。环球同此凉热,疫情不仅对人民的生命安全造成巨大威胁,对经济的影响也越来越凸显。做企业总是和各种不确定性打交道,特别是当下我们既要与新冠肺炎做斗争,还要面对潜在的经济下行的压力,着实不易。 企业要如何度过难关? 这个问题我已不是第一次回答。历史上金山软件最困难时差点发不出工资,卓越网创业时也经历了非典疫情。2008 年金融海啸席卷全球,很多年轻的创业者面对 2009 年的形势不知所措。那时我主要是一名天使投资人,于是我在博客中分享了自己的经验,后来被媒体总结为五个“过冬锦囊”。 十一年过去了,我相信这五个办法依然很有价值,因为小米一直在践行,既是对极致效率的自我追求,客观上也是一种未雨绸缪:以四季常态过冬天,则冬天亡;以冬天态度过四季,则四季存。抵抗疫情造成的经济次生灾害,需要全社会积极应对,其中企业无疑扮演了重要的角色。在此,我把这篇博文增补修订,加入新形势下的思考,希望能跟大家讨论共勉。 《面对危机的五个建议》——2009年博客 步入 2009 年后,几乎所有人都领略到这次冬天的寒意。不少人问我,创业公司如何过冬? 我的回答和大家一样:现金为王。 持有足够的现金量是生存的关键。我在二十年的职业生涯中,遭遇过多次冬天,甚至在 1997 年 9 月管理北京金山的时候差点发不出工资,所以无论压力有多大,我坚持企业安全第一,保持充足的现金量。有了足够的现金,的确可以轻松过冬。但我认为问题的核心不是现金,而是企业的基本生存技能:成本控制。 如何有效控制成本呢?这的确是一个非常复杂的问题,和大家分享一些我的经验。 一、建立全员成本意识 成本意识要从公司创建开始建立。… Read More »雷军:疫情拐点之际,谈谈企业如何度过难关【转】

vue.js 3.0及前端技术

社会在发展,技术在进步。前端技术日新月异,虽然之前学过一篇关于vue.js的学习心得,但如今又有新的玩法...

GoLang学习心得1

最近在学习GoLang,学习这语言的最主要原因——换工作了 由于各种原因,辞去了待了三年的公司,然后又找了一家新的。由于这家规模没有之前那个大,各种福利就跟不上,多少心里有些落差,可这阻碍不了我工作的激情,面对工作,我还是很认真的。 或者是因为“金三银四”的原因,最近感觉跳槽的人很多……(好像我上一次跳槽也是在3月份)进到这个新公司,本来是一web前端为主,可人员变动,之前负责一个代理端的人员跑了,一下子没有人来接手这个项目,结果我就被苦逼的接下了这个项目——用GoLang开发的一个代理。接手的原因是——“我的基础比较扎实”,言外之意,大家都懂的,就好比立马被拉进了一个名叫”这个锅不好接“的聊天群里。说了那么多,结论就是,我换了个公司,然后接了一个用GoLang开发的项目,更直白点说,就是我开始学习GoLang了…… 多的不说了,开始进入正题: 面对GoLang,可以说是一脸懵逼。打开百度搜搜,先了解下它到底是啥,然后了解下能干啥,有啥优缺点,一翻搜索后,开始搭建开发环境: 开发环境的搭建就掉进了坑,还好爬的快。网上各种“大神“推荐了好多开发工具:liteide,eclipse……还有好多,出了之前用过eclipse之外,其他都没听过……好吧,那就eclipse……可是,各种弄了后,发现,没法编译程序……或许是我哪里没配置好,还有一个主要原因,是我之前都不喜欢用eclipse,用起来感觉别扭(完全个人原因)。于是还是打开了我的VSCode,搜搜看这万能的”记事本“,能不能进行GoLang的开发。各种试水后,终于搭建起来了,说一下步骤: 1、下载GoLang的环境包,下载地址必须是官网: https://golang.google.cn/dl/ 下载下来后,点击安装 2、配置GoLang的环境变量配置 添加GOROOT变量,值为安装的go开发包位置; 如:C:\Go\ 添加GOPATH变量,值为你开发go的工作区,就是代码目录,类似java的workspace 如:E:\dev_2019\go 这下命令行中就可以使用go命令,敲击  go env  可查看当前go的环境配置 这个GOPATH很关键,你最好也必须把代码放到这个目录下,而且又讲究:里面会有三个必须目录: bin\: 可执行文件目录,一般在src下使用go install后,就会生成如windows下的exe文件到这个目录 pkg\: 一些依赖包的目录 src\:… Read More »GoLang学习心得1