最近一两天在学git,之前连git、github、gitlab有什么关联与区别都还没能明白的计算机小白就循规蹈矩的从最基础的建库、操作库中文件开始。因为项目组在的项目放在了gitlab上统一管理,所以要学git,总不能连同事更新上的代码我只知道下载压缩包这种无法拥有同步更新功能的方式吧。
    那么此时,git本地库与gitlab远程库之间的连接就显得尤为重要了。想从远程下载代码,在gitlab上主要有ssh和http两个方式,通过ssh协议更为安全,首先我们来了解一下关于ssh的一些知识:
    SSH是传输层和应用层上的安全协议,它通过加密连接双方会话的方式来保证连接的安全性。当使用ssh连接成功后,将建立客户端和服务端之间的会话,该会话是被加密的,之后客户端和服务端的通信都将通过会话传输。SSH服务的守护进程为sshd,默认监听在22端口上。ssh服务进行加密操作方式有两种:
    对称加密:加密和解密使用一样的算法,只要解密时提供与加密时一致的密码就可以完成解密。例如QQ登录密码,银行卡密码,只要保证密码正确就可以。
    非对称加密:通过公钥(public key)和私钥(private key)来加密、解密。公钥加密的内容可以使用私钥解密,私钥加密的内容可以使用公钥解密。一般使用公钥加密,私钥解密。
    假如从客户端A连接到服务端B上,将包括主机验证和用户身份验证两个过程,以RSA非对称加密算法为例。
    主机验证:首先将进行主机验证过程,即判断主机B是否是否曾经连接过。
    用户身份验证:假设使用公钥认证机制,客户端A需要将自己生成的公钥(~/.ssh/id_rsa.pub)发送到服务端B的~/.ssh/authorized_keys文件中。当进行认证时,客户端将告诉服务端要使用哪个密钥对,并告诉服务端它已经访问过密钥对的私钥部分~/.ssh/id_rsa(不能直接提供给服务端匹配检测,因为私钥不能泄露。另外,自己在访问私钥的时候会匹配同目录下的公钥文件,只有能匹配上才表示私钥是完整无误的,客户端需要同时具有私钥和公钥文件),然后服务端将检测密钥对的公钥部分,判断该客户端是否允许通过认证。
    具体可以看hp/chrome收藏。

    回过来,所以本人根据教程尝试了一下通过ssh方式下载代码。
    遇到问题就要解决问题,这对于一名程序员来说太正常不过了,这一次我也遇到了问题:
    image.png
    有问题就百度,这是一件值得高兴的事,不管是否会找到你想要的答案,最起码你知道是有希望的,而当输入关键字以后发现一整个列表大多是红色鲜有蓝色字出现时,那就更别提有多高兴了,你甚至觉得,你似乎已经找到答案了。
    。。。。(此处省略一个小时的困惑与迷茫)
    那什么后来啊,后来我去问公司大牛,也是我的直系学长,给我上了一堂生动有趣的计算机网络课。

    我搜索的关键字都放在了后面两行,也就是fatal以后的两行内容,其实对于很多出现这种情况的用户,根据这两行内容搜索出来的内容是很有帮助的,很可惜,我不是其中之一,那么我的问题出在哪里?
    ssh:connect to host git.bigvisiontech.com port 22:Connection refused

    欧开,废话结束,就从这里开始吧。我在学后端的时候,对于8080、3306这些数字是很熟悉了,他分别是tomcat端口号和mysql默认端口号,没错这些数字就是端口,而上面代码中的22,也是端口,我们在访问其他计算机或者说服务端的时候,我们就是通过IP地址加端口号的方式访问的,并希望从对方那里返回想要的数据。
    事实上,整个流程并不是那么简单,我们打开百度,输入ip关键字:
    image.png
    你会发现在百度上显示自己机器的ip地址与通过通命令提示符ipconfig查找的本机ip地址并不相同
    why?
    路由在这个时候就登场了,在与外网进行数据交互的时候,一台或者几台计算机是以共同连接的那一台路由器进行数据交互的,而百度上显示的这个ip地址,就是外网(运营商)随机分配给路由器的ip地址,路由器通过光纤连接到电信、移动或者联通,数据经这三大运营商后传递到目标服务器所对应的路由上,这样才形成了通路。

    但是有通路就可以了吗,那要路由干嘛的呢,直接通不就好了。

    在一些情况下,比如我们在路由器设置中对路由器端口号与计算机某端口号进行了配对,或者两个在此次通信之前该ip对应的端口号与路由有过数据传输记录,那么路由会默认在此次通信时提供端口之间的配对信息,当路由的某一端口号与计算机的端口号形成映射关系,所以当数据传输到目标端的路由器时,路由器会根据这种映射关系将数据传输到对应的计算机(服务器)端口。可当路由没有这种端口之间的映射关系时,数据到达路由后,路由无法选择将数据传到哪一个端口上去,换句话说,数据就请求或者访问不到了。

    所以,回到刚才的问题,在公司内部的台式电脑在一个内网中,用于创建gitlab远程库的服务器需要通过外网访问,这台服务器只是一台没有操作界面的主机,是不会主动传数据给路由的,那么我们就需要通过路由设置某个端口与服务器22端口进行配对,所以,为什么最终会出现Connection refused这个问题,准确来说,大概率就是gitlab服务器22端口与路由器并没有设置端口对应,所以路由器就阻挡了我这台计算机访问服务器端的请求,还有一种可能就是访问路由的22端口已经被内网的另外一台计算机占用了,此时我的计算机是无法再访问这个端口的,所以才出错,那么那台计算机在映射存在的情况下是可以实现成功访问的。

    那么此时有心的读者可能就会问了,为什么要把gitlab服务器放在外网上,直接放在内网不就好了嘛?好主意!一般人都想不到,但是我也想到啦。那么如果放在内网,意味着由于没有了路由器的屏蔽作用,所有内网的电脑都可以随便访问服务器,那么万一某些别有居心的员工图谋不轨,公司的代码就很危险了。另外就是因为gitlab还需要被阿里云上使用,需要固定的ip地址,但是固定ip的网络很贵,说到钱,那这就不是我们讨论的事了。

    最后,问题的原因找了,那么就可以解决问题了。把那台连接22端口的计算机扔了?不太好,让负责人单独给你开一个端口对应?不现实,那怎么办?好办,不用ssh就好了,用http下载,一样可以关联,同步更新代码。

    ps.
    1、什么是内网和外网?
    内网连通外网(内网一般会选择一台计算机作为服务器),现在的路由器如果不用wlan口那么其作用就是交换机,一般公司内网由红线部分组成,可同时访问外网,也有像图中组成结构,安全性更好,4号机此时会有两个内网中的交换机分别给它分配ip地址。
    image.png
    服务器不管是局域网还是广域网存在的作用都是为了给用户提供安全流畅的不间断服务,而这些服务是多种多样的,比如我们最常用的http,就是我们看到的网页,还有文件服务,邮件服务,数据库服务等等

    2、什么叫做内网穿透

    3、ip地址的改变与分配
    对通过网络服务商提供的宽带等服务上网的一般家庭用户来说,IP可以不严谨的分为外网IP和内网(局域网)、本机IP。本机IP就是127.0.0.1。外网IP是因特网IP,其IP地址具有全球唯一性。但是全世界的IP地址数量是有限资源,日益增加的上网用户人数使得有限的IP地址资源紧张。为此,网络服务商采用了动态分配的办法,在用户上网的时侯分配一个ip,当不上网时,之前用的ip又很可能分配给别的上网用户。这样大大提高了IP的利用效率。而内网IP相当于电脑在局域网里面的地址标识,其分配机制其实与外网IP的分配相似,在不引起IP地址冲突的情况下,可以设置成固定IP。内网IP地址是由路由器设备分配给每一部电脑内部使用的IP地址,路由器端口ip(可设置)即连接该端口内网的网关,内网中所有计算机的ip地址都必须为路由器网关所处于的网段中的任意ip地址,如网关为192.168.1.254,则内网ip可以在1~253之间设置,而内网的所有IP地址都是通过同一个外网IP地址进行上网的。

    4、what about ping?
    a、Ping 127.0.0.1127.0.0.1是本地循环地址,如果本地址无法Ping通,则表明本地机TCP/IP协议不能正常工作。验证协议是否正常、网卡是否有问题。注意如果ping127.1.1.1,返回的还是127.0.0.1,实际上ping的只要是127打头的,后面不论什么,返回的都是127.0.0.1。
    b、Ping本机的IP地址,用IPConfig查看本机IP,然后Ping该IP,通则表明网络适配器(网卡或MODEM)工作正常,不通则是网络适配器出现故障。
    c、Ping同网段计算机的IP,Ping一台同网段计算机的IP,不通则表明网络线路出现故障;若网络中还包含有路由器,则应先Ping路由器在本网段端口的IP(即网关),不通则此段线路有问题,通则再PING路由器在目标计算机所在网段的端口IP,不通则是路由出现故障,通则再Ping目的机IP地址。验证是否主机存在,或两台主机间网络通畅
    d、Ping网址,若要检测一个带DNS服务的网络是否出问题,在上一步Ping通了目标计算机的IP地址后,仍无法连接到该机,则可PING该机的网络名。ping域名,验证是否可以连接外网,也就是是否可以上网

    5、关于DNS
    DNS是互联网的一项服务,它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。简单的讲DNS就是翻译官,就像把baidu.com翻译成220.181.111.188让机器理解。

    6、localhost
    localhost = 127.0.0.1,在网址上通过localhost访问网页是通过http协议访问的,需要开启页面端口号,如果有子目录,则通过\继续访问
    如果直接访问本地文件,那么是通过file协议进行访问,例:
    file:\\E:\website\phpstudy\phpStudy_64\phpstudy_pro\WWW\index.html

    7、代理与反向代理
    正向代理或包过滤方式用于拒绝其他外部访问方式并提供内部网络对外部网络的访问能力。
    当一个代理服务器能够代理外部网络上的主机,访问内部网络时,这种代理服务的方式称为反向代理服务。此时代理服务器对外就表现为一个Web服务器,外部网络就可以简单把它当作一个标准的Web服务器而不需要特定的配置。不同之处在于,这个服务器没有保存任何网页的真实数据,所有的静态网页或者CGI程序,都保存在内部的Web服务器上。因此对反向代理服务器的攻击并不会使得网页信息遭到破坏,这样就增强了Web服务器的安全性。
    image.png