网络传输流程

TCP/IP五层或者四层模型

五层包含物理层,四层就不包含物理层
网络传输流程
通过应用层到物理层或者物理层到应用层的层层封装和分用,将传输的数据进行不同层协议的封装或者分用
网络传输流程

IP和MAC的概念

一个网卡对应一个 ip 地址,就想一个人只有一个身份证号码一样,但是一台主机不一定只有一个ip,因为存在:一台主机可以安装有线网卡,也可以安装无线网卡

ip 地址:

IP地址是在网络层的IP头部里,用于识别网络中互联的主机和路由器,其实主要是确认子网,通过子网掩码确认某个IP地址所在的子网,而后再在子网内部确认mac地址就能找到准确的用户了

Mac 地址:

mac地址是在数据链路层包裹在以太网头部中的,它主要用来识别同一个链路中的不同计算机。Mac地址即网卡号,每块网卡出厂的时候,都有一个全世界独一无二的 MAC 地址,也就说 mac 地址能准确的标识一台计算机

端口号(port):

端口号是在运输层包含在TCP/UDP头部中的,用于识别应用程序。一台主机上能运行多个程序,那么接收到的消息到底是哪个程序发送的,就需要端口号来确认,确认一台主机上的不同应用程序

在两台设备间传输数据,通过目的 IP 来找接收主机的子网位置,找到子网位置之后,通过目的MAC来确认主机的位置,因为一个MAC地址能够明确的标识一台主机,但是这个寻找的过程中基于集线器或者交换机的网络设备传输时源MAC和目的MAC不会发生改变,但是基于交换机传输时会发生改变
网络传输流程

网络设备的功能

网络传输流程

网络数据的传输流程

1.只有集线器的情况下

网络传输流程

场景:主机1通过 IP + PORT 访问 http 服务器的服务

流程:

(1)查询主机1的本机ARP缓存表,查看对应 IP 的MAC地址
(2)如果本机找不到,则通过集线器广播ARP请求数据(里面包含了:源MAC,目的 MAC 是 FF:广播地址,目的 IP),其他主机接收到数据后,查看自己的 IP 是否和请求数据中的 IP 相同,相同的话则返回自己的 MAC ,不相同的话就丢弃数据
(3)更新本机 ARP 缓存表,这样下次遇到同样的 IP 就能够查找到 MAC 地址
(4)发送数据给 HTTP 服务器:集线器会把该数据发送给所有主机,这些主机接收到后同样查看 MAC 地址是否和自己的 MAC 地址一致,如果一致就处理,否则就丢弃

这个过程中会产生 冲突/碰撞域 :也就是同一个时间下,多台主机同时发送数据包,那么集线器要把这么多的数据包同时发送给所有的端口,但是端口带宽有限,就会造成干扰

2.局域网内只存在交换机的情况

网络传输流程
基本流程和集线器相同
交换机存在一个 MAC 地址转换表,基本的功能也和 ARP 缓存表相同,不同的是交换机有多个端口来处理数据,这样就降低了发生冲突的概率,相当于把主机分成不同的部分,然后一部分主机发送数据给一个端口,其他部分主机发送数据给其他不同的端口

3.局域网内交换机+路由器情况
网络传输流程

场景:主机1访问主机4的http服务,两个主机在不同网段内,涉及到跨网段的问题,此时不能像之前通过集线器的ARP缓存表或者交换机的MAC地址转换表来查询目的主机的 MAC 地址,只能通过路由器来获取连接主机的相关信息

流程:

(1)通过目的 IP 的网络号(也就是 IP 的前三位)和自己的子网掩码做按位与操作,将等到的网络号和自己的网络号进行对比
(2)相同则说明目的主机和自己在同一个网段内,则像前面的只有交换机的情况去处理
(3)如果不同,则需要将数据发送到路由器,通过网关地址来找到目的 MAC 地址
(4)路由器处理的时候会发送 MAC 的改变,源 MAC 由原来的主机1MAC改为路由器的MAC,目的MAC由原来的路由器MAC地址修改为主机4的MAC地址(如果主机4的MAC地址查询不到,则需要通过广播的方式来查找)

3.广域网的传输流程(重要)

网络传输流程
网络传输流程

场景:主机1访问 http://www.baidu.com

流程:

(1)先要将域名转换成 IP 地址,DNS协议(在本地的 DNS 缓存中查找,如果没有则往路由器查找,再没有往上级DNS服务器查找,层层查找)
(2)五元组信息:源 ip :本机 IP ,目的 IP :百度 IP 地址,源端口号:主机1程序端口号,目的端口号 :百度HTTP服务器端口号
(3)通过目的 IP 和 子网掩码的按位与操作发现不再同一个网段内,则发送到路由器去处理
(4)路由器处理数据:

可能会出现两个问题:

a)路由器的 ARP 缓存也查找不到百度的 MAC 地址
b)在百度服务器接收到数据处理之后,要返回结果给主机1,根据发送给百度服务器时的IP+PORT 来返回数据,如果是局域网 IP + PORT 就会有问题

解决方法:

a)通过路由的功能来找到合适的下一次跳转位置,虽然不能一下子找到百度的MAC地址,但是知道大体的方向,通过这个方向的层层查找,最终也会找到百度的 MAC 地址
b)通过 NAT + NATP 来将私网的 ip +port 映射为公网的 ip + port
知道下一次跳转的方向后,修改 MAC 地址为:源MAC地址修改为路由器的 MAC 地址,目的MAC修改为下一次跳转设备的(此时目的 ip 和本设备的 ip 不同,所以不能处理数据)
(5)当百度服务器接收到数据时:目的MAC和本机MAC相同,目的IP和本机IP相同,此时才能够处理数据,之所以要 IP也相同才能处理,是因为之前在传输的过程中,只有目的 IP一直没有变化始终都是百度服务器IP,变化的是 MAC 地址,通过 MAC 的地址变换,才能将数据报层层的传输,最终达到百度服务器
(6)服务器处理完数据后,要返回结果给主机1,数据报为:
源IP:百度服务器IP,目的IP:路由器的公网IP,目的端口号:路由器程序端口号,源端口号:百度http服务器端口号
(7)路由器接收到数据报后:将 目的 IP 修改为:局域网内主机1的IP,目的端口号修改为:主机1的浏览器端口号,并且此时能够通过路由器的ARP缓存查找到主机1的 MAC 地址
(8)最后主机1接收到数据报,发现目的 MAC 和 目的 IP 和自己相同,进行分用处理