当前位置: 首页 > news >正文

数据包在客户端和服务端,以及网络设备间如何传输的?

声明:文章中图片来自于网络收集,整体流程自己梳理。

目录

问题:如下socket客户端请求数据包如何传输的?

拓扑环境

数据包在分层间传输

网络分层L2/L3/L4

数据包收发-在各分层间变化

各层头部中-核心信息

数据包在不同设备间传输

客户端数据包发送流程

DNS域名解析

添加L4 tcp头

添加L3 ip头

添加L2 eth头

中间设备-二层交换机

中间设备-三层路由器

路由器和交换机区别

路由器收包流程

路由器发包流程

服务端数据包接收流程

校验L2 eth头中目的mac

判断L3 ip头中目标ip

判断L4 tcp头中目标port

iptables-介入数据包处理流程

VMware-不同网络模型

Brigde-桥接模式:默认使用VMnet0

NAT模式 :默认使用VMnet8

Host-Only-仅主机模式:默认使用VMnet1


  1. 问题:如下socket客户端请求数据包如何传输的?

import socket
import ssl
import requests
# 伪代码展示底层流程
def send_request():
    # 解析 URL
    url = 'http://www.test.com'
    host = 'www.test.com'
    port = 80
    
    # 创建 socket 连接
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # 对于 HTTPS,使用 SSL/TLS
    # s = ssl.wrap_socket(s)
    
    # 连接到服务器
    s.connect((host, port))
    
    # 构造 HTTP 请求
    request = "GET / HTTP/1.1\r\nHost: www.test.com\r\n\r\n"
    
    # 发送请求
    s.send(request.encode())
    
    # 接收响应
    response = s.recv(4096)
    print(response.decode())
    
    # 关闭连接
    s.close()
# 使用 requests 库发送请求
response = requests.get('http://www.test.com')

  1. 拓扑环境

https://cloud.tencent.com/developer/article/1607505

浏览器客户端设备 与 web服务器设备间通信:

  1. 数据包在分层间传输

https://gitee.com/ixiaohuzi/CS-Base/blob/main/network/1_base/how_os_deal_network_package.md

https://blog.csdn.net/weixin_44471703/article/details/123307928

https://www.cnblogs.com/qishui/p/5437301.html

  1. 网络分层L2/L3/L4

  1. 数据包收发-在各分层间变化

以web客户端浏览器发包,服务端收包为例,介绍数据包在网络协议栈各层之间处理情况:

数据包发送时:

  1. 添加L4 tcp头,主要是填充源port和目的port
  2. 添加L3 ip头,主要是填充源ip和目的ip
  3. 添加L2 以太头,主要是填充源mac和目的mac

数据包接收时:

  1. 判断L2 以太头,目的mac是否为本机的,是则交给上层处理,否则丢弃数据包。
  2. 判断L3 ip头,目的ip是否为本机的,是则交给上层处理,否则转发或者丢弃数据包。
  3. 判断L4 tcp头,目的port是否为本机侦听socket的,是则交给上层处理,否则拒绝连接。

各层头部中-核心信息

  1. 一个完整的数据包格式:

  1. L2以太网帧头:包含源和目的mac

  1. L3 ip头:包含源ip和目的ip

  1. L4 tcp头:包含源port和目的port

  1. 数据包在不同设备间传输

客户端数据包发送流程

DNS域名解析

客户端请求时,优先做域名解析,得到服务器ip:

[root@VScan /]# curl www.test.com

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx 172.18.110.105!</title>
</head>
<body>
<h1>Welcome to nginx 172.18.110.105!</h1>
</body>
</html>

先查找hosts文件中域名对应的服务器ip:

[root@VScan /]# cat /etc/hosts

172.18.110.105  www.test.com

未配置静态hosts文件,则请求DNS服务器获取域名对应的服务器ip:

[root@VScan /]# cat /etc/resolv.conf

nameserver 114.114.114.114

添加L4 tcp头

添加L4 tcp头,核心是填充源port和目的port信息:

  1. 创建一个socket连接时,使用五元组区分(即协议,源ip源port,目的ip目的port),使用 netstat 命令可以查看此连接的五元组信息。
  2. 源port选择:操作系统通常会从此连接上未使用的端口范围即 1024 到 65535 中选择一个port。
  3. 目的port:即客户端请求的服务器port。

添加L3 ip头

