• HTTP协议(一):概述


    背景介绍

    但凡世界上牛逼的人物,都会有一个非常离奇的经历。比如说乞丐出身的皇帝朱元璋,出生时家中红光大作,映红了半边天;再比如说无良皇帝刘邦,简直不要太牛逼,说自己是老妈和一条白龙交合生出的自己,而老爹是目击证人(笑哭)。
    而我,作为网络世界的扛把子,自然也不能在经历上矮人一头。
    我,就是大名鼎鼎的HTTP,我的老爹是CERN(欧洲核子研究组织)的蒂姆 • 伯纳斯 - 李(Tim BernersLee)博士,而我被制造出来的直接原因就是为了方便世界各地的学者交流信息
    话说在我诞生的时候,天空中电闪雷鸣,狂风大作……,我一出生,就是身高百尺,手摘星辰。
    不过你要是想知道我到底有多厉害,那我就得介绍一下我们这个世界的背景以及实力等级的划分了。
    我所在的世界,叫做网络星球。我的家族,是这个世界上数一数二的家族:TCP/IP协议族。以后你就会了解到TCP/IP协议族到底是多么无敌的存在。
    我的家族是上古修炼家族,传承源远流长。共有四大分部:应用层,传输层,网络层,数据链路层,而我,就是应用层中最年轻的长老,也是我的家族中数一数二的存在。又要回到我的背景介绍上了,在这个世界,修炼者的等级分为100级,而我在出生的时候,就是45级,可以说是前无古人,后无来者,不行,让我先飘一会。
    几十年过去了,我也已经80级了,我越来越成熟,也越来越强大,现在啊已经成为了这个世界上的中流砥柱。
    为了吸引更多的优秀人才来到我的家族,我想向大家详细的介绍一下我家族的情况。

    四大分部,各司其职

    像我们这么大的一个家族,想要保证整个家族的正常运转,就需要让每个人各司其职,高速流通。为了让人才的能力得到最大程度的发挥,当年家族最具前瞻性的族老,将家族分成了四个部分,就是上面说的:应用层,传输层,网络层,数据链路层。
    我们的世界,一直和人类的世界有着频繁的交流。不但如此,为了历练我们家族中的成员,总会接受人类世界的发布的任务,赚取我们世界上的货币—–流量来维系家族成长。所以,这些发布任务的人类,被我们称作用户。
    下面我就来介绍一下各司其职的四大分部,在家族中的作用。

    应用层:
    也就是我所在的分部,这个部门决定了向用户提供服务的通讯活动,每一种服务对应的通讯活动,都由一个家族成员来承担。比如说承担文件传输服务的专门人才,也是我的小弟:FTP。再比如说能对域名进行解析的(将域名[www.roobtyan.com]换为[202.206.xxx.xx])DNS,也就是我的二叔。而我,也就是网络世界的扛把子,我的任务是将用户的请求和服务器的各种响应打包,传递给下一层的专门人员。
    简单的说,我们这个部门举足轻重,每一种用户想要的执行的操作,比如上面的传输文件,域名解析等,就会有一专门的人负责这个功能。当然,域名解析并不需要用户亲历亲为,浏览器小兄弟会自动完成这个任务。

    传输层:
    传输层是和我们关系最近的一层,这一层的作用是用来在两台机器之间进行数据传输的。事情是这样的,因为用户网络状况等的一些原因,是无法保证传输的可靠性,也就是说,传输的数据可能会在传输的过程中出现错误。导致数据到达另一台机器的时候不是用户想要的内容。这时,就会发现,我家族中的这个部门是举足轻重的。
    传输层的一大功能就是提供了可靠的数据传输,这也是使得我的家族在网络世界上的地位越来越高的另外一个原因。
    在这一层,最具有代表性的人物是TCP和UDP这俩货,他们俩其实是一对双胞胎,和我是死党。虽然他们俩看起来差不多,提供的功能又都是可靠的数据传输。但是这俩货的思路可不是那么的一样,以后如果有机会,我会好好的给大家介绍一下这对兄弟的。不过,在后面的说明中,我还是会简单介绍一下这个TCP的。
    总的来讲,为了实现可靠的数据传输,TCP和UDP都会将我(HTTP)封装的请求数据和响应数据切割后打包,再进行传输。他们的打包方式简单粗暴,他们将数据切割成一小段一小段的,然后再加上自己的内容,也就是给这些小段的数据加上标号,到达另一台计算机的时候,再用这个标号的顺序把我的数据重新给原回去。看得我是一阵心疼,好不容易打包好的数据,万一让他们给弄丢了,我岂不是还得重新打包?可惜目前他们这两个传输专家也没有什么好的办法。

    网络层:
    在我的世界中,网络线路四通八达,主机的数量也是非常多,看的我胆战心惊。我总在想,网络层究竟是如何将这些数据准确的送到目的机器的呢?
    直到有一次我问了问IP小兄弟,我才弄明白,原来,IP小兄弟的任务就是将数据准确的送到目的主机。(这里的是IP协议,而非ip地址)
    IP小兄弟会给每一个数据包划分一个传输线路,开始发送后,一边寻找下一个规划线路中的节点,一边向节点转发,最终到达目的地。

    数据链路层:
    数据链路层的一帮家伙都是硬梆梆的,他们都是实体的。也就是人类说的网络相关硬件,什么网线啊,什么交换机了,什么服务器主机等等,反正是处理网络的硬件部分都属于数据链路层。
    不过,我不太喜欢和这帮家伙打交道,脾气又臭又硬。

    好了,讲到这里,我最后补充一下整个网络传输过程:
    我(HTTP)的作用是将用户请求数据和服务器相应数据封装,加上自己的头信息,也就是做个标记。我将数据封装完后,交给传输层中的我的死党TCP或者UDP,他们两个会将我的数据切割,然后加上标志,开始传输。传输的过程交给的是网络层,IP小兄弟会规划传输路线,一边寻找节点一边向节点转发,最后到达目的地,再由链路层中的硬件接收;硬件接收后,再由TCP或者UDP还原数据包,最后再交给我,去掉我的头信息,还原回真正的请求数据。同样的,当请求被服务器识别之后,会将响应数据交给我HTTP,以同样的路径返回客户端。注意,发送时,每次经过一个层次,就会封装一次数据,而接收数据的时候恰恰相反,是一层层的去封装。

    代表人物简介

    下面,让我来用比较简洁的语言介绍一下这几个代表人物(TCP,IP,DNS),(不会太过于深入,毕竟这只是入门的文章,以后的文章会写的更加深入)

    TCP:看看是不是法对了

    前面说过,我的死党TCP这个家伙,会将我封装的大块数据分割成一个个小的数据段,这个小的数据段还被这货起了名字:报文段,每个报文段会有一个唯一标识,而最终在接收的时候,TCP也是通过这个唯一标识来判断是否有数据丢失,如果有数据丢失,这货会重新发送一遍的(客户端或者服务端),这让我们很不爽,因为貌似效率低了些(实际上还不错),但是也没有办法。
    我的死党TCP有一独门绝技,名曰TCP的三次握手。

    • 第一次握手(发送端–>接收端):发送端的TCP发送带有SYN标志的数据包。
    • 第二次握手(接收端–>发送端):如果握手成功(收到第一次握手时候的数据),接收端发送带有SYN/ACK的标志数据包表示已经收到,就是确认信息。
    • 第三次握手(发送端—>接收端):发送端发送带有ACK的数据包,表示握手结束,确认数据已经成功到达,完成握手。
    • 如果其中有某次握手意外结束,则会重新发送丢失的数据包。

    其实上面TCP的绝技三次握手的作用,就是确定报文段是否成功被接收端接收了。这就是TCP的独门秘诀。

    IP:看看数据包应该去哪

    (刚才我在备注中已经说明,这个IP指的是网络层的IP协议,并非是IP地址,这一点要注意。)IP小兄弟的任务就是给报文段规划一个正确的路线,然后一边中转一边发送。
    对了,IP小兄弟高速我,他的能力完全是因为MAC地址,他向我解释说,每一台硬件的MAC地址是唯一的,在这个世界上找不到两个相同的MAC地址,所以,它能够准确的找到中转的位置。
    他还说了一个有意思的事情,就是在传输的过程中,上一台主机只知道下一台主机在哪,而不知到其他的路线中的主机在哪,这就是传说中的“没有人能够全面掌握互联网中的传输状况”的由来。

    DNS:别装了,我知道你是谁

    当你看见一个网站的时候,你不借助工具,你是不知道这个网站的ip的。比如说我的博客(http://roobtyan.con),光看这个网址,你肯定不知道ip地址。但是,计算机的能力是处理数字,它是不会识别文字的,即便可以识别,那也是因为有字码表的存在。
    为了方便各个层次的功能开展,我们应用层的大家庭中,就有了这个DNS,他的作用是将域名解析成ip地址。
    只要资源在互联网上,都能被DNS解析到,所以,DNS经常说的一句话就是:“别装了,我知道你是谁。”。
    对了,DNS服务在你向浏览器中输入域名,然后回车后就启动了,这时返回给浏览器的就是IP地址。

    嗯,说了这么多,好像完全忽视了我的存在,其实我也很不爽,没办法,无良作者非要介绍完整个的大背景。好吧,若你想知道我为何能成为TCP/IP协议族的扛把子,那么就请看下一期的“我是传奇之HTTP”了!
    欢迎关注我的专栏呦!

    结语

    感谢您的阅读,欢迎指正博客中存在的问题,也可以跟我联系,一起进步,一起交流!

    微信公众号:进击的程序狗
    邮箱:roobtyan@outlook.com
    个人博客:http://roobtyan.cn
    也非常欢迎你关注我的微信公众号,谢谢支持!
    这里写图片描述

  • 相关阅读:
    C#面向对象编程
    WPF Storyboard的启动
    WPF中的窗体Show()和ShowDialog()区别。
    四元数
    小学生四则运算
    小学生四则运算
    javascript ===与==的区别
    a标签的href与onclick中使用js的区别
    10步让你成为更优秀的程序员
    检查SQL Server被哪个进程占用,且杀进程。
  • 原文地址:https://www.cnblogs.com/roobtyan/p/9576695.html
Copyright © 2020-2023  润新知