标签信息
  获得0次关注
  发布20篇文章

王老迪 2018-09-05 16:38:26

        王二之前有捋过网络基础相关的,但上一次只看到了现在网络基础结构的最底层,数据链路层,而且目前已经全忘完了。。。(只能依稀记得硬件上的能达成网络的原理)

        其实这也不全怪王二,王二还买了本http详细解读的书,看了几次简直折磨,厚厚一本还生硬,这还只是一本http协议,一想还有那么多协议,真的是cpu疼,跟中学时背政治差不多了,估计能把每个协议能全整明白的人只有上古程序员了。


        想到这,王二就有了一个疑问,为什么协议不能统一成为一个协议呢?

        几经知乎。。。。答案是

        就算统一,技术含量不会降低,还是需要做更多的扩展,解决不同的问题,一个协议你都难完完全全的搞定,如果一个强耦合的协议诞生,那么带来的学习量更巨大,维护起来更麻烦,而现在,就只需要每一层分工合作即可,可以根据不同的需求,掌握不同的协议。

        所以,该啃的还得继续啃。(前人总结肯定是有教训的5555)


        王二认为,要学习一个东西,起码的先要知道为啥得学。(强制抵制面试需要)

        王二需要学的想法很简单,面试需要(实力打脸。)

        当然不全是,在很多工作当中,无论哪端,我们都要跟网络打交道,当然服务端偏多,读取数据,接收数据,将数据传送给另一端。在这中间需要针对不同的是场景采取不同的措施,比如跟游戏端对接,普通的短连接肯定不行,需要使用WebSocket长链接来处理。


        那什么是WebSocket呢?WebSocket和tcp是什么关系呢?好吧,我们进入今天的正题。(这里我从历史的角度来展开,不然还是背政治了- -。)


-----------------我是华丽的分割线1----------------


        早在20世纪50年代,苏美冷战,冷战高峰期。美国希望能够在即使是核战争的状况下,也能控制网络,因为电话网是脆弱的。

        直到1957年,苏联的发射了人类第一颗人造卫星Sputnik,美国焦急。便成立ARPANET研究组织(国防部研究院),并在1967年转移到网络上,成为因特网前身,但在当时,ARPANET并不适合多个网络运行。

        于是,我们的主角就萌芽发展啦,研究协议的工作便迅速展开,最终在1983年1月1日,TCP/IP取代旧的网路控制协议(NCP)被大家广泛接受。

        (这里要科普下,TCP/IP不是仅仅指tcp协议和ip协议,这里指的是相关协议的总称,你也可以称之为TCP/IP协议族)


        【

                傻迪:为啥要建立协议呢?

                王二:恩?没协议,多方连接,你怎么能确定你的数据发送到什么地方,你怎么能确定你发数据对还是不对。


                傻迪:为啥TCP/IP被大家接受了?

                王二:(维基半小时。。),原因有二。

                    1:NCP自己不给力。 

                         a:并不能给每台电脑都设置唯一的地址

                         b:缺乏纠错功能,出错就可能瘫痪,效率就低

                    2:TCP/IP海纳百川

                         TCP/IP保持着对众多的底层协议的支持,每层几乎超过一般,例如:以太网(Ethernet)、令牌环(Token Ring)、光纤数据分布接口(FDDI)、点对点协议(PPP)


                傻迪:那为啥没出现类似于TCP/IP,或者更好的协议族?

                王二: 这....  TCP/IP协议族相当于是个容器,换一个容器跟换个名字似乎没什么区别。

          】


-----------------我是华丽的分割线2----------------


        我们知道TCP/IP协议族的诞生,以及为什么会诞生,那么这个协议族究竟是怎样去完成这份工作的呢?

        前面有说过,整个网络的通信,是分层级的,按照OSI(国际标准化组织)模型,一开始将其分为7个层级,也可以简单的描述为4个层级,它们从上而下是应用层,传输层,网际层,网络接口层。(为了简洁,更详细的我就不复述了)

        我们的主角TCP/IP,起始于网际层协议IP(网际协议,也可称为因特网协议),因为网络数据传送方式的不同,操作也有差别(比如下载等),因此协议也比较多。当然他们也分类,有‘必须’,‘推荐’,‘可选’,其中必须的就有IP以及ICMP,有这两个,一个路由器就可以运作,当然,仅仅他两,能解决的问题不多,还需要更多的‘推荐’的协议。

        (每个协议的诞生都需要去通过标准化的组织,确定协议标准化的是RFC,它会给每个符合标准的协议一个编号)

        这里给张表单,纪念一哈

