你了解你的HTTP请求有多辛苦吗???

HTTP请求与响应

前言:

作为一名合格的前端,每天会应对无数的网络请求。
所以,了解这些网络底层是怎么从源发送过来的,接收源的又是如何处理的,对你的工作中的调试是有质的提升的。

刚好最近希望系统的学习下,就选择了工作中较常见的HTTP请求与响应。

有错误的可以通过下面二维码的联系方式联系我,欢迎指点错误。

背景:

互联网上相关联的协议,集合起来可以有个叫法叫“TCP/IP协议族”。

我们只要了解其中的HTTP协议,就够用了。
那这个协议族里有个比较重要的点,就是分层。
从上往下分呢,分别是应用层,传输层,网络层和网络数据链路层。
等等阅读时可以参考”TCP/IP参考模型”图来理解。


TCP/IP参考模型:

TCP/IP结构模型


目录:

  • 应用层
  • 传输层
  • 网络层
  • 链路层

HTTP请求:

1. 应用层:

该层里包含很多常见的协议,如ftp协议,smtp协议,还有本篇主角HTTP协议。

当一个HTTP请求被发出时,通常是由发送方(客户端)发起,那么此时是到达了”TCP/IP参考模型”中的应用层的。
其中起作用的是HTTP协议,该协议生成了针对目标(也就是接收方服务器)的HTTP请求报文(包含了请求行,请求头部,有时还带有请求体,具体见下一篇详细的解释),并发往下一层。
注意,这时候的报文还是完整的。

小结: 应用层是用来生成报文的。

2. 传输层:

当HTTP请求穿过应用层后,就是到达了传输层了。该层内主要作用是传输报文,只不过这里的报文被做了些手脚。

其中,为了传输方便,TCP协议将一串串完整的请求报文,按序号分割成多个报文段,并在各个报文上打上标记序号以及端口号,形成IP数据包,最后再将一个个被切割后的报文片段传输给网络层。
注意,这时候是片段了。

小结: 传输层是用来切割报文的。

3. 网络层(IP层):

这里的网络,并不是我们平时理解的网络信号的网络,这里指的是一种结构模型层。
首先,先来了解下IP和MAC区别

好,当到达网络层后,这时候才是整个“TCP/IP参考模型”结构体系的关键,因为它决定了发往哪里去,按什么顺序发

其底层使用的就是因特网协议,也就是IP协议(如果你想联网)。
它将客户端和服务器端这两端通过路由作为桥梁,IP协议作为通信工具,连接起来进行通信。

其中,路由的作用就是:为接收到的处理好的请求报文(也就是数据包)找到相对应的目的主机(接收方)。点我去看路由找地址的原理

还有,路由主要使用的协议即为IP协议。所以,网络层也有别的叫法,就是IP层。

那在与目标服务器连接之前呢,还会干这样的事…
会发生握手事件,TCP协议著名的三次握手,就在该层发生的。点我去看TCP三次握手的简单过程。

小结:网络层可以看成是个指路牌,即根据报文在路由表里寻找目标服务器的地址。

4. 链路层:

该层可以说是和设备最近的一个层级,也就是物理层(OSI模型)最接近的一层了。
那么就是说,离服务器接口最近了。

但是呢,该层是不干活的,为什么呢?你有见过领导还写业务代码吗?

当然,也不是啥都没干。
链路层作用中的其中作用之一就是在检测你这些处理完过来的报文数据到底有没错误。也就是测试。
测试什么呢?
具体我也不知道怎么检测,但我给出自己的猜测,希望有懂的大牛能告知我一声,感谢。
我认为的是链路层要做的事是,就是确定是否存在该物理地址,以及确定目的地址是否存在等问题。
balabala…
当确认无误后呢,就交给服务器处理了。
服务器对得到的报文进行解析处理,然后返回带有响应数据的响应,于是,响应就开始了。
小结: 链路层是用来检测、确认报文数据,然后就是作为接口,对接服务器或硬件的。


HTTP响应:

具体过程就相当于刚刚来的路,重走一次,只不过这次是倒着走了。

链路层 –> 网络层 –> 传输层 –> 应用层 —> 客户端,通常是浏览器,就这样,一次请求和响应就完成了。


疑惑点:

