探究!一个数据包在网络中的心路历程(浏览器键入url—网址后,发生了什么?)

01、孤单小弟–HTTP

①首先浏览器要做的就是解析URL,从而生成发送给Web服务器的请求信息。
②对URL解析之后,浏览器确定了Web服务器和文件名,接下来就是根据这些信息来生成HTTP消息了。

02、真实地址查询–DNS

①通过浏览器解析URL并生成HTTP消息后,需要委托操作系统将消息发送给Web服务器。但在发送之前,还有一项工作要完成,那就是 查询服务器域名对应的IP地址,因为委托操作系统发送消息时,必须提供通信对象的IP地址。

比如我们打电话的时候,必须要知道对方的电话号码,但由于电话号码难以记忆,所以通常我们会将对方电话号+姓名保存在通讯录里。

所以,有一种服务器就专门保存了Web服务器域名与IP的对应关系,它就是DNS服务器。

  • 域名的层级关系
    DNS中的域名都是用“句点”来分隔的,比如www.server.com这里的句点代表了不同层次之间的界限。
    在域名中,越靠右的位置表示其层级越高。一级又一级,为根域、顶级域服务器(com)、权威服务器(server.com)。根域的DNS服务器信息保存在互联网中所有的DNS服务器了。

因此客户端只要能够找到任意一台DNS服务器,就可以通过它找到根域DNS服务器,然后再一路顺腾摸瓜找到位于位于下层的某台目标DNS服务器。

03 指南好帮手–协议栈

通过DNS获取到 IP后,就可以把HTTP的传输工作交给操作系统中的协议栈
协议栈的内部分为几个部分,分别承担不同的工作。上下关系是有一定的规则的,上面的部分会向下面的部分委托工作,下面的部分收到委托的工作并执行。分为以下几部分。

  • 应用程序:网络应用程序(浏览器、Web服务器),socket 库
  • 操作系统(协议栈):TCP/UDP ,IP(ICMP、ARP)
  • 驱动程序:网卡驱动程序
  • 硬件:物理硬件网卡

应用程序(浏览器)通过调用Socket库,来委托协议栈工作。协议栈的上半部分有两块,分别是负责收发数据的TCP和UDP协议,他们俩会接受应用层的委托执行收发数据的操作。

协议栈的下面一半是用IP 协议控制网络包收发操作,在互联网上传数据时,数据块被切成了一块块的数据包,而将网络包发送给对方的操作就是IP 负责的。

此外,IP 中还包括 ICMP 和 ARP 协议。

  • ICMP 用于告知网络包传送过程中产生的错误以及控制各种控制信息
  • ARP 用于根据 IP 地址查询相应的以太网 MAC 地址

IP 下面的网卡驱动程序负责控制网卡硬件,而最下面的网卡则负责完成实际的收发操作,也就是对网线中的信号执行发送和接收操作。

04 可靠传输-- TCP

http时基于TCP协议传输的,所以在这我们先了解下TCP协议。

首先,源端口号和目标端口号是必不可少的,如果没有这两个端口号,数据就不知道发给哪个应用。
接下来有包的序号,这个是为了解决不丢包的问题。
还有应该有的是是确认号,目的是确认发出去对方是否有收到。如果没有收到就应该重新发送,直到送达,这个是为了解决不丢包的问题。
接下来还有一些状态位。例如 SYN是一个发起连接,ACK是回复,RST是重新连接,FIN是结束连接等。TCP是面向连接的,因而双方要维护连接的状态,这些带状态位的包的发送,会引起双方的状态变更。
还有一个重要的就是窗口大小。TCP要做到流量控制,通信双方各声明一个窗口(缓存大小),标识自己当前能够的处理能力,别发松的太快,撑死我,也别发的太慢,饿死我。
除了做流量控制之外,TCP还会做拥塞控制,对于真正的通路堵车不堵车,它也无能为力,唯一能做的就是控制自己,也即控制发送的速度。不能改变世界,就改变自己嘛。

  • TCP 传输数据之前,要先三次握手建立连接。
    三次握手的目的是保证双发都有发送和接收的能力。

  • 如何查看 TCP 的连接状态?
    在Linux 可以通过 netstart -napt 命令来查看

  • TCP 分割数据
    如果HTTP 请求消息比较长,超过了MSS 的长度,这时 TCP就需要把HTTP的数据拆解成一块块的数据发送,而不是一次性发送所有数据。数据会被以MSS 的长度为单位就行拆分,拆分出来的每一块数据都会被放进单独的网络包中。也就是在每个被拆分的数据加上TCP 头信息,然后交给IP模块来发送数据。

  • TCP 报文生成
    TCP 协议里面有两个端口,一个是浏览器监听的端口(通常是随机生成的),一个是Web服务器监听的端口(HTTP默认端口号是80,HTTPS默认端口号是443)。在双发建立了连接后,TCP报文中的数据部分就是存放HTTP 头部 + 数据,组装好TCP报文后,就需要交给下面的网络层处理。

05 远程定位 – IP

