数据在网络中的传输过程

在计算机网络当中,数据是怎么样保证准确的从客户端发送到服务器端的,这是本文探究的重点。

下图是本文中使用的网络拓扑图,数据从客户端发送给服务器端。

客户端各层对数据的封装

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。

交换机的交换

交换机收到客户端的报文后,会进行解析,只解析到数据链路层,从中获得目标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   Vlan1Switch#show mac-address-tableMac Address Table
-------------------------------------------Vlan    Mac Address       Type        Ports
----    -----------       --------    -----1    0030.f2c1.2e89    DYNAMIC     Fa2/11    0050.56c0.8801    DYNAMIC     Fa0/11    f830.f9c1.7e09    DYNAMIC     Fa1/1

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

路由器的路由

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

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

Router(config)#do show ip route
Codes: C - connected, S - static, I - IGRP, R - RIP, M - mobile, B - BGPD - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter areaN1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2E1 - OSPF external type 1, E2 - OSPF external type 2, E - EGPi - 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 - ODRP - periodic downloaded static routeGateway of last resort is not setC    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再将数据转发到服务器端。

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


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

扩展

查看域名对应的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.174183.232.231.172
Aliases:  www.baidu.com

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

C:\>tracert 192.168.3.6Tracing route to 192.168.3.6 over a maximum of 30 hops: 1   0 ms      0 ms      0 ms      192.168.1.1002   0 ms      0 ms      1 ms      192.168.3.6Trace complete.

图解数据在网络中的传输过程相关推荐

  1. 数据包在网络中的传输过程详解

    我们当今使用电子设备都离不开网络,通过网络我们可以聊天.玩游戏.看电影都操作. 网络的本质就是交换数据. 本文我们就来看下数据是如何在网络中传输的. 计算机网络模型 现在有两种计算机网络模型,分别为O ...

  2. 读书笔记(随笔2)数据在网络中的传输

    2 数据在网络中的传输 所有的数据对于网络来说都是业务,不同的业务数据对传输的要求不一样, 就需要有不同的 信令协议 来满足它,不同的信令协议对数据的封装和标识提出 了不同的要求,从而又产生了各种 封 ...

  3. 数据在网络中的传输(一)

    最近面试被问到了一些<<计算机网络>>方面的问题,由于之前的工作中很少涉及到,7.8年了前学的了,都基本还给老师了,回答得不太满意.所以这几天又从头学习了一遍<<计 ...

  4. IP数据包在网络中的传输过程

    1. 获取目的IP 2. 判断源IP与目的IP是否在同一网段   -->   比较 IP & Genmask 是否相同 2.1 若在同一网段,则先查询arp缓存中是否有目的ip的mac地 ...

  5. 消息在网络中的传输过程

    PC-A向PC-B传输消息,首先是用户打开消息应用例如QQ,然后给小黑发消息(你吃了吗), 1)在应用层生成数据"你吃了吗(小黑IP)",然后数据传入表示层节点-表示层, 2)在表 ...

  6. 数据在网络中的传输示意图

  7. 浅析网络数据帧在网络中的传输

    文章目录 网络帧的传输 1. 网络的分层 2.网络帧的封装 3. 网络帧的传输 4. 相关疑问 参考材料 网络帧的传输 本文主要简单回顾一下网络数据包的封装.分片.传输以及重新组装的过程,帮助我们理解 ...

  8. 数据在网络中是如何传输的

    更多专业文档请访问 www.itilzj.com 你有想过吗,在计算机网络当中,数据是怎么样保证准确的从客户端发送到服务器端的?中间涉及到了哪些理论? 01 客户端各层对数据的封装 java实现客户端 ...

  9. 数据在网络中的发送和接收过程--简略版(TCP/IP五层结构)

    在应用层上设备A想给IP地址为P的设备B发送信息:(假定已知B的IP) 数据信息从应用层而来,在传输层指定特定的端口号,再将这些数据放到TCP报文或者UDP报文内. 若使用UDP,不论从应用层来的数据 ...

最新文章

  1. angluar ajax实例,Angular服务Request异步请求的实例讲解
  2. java.util.ConcurrentModificationException
  3. 软件设计师 - 算法思想
  4. html5下拉列表多行显示不出来,为什么我这个代码的效果显示不出来?我要显示的是鼠标经过选项出现下拉菜单栏!求大神提点!!!...
  5. 深度学习之RNN、LSTM、GRU篇
  6. 数据结构与算法之-----二叉树(一)
  7. CentOS系统启动过程1-10 详细叙述
  8. 最全java面试题及答案(208道)
  9. 入门系列之基于MATLAB的滚动轴承内外圈复合线性剥落故障动力学建模
  10. 电子邮件收发这样实现!!!
  11. CAD下载与安装(含安装包百度网盘链接)
  12. 关于goole IO大会发布的android M和android studio1.3的更新
  13. 数字信息时代中国面临两个机遇
  14. 计算机系统如何禁止文件删除功能,Win7如何禁止在C盘上安装软件?|win7系统c盘哪些文件是可以删除的...
  15. 微积分的历史(五):发展之泰勒公式(上)
  16. windows录屏html文件,win7系统自带的屏幕录制工具如何打开使用
  17. 广义线性混合模型(GLMM)变量选择
  18. hello world漫游
  19. SSM毕设项目校园书蜀黍易购平台xk9g6(java+VUE+Mybatis+Maven+Mysql)
  20. 课程学习(Curriculum Learning, CL)

热门文章

  1. docker rabbitmq error: touch cannot touch ‘/etc/rabbitmq/rabbitmq.conf‘ permission denied
  2. EMC防护中的滤波电容-为什么放0.1uF和0.01uF电容
  3. 计算机无法完成更新如何处理,Win10更新过程中碰到“无法完成更新”怎么办
  4. poj-2905 The Pilots Brothers' refrigerator
  5. 个人整理可编辑PDF值得一读的电子书大全(持续更新)
  6. Third1: Basic Web applications BASIC NFS services triggering mount | Cloud computing
  7. 阿里云应用身份服务IDaaS新升级,云原生、高安全,极致用户体验
  8. 中科蓝讯 AB32VG1 RISC-V开发板模块评测任务大挑战
  9. 项目管理专用中英文术语词汇
  10. html格式错误检测,HTML格式错误