HTTP发展史

​前言

本篇讲述的是一个快递员送包裹的故事,同时在发送包裹的过程中遇到的一系列的问题,通过讲述快递员如何快递员解决的这些问题的方法来引出相关的网络协议,并将方法与网络协议进行对比。

内容主要包含四个部分,第一部分主要通过讲快递员steven ji在发送包裹的时候出现的包裹丢失、道路不通等问题来引出tcp模块的SYN、ACK和三次握手等相关概念,第二部分通过steven sao的所提供的地址别名服务来说明dns服务的基本原理,第三部分通过steven ji的业务从包裹扩展到送信来引入http的概念,第四部分从steven ji为了解决信的内容被剽窃而使用了信封加密和证书来说明从http到https的必要性。

 

目录

  1. 开始送包裹(tcp) 

  2. 地址的别名(dns)

  3. 开始送信(http)

  4. 防止信件被剽窃(https) 

 

内容

接下来通过一个形象的比拟故事来简述发展史:

 

一、快递生意的发展史

人物介绍

姓名:        steven ji

特点:

  • 拥有自己的快递站点

  • 喜欢开着自己的奔驰送快递

起步

开始送快递(最简单的数据发送方式)

快递小哥开了一个快递站点,专门接收别人送过来的快递,然后将快递从当前站点发往下一个节点 。

上面内容对应的tcp模块的相关内容:

上面的nginx就是要送快递的人,网卡就是快递小哥,他将自己要送出去的数据交给网卡,网卡发给下一个路由器, 直到快递(数据)到达目的地。 

 

生意出了问题(一)

包裹丢了(传输的基本流程)

生意起步还算可以,但是总是有人来投诉,他们的包裹对方没有收到,但是steven ji对此毫不知情,所以他想到了,如果对方收到了以后告诉一下,同时他在开始送的时候计算一个超时时间,如果时间超过了还没有收到通知,他就去找送包裹的人,重新装一份,再送出去。 

上面内容对应的tcp模块的相关内容:

         上面的两个站点就是两个pc上要通信的应用程序,而包裹是他们想 要发送的数据块,这块数据一共20字节大,数据先从左边发到右边, 开始序号为1,发送了20字节,右边pc上的应用程序收到数据时,返 回ack为21表示前面的20字节已经收到了,我想要第21字节的数据。 

 

生意出了问题(二)

道路不通,对面站点是否开门, 交通工具承载量不熟悉 (三次握手)

快递小哥经常收到各种快递,马上要送出去的时候,结果有人通知他,这里的道路是不通的,信现在还没有办法送出去,而且经常有他送出去了,其实包裹已经收到了,但是迟迟收不到对方的回信,结果他多余送了几分快递。为了解决这样的问题,快递小哥想到了先提前探探路,先问一下 去对面的路通不通,对方是否愿意接收他的包裹,对面回答他可以的同时再问他去他那里的路通不通,他回答可以。同时,steven ji在看路的途中就对沿路运输包裹的交通工具的承载量进行研究,以评判下一次发包裹的时候每次发多少。

上面内容对应的tcp模块的相关内容:

左边pc的应用程序先发送一个带有SYN标志的数据包表示要和他连接,对方收到他的请求之后,回答他一个同时带有着ACK和 SYN标志的包,表示我同意了你的请求,那么你是否同意和我连接 ,左边的PC返回给他一个标志着ACK并且长度为0的数据包,表示可以连接。图中的MSS就是左边的最大报文长度,也就是左边告诉右边每次 传递的最大报文长度为1024字节,超过了要进行分批传输。 

 

不晓得何时结束 

一直在等待对方发包裹 (四次挥手)

虽然steven ji给对方发了包裹,对方也给了响应的回复,但是双方都不知道该何时结束,而且快递的发送是全双工的,也就是左边可能给右边发,右边也可能给左边发,所以steven ji经过深思熟虑之后想到,自己这边先说要结束了,然后右边确认一下,这是右边还可以给左边发,直到右边说我要关闭连接,左边确认,此次交易结束。 