TCP 模块在执行连接、收发、断开等各阶操作时,都需要委托IP模块将数据封装成网络包发送给通信对象。
在 IP 协议里面需要有**源地址 IP ** 和 **目标地址 IP **:

  • 源地址IP:即使客户端输出的IP地址;
  • 目标地址:即通过DNS域名解析得到的Web服务器 IP

因为HTTP 时经过TCP 传输的,所以在 IP 包头的协议号,要填写 06(十六进制),表示协议为TCP。

  1. 假设客户端有多个网卡,就会有多个IP地址,那IP头部的源地址应该选择哪个 IP呢?
    当存在多个网卡时,在填写源地址 IP 时,就需要判断到底应该填写哪个地址。这个判断相当于在多块网卡中判断应该使用哪一块网卡来发送包。这个时候就需要根据路由表规则,来判断哪一个网卡作为源地址IP。在linux 操作系统中,我们可以使用 route -n 命令查看当前系统的路由表。
  2. IP 报文生成
    此时,加上了IP 头部的数据包表示:“有 IP 大佬给我指路了,感谢IP层给我加上了IP 包头,让我有了远程定位的能力!不会害怕在浩瀚的互联网迷茫了!可是目的地好远啊 ,我下一战应该去哪呢?”

06 两点传输 – MAC

  1. 生成了 IP 头部之后,接下来网络包还需要在IP 头部的前面加上MAC 头部。在MAC包头里需要 发送方MAC地址接收方目标 MAC地址,一般在TCP/IP通信里,MAC包头的协议类型只使用:IP协议或者ARP协议。
  2. MAC发送方和接收方如何确认?
    发送方的MAC地址获取就比较简单了,MAC地址是在网卡生成时写入到ROM里的,只要将这个值读取出来写入到MAC头部就可以了。
    接收方的MAC地址就有点复杂了,只要告诉以太网对方的MAC的地址,以太网就会帮我们把包发送过去,那么很显然这里应该填写对方的MAC地址。
    所以先得搞清楚应该把包发送给谁,这个只要查一下路由表就知道了。在路由表中找到匹配的条目,然后把包发给Gateway中的 IP 地址就可以了。
  3. 既然知道要发给谁,那如何获取对方的MAC地址呢?
    不知道对方MAC地址?不知道就喊呗。此时就需要ARP协议帮我们找到路由器的MAC地址。ARP协议会在以太网中以广播的形式,对以太网所有的设备喊出:“这个IP地址是谁的?请把你的MAC地址告诉我”。然后就有人回答:“这个IP地址是我的,我的MAC地址时XXXX”。
    如果对方和自己处于同一个子网中,那么通过上面的操作就可以得到对方的MAC地址。然后,我们将这个MAC地址写入MAC头部,MAC头部就完成了。
  4. 好像每次都要广播获取,这不是很麻烦吗?
    放心,在后续操作系统会把本次查询结果放到一块叫做ARP缓存的内存空间留着以后用,不过缓存的时间就几分钟。
    也就是说,在发包时:先查询ARP缓存,如果其中已经保存了对方的MAC 地址,就不需要发送ARP查询,直接使用ARP缓存中的地址;而当ARP缓存中不存在对方MAC地址时,则发送ARP广播查询。
  5. 查看ARP缓存内容
    在Linux系统中,我们可以使用arp -a命令来查看ARP缓存的内容。
  6. 至此,MAC报文生成。
    此时,加上了MAC头部的数据包万分感谢,说道:”感谢MAC大佬,我知道我下一步要去哪了!我现在有很多头部兄弟,相信我可以到达最终的目的地!“,带着众多头部兄弟的数据包,终于准备要出门了。

07 出口 – 网卡

  1. IP生成的网络包只是存放在内存中的一串二进制数字信息,没有办法直接发送给对方,因此,我们需要将数字信息转换成电信号,才能在网线上传输,也就是说,这才是真正的数据发送过程。负责执行这一过程的时网卡,要控制网卡还需要网网卡驱动程序。网卡驱动从IP模块抓取到包之后,会将其复制到网卡内的缓存区中,接着会在其开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列
  2. 最后网卡会将包转为电信号,通过网线发送出去。

08 送别者 --交换机

下面来看一下包是如何通过交换机的。交换机的设计是将网络包原样转发到目的地。 交换机工作在MAC层,也称为二层网络设备

  1. 交换机的包接收操作。
    首先电信号到达网线接口,交换机里的模块进行接收,接下来交换机里的模块将电信号转换为数字信号。然后通过包末尾的FCS校验错误,如果没问题则放到缓冲区。这部分操作基本和计算机色网卡相同,但交换机的工作方式和网卡不同。
    计算机的网卡本身具有MAC地址,并通过核对收到的包的接收方MAC地址判断是不是发给自己的,如果不是发给自己的则丢弃;相对地,交换机的端口不核对接收方MAC地址,而是直接接收所有的包并存放到缓冲区。因此,和网卡不同,交换机的端口不具有MAC地址
    将包存入缓冲区后,接下来需要查询一下这个包的接收方MAC地址是否已经在MAC地址表中有记录了。
  2. 交换机的MAC地址表主要包含两个信息:一个是设备的MAC地址,另一个是该设备连接在交换机的哪个端口上。
  3. 当MAC地址找不到指定的MAC地址会怎么样?
    地址表中找不到指定的MAC地址。这可能是因为具有该地址的设备还没有向交换机发送过包,或者这个设备一段时间没有工作导致地址从地址表中删除了。
    这种情况下,交换机无法判断应该把包转发到哪个端口,只能将包转发到除了源端口之外的所有端口上,无论该设备连接在哪个端口上都能收到这个包。
    这样做不会产生什么问题,因为以太网的设计本来就是将包发送到整个网络的,然后只有相应的接收者才接收到包,而其他设备则会忽略这个包。

