白话计算机网络通信过程

用户头像
WB
关注
发布于: 2020 年 05 月 10 日
白话计算机网络通信过程

引述

由于年后一直忙着产品交付,每天忙的焦头烂额,要么解bug,要么补文档,导致没有时间和精力维护公众号。目前,产品交付已经告一段落,终于有时间喘口气更新文章了。



今年由于疫情原因,团队中陆续有同事离职和转岗,使得软件中的很多模块需要重新分配人员进行开发和维护。leader给我分配了一些新业务的开发和维护工作,同时也把以太网应用层协议栈的开发和维护工作交给了我。



本周与同事交接了协议栈的工作。我通过阅读协议源码和相关文档,同时又找了一些计算机网络的资料系统学习了几天,这篇文章将我学到的计算机网络的知识做个总结。

什么是网络通信

谈到网络通信,很多人第一反应都会想到TCP/IP协议族,七层网络模型等专业术语。本文也包含这些术语,但既然是白话计算机网络,我会尽可能形象的描述计算机网络通信的过程。



现如今,人们的生活离不开智能手机、电脑等硬件,也离不开微信/支付宝等软件。



其中,手机和电脑是进行网络通信的硬件载体,例如:网卡/射频天线/wifi模块等。微信和支付宝则是网络通信的软件载体,人们操纵软件进行的各种操作大多需要与后台服务器进行数据交互。



那客户端和服务器是如何进行数据的发送与接收呢?



接下来,我将白话解释一下数据的发送和接收流程,图片与文字描述结合看效果更好。



数据发送的流程

(1)用户在主机A中输入“123”,并点击“发送”按钮。该软件会根据开发人员定义的应用层协议将“123”进行打包,接着进入传输层。



(2)传输层会将应用层发来的数据放入paylaod中,标明该软件所占用的计算机端口号,经过传输层协议打包后的数据被称为data segment(数据段)。



你是否还记得socket编程时,有一个结构体的成员变量需要端口号吗?没错,就是它,端口号指明数据来源于哪个软件。



(Note:一台计算机能够同时运行多个软件,当计算机从网络中收到新数据时,计算机能够根据传输层协议中的端口号判断该数据属于哪个软件)。



(3)数据段打包后进入网络层,该层的主要目的是添加源IP地址和目标IP地址,这是为了表明数据的起始地址和目的地址。经过网络层协议打包的数据被称为data packet(数据包)。



(4)接着进入数据链路层,该层的作用就是将IP数据包前面加上MAC地址,组成data frame(数据帧),并整个数据帧添加开始头和结束头。



(5)数据帧会被网卡以数据流的方式发往网络中



此外,由于数据在网线中以模拟信号的方式传输,因此在彻底发出去时会利用modem(猫)将数字信号调制成模拟信号。



如果你学习过C语言,你可以把网络协议当作结构体。以下面定义的结构体为例,当完成appLayer_protocol定义的变量的赋值后,把该变量放入transLayer_protocol的payload中就算传输层协议打包完成了。



按照下面定义的结构体一层层的赋值,等效于数据被一次次的被不同协议打包。

struct appLayer_protocol
{
uint16 serviceID;
uint8 handleID;
void* payload;
};

struct transLayer_protocol
{
uint16 portNum;
void *payload;
};

struct netLayer_protocol
{
char addr[32];
void *payLoad;
};

struct dataLinkLayer_protocol
{
char mac_addr[32];
uint32 start_flag;
uint32 stop_flag;
void *payload;
};




数据接收流程

数据接收的流程与发送相反,即主机从网络中获取到数据后,一层层的从协议中将数据解析出来,向上逐层传递。



(1)当计算机从以太网接收到数据时,modem(猫)会首先对模拟信号进行解调,将其转化为数字信号。



(2)数据链路层会识别数据流的开始头和结束头,并解析数据帧,将其中包含的数据包传给网络层。



(3)网络层判断数据包中的目的IP地址,判断该数据包是否发给自己。如果目的IP地址与自身IP不一致,则丢弃。反之,将数据解析并向上传递给传输层。



(4)传输层识别出数据中的端口号,并找出该端口号对应的软件,之后将解析出的数据传给该软件,该软件中的应用层协议将会对该数据进行解析和处理。



至此,数据的一次发送和接收流程完美结束。说白了,网络世界的数据传输全部依靠网络协议,而这些网络协议均是国际标准,因此计算机才能够彼此发送和接收数据。

总结

本篇文章主要是在讲计算机之间的TCP/IP通信,而这也是如今网络世界应用的最为广泛的网络协议。



现如今,很多程序员在工作中主要负责业务开发,很少涉及网络协议的相关知识,如有需要直接调用封装好的API即可。因此,他们对于网络协议并不熟悉,但计算机网络作为程序员的基础知识还是有必要掌握的,它能帮助我们程序员更好的理解自己在做什么。



此外,网络通信的过程大致相似,如果你正在学习其他通信协议,例如CAN协议,也可以参考本文,会对你有所帮助的。



发布于: 2020 年 05 月 10 日 阅读数: 39
用户头像

WB

关注

车联网,AutoSar,功能安全,Linux 2018.12.15 加入

还未添加个人简介

评论

发布
暂无评论
白话计算机网络通信过程