上面内容对应的tcp模块的相关内容:

如上图所示,左边的pc给右边的pc发一个有FIN标志的包,表示我要关闭连接了,右边给左边回复确认关闭包,右边给左边发一个 FIN标志的包,左边给右边发一个确认包,双方都关闭连接。 

 

事业疯狂上涨 

从一来一回到多来一回(滑动窗口)

因为应用了科学的方法,steven ji的生意做的如火如荼,但是有的时候有些大包裹,他要分几次送,他一个人送不过来,于是他找来了他的兄弟们,steven sao和steven yang一起帮他送快递,这样解决了快递送不过来的问题,但是因为他们送的太快,对面处理的太慢,经常导致对面处理不过来,这时steven sao突然想到,能不能让他们每次回答我们的时候,顺便告诉我们他们还能接受多少包裹。 

上面内容对应的tcp模块的相关内容:

如上图所示,win就表示当前程序可以接受的数据字节数,在建立连接的时候,左边告诉右边,我的win是4096,右边回复左边,我的win也是4096,然后当左边连续传递三个1024字节大的数据包时 ,右边程序先处理了2048个字节,并回复ACK为2049(这里的ACK 和发送的报文关系已经变成了多对一),然后他接受了第三个报文, 但没有处理,回复对方ack为3073,win大小为3072,这就是有名的 tcp滑动窗口。 

 

送的太多也不好 

送的太多导致堵车了(拥塞控制算法)

steven ji的生意蒸蒸日上,每天他都会收到大量的包裹,然后他和他的两兄弟就一顿猛送,结果经常导致包裹堵在路口了,迟迟送不过去,steven sao听闻这个情况之后,跟steven ji说,那我们就先送一个,然后对方要是收到对方的确认之后,我们把就把这个数+1,这样第一次是1,第二次是2,第三次是4,直到发现道路开始堵起来起来的时候,我们再每次只送一个 ,再设置一个阈值为堵起来时候的那个数的1/2(暂称为n),当小于这个n的时候还是+1,当大于这个数的时候,我们就设置(当前送的包裹数+1/n)为每次可以送的包裹数。 

上面内容对应的tcp模块的相关内容:

上面的cwmd就是每次可以发送的包的数目,刚开始的时候是1, 然后收到一个ack的时候变成2,然后左边就发送两个数据包, 一直这样累加,这个就是tcp的慢启动算法,然后cwmd累加到一个阈值的时候,开始拥塞避免算法(有兴趣的同学可以自己研究一波)。

 

协议 

到底哪一个是TCP协议 

百度上对协议这个次的解释:双方必须遵循的一组约定。

其实tcp协议就是上面所说的,要如何建立连接,如何关闭连接,如何发送数据和回复,如何确认对方能接受的数据大小。 

上图为TCP的包的格式,每一行有32位,第一行的1到16位为本机的端口号,17到32位为目标机器的端口号,第二行为发送包的序号,第三行为ACK的序号,像这样也是协议的一部分,他约定了每一个包的每个字节的作用。 

 

 

二、别名服务 

人物介绍

姓名:       steven sao

特点:

  1. 大头里面全都是sao操作

  2. 人如其名、名副其实

大头里面全都是sao操作

地址转换服务

steven ji发现总有那么几个人是经常寄包裹的,而且他们的要寄的地方总是那么几个,但是他们每次要写一大串地址,于是他们跟steven ji说,他们可以给他们经常寄的这个地址一个别名,比如说Tom's 家,steven ji再转换一次,steven ji听了之后十分的不爽,但是觉得对方说的很有道理,就答应了。于是他掏出了自己祖传的小本本,把对应地址和地址别名记下来,每次看到信的地址就去小本本里面看一下对应关系。  