image.png

       


        作为一个伪前端程序员,王二重点科普一下-》http,https,DNS,SSH,FTP 以及 TCP 和 IP(这里只介绍一下,具体报文结构,怎么处理,很难简单的一篇博文描绘出来,也记不住,后续我会继续学习的)


-----------------我是华丽的分割线3----------------


 IP协议(难度指数:★★★★) 


    历史原因:

        我们说过,联网很简单,物理设备搭起来就行;一对一可以(前面的NCP),一对多,多对多就瞬间傻叉,IP协议就是为了解决这个问题而诞生的。

        IP协议会给每个连上国际互联网的机器分配一个IP地址,这样在浩大的互联网中就不会找不到对应的机器(当然,这其中还有很多细节的流程)。

        第一个能完美解决的方案是 IPV4(互联网通讯协议4),也就是第四个修订版本,也是部署的最广泛的一个版本,但IPV4有个很明显的问题,地址不够,它使用的是32位(4字节)地址,所以只有4,294,967,296(232)个地址,随着终端用户的增加,在2011年2月3日用尽。取而代之则是IPV6,当然会在IPV4的基础上做一些优化,好的程序员不就是会这样吗,hhhhh。

        其实IPV6在1998年就已经通过标准化组织出台,但是IPV6也没有带来革命性的变化,导致一些制造商,运营商们无法直观的感受到,推动的动力也就不大。

    特性:

        无状态:双方发送的IP数据报是相互独立的,没有任何上下文关系(可能会乱序,或者重复,但简单高效)

        无连接:通信双方都不长久维持任何信息(所以上层必须指明ip地址)

        不可靠的服务:不能确保一定能送到,但尽最大努力传递,失败也不会重传



TCP协议 (难度指数:★★★★★)


    历史原因:

        看了IP也知道,IP是不靠谱的,这么坑,你甚至想骂爹;但事实就是这样,在网络的过程中,会出现各式各样的问题,信息丢失在协议层面,物理层面都会出现。

        而TCP协议的特性就是为了确保协议能够准确的到达目标服务器,所以就有了著名的‘三次握手’。

    简洁点的操作:

        TCP保证传输前需要先建立链接,并为该链接分配好必要的内存资源,完成数据交换后需要断开并释放资源。

    三个重要的特性:

        1.可靠的、面向连接的和基于流的服务

        2.使用了超时重传、数据确认等方式来确保数据包被正确地发送到目的端

        3.基于流的数据没有边界限制,它源源不断地从通信的一段流入另一端,发送端可以逐个字节地向数据流中写入数据,接收端也可以逐个字节地读出。


        字里行间,都表明TCP是个严谨的好孩子。在实际应用中,这样‘死板’的好孩子在某些场合可能不适应,就是那些需要实时的场景,他们通常允许一些丢包,出错或者拥塞,比如游戏,实时多媒体等。

        还要提一下,端口也是TCP的重要标识。

        (到这里,是不是也会想到socket,一步步来)

        【

                小舟舟:在吗,有条祖传的染色体想发给你,

                小强强:发吧(嫌弃模样),

                小舟舟:(づ ̄3 ̄)づ╭❤~(1S不到),给你了

        】


/* 

    上面这两层讲到了网际层和传输层,后面那些都是应用层的协议了,比较多 

    有了网际层和传输层协议的支持,应用层基本就不用关心链接的问题了,会更多的偏向实际中需要面对的问题。

 */


FTP协议和SSH协议(难度指数:★★★)


    专用端口号[20,21]

    历史原因:

        我们需要操纵远程电脑,或者远程服务器的主机,FTP应运而生,甚至FTP比我们主角TCP/IP诞生的还早,早在1971年,就在NCP上运行,单对单也需要它不是。后来一直也在慢慢的兼容TCP/IP,直至IPV6。

        把这两个协议放到一起的原因是,他两都可以是文件操作协议,而且王二会经常看到这样一张图片

image.png


    【傻迪:有啥区别呢?】

      上面我们说了,它们的共同点都是可以操作文件,可以操作就会暴露一个问题,安全问题,FTPS和SFTP就是为了安全而衍生的。

       区别就是,FTP不加密,SFTP和FTPS加密且加密机制不一样。

       这里面有个特殊的FTPS,分为显式和隐式,显式是兼顾兼容的作法。隐式则必需在客户端与服务器端都打开设置。


        这里王二要间接吐槽一下FTP协议。也是FTP协议的一些缺点,它给我们带来的便利当然毋庸置疑。

        1.不知道你有木有发现上传文件的时候,明明一看服务器运行正常,上传传不上去?超时什么的?

          答:这是因为当你开了端口号的时候,防火墙存在时,客户端很难过滤处于主动模式下的FTP流量,所以防火墙呀防火墙,防火墙也要吐槽一下,在linux环境还有不同的写法。(只是简单的吐槽哈,当然现在知道原因 - -!)

        2. 在有很多小文件的情况下(十万百万),FTP的软件不会超时,也不会报错,而是直接死翘翘。。。

          答:这是因为FTP对处理小文件的性能确实不好,别的也差不多。。当超过100W时,我建议大家使用rsync(数据镜像备份工具,具体参数自行google哈)



