本篇博客主要介绍网络数据的传输流程。主要理解局域网和广域网的数据传输流程。
局域网数据传输流程
传输案例如下:
客户端访问局域网http服务器(http://192.168.1.100)。
本机封装数据(从上到下封装)
- 应用层:浏览器将请求数据封装为一个HTTP请求;
- 传输层:TCP协议将数据包再次封装为TCP数据包;
- 网络层:IP协议再次封装;
- 数据链路层:以太网技术,携带MAC(系统将数据包发送到本机网卡),封装为数据帧;
接收端处理数据(从下到上)
- 数据链路层:操作系统在网卡接收数据,系统解析接收到的数据包(处理数据帧);
- 网络层:系统处理IP头;
- 传输层:系统处理TCP头,根据得到的端口号,系统将数据包交给应用程序处理;
- 应用层:应用程序处理数据;
局域网发送数据(没有交换机、没有路由器)
现在只知道目标主机IP,而不知道目标主机MAC地址。
- 首先,查找本机ARP缓存表(IP地址和MAC地址的映射关系),找到了就发送到目标主机;
- 如果找不到,广播一条请求MAC地址的请求,向局域网内发送目标主机IP地址。局域网内所有主机都收到这条消息,检查自己的IP地址和收到的IP地址,如果不一致,则丢弃;一致则响应自己的MAC地址;
- 发送端知道目标主机MAC地址后,再发送数据包。局域网内所有主机都可以收到该数据包,如果发现目的MAC和自己的MAC地址不一致则丢弃,如果一致,则处理数据。
局域网发送数据(有交换机、没有路由器)
- 将数据包发送到交换机;
- 交换机处理数据:查看MAC地址转换表(转换IP和MAC地址),如果有目标主机IP对应的MAC地址,直接发送;如果没有,就发送请求MAC的广播;
- 交换机更新MAC地址转换表;
- 知道了MAC地址后,发送数据。
局域网发送数据(有交换机,也有路由器)
- 发送端封装数据报;
- 将目的主机的IP与子网掩码做位与操作,求出目标主机的网络号。将目标主机的网络号和本机网络号进行比较,相同说明在同一个网段,不同则在不同的网段;
- 如果在同一个网段,按照前面没有路由器的方式传输;
- 如果不在同一个网段,则本机不知道目标主机的MAC地址,将数据包发送到网关(路由器)来进一步处理;
- 发送端发送到网关:源主机中(源MAC地址为本机MAC地址,目标MAC地址为路由器MAC地址),数据发送到路由器后,进行解包分用(源MAC目的MAC取出来),并且封装(源MAC修改为自己的MAC,目的MAC修改为接收端主机的MAC);
- 网关(路由器)发送到接收端:接收端接收到数据包,进行解包分用。
广域网数据传输流程
传输流程:浏览器访问百度http://www.baidu.com。
- 本机封装的步骤和之前一致(DNS、HTTP、TCP、IP、数据帧),通过子网掩码发现目标IP不在同一个网段,需要发送到网关(路由器)进一步处理;
- 网关(路由器):解包分用,重新封装(源MAC为本路由器MAC,目的MAC为下一个设备的MAC,源IP由发送端私网IP修改为本路由器公网IP,源端口号由发送端应用程序端口号修改为路由器端口号,目的IP和端口号不变),路由器建立端口映射(NAT+NAPT);
- 下一个设备处理数据:解包分用,重新封装(源MAC为自己的MAC,目的MAC修改为下一个设备的MAC);
- 接收端接收:发现目标IP和本机IP一致,解包分用,和之前流程一样;
- 接收端响应数据:源IP为接收端主机公网IP,源端口为接收端应用程序端口号,目的IP为路由器公网IP,目的端口为路由器映射端口,源MAC和目的MAC的变化和发送流程变化一致;
- 路途中的设备不停的解包分用,重新封装数据包(源MAC修改为自己的,目的MAC修改为下一个设备的MAC);
- 路由器接收到数据包,发现目的IP和自己公网IP一致,就处理数据(目的端口绑定的程序处理),把目的IP修改为发送端私网IP,端口号修改为发送端应用程序端口号(NAT+NAPT)。
为什么目标主机不能处于局域网内?
如果目标主机处于局域网内,刚开始接收客户端数据时,只能由路由器公网IP+路由器端口号作为目的IP和目的端口,但是刚开始没有建立局域网内主机的映射关系,所以路由器接收到来自客户端的数据不知道发给局域网内哪个主机哪个应用程序。