IP和MAC区别

  • 首先,要先解释下其中两个难点区分,就是IP地址和MAC地址。
  • IP地址是Internet协议地址,是逻辑地址,也就是抽象的,是每个Internet包给的,动态的,可以不同的。
  • 而MAC地址却是物理地址,也就是实际存在的,由设备的网卡提供的,而且一般不能改变的,也就是固定的了。
  • 通俗地讲,IP地址可以理解为你家门牌号,而MAC地址相当于你个人身份证。
  • 两者并没有必然关系。

看完了回去继续看网络层

*到这,你可能会有这样的疑问?**

既然有了IP地址能定位,那为什么还要MAC地址呢?

这里借助知乎一个回答:

由于IP地址是在第三层—网络层中被定义的,具有第三层的意义;
而MAC地址在第二层中定义,具备第二层的意义。
所以,在同一网段内,即局域网内,只需要使用MAC地址就能够定位你是哪台主机了;
但是,一旦跨了网段(即互联网环境),此时单独靠MAC地址来定位,不仅吃力,还有可能找不到,因为有可能会有一样的MAC地址出现。所以需要IP地址来寻址。
那IP地址是做什么呢?IP地址主要是用于网络定位,用于互联网,由于MAC地址受硬件限制,因此IP地址用于互联网的定位更有先天优势。

那为什么路由就能知道,接收到的报文要发往哪里呢?

原来,该报文里就包含了目标主机的IP地址。
而IP地址含有两个部分,一个是网络地址,一个是主机地址。
而且,通过对方的IP地址,不仅可以判断出对方是否和本机在一个网络内,还能获取对方主机地址。

那么,路由的处理机制分两种情况

  • 第一,针对不需要跨网段的,也就是在局域网内:
    这时候交给”交换机”处理。

这,就体现了mac地址的作用了,因为mac地址是物理地址,硬件地址,由网卡提供的,一般无法改变。

而网络层中路由借助“ARP协议”,会将目标主机(目标服务器)的IP地址,解析成目标主机对应的MAC地址与arp表对应,然后,告诉交换机,然后交换机会根据自己的转发表中的mac地址和mac地址对应的端口号一一对应,然后进行转发。

如果在转发表内找到了对应端口号,那么恭喜,你的快递是顺丰的,交换机直接一步到位发送到目标主机;如果找不到,呵呵,你估计贪便宜,找了韵达了…它就每个端口都转发一次,总会中一次的,很粗暴的方法,自然效率偏低了。

  • 第二,针对需要跨网段,也就是进入因特网了:
    这时候交给网关处理。

这时候就需要使用请求报文中的IP地址,来寻找目标主机的IP位置,接着告诉网关IP地址,网关进行匹配相应的路由,然后在路由表中寻找对应的IP地址,然后根据IP地址中的网络地址,判断是跨网还是内网,再决定要往哪个网络跳转。

看完了回去继续看网络层-路由

TCP协议-三次握手

首先,先一笔带过这三次,握的是什么手。是猪手还是咸猪手?

  • 第一次:客户端发出SYN连接请求,告诉服务器,我要来了;
  • 第二次:服务器收到SYN,然后向客户端发出既有SYN,也有ACK的连接请求;
  • 第三次:客户端收到了服务器发来的带2个属性的请求,最后发出一个确认报文ACK的请求告诉服务器。
你可能会有疑问:为什么是3次握手?

其实第2次应该就可以开始连接了吧。关于这点,要从谁是发起方说起。
由于现在发起方是客户端,所以从客户端说起。

想象下这样一个情景:
客户端发送了请求,如果想知道有没发送成功,得靠响应吧。
所以服务器返回了一个响应,告诉客户端,服务器已经收到你的请求了。
但站在服务器的角度来看,服务器本身并不知道客户端有没收到自己发送给它的响应啊。
于是,客户端,最后再次发送一段报文给服务端,告诉他:”我已经收到你的请求了,我准备好了,我们可以开始连接了,你也准备好吧。“

所以才有第三次握手的需要。

至于这3次握手里,究竟具体是怎么实现的,我也会弄明白的,所以以后会上的。

看完了回去继续看网络层


总结:

一次完整的HTTP请求,从发送到接收,是需要经历: 应用层–>传输层–>网络层–>链路层,甚至到了物理层的。


下一篇,我会对一次HTTP请求中的报文进行详细解释,也就是说如果你想知道HTTP请求中带了哪些东西,可以看看我下一篇文章。


个人能力有限,有错误的麻烦扫描下面二维码联系我(回复公众号我就能收到),进行勘误,共同进步。

个人公众号二维码

Author: JawQ_
Link: http://wujiaqiang.com/2017/09/05/http/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.
支付宝-打赏
微信-打赏