添加L3 ip头,核心是填充源ip和目的ip信息:

  1. 源ip选择:系统的网络协议栈会根据目的ip匹配路由表,确定发送数据包的出口网络接口,并将该接口的IP地址作为源IP。

  1. 目的ip:由应用层决定,通常通过直接配置或者DNS解析获得。

添加L2 eth头

添加L2 eth头,核心是填充源mac和目的mac信息:

  1. 源mac:使用之前路由匹配得到的出口网络接口,使用此网卡上mac作为源mac。
  2. 目的mac选择:

客户端和服务端处于同一网段,则通过arp获取目标主机的mac,作为目标mac。

客户端和服务端处于不同子网,则客户端通过arp请求获取网关的mac地址,作为目标mac。

中间设备-二层交换机

MAC地址学习:

  1. 交换机每个端口收到数据包后,记录源MAC地址与此端口的映射关系(即mac表),作为后续转发数据的依据。

数据包转发:通过数据包中目标mac查找自己的mac表,决定将该数据包转发到哪个端口。

  1. 如果交换机的MAC地址表中存在目标MAC地址的记录,交换机会将数据包转发到对应的端口。
  2. 如果MAC地址表中没有目标MAC地址的记录,交换机会将数据包广播到所有端口(除了接收端口),直到找到目标设备。

中间设备-三层路由器

路由器中nat模式,端口映射,三层交换机等功能省略介绍。

路由器和交换机区别

路由器是基于 IP 设计的,俗称三层网络设备,路由器的各个端口都具有 MAC 地址和 IP 地址;

二层交换机是基于以太网设计的,俗称二层网络设备,交换机的端口不具有 IP 地址。

路由器收包流程

检查数据包L2头中目的mac,看看是不是发给自己网卡的包,如果是就放到接收缓冲区中,否则就丢弃这个包。

根据数据包L3头中目标ip匹配自己的路由表,以找到相匹配的记录,知晓将数据包转发给哪个网卡。

  1. 将数据包中目标ip和路由表中每个条目的子网掩码做与运算,得到的结果与对应条目的目标地址比较是否相等,相等就会作为候选转发目标,如果不匹配就继续与下个条目进行路由匹配。
  2. 路由表中表项选择时,会选择最长前缀匹配的项,一个目的地址可能与多个表项匹配。子网掩码最长的即最长前缀匹配,与目的地址的高位匹配得最多的表项。
举例说明,路由表中有两项:
192.168.20.16/28 eth1
192.168.0.0/16 eth2
在要查找目标ip 192.168.20.19 的时候,这两个表项都“匹配”。
这种情况下,前缀最长的路由就是192.168.20.16/28,因为它的子网掩码(/28)比其他表项的掩码(/16)要长。
故数据包从 eth1 发出去。
  1. 找不到匹配项时,就会选择默认路由,即作为默认网关。

路由器发包流程

  1. 路由表项中网关列,是一个网关ip,说明数据包还未抵达终点,还需继续转发给此ip的网关设备。
  2. 路由表项中网关列,如果网关为空,则 IP 头部中的目标 IP 地址就是要转发到的目标设备,也是就终于找到 IP 包头里的目标地址了,说明已抵达终点。
  3. 上面得到了 IP 地址之后,

在网络包传输的过程中,数据包中源IP和目标IP 始终是不会变的,一直变化的是 MAC 地址,因为需要 MAC 地址在以太网内进行两个设备之间的包传输。

改写数据包中源MAC 地址,改为此路由匹配项得到的端口上的MAC地址。目的mac根据上面ip决定,如果是网关则为网关的mac,否则为对应设备的mac。

路由器也有 ARP 缓存,因此首先会在 ARP 缓存中查询此IP对应的mac地址,如果找不到则发送 ARP 查询请求。mac不存在则通过 ARP 协议根据 IP 地址得到对应的 MAC 地址,并将查询的结果作为目标 MAC 地址。

服务端数据包接收流程

校验L2 eth头中目的mac

判断L2 eth头中目标mac,为本机的mac则去除以太头,交由上层处理,否则丢弃此包。

判断L3 ip头中目标ip

判断L3 ip头中目标ip,为本机的ip则去除ip头,交由上层处理。不为本机ip,如果启用了转发机制,则查找路由表将数据包转发出去。

# cat /etc/sysctl.conf| grep net.ipv4.ip_forward

net.ipv4.ip_forward=1

判断L4 tcp头中目标port

