14张图,让你秒懂数据在网络中到底是如何传输的
yuyutoo 2024-10-14 16:20 6 浏览 0 评论
之前写了不少技术科普文,不知道你看过多少?
今天老杨想提问一下:
你有想过吗,在计算机网络当中,数据是怎么样保证准确的从客户端发送到服务器端的?中间涉及到了哪些理论?
这篇文章分享的14张图,希望能助你理清数据传输的全过程。
01 客户端各层对数据的封装
java实现客户端的代码如下:
Socket socket = new Socket("192.168.3.6", 8899);
try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);
) {
printWriter.println("hello"); // 发送数据
String line; // 读取数据
while (null != (line = bufferedReader.readLine())) {
System.out.println("receive message from server: " + line);
}
}
应用层会指定发送的服务器的域名(或者IP)和端口号、以及要发送数据的内容,传递给下一层传输层。
传输层会在把应用层的报文当成自己的数据,然后在前面拼接源端口号,和目标端口号。
其中源端口号就是客户端进程监听的端口号,这个端口号一般不是固定的,由操作系统在49152~65535范围内动态分配,而目标端口号就是服务器接收数据的端口号,一般是固定的,在java代码中会指明。
网络层会在传输层报文的基础上增加源IP和目标IP,其中源IP就是本地网卡的IP地址,目标IP是服务器的IP,如果java代码中指定的是服务器的域名。
那么,首先需要通过DNS服务器将域名解析为IP,域名解析的流程:
先查浏览器缓存->操作系统缓存->hosts文件->DNS服务器。
数据链路层会在网络层的基础上增加源MAC地址和目标MAC地址,其中源MAC地址就是本机网卡的MAC地址,目标MAC地址是下一跳网络设备(一般是交换机或路由器)的MAC地址。
注意,目标MAC地址一般不是服务器的MAC地址(如果客户端和服务器端在同一个网段,那么目标MAC地址就是服务器的MAC地址),因为客户端根本就无法得知服务器的MAC地址,所以数据链路层采用下一跳的机制转递数据。
那么怎么知道我的下一跳是谁呢?
下面就要请出ARP协议了,ARP会发出一个广播,告诉全世界:“大家好,我的IP地址是192.168.1.6,我的MAC地址是00-50-56-C0-88-01”
当同一个网段上的主机接收到ARP报文时,会将这些信息添加自己的ARP缓冲区中的ARP列表,同时将自己的IP地址和MAC地址回应给发送者,这样每个位于同一个网段的主机都有整个网段内各个主机的IP与MAC地址的对应关系了。
ARP列表的具体内容如下:
# arp -a
? (192.168.1.1) at 00-60-47-D4-41-A9 [ether] on eth0
? (192.168.1.7) at F8-30-F9-C1-7E-09 [ether] on eth0
? (192.168.1.100) at 00-30-F2-C1-2E-89 [ether] on eth0
... ...
现在我的目标IP是192.168.3.6,又不在这个ARP列表中,那我怎么知道目标MAC地址要填啥呢?填下一跳的MAC地址,那么下一跳是又是谁呢?这里就要请出路由表了。
# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 192.168.1.100 0.0.0.0 UG 1024 0 0 eth0
这个路由表是计算机的路由表,而不是路由器的路由表,这个路由表怎么来的呢?根据/etc/sysconfig/network-scripts/ifcfg-eth0这个文件生成的。
# cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
NAME=eth0
UUID=ff200252-6eac-448d-b904-a6d1a1a7da3c
ONBOOT=yes
IPADDR=192.168.1.0
NETMASK=255.255.255.0
GATEWAY=192.168.1.100
DNS1=8.8.8.8
HWADDR=00-50-56-C0-88-01
那么这个路由表怎么使用呢?将目标IP与每一条记录的子网掩码(Genmask)一一按位与运算,匹配度最高的Destination字段的IP就是下一跳的IP192.168.1.100,也就是网关地址GATEWAY,然后根据下一跳的IP去查ARP列表获得MAC地址00-30-F2-C1-2E-89。
就这样客户端完成了对报文的组装,交给物理层把数据从网卡发送出去,发送到交换机A。
02交换机的交换
交换机收到客户端的报文后,会进行解析,只解析到数据链路层,从中获得目标MAC地址,然后查找ARP列表,将报文转发给对应的网卡端口。
交换机中的ARP列表:
Switch#show ip arp
Protocol Address Age (min) Hardware Addr Type Interface
Internet 192.168.1.1 - 0060.47D4.41A9 ARPA Vlan1
Internet 192.168.1.6 0 0050.56C0.8801 ARPA Vlan1
Internet 192.168.1.7 0 F830.F9C1.7E09 ARPA Vlan1
Internet 192.168.1.100 0 0030.F2C1.2E89 ARPA Vlan1
Switch#show mac-address-table
Mac Address Table
-------------------------------------------
Vlan Mac Address Type Ports
---- ----------- -------- -----
1 0030.f2c1.2e89 DYNAMIC Fa2/1
1 0050.56c0.8801 DYNAMIC Fa0/1
1 f830.f9c1.7e09 DYNAMIC Fa1/1
根据目标MAC地址00-30-F2-C1-2E-89找到交换机的端口为Fa2/1,这样交换机就会把报文从这个端口发送出去,发送到路由器,这里的端口是交换机的物理端口,也就是插入网线的插口。
03 路由器的路由
路由器可以连接两个不同的网络。
路由器有一张路由表,路由表可以通过网络工程师配置或者从其他路由器学习得到。
Router(config)#do show ip route
Codes: C - connected, S - static, I - IGRP, R - RIP, M - mobile, B - BGP
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2, E - EGP
i - IS-IS, L1 - IS-IS level-1, L2 - IS-IS level-2, ia - IS-IS inter area
* - candidate default, U - per-user static route, o - ODR
P - periodic downloaded static route
Gateway of last resort is not set
C 192.168.1.0/24 is directly connected, FastEthernet0/0
C 192.168.3.0/24 is directly connected, FastEthernet0/1
路由器会解析报文到网络层,然后发现目的IP是192.168.3.6,从上面的路由表可以可以发现,想要去192.168.3.0网段,只需要将数据从FastEthernet0/1端口发送出去即可。
另外路由器会将目标MAC地址替换成下一跳的MAC地址(在这里是服务器的MAC地址,如果中间还有其他路由器,那么就是下一个路由器的MAC地址),怎么替换呢?还是查ARP表:
Router#show ip arp
Protocol Address Age (min) Hardware Addr Type Interface
Internet 192.168.1.1 9 0060.47D4.41A9 ARPA FastEthernet0/0
Internet 192.168.1.6 11 0050.56C0.8801 ARPA FastEthernet0/0
Internet 192.168.1.7 0 F830.F9C1.7E09 ARPA FastEthernet0/0
Internet 192.168.1.100 - 0030.F2C1.2E89 ARPA FastEthernet0/0
Internet 192.168.3.1 11 000D.BD42.926B ARPA FastEthernet0/1
Internet 192.168.3.6 11 0030.A396.5DE7 ARPA FastEthernet0/1
Internet 192.168.3.7 6 00D0.974C.0741 ARPA FastEthernet0/1
Internet 192.168.3.100 - 00E0.B043.9302 ARPA FastEthernet0/1
查询IP192.168.3.6的MAC地址为0030.A396.5DE7然后将目标MAC替换成这个,然后将数据从FastEthernet0/1端口发送出去,交给交换机B,交换机B再将数据转发到服务器端。
04 服务器端各层对数据的解析
服务器端收到数据后会逐层进行解析,最后将真正的数据交应用程序进行处理,至此一个数据从客户端到服务器端就完成了,服务器端会发送响应报文给客户端,大体的流程类似,但是数据不一定是原路返回的,因为中间经过的路由可能不同。
05 扩展
查看域名对应的IP:
> nslookup www.baidu.com 114.114.114.114
服务器: public1.114dns.com
Address: 114.114.114.114
非权威应答:
名称: www.a.shifen.com
Addresses: 183.232.231.174
183.232.231.172
Aliases: www.baidu.com
查看本机到服务器中间经过了多少个路由节点:
C:\>tracert 192.168.3.6
Tracing route to 192.168.3.6 over a maximum of 30 hops:
1 0 ms 0 ms 0 ms 192.168.1.100
2 0 ms 0 ms 1 ms 192.168.3.6
Trace complete.
干货文章需要小友们多转发收藏,支持老杨哈。
还有什么想看的技术科普,留言告诉老杨一声,下期可能就直接更新了
相关推荐
- 当 Linux 根分区 (/) 已满时如何释放空间?
-
根分区(/)是Linux文件系统的核心,包含操作系统核心文件、配置文件、日志文件、缓存和用户数据等。当根分区满载时,系统可能出现无法写入新文件、应用程序崩溃甚至无法启动的情况。常见原因包括:...
- 玩转 Linux 之:磁盘分区、挂载知多少?
-
今天来聊聊linux下磁盘分区、挂载的问题,篇幅所限,不会聊的太底层,纯当科普!!1、Linux分区简介1.1主分区vs扩展分区硬盘分区表中最多能存储四个分区,但我们实际使用时一般只分为两...
- Linux 文件搜索神器 find 实战详解,建议收藏
-
在Linux系统使用中,作为一个管理员,我希望能查找系统中所有的大小超过200M文件,查看近7天系统中哪些文件被修改过,找出所有子目录中的可执行文件,这些任务需求...
- Linux 操作系统磁盘操作(linux 磁盘命令)
-
一、文档介绍本文档描述Linux操作系统下多种场景下的磁盘操作情况。二、名词解释...
- Win10新版19603推送:一键清理磁盘空间、首次集成Linux文件管理器
-
继上周四的Build19592后,微软今晨面向快速通道的Insider会员推送Windows10新预览版,操作系统版本号Build19603。除了一些常规修复,本次更新还带了不少新功能,一起来了...
- Android 16允许Linux终端使用手机全部存储空间
-
IT之家4月20日消息,谷歌Pixel手机正朝着成为强大便携式计算设备的目标迈进。2025年3月的更新中,Linux终端应用的推出为这一转变奠定了重要基础。该应用允许兼容的安卓设备...
- Linux 系统管理大容量磁盘(2TB+)操作指南
-
对于容量超过2TB的磁盘,传统MBR分区表的32位寻址机制存在限制(最大支持2.2TB)。需采用GPT(GUIDPartitionTable)分区方案,其支持64位寻址,理论上限为9.4ZB(9....
- Linux 服务器上查看磁盘类型的方法
-
方法1:使用lsblk命令lsblk输出说明:TYPE列显示设备类型,如disk(物理磁盘)、part(分区)、rom(只读存储)等。...
- ESXI7虚机上的Ubuntu Linux 22.04 LVM空间扩容操作记录
-
本人在实际的使用中经常遇到Vmware上安装的Linux虚机的LVM扩容情况,最终实现lv的扩容,大多数情况因为虚机都是有备用或者可停机的情况,一般情况下通过添加一块物理盘再加入vg,然后扩容lv来实...
- 5.4K Star很容易!Windows读取Linux磁盘格式工具
-
[开源日记],分享10k+Star的优质开源项目...
- Linux 文件系统监控:用脚本自动化磁盘空间管理
-
在Linux系统中,文件系统监控是一项非常重要的任务,它可以帮助我们及时发现磁盘空间不足的问题,避免因磁盘满而导致的系统服务不可用。通过编写脚本自动化磁盘空间管理,我们可以更加高效地处理这一问题。下面...
- Linux磁盘管理LVM实战(linux实验磁盘管理)
-
LVM(逻辑卷管理器,LogicalVolumeManager)是一种在Linux系统中用于灵活管理磁盘空间的技术,通过将物理磁盘抽象为逻辑卷,实现动态调整存储容量、跨磁盘扩展等功能。本章节...
- Linux查看文件大小:`ls`和`du`为何结果不同?一文讲透原理!
-
Linux查看文件大小:ls和du为何结果不同?一文讲透原理!在Linux运维中,查看文件大小是日常高频操作。但你是否遇到过以下困惑?...
- 使用 df 命令检查服务器磁盘满了,但用 du 命令发现实际小于磁盘容量
-
在Linux系统中,管理员或开发者经常会遇到一个令人困惑的问题:使用...
- Linux磁盘爆满紧急救援指南:5步清理释放50GB+小白也能轻松搞定
-
“服务器卡死?网站崩溃?当Linux系统弹出‘Nospaceleft’的红色警报,别慌!本文手把手教你从‘删库到跑路’进阶为‘磁盘清理大师’,5个关键步骤+30条救命命令,快速释放磁盘空间,拯救你...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)