0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

数据是怎么样保证准确的从客户端发送到服务器端

马哥Linux运维 来源:杰哥的IT之旅 作者:杰哥的IT之旅 2022-07-01 10:09 次阅读

你有想过吗,在计算机网络当中,数据是怎么样保证准确的从客户端发送到服务器端的?中间涉及到了哪些理论?

01 客户端各层对数据的封装

java实现客户端的代码如下:

356decc0-f3c3-11ec-ba43-dac502259ad0.png

应用层会指定发送的服务器的域名(或者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地址的对应关系了。

357b3fce-f3c3-11ec-ba43-dac502259ad0.png

ARP列表的具体内容如下:

3588eb74-f3c3-11ec-ba43-dac502259ad0.png

现在我的目标IP是192.168.3.6,又不在这个ARP列表中,那我怎么知道目标MAC地址要填啥呢?填下一跳的MAC地址,那么下一跳是又是谁呢?这里就要请出路由表了。

35941292-f3c3-11ec-ba43-dac502259ad0.png

这个路由表是计算机的路由表,而不是路由器的路由表,这个路由表怎么来的呢?根据/etc/sysconfig/network-scripts/ifcfg-eth0这个文件生成的。

359eaa40-f3c3-11ec-ba43-dac502259ad0.png

那么这个路由表怎么使用呢?将目标IP与每一条记录的子网掩码(Genmask)一一按位与运算,匹配度最高的Destination字段的IP就是下一跳的IP192.168.1.100,也就是网关地址GATEWAY,然后根据下一跳的IP去查ARP列表获得MAC地址00-30-F2-C1-2E-89。

就这样客户端完成了对报文的组装,交给物理层把数据从网卡发送出去,发送到交换机A。

02 交换机的交换

交换机收到客户端的报文后,会进行解析,只解析到数据链路层,从中获得目标MAC地址,然后查找ARP列表,将报文转发给对应的网卡端口。

交换机中的ARP列表:

35aee52c-f3c3-11ec-ba43-dac502259ad0.png

根据目标MAC地址00-30-F2-C1-2E-89找到交换机的端口为Fa2/1,这样交换机就会把报文从这个端口发送出去,发送到路由器,这里的端口是交换机的物理端口,也就是插入网线的插口。

35d323ce-f3c3-11ec-ba43-dac502259ad0.png

03 路由器的路由

路由器可以连接两个不同的网络。

路由器有一张路由表,路由表可以通过网络工程师配置或者从其他路由器学习得到。

35e424e4-f3c3-11ec-ba43-dac502259ad0.png

路由器会解析报文到网络层,然后发现目的IP是192.168.3.6,从上面的路由表可以可以发现,想要去192.168.3.0网段,只需要将数据从FastEthernet0/1端口发送出去即可。

另外路由器会将目标MAC地址替换成下一跳的MAC地址(在这里是服务器的MAC地址,如果中间还有其他路由器,那么就是下一个路由器的MAC地址),怎么替换呢?还是查ARP表:

35fc3052-f3c3-11ec-ba43-dac502259ad0.png

查询IP192.168.3.6的MAC地址为0030.A396.5DE7然后将目标MAC替换成这个,然后将数据从FastEthernet0/1端口发送出去,交给交换机B,交换机B再将数据转发到服务器端。

360cd920-f3c3-11ec-ba43-dac502259ad0.png

04 服务器端各层对数据的解析

361c32ee-f3c3-11ec-ba43-dac502259ad0.png

服务器端收到数据后会逐层进行解析,最后将真正的数据交应用程序进行处理,至此一个数据从客户端到服务器端就完成了,服务器端会发送响应报文给客户端,大体的流程类似,但是数据不一定是原路返回的,因为中间经过的路由可能不同。

05 扩展

查看域名对应的IP:

362d52c2-f3c3-11ec-ba43-dac502259ad0.png

查看本机到服务器中间经过了多少个路由节点:

364afb2e-f3c3-11ec-ba43-dac502259ad0.png

原文标题:数据在网络中是如何传输的

文章出处:【微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

审核编辑:彭静

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6511

    浏览量

    87595
  • 计算机网络
    +关注

    关注

    2

    文章

    316

    浏览量

    21884
  • 服务器端
    +关注

    关注

    0

    文章

    2

    浏览量

    963

原文标题:数据在网络中是如何传输的

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    使用lwip socket udp功能,开发板为客户端时不能够接收服务器端发送过来的数据

    调用,间隔10ms */ void Socket_UDP_ClientTX(void) //开发板为客户端数据发送到服务器端是成功的 ok { volatile u8 _KeyCod
    发表于 04-16 06:01

    用队列实现的1对N的TCP服务器端,自动回复信息总发错客户端

    本帖最后由 kaneiqi1210 于 2014-7-17 12:43 编辑 如题,我仿照教材用队列做的TCP一对多的服务器端,在1对1时,没问题,而在1对多时,就出现,自动回复信息至不正确的客户端(即非发送信息的
    发表于 07-17 09:31

    labview TCP客户端

    最近在做一个labview 客户端测试小程序,服务器采用MFC编写,客户端采用TCP侦听函数,通信可以连接,数据也正确,但是服务器端检测
    发表于 06-30 23:15

    qt tcp程序在服务器端发送数据之前能接收客户端发送数据吗?

    写了一个tcp的客户端服务器端,是服务器端客户端发送文件,但是我想在服务器端
    发表于 04-22 20:06

    一个服务器,多个客户端,怎么向指定的客户端数据

    我用labview做服务器,单片机做客户端客户端几百个,怎么区分客户端,给指定的客户发发数据
    发表于 06-01 09:26

    labview怎么实现服务器端一直等待客户端发送数据

    我现在在做labview的服务器端,但是当客户端发送数据结束后,我的服务器端会报错。报错的意思就是说客户
    发表于 08-12 14:34

    怎么用key0,key2控制服务器端客户端知道有数据发送请求的?

    原子用key0,key2控制服务器端客户端有请求数据发送,是如何知道有数据发送请求的,没看明白
    发表于 07-29 04:17

    TCP:多个客户端服务器发送数据

    本帖最后由 埥茬適里瀭叺妏牸 于 2019-8-23 10:27 编辑 就是当多个客户端第一次连接上服务器发送数据没问题,但是途中更改客户
    发表于 08-22 15:05

    Tcp/ip客户端示例:将数据发送到服务器的最佳方法是什么?

    H/WPIC32以太网启动套件2MPLABX3.2,和声1.6AM,我会把正确的数据发送到我的服务器吗?问题是我对Microchip给出的泛型Tcp/ip
    发表于 09-11 12:37

    为什么LWIP的TCP客户端服务器端断开后继续发送数据就无法检测到连接状态?

    发现LWIP的TCP客户端有个BUG,当服务器端开之后,如果还继续发送数据,那就不能检测到连接状态。求助求助
    发表于 10-29 20:26

    DHCP客户端如何将主机名发送到服务器

    有没有人知道,如果DHCP客户端和谐,可以将设备的主机名返回DNS服务器。我很感激服务器在许多情况下把主机名发送客户端。应用程序是当你第一
    发表于 05-01 06:44

    Labview客户端状态获取

    连接数量不是实时读取,如果某个客户端断开连接,需要发送一次数据后才能更新客户端数量,而且同一客户端反复断开连接时
    发表于 11-15 15:02

    监控系统客户端服务端设计

    项目开发报告1 项目简介1.1 概述1.2 开发环境1.3 其他支持1.4 应用界面1.4.1 服务器端1.4.2 客户端1.5 程序使用2 项目开发2.1 搭建基于实验平台数据库2.1.1
    发表于 12-21 07:02

    请问如何处理客户端服务器的写操作?

    我的项目涉及一个 Nucleo-64+X-NUCLEO-BNRG2A1 通过蓝牙与 Android 手机通信。我成功地将数据服务器 (BNRG2A1) 发送到
    发表于 01-04 08:22

    为什么在websocket中将数据手机发送到esp32服务器时会出现错误?

    大家好。为什么在 websocket 应用程序中将数据我的客户端手机发送到 esp32 服务器时会出现这样的错误?代码:W (357344
    发表于 03-02 06:51