程序员一定被问过这个问题:
我在浏览器输入一个网址,后面发生了什么?
有人要说了,这么老的问题也拿出来说:
就是HTTP协议呀,服务端也使用HTTP协议接收,我们就是这么做的,很简单。。。
上面的回答可能是很多工程师真实的工作体验,现在的技术领域分工高度发达,我们引入一个库就可以高效地开发应用了,完全不需要也没时间去了解底层发生了什么。
那么底层究竟发生了什么呢?事实上这个老问题真的不算简单,可延伸的幅度非常宽广,我们按照下面几个问题慢慢展开:
问题1: 生成HTTP报文后,怎么发出去的?
问题2: 网络为啥要分层呢?我直接发不就行了吗?
问题3: 怎么找到我要访问的服务器呢?
问题4: 我的数据丢了怎么办?
问题5:不是还有个Socket吗?我们用的是Socket长连接,它是第几层啊?
问题6: 我们用的是HTTPS,它和HTTP一样属于应用层吗?
HTTP(Hyper Text Transport Protocol)全称是超文本(扩展的文本)传输协议,HTTP协议诞生的目的就是传输HTML文本,后面逐渐迭代出HTTP/1.0、HTTP/1.1、HTTP/2 和 HTTP/3这些版本,迭代带来的是更好的性能和更加丰富的能力。
TIP: 协议(Ptotocol): 在计算机领域,理解为双方都要遵守的约定。
本文会高频地提到“协议”这个词(如HTTP、TCP、UDP等),为了解决不同场景的问题,计算机领域的前辈们制定了大量的协议,这些协议的凝结着解决问题的智慧。
先看一下HTTP协议的报文格式:
HTTP协议的报文格式
如果你有幸参与过HTTP服务的初期搭建,可能做过一些平时不需要关注的工作: 比如HTTP的版本选择、Header的生成和解析等,后面的同事运气足够好的话,常常会不知道这些东西的存在。
现在你应该知道了,一次HTTP请求,就是以上面的报文格式发出请求和收到响应的过程。
好的,文章结束了,告辞!
对这个解释有位同学非常不满意,甚至有点想骂人(能讲点我不知道的吗),然后抛出一个问题:
问题1: 生成HTTP报文后,怎么发出去的?
如果问老程序员,他会说发给了下层,下面还有好几层。。。
网络的分层模型
与很多大型项目解决方案类似,网络的基本处理框架也是分层。每一层负责自己的事情,处理完成后丢给上层(接收场景)或下层(发送场景)。越下层能力越通用。我们以实际使用的TCP/IP模型为例,如下图。
TCP/IP网络模型
如上图所示,TCP/IP的模型分为5层,从下到上依次是: 物理层、MAC层、IP层、传输层、应用层。我们用到的HTTP协议就属于应用层。
很多人会把IP层叫网络层,把MAC层叫数据链路层,网络层和数据链路层的说法来自OSI模型(有7层),当然没必要太较真,了解就好。
基本模型了解后,我们就知道了,生成HTTP报文后,会发送到下面的传输层,然后一层一层地向下传输。那么一次HTTP请求的过程大概就是。。。这样:
好的,文章结束了,告辞!