从一道面试题简单了解下TCP/IP四层模型的作用

相信面试过的应该有不少人都遇到过这样的一个面试题:

简述从浏览器输入一个URL(jeujin.im)的全过程
复制代码

这是一个很常见的题,随手一搜就能得到大量的答案。这些答案基本都大同小异。

  1. 域名解析,将域名解析为ip,可能会经过浏览器缓存-os缓存-hosts文件-dns服务器
  2. 获取ip后浏览器发起http请求
  3. 浏览器和服务器经过三次握手后建立tcp连接,发送数据
  4. 服务器接收数据后经过处理返回响应
  5. 浏览器收到响应结果刷新页面数据

大多的答案都是这样,只不过可能对每一点都介绍的详细些。

但这个问题看似简单,但是实际上这中间包含的知识点特别的多,如果面试官希望了解TCP相关可能会让你接着介绍tcp的三次握手四次挥手,如果面试关想了解网络相关可能会让你介绍http请求发送的具体流程,甚至如果他想要了解服务端的处理流程可能会让你介绍相关web框架的处理方法(SpringMVC的处理流程)。

本片文章就通过该问题来介绍下TCP的四层模型的作用。

基本信息

我本机的配置如下:

ipv4地址:192.168.0.100
子网掩码:255.255.255.0
网关地址:192.168.0.1
DNS地址:8.8.8.8
复制代码

阅读本文默认读者已知上述概念的作用。

访问流程

域名解析

首先当在浏览器中输入需要访问的网址按下回车键后,首先开始的就是对域名进行解析,取到相应的IP地址。这个过程其实也很麻烦,大概就是从各种缓存中查,如果没有就查hosts文件,继续就走DNS服务器。

以访问掘金(juejin.im)为例,这一步我们可以取到对应的IP(139.198.2.223)

网段地址判断

我们都很清楚,在计算机网络中,只有同在一个局域网的机器才能够直连。如果不再同一个子网中,两台机器通信就需要网关(路由器)的介入才行。

所以在取到IP后第一步就需要判断目标ip和当前请求主机是否处于同一子网中,判断需要由子网掩码参与。

判断的方式就是将两个IP(目标IP和本机IP)分别同子网掩码做逻辑与操作得到所处的网络段,判断是否处于统一网段即可。

与运算是将ip的每一段换算成二进制然后运算
本机IP:
  192.168.0.100
  255.255.255.0
  --------------
  192.168.0.0
 
掘金:
  139.198.2.223
  255.255.255.0
  --------------
  139.198.2.0
复制代码

明显不是同一子网,需要网关转发数据。

我们的机器是无法和广域网的其他机器通信,但是路由器是可以的,所以我们的请求需要由网关来进行转发。

应用层

现在我们已经知道需要向网关发送请求了,让网关转发给目标地址,但是我们给网关发送的数据是什么呢?

很明显,浏览器发送的是http请求,发送给网关的就是http的请求数据。

http请求报文是由请求头和请求体组成的。

http报文

不过此时并不是http数据报文的全部数据,有的只是请求体数据部分。这一部分是网络模型中的应用层做的事情,封装http请求的数据。这一层参与者主要是http协议。

image

传输层

经过应用层,已经有了http头和正文部分,接下来请求到了传输层,这一层会有tcp协议的参与。

这一层的主要任务就是加上请求端口,包括发送方端口和接收方端口。发送方端口是随机选取一个空闲端口,而接收方一般是默认的80端口,也可以在请求中指定某一端口。端口是用来告诉请求处理方是哪一个应用程序来处理当前请求数据。

在这一层中,会在应用层数据的基础上添加一个tcp头,tcp头中包含了端口信息。

image

网络层

经过传输层后,此时已经有了请求数据包和请求端口。接下来请求到了网络层,网络层主要由IP协议参与。

网络层的作用就是将ip地址加入当请求数据包中,封装成一个IP数据包。IP头中包括请求主机的IP地址和目标主机的IP地址。

image

数据链路层

此时数据到了数据链路层,此时的数据包已经包括了请求ip,请求端口和数据等。

在数据链路层主要就是将请求方和目标方的MAC地址封装进数据包中。这一层由以太网协议参与。

以太网协议规定每一台接入网络的设备都必须有一张网卡(也可以有多张网卡),数据包的传输必须是从一个网卡传输到另一张网卡。而每一张网卡都有一个唯一的标识,被成为mac地址。以太网发送的数据包中必须得有发送者的mac地址和接受者的mac地址才行。

image

数据传输

现在我们需要的数据都已经准备好了,可以开始数据传输了。

这时传输并不是精确将数据投递到目标机器,传输是以广播的形式,将数据包广播给子网内的所有机器,然后接收的设备取出数据包中接收端mac地址来喝自身的mac对比,如果不一致就讲数据丢弃。如果mac地址对比一致的话才能继续处理。

如果目标机器和发送主机在一个子网的话通过这个步骤是可以将数据发送到目标地址的。但是如果两者不再一个子网中,就需要网关的参与了,这时候目标地址的mac地址其实是网关的mac地址。

而且在请求的时候可能会通过多个网关才能将数据发送到目标地址上。

请求响应

上述流程说的是请求的过程,而对于目标服务器的请求处理的流程就是上面的一个逆过程,请求是将数据进行封装,而请求处理则是对得到的数包的拆包过程,每一层获取需要的东西。

image

小结

本篇文章只是对浏览器请求中网络模型的作用的一个很简单的介绍,读完本文可以有一个简单的印象,但是实际上每一层的处理都是很麻烦的,每一层所涉及的协议也是需要重点学习的。

猜你喜欢

转载自juejin.im/post/5ec1ddb85188256d877dc70e