09出境大门 – 路由器

  1. 网络包经过交换机之后,现在到达了路由器,并在此被转发到下一个路由器或目标设备。
    这一步转发的工作原理和交换机类似,也是通过查表判断包转发的目标。不过在具体的操作上,路由器和交换机是有区别的:①因为路由器是基于IP设计的,俗称三层网络设备,路由器的各个端口都具有MAC地址和IP地址。②而交换机 是基于以太网设计的,俗称二层网络设备,交换机的端口不具有MAC 地址。
  2. 路由器的基本原理
    路由器的端口具有MAC地址,因此它能够成为以太网的发送方和接收方;同时还具有IP地址,从这个意义上来说,它和计算机的网卡是一样的。
    当转发包时,首先路由器端口会接收发给自己的以太网包,然后路由器查询转发目标,再由相应的端口作为发送方将以太网发送出去。
  3. 路由器的包接收操作
    首先电信号到达网线接口部分,路由器中的模块会将电信号转成数字信号,然后通过包末尾的FCS进行错误校验。
    如果没问题则检查MAC头部中的接收方MAC地址,看看是不是发给自己的包,如果是就放到接收缓冲区中,否则就丢弃这个包。
    总的来说,路由器的端口都具有MAC地址,只接收与自身地址匹配的包,遇到不匹配的包直接丢弃。
  4. 查询路由表确定输出端口
    完成包接收操作之后,路由器就会去掉包开头的MAC头部。MAC头部的作用就是将包送达路由器,其中的接收方MAC地址就是路由器端口的MAC地址。因此,当包到达路由器之后,MAC头部的任务就完成了,于是MAC头部就会被丢弃。接下来,路由器就会根据MAC头部后方的IP头部中的内容进行包的转发操作。
    转发操作分为几个阶段,首先是查询路由表判断转发目标。根据路由规则选择下一站路由器。
  5. 路由器的发送操作
    接下来我们进入包的发送操作。首先,我们需要根据路由表的网关列判断对方的地址:①如果网关是一个IP地址,则这个IP地址就是我们要转发的目标地址,还未抵达终点,还需要继续路由器转发。②如果网关为空,则IP头部中的接收方IP地址就是要转发到的目标地址,也是终于找到IP包头里的目标地址了,说明已抵达终点
    知道对方的IP地址之后,接下来需要通过ARP协议根据IP地址查询MAC地址,并将查询的结果作为接收方的MAC地址。
    路由器也有ARP缓存,因此首先会在ARP缓存中查询,如果找不到则发送ARP查询请求。
    接下来是发送方MAC地址字段,这里填写输出端口的MAC地址。还有一个以太类型字段,填写0080表示IP协议。
    网络包完成后,接下来会将其转换成电信号并通过端口号发送出去,这一步的工作过程和计算机是相同的。
    发送出去的网络包会通过交换机到达下一个路由器。由于接收方MAC地址就是下一个路由器的地址,所以交换机会根据这一地址将包传输到下一个路由器。
    接下来,经过层层转发之后,网络包就到达最终的目的地。
    不知你发现了没有,在网络包传输的过程中,源IP和目标IP始终是不会变的,一直在变的是MAC地址,因为需要MAC地址在以太网内进行两个设备直接的包传输。

10。互相扒皮 – 服务器与客户端

  1. 数据包抵达服务器后,服务器会先扒开数据包的MAC头部,查看是否和服务器自己的MAC地址符合,符合就将包收起来。
  2. 接着继续扒开数据包的IP头,发现IP地址符合,根据IP头中协议项,知道自己上层是TCP协议。
  3. 于是,扒开TCP的头,里面有序列号,需要看一看这个序列包是不是我想要的,如果是就放松缓存中然后返回一个ACK,如果不是就丢弃。TCP头部里面还有端口看,HTTP的服务器正在监听这个端口号。于是,服务器自然就知道是HTTP进行想要这个包,于是就将包发送给HTTP进程。
  4. 服务器的HTTP进程看到,原来这个请求是要访问一个页面,于是就把这个页面封装在HTTP的响应报文里。
  5. HTTP响应报文也需要穿上TCP、IP、MAC头部,不过这次是源地址是服务器IP地址,目的地址是客户端IP地址。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值