专栏首页我是东东强记一次完整的网络通信过程

记一次完整的网络通信过程

全文概要

写完前面几篇对网络硬件设备以及对应工作机制的介绍之后,我觉得有必要再多有一篇博文对网络中的端到端通信过程进行完整的解析,本文对同一网段内、跨网段主机通信两种情形分别列举两个简单示例,分别描述了通信过程中各硬件设备和网络协议的协同工作流程。

通用流程


网络设备之间的通信首先会经过如下两个步骤:

  1. 发送主机应用程序生成数据,准备向外发送一个数据包;
  2. 发送主机(TCP/IP协议栈)判断这个数据包的目的地址是否在同一个网段:本机IP地址和目的IP地址分别与本机子网掩码作按位与操作,结果一致则在同一网段,否则两者分别位处不同网段,针对两种不同情况,通信流程也有明显差异。

注意:网关通常指的是路由器的一个物理端口,此时路由器称为“网关路由器”。路由器转发数据包时不会对它的源IP地址和目的IP地址做修改,只会修改MAC地址。

网内通信


网内通信,即通信双方都位处同一网段中,数据传输无需经过路由器(或三层交换机),即可由本网段自主完成。

以下图拓扑为例:

在第一节的两个步骤基础上,若目的主机与发送主机属于同一网段,假设发送主机的ARP表中并无目的主机对应的表项,则发送主机会以目的主机IP地址为内容,广播ARP请求以期获知目的主机MAC地址,并通过交换机(除到达端口之外的所有端口发送,即洪泛(Flooding))向全网段主机转发,而只有目的主机接收到此ARP请求后会将自己的MAC地址和IP地址装入ARP应答后将其回复给发送主机,发送主机接收到此ARP应答后,从中提取目的主机的MAC地址,并在其ARP表中建立目的主机的对应表项(IP地址到MAC地址的映射),之后即可向目的主机发送数据,将待发送数据封装成帧,并通过二层设备(如交换机)转发至本网段内的目的主机,自此完成通信。

具体分析过程参见此篇

网际通信


网际通信,即通信双方分处不同网段,数据传输需经过路由器(或三层交换机)才能完成不同网段的通信。

以下图拓扑为例:

在第一节的两个步骤基础上,若目的主机与发送主机不在同一网段,则需进行以下五个步骤:

  1. 假设发送主机的路由表中也无目的主机所在网段对应的表项,发送主机会将此数据包先发送至默认网关,由默认网关完成转发,假设发送主机的ARP表中并无默认网关对应的表项,则进行上一节中相同的ARP过程以获知默认网关MAC地址,之后根据此MAC地址,本机将数据包封装成帧后发送给默认网关。值得注意的是,此数据包的目的MAC地址为默认网关的MAC地址,而目的IP地址仍为目的主机的IP地址,即:源、目的MAC地址在帧转发过程中会被修改为本跳和下一跳的MAC地址,而源、目的IP地址则始终不变;
  2. 假设两个通信网段仅通过此默认网关连接(两个网段之间只有默认网关这一跳),默认网关提取数据包的目的IP地址,并查找路由表对应表项,通过与每个表项的掩码(Genmask)进行按位与操作,得到的结果如果与对应目的网段(Destination)相同,在本例中将会找到一个满足要求的路由表项,并发现此表项指示的下一跳(Gateway)的IP地址为0.0.0.0,即说明目的主机属于与该网关的某个端口(由Iface指示)直连的网段,会向该端口转发此数据包,但在此之前,假设网关的ARP表项中并无目的主机对应的表项,那么它还是需要向目的网段广播ARP请求以获知目的主机的MAC地址,并随后以此MAC地址作为目的MAC地址,以路由表项Iface指示的端口的MAC地址为源MAC地址,将数据包封装成帧向目的主机发送。
  3. 假设两个通信网段之间包含不止一跳,那么默认网关进行步骤2类似过程,重新封装数据包转发到下一个网关;
  4. 直到网关发现目的网段与本机的某个端口直连,再行获取目的主机的MAC地址,并将数据包重新封装成帧发送到目的主机网卡;
  5. 目的主机协议栈验证目的IP地址是自身的IP地址后交付给上层应用,自此完成通信。

具体分析过程参见此篇

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 转发表(MAC表)、ARP表、路由表总结

    计算机网络中一个关键步骤在于通信路径上不同节点对于流经本节点的数据包转发,常见的交换设备主要是交换机(第二层、三层)和路由器(第三层),在实际运行时,它们各自维...

    我是东东东
  • 细说子网

    最近闲来无事,抄起本《Wireshark网络分析就是这么简单》想了解下数据包粒度(Packet-level)的网络测量及分析方法,书开篇提出一个面试题,与子网掩...

    我是东东东
  • 交换机与路由器详细比较

    作为计算机网络中最重要的两种数据包转发设备,交换机和路由器在功能设计方面既存在本质差别,又包含诸多相似之处,本文从两种设备的工作原理出发,详细介绍了它们之间的种...

    我是东东东
  • 从C#到TypeScript - 类型

    从C#到TypeScript - 类型 TypeScript和C#一样是微软搞出来的,而且都是大牛Anders Hejlsberg领导开发的,它们之间有很多共同...

    用户1147588
  • 糟糕了,我的Jetson Nano为啥点不亮?

    If you cannot boot your Jetson Nano Developer Kit, the problem may be with your ...

    GPUS Lady
  • 建网站需要的东西和技术

    FHYC
  • network is unreachable centos无法连接外网(或unknown host baidu.com)

    转载请务必注明原创地址为:http://dongkelun.com/2018/01/17/networkIsUnreachable/

    董可伦
  • xmake从入门到精通7:开发和构建Cuda程序

    xmake是一个基于Lua的轻量级现代化c/c++的项目构建工具,主要特点是:语法简单易上手,提供更加可读的项目维护,实现跨平台行为一致的构建体验。

    ruki
  • deepin系统下如何设置wifi热点(亲测有效)

    deepin系统下如何设置wifi热点(亲测有效) deepin wifi ap linux 热点 首先必须吐槽一下linux下设置wifi太累了。。。。来来回...

    marsggbo
  • 127.0.0.1 vs 0.0.0.0 vs localhost vs 主机IP

    说明:上一篇写完《当你输入URL到页面显示经历了什么--URL到IP地址》之后读了好几本关于网络的书(当然都是跳着读),发现期初想的太简单,还是遗漏了许多,后面...

    前端黑板报

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动