http协议和https协议(难度指数:★★★)


    专用端口号[http:80,https:443]

    历史原因:

        与FTP相仿,HTTP协议的诞生主要是为了解决HTML的发布和接收(也就是我们的网页啦),这一切都得归功与蒂姆·伯纳斯-李,前面博文也提到过他,是他一个人创举。而且这位老爷子还在世,今天才63岁,历史离我们那么远(因为你不愿意接收),又离我们那么近哈。

        关于网页可以扒出不少好玩的故事,不过,没有小龙虾,打死我也不会说的。。。

        HTTP发展到现在一共经历了4个版本,分别是0.9、1.0、1.1、2.0,目前最新的标准即是2015年5月正式发布2.0。


        HTTP主要的部分就是请求和响应

            请求:请求又分为请求方法和请求内容,请求内容就就是请求头,请求行这些,请求方法到目前HTTP一共提供了8种方法,分别是:

            GET(向指定的资源发出“显示”请求。只用在读取数据)

            HEAD(向指定的资源发出“显示”请求。服务器将不传回资源的本文部分。不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”)、

            PUT(向指定资源位置上传其最新内容。)、

            POST(向指定资源提交数据,请求服务器进行处理)、

            DELETE(请求服务器删除Request-URI所标识的资源。)、

            TRACE(回显服务器收到的请求,主要用于测试或诊断)、

            OPTIONS(向服务器传回该资源所支持的所有HTTP请求方法。)、

            CONNECT(HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器)

            (HTTP服务器至少应该实现GET和HEAD方法)

            响应:简单的理解就是HTTP服务收到请求和给你返回的内容,与请求不同的是,他有个状态码和其他的一些特殊的状态信息。


        HTTPS:看到这个,很容易就联想到了FTPS,哈哈。别说,它两性质还真的相同,都是为协议的安全而服务,后面的那个S你可以理解为SSL,一种的安全套接层。目前逐渐演变成TLS(运输层安全性协议)。

        到这里,一个网站主观感受到的协议基本上差不多了,来张图体现一下

image.png


-----------------我是华丽的分割线4----------------


        貌似我们还遗忘了最初的那个问题,Socket,那到底Socket是个什么东西呢?其实我上面已经提到了,SSL协议,其实中间这个S就是Socket,既然SSL是安全套接层,那么,Socket其实也就是一个套接字,也就是专门用于连接网络的编程接口。


        这么讲还是比较难以理解哈,还是追溯历史。

        最早的套接字接口来源于4.2BSD,也就是Berkeley套接字接口,它的作用是主要用于实现进程间通讯。


        【傻迪:什么是进程呢?】

         进程就是一个程序的运行实体。这么说吧,小时候都看过数码宝贝。。。我们都知道数码宝贝的本质就是数据,他可以有不同的动作(指令),也可以是各种模样(组织形式),这个时候,它们就相当于是一个程序;而进程就是这个程序运行过程中的实例。


        【傻迪:进程有什么重要特征呢?】

         单单是数据,就有很多细节,比如存储,输入,输出,调用,寻址,权限,联调等等,这些都是。但是简洁的讲,我们需要记住的是它的状态,不同的操作系统也有各种不同的状态,先了解一些常见的,例如:新生(程序在新产出中)、运行(正在运行)、等待(亦称‘阻塞’)、就绪(排班中,等待CPU)、结束(完成运行)。

        那我们就知道套接字的作用了哈,就是让两个数码宝贝可以进行交流(搞不好还能合体!~)


        【傻迪:那WebSocket是什么鬼?】

         看字面意思,WebSocket,简称WS。简称一下,你是不是又会想到SSL这货。。。对的,与SSL相似,WebSocket就是一个协议,是一种在单个TCP连接上进行全双工通讯的协议。

          webSocket的特点就是浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。(有点热加载的味道,其实在web中,我们访问一个网站,即使不是websocket,访问同一个页面的时候,在后面的几次也不会一直进行三次握手,有很多资源是301不是 ^_^)


        写到这也差不多算科普完毕了,接下来就要编代码了(痛苦)。