上图是windows系统文件的hosts文件,他就相当于steven ji的 的小本本,用来记录ip地址和域名的别名,浏览器在每次访问 之前会查看一下这个文件,看看对应关系。 

 

额外服务变成隐患 

别名太多,steven sao发力(dns) 

别名系统出来很受欢迎,大家都争相恐后的使用,结果小本本记录了很多内容,多余很多的工作量。steven sao看到后,提议把这个服务单拎出来,自己专门记录这个,为便于查找,steven sao将地址以树形结构来划分,他安排了多个部门,每个部门负责一个市,这个部门的下级部门负责这个市下面的所有区。然后steven ji每次来问对应的地址的时候,先去steven sao那里问每个省级管理部门的负责人,然后他去找那个负责人再去问市级的部门负责人,直到找到那个具体地址为止。 

上图是就是一个域名的层次接口,本机要解析域名的话,会先查 看缓存,再去看一眼hosts文件,如果有就返回,否则会访问本机 的首选dns服务器接到要解析域名的任务的时候,就会去问根节点, 比如.com的dns服务的ip是多少,然后根节点返回他,然后他去问 .com的dns服务器.51youdian.com的的dns服务器地址是多少,就 这样以此类推,直到找到目标地址。 

 

地址别名一对多、别名的别名sao操作 

想给一个地址启用多个别名, 但地址修改后,相关的都要改(cname) 

很多人都很想用这个别名系统,所以stven sao对别名进行了统一,比如某个地址他成为Tom's 家,所有人都称为Tom's家,但是有的人就不想这样叫,他就给这些人另外创建了很多地址相同,别名不同的记录,结果某一天地址改了,他要去把相关的别名都重新改一遍,工作量还是很大的。steven sao就想,能不能给每一个别名再起一个别名,这样我只需要维护一个别名信息就好。 

这是我使用dig对www.baidu.com进行的一次查询,它先以一条A 记录的形式去查询www.baidu.com,结果回答它的是www.baidu.com 是www.a.shifen.com的一个别名,然后www.a.shifen.com有两条A 记录,分别对应两个ip。关于一个域名对应多个ip,在配置虚拟主机的时候我们经常使用, 我们经常把多个域名都指向本机的环回地址(127.0.0.1) 

 

三、开始送信

 

特殊的包裹:信件 

不想寄包裹,只想寄封信(http协议) 

steven ji发现很多人让他寄出去的包裹都很小很轻,经过询问之后,他发现这些人只是想寄信,然后将信放在包裹中寄出去,但是信的内容只有文字,过于死板,steven sao发现这个问题之后,就和steven ji和steven yang一起商量,能不能提供一个特殊服务,他们在写信的时候,对某一块写上:这里需要图片,这里需要换行等操作。我们请人帮他美化,然后收取一定的费用就好。他只需要在信的起始行写上需要我们这个服务的哪个版本,然后在信头部写上他的信的介绍,比如是哪个国家的语言等等,在最下面写上信的内容。 

其实,steven ji他们一帮人扮演的就是浏览器和http程序的角色,他 们对页面进行美化,发送http报文给服务端,上图就是一个http的请 求头和响应头,可以看到http的请求头和响应头都有一个起始行, 请求的起始行包括请求的方法、相对地址和协议的版本号,返回 报文包含了版本号和状态。请求头和返回头里面包含一些对请求体 formdata的描述、一些http选项和说明字段。 

 

特殊的包裹:信件2(HTTP报文格式) 

这一页没有故事 

其实HTTP协议就像steven ji他们刚才定义的那样,只不过HTTP的起始行和头部都是由ascii文本组成的,使用回车换行符(\r\n)来作为每一行的结束,头部和主题之间使用一个空行来分隔,主体可以有是二进制也可以是文本,也可以没有。 

 

送信过于频繁 

很多时间花在探路和观察交通上(引入长链接)

