被问到http的时候你就这么回答!

473 阅读12分钟

大家好,我是标题党,啊不,我是小雨小雨,致力于分享有趣的、实用的技术文章。 内容分为翻译和原创,如果有问题,欢迎随时评论或私信,希望和大家一起进步。 分享不易,希望能够得到大家的支持和关注。

什么是互联网

互联网是指 凡是 能彼此通信的设备组成的网络就叫互联网,指利用TCP/IP通讯协定所创建的各种网络,是国际上最大的互联网,也称“国际互联网”。

其中TCP/IP是网络的基础通信架构,提供了点对点链接的机制。并且将软件通信过程抽象化为四个抽象层,下层服务上层,也就是我们熟悉的七层OSI模型。(也就是说TPC/IP是联网的基础,由他衍生出了OSI)

OSI模型是一个视图使各种计算机在世界范围能互连接为网络的标准框架,也就是说是网络互接的标准。(大白话就是规则。按照这个规则,我们就能联网)

用一张图表示OSI模型:

如果讨论TCP/IP的时候,我们又可以分为四层,如下图:

看看就好,我们要关注的是应用层的http和传输层的tcp,对了,两个模型的对应关系如下:

由于TCP、UDP位于传输层,HTTP位于应用层,按照下层服务于上层的机制,我们从TCP、UDP开始说起。

UDP是什么

UDP位于OSI模型的传输层,是一种无连接的协议,该标准定义的内容很专一,就是数据无脑发数据,不管天崩地裂,海枯石烂,发就完了。为啥这个莽夫是不可靠的呢?

  • 无连接:就比如小雨去上班,不管他周内还是周末,上就完了,自然而然就会有一些问题发生
  • 恒速:这个莽夫没有拥塞控制系统,也就是不会变通,一根筋按照一个频率进行发收运动,就算对方受不了了,UDP也不会改变它的频率。
  • 简单:这货头部开销小,只有八字节,比tcp要少三倍左右,所以就很快。

不过,正由于UDP的快,也有一些场景是非他莫属的,比如DNS啊、音视频啊、实时游戏啊、聊天工具啊巴拉巴拉...

可能有人会问,DNS这种使用UDP会不会有问题啊,比如UDP丢包了,那岂不是返回404了啊。

没错,但是浏览器响应时间大致分为以下三个:

DNS解析 + TCP链接 + HTTP请求/响应

除了DNS能用UDP,其他二位也没法用啊,不然网站丢内容了啊。而且还有备选方案,某种情况下失败了会利用TCP重新查询的,不只是有UDP一种。

可能还有人会问,那聊天工具这种用UDP这问题大了啊,我要是跟我女神表白,这莽夫只管发,结果各种丢包(发送失败),而且我还不知道,那我心态崩了啊。我以为她知道,结果她不知道,然后她还不回我,你让我咋想...

只能说,为啥不能给女神留下神秘感,让她来主动找你呢,哈哈哈

其实通讯工具一般会发送两次,UDP发送一个消息后,如果服务器收到了,会用UDP在返你一个消息,如果没返回,或者发送失败,你就会收到发送失败类似的消息啦,去表白吧,没事的,消息肯定发的出去,答不答应就看自己了。

总的来说,在某些对速度要求极高,但是准确性要求低的情况,UDP是很适合的。

TCP是什么

UDP莽夫不靠谱,TCP小伙来弥补。

关于TCP,我觉得可以用拟人化来代表,众所周知TCP是全双工的吗,其实就是两个独立的人在进行微信聊天。光一个人发是不行的,另一个人也得发,不然聊个j。

那TCP怎么就靠谱了呢?

没错,小伙看日历了!!!而且更厉害的是,他休假的时候也会看日历!!!

其实就是TCP在发送数据的前后,会进行连接创建和连接终止的操作。保证事务完整性。这就是我们经常被问到的问题:三次握手和四次挥手。

三次握手创建连接