判断L4 tcp头中目标port,为本机的socket侦听port,交由此侦听port的服务处理。未找到侦听port则回复 TCP RST拒绝连接。

  1. iptables-介入数据包处理流程

  1. 五条链代表了不同的处理时机(即在数据包处理的哪个阶段),如:PREROUTING/INPUT/FORWARD/OUTPUT/POSTROUTING执行什么规则。
  2. 五个表,只不过是对五条链设置的规则要存储在哪些表里(filter表/nat表/mangle表/raw表/security表),在匹配流量时要查表确定。

iptables介入数据包处理流程的5个阶段,对数据包做改写操作:

  1. PREROUTING 收到数据包后,对数据包做dnat,改写数据包中目的ip和port信息。多个内网服务共享一个外网ip对外提供服务。
  2. INPUT 对交由本机处理的数据包做检查,如限制特定的客户端ip访问本机服务。
  3. FORWARD 数据包不是给本机处理的,需要做转发处理,即数据包从本机的一个网络接口转发到另一个接口,可以过滤这些流量(允许对哪些ip或port的数据包做转发处理)。如将本机作为路由器使用,做数据包的转发。
  4. OUTPUT 用于检查本机生成并发送出去的流量。当数据包的源地址是本机时,允许或拒绝本机应用程序发起的流量。
  5. POSTROUTING 用于在数据包从本机离开时应用规则,通常用于源地址转换(SNAT),修改数据包的源ip和port信息地址。如客户端访问外网场景,将内网ip转为外网ip。
  1. VMware-不同网络模型

【编辑】-【虚拟网络编辑器】-【更改设置】:根据应用场景添加网络设置不同的网络模型。

  1. Brigde-桥接模式:默认使用VMnet0

应用场景:虚拟机与外部网络通信的场景,如虚拟机要访问互联网或与其他物理机器通信,虚拟机等同于宿主机类似的其他设备。

设置桥接网络连接到哪个物理网卡:

给虚拟机增加网卡时,设置网卡连接桥接模式网络,后续可以给此网卡配置此物理网卡所在的ip:

  1. NAT模式 :默认使用VMnet8

应用场景:适合虚拟机访问外部网络,但无需外部访问虚拟机的场景。虚拟机通过宿主机的网络连接访问外部网络,但虚拟机不会直接暴露在外部网络中,宿主机负责进行网络地址转换。

查看NAT模式网络地址:

给虚拟机增加网卡时,设置网卡连接NAT模式网络,后续可以给此网卡配置此网段内的ip:

  1. Host-Only-仅主机模式:默认使用VMnet1

应用场景:虚拟机与宿主机之间可以通信,但不能直接访问外部网络。

添加主机模式网络(即私有网络):

给虚拟机增加网卡时,设置网卡连接主机模式网络,后续可以给此网卡配置此网段内的ip:

虚拟网络设备:

GNS3是一款运行在Windows、Linux上的跨平台图形网络模拟器,可以模拟交换机路由器虚拟设备,连接VMware虚拟机的网卡搭建网络实验环境。https://blog.csdn.net/airenKKK/article/details/135888133

相关文章:

  • Golang | 每日一练 (3)
  • 虚拟地址与物理地址
  • 如何在简历中巧妙展现你的兴趣爱好
  • JavaScript数组常用的方法有哪些?map、filter、reduce 的区别和使用场景是什么?
  • 【Quest开发】全身跟踪(一)
  • 内置函数用法
  • 求两个正整数最大公约数的三种算法
  • Linux下 <用户名> is not in the sudoers file
  • 《晶体管电路设计》 第三章 增强输出的电路
  • 【Python项目】基于Python的Web漏洞挖掘系统
  • 超级详细,知识图谱系统的理论详解+部署过程
  • 全局错误处理如何与Vue Router集成?
  • JavaScript中的symbol类型的意义和使用
  • ssm-day06 ssm整合
  • SpringBoot 项目配置动态数据源
  • 【C++篇】树影摇曳,旋转无声:探寻AVL树的平衡之道
  • Apache Logic4j 库反序列化漏洞复现与深度剖析
  • 【蓝桥杯集训·每日一题2025】 AcWing 6135. 奶牛体检 python
  • HarmonyOS学习第3天: 环境搭建开启鸿蒙开发新世界
  • java练习(35)
  • 中小型门户网站/dz论坛seo
  • 没有网的电脑怎么安装wordpress/灰色词seo推广
  • 新闻类网站开发多久/企业专业搜索引擎优化
  • 网站首页做301/网络营销推广外包平台
  • 网站建设 m.ykn.cc/为什么中国禁止谷歌浏览器
  • 大连建立网页/富阳seo关键词优化