很多热恋中的情侣,他们书信交通过于疯狂,结果大量的时间都浪费在了探路(三次握手)和观察交通(慢启动)上,于是steven yang想到既然有的人沟通这么频繁的,那能不能只探路一次,那让对方等着,steven  sao问:那对方要等多久呢?steven ji说:我们可以跟包裹的重新发送机制一样,设置一个时间,超过了就不等了。steven sao说:那要是真的没啥可发了,还是一直白等,很累人的。steven yang说:我们我可以在信的头部加上一个选项叫次数,后面跟一个数字,他们每发一次信,我们就把次数-1,直到次数为0就告诉对面快递站,不发了。 

 

 

四、加密

人物介绍

姓名:      steven yang

特点:

  1. 不得志的数学家

  2. 经典二人转演员

信被剽窃 

信的内容被修改、偷看和冒充 (引入非对称加密方式)

信的虽然被安全送过去了,但是经常会被人偷看或者被人修改,更有甚者会把原来的信拿出来,直接自己写一封信扔进去,替换掉原来的信,受到大量投诉之后,steven ji一筹莫展,steven yang见状跟steven ji说:我们可以把信的内容加密。steven ji说:加密了还是要把密码传过去,等于什么都没做。steven yang说:你说那个是对称加密就是加密和解密的秘钥都是同一个。我们可以使用非对称加密,这种加密方式有两个秘钥,一个公钥,一个私钥,我们可以为每一个客户生成一对公钥和私钥,并且记录他们的公钥,在要传输的时候,使用他们的公钥加密信件内容,他们使用自己的私钥对信的内容进行解密并查阅。 

 

 

加密太过复杂 

加密太过复杂,人力成本过大(对称加密和非对称加密方式结合)

steven yang向steven ji推荐,我们可以把自己的公钥告诉所有人,如果我们要给那个站点送信,我们先把内容用我们的私钥加密,他们用我们的公钥解开就好,Steven ji说:那所有人都可以得到公钥,等于没加密,而且你这个加密方法太复杂了,每次我们要花大量的人力成本来加密和解密。steven sao听到后说:那为什么不把对称加密和非对称加密结合起来呢,我们可以先生成一个对称加密的秘钥,然后使用私钥加密之后传给对方,后面就使用这个对称加密的秘钥来加密就好。 

steven yang听了steven sao的话之后,问他:这样是对的,但是 这仍然挡不住有人从中间冒充。于是steven yang自己成立了一个 类似于公安局的组织,专门给这些站点办理他们的证书,这个证 书上有公司的详细信息,还有公司的公钥、这个证书的有效期等。站点要加密之前先要给出自己的证书,然后我们这边去steven yang 那里验证一下,证书和域名是否对的上号。 

 

证书的后续操作 

非对称加密的应用 

在验证过对面站点的证书之后,steven yang告诉steven ji,我们可以让对面传一个随机数,我再给他传一个随机数,依靠相同的算法,我们都会生成相同的数字,然后这组数据就是我们以后对称加密所使用的秘钥,我们以后可以再和他确定一个加密算法,每次给信的内容算一个hash值,这样即使有人改了内容,他的内容所得的hash值和我们是相同的,steven ji和steven sao都觉得steven yang说的对,但是最大的问题是,这个算法怎么确定呢,steven yang说我们可以跟tcp一样,在开始握手的时候就把非对称加密的算法、对称加密的算法和要计算hash值得算法都确定下来,那个随机数也可以同时给我们 :

上面是一个nginx的ssl配置,ssl_prefer_server_ciphers  如果不指定默认为off,当为on时,在使用SSLv3和TLS协议时, 服务器加密算法将优于客户端加密算法。 

 

总结

本文通过描述一个快递员送快递来引入tcp,通过描述送快递的过程中出现的问题来引入tcp的相关功能,通过送快递途中提出的一些快捷服务来引入http概念,通过描述信件被偷看或者被调换的情况来说明https的必要性。

 

参考文献:

《TCP/IP详解 卷1》

《Https的原理及流程》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值