提前声明,关于每个标志的格式和内容是什么,这里不做讨论,有兴趣的自行研究。这些定义用到的时候再查就好。

在此之前,要先解释几个名词(又是名词,大白话不好吗 doge~)

  • SYN: 表示建立连接,如果我给你的消息里有这个标志,说明我想和你负距离接触,当然这是双向的,你也可以给我发。
  • FIN: 表示关闭连接,同上,不过表示我好了,请你离开
  • SEQ: 表示初始包序号,随时间变化。就是说我希望你从从这数字开始计数,其实就是确保双方都是本人,不能随便带个序号来都能进行工作,那就乱了
  • ACK: 表示响应,就是说我成功得到了你给我的内容
  • PSH: 表示有DATA数据传输
  • RST: 表示连接重置。

好,进入正题,先看张图吧

看完图可能就豁然开朗了吧。不过,其实我还少说了一部分,这些内容的值是什么呢? 咱们看个建立链接的真实例子(访问百度的抓包)吧!

可以清楚地看到,经过三次tcp握手后,通道建立成功,然后发送了http请求,也侧向验证了传输层服务应用层。

还可以看到每次发送tcp的时候,seq ack这类值都会发生变化,这个是关键,上面说了他们的定义,但是没说为啥要用这些。

这是因为我们要确认连接双方的确定性,进而建立可靠连接。

客户端发送请求连接百度,然后发送带有SYN标志的tcp到服务端,告诉服务端,我想和你连接。

服务端如果没收到,那就算了,如果收到了,就会返回表示接收到了的ACK信号,并发送服务端的SYN与客户端建立连接,这是双向的、可靠地。

如果服务端发送过客户端没收到呢?服务端会定时重新发送,知道成功或超过最大限制未知。简化版心跳机制吧。

客户端收到了服务端发的SYN和ACK,会再次发送代表接收到了的ACK信号,告诉服务端,我ok了

上图中后两次ACK的值为1就代表是响应成功1次。

其实更通俗的来讲,就是下一次的tcp通信要能证明上一次的tcp通信是成功的。 就比如说ack,我第一次请求连接的时候,初始ack肯定为0,然后你发给我的为1,就证明了我第一次请求是成功的,反之亦然,可以自己思考一下,有问题欢迎交流。

到这里可能有人会问,为啥一定是三次呢?因为下一次的tcp通信要能证明上一次的tcp通信是成功的啊。不然你试试两次,看看能不能证明。这是的三次是最小次数,保证效率,三次通信以上理论上都是可以的,但是没必要。

四次挥手断开连接

四次挥手其实和上面差不多,不过SYN变成了FIN,用来'触发'断开连接操作。操作其实是一样的。

那为啥不能和创建连接一样,三次不就好了嘛,还效率。

举个可能不算恰当的例子:创建连接是往一个空的容器里加东西,加就完了,反正刚开始是空的。而断开连接在不加东西之后,还需要将容器里的东西清理掉,有始有终。

一图以蔽之:

还不明白,私聊我,我怼怼你!!!

好了,传输层任务完成,应用层启动~

HTTP和HTTPS

能说的很多,但是感觉又没啥好说的,随便说说吧就。

首先我们知道https就是http,不过加了一层安全控制: SSL/TLS。

怎么就安全了捏?

我们知道http是明文传输的,也无法校验内容的完整性。并且由于是无状态链接,所以也不知道这东西是谁发的,会不会被人改过。

那https的s到底做了啥?

加密!

对称加密

就是我们门禁,对,就宾馆的那种。我们可以将要发送的内容保护起来,放到宾馆里,然后通过门禁(密钥)来访问内容。看起来很安全哈。但是如果这个门禁被人偷偷拿走复制了一份,那我们的内容就可以被其他人随意访问了。这是不靠谱的,我们没隐私了,赤裸裸~

非对称加密

我们换个方案吧,我们让宾馆提供两张门禁卡,一个公开的,所有人都可以知道,一个是私有的,只有负责人才知道,然后宾馆的房间改为两道门,外面的门可以用公开的门禁打开(公钥加密),里面的门可以用私钥打开(私钥解密),并且里面的门有一个通道,可以让有公钥的人将内容放到房间内。由于里面的门只能用私钥打开,所以只有负责人能够查看这个内容。

这就是非对称加密,使用两个密钥,一个是公开的 - 公钥,一个是私密的 - 密钥。然后我们把公钥散播出去就可以了。

但是非对称加密的速度比对称加密要慢很多,这也不是我们想要的。并且单纯的非对称加密,只能保证用公钥加密私密信息只能被拥有私钥的负责人查看。

ps: 笔者还有个问题想不明白,如果公钥随意分发,那有图谋不轨的人随意进行通信,虽然没问题,可以通过服务端进行控制。但是这样感觉怪怪的~

怎么能让它快起来呢?

对称加密和非对称加密混这用,对称加密用于内容,非对称加密用于对称加密密钥的传输。

这样我们就只用到了一次非对称加密,然后就可以用对称加密进行内容的解析。大大提升的速度。

但是这其中有个很严重的问题。如果在服务器发送对称加密密钥的时候,被某个坏人截取到了,这样不但获取到了服务器的公钥,还可以给浏览器发送他的公钥,相当于中间人的角色。浏览器和服务器在不知情的情况下进行危险的通信活动。

怎么证明公钥的正确性

这就要利用非对称加密的另一个功能,数字证书。因为私钥是唯一,所以我们可以用私钥进行加密(签名),这样只有正确的公钥才能开锁。保证了内容是安全的。

并且需要浏览器内置一些安全的公钥,用于解析这个证书,这就是证书中心(CA)的作用了。证书中心是一个绝对有保障的组织,他们会和操作系统、浏览器厂商协定,将证书中心(CA)的公钥提前种好。

上面是前提,接下来,服务器会提前找证书中心为公钥做认证,然后返回服务器数字证书。证书的内容是通过证书中心私钥加密过得服务器相关信息和服务器公钥,这样就保证了公钥无法被篡改,保障了安全。

之后浏览器在请求的时候,就会获取到正确的公钥。之后服务器返回内容的时候也会进行一步处理,保障内容不会被篡改。

浏览器会返回两部分,一部分是明文的hash算法结果。一部分是用服务器私钥加密过得明文的hash算法结果,然后浏览器在获取后,会通过hash和服务器公钥进行解密,得到的两部分如果相等,那么这次传输的内容就没问题。可以愉快地进行通信啦~

看明白了是不是会问为啥要进行hash在加密啊,直接加密不就好了吗?答案很简单啊,因为效率。

优化

  • tcp三次握手可以利用'会话缓存'来节省一次握手时间,其实就是缓存,和咱们平常写代码没差,就是写法不一样。我们平常用到的很多技术很多也是一些基本的技术,举一反三就好。
  • 和上面差不多。tcp第二次握手的时候就可以发数据了,可以在这上面做手脚
  • 尽量减少rsa算法,实在是慢,这个想办法缓存或者算法优化吧,我也不太懂~
  • 证书优化,怎么便宜怎么来呗,薅!!!不过也得看企业/个人怎么取舍了
  • 等~ 不做深入了

总结

本文内容是理解后经过处理展示出来的,不理解的也不会乱写,如果仍有问题欢迎指出,我会及时回复的。

了解这几点,对于http基础会有一个整体的理解,不管是工作中还是求职中都能说出个一二三来,或许还应该写一点常见问题,但是微乎其微,等用到了自然而然就知道了。

马上清明节了吧,祝大家清明节快乐!!哈哈哈哈~

部分图片来源自网络,侵删

面试答案(滑稽~

面试答案(老稽~

wireshark血泪史

含义

如何使用wireshark

TCP&UDP

DNS为什么用UDP

介俩活宝啊(一)

介俩活宝啊(二)

峰宝