目录一、网络基础概念1.1 网络发展1.2 初识协议1.3 协议分层1.3.1 OSI七层模型1.3.2 TCP/IP 协议栈1.3 再识协议1.4 协议和操作系统的关系1.5 什么是协议1.6 网络传输基本流程1.6.1 局域网通信封装的过程解包和分用的过程1.6.2 跨网络通信认识 ip 地址Mac vs IP个人主页矢望个人专栏C、Linux系统编程、Linux网络编程、C语言、数据结构、Coze-AI、MySQL一、网络基础概念1.1 网络发展网络的发展本质上是一场关于“连接”的扩张史。它始于1969年美国军方阿帕网ARPANET的四个节点最初只为冷战背景下分散指挥系统的科研通信80年代TCP/IP协议的确立让它像“通用语言”般统一了全球散落的局域网迈出走向公众的第一步。90年代万维网WWW和浏览器的发明则用图文界面拆掉了技术高墙让普通人也能点击冲浪此时网络仍是“信息高速公路”主要传递静态页面和邮件。进入21世纪移动通信与智能手机将网络从桌面解放渗透进生活每个角落催生出社交、电商、短视频等动态交互生态网络变为“生活基础设施”。而如今云计算、物联网和5G/6G正编织起万物智联的网络它不再仅是人与人的连接更是人与物、物与物的智能协同从传递信息转向重塑社会运行方式一个虚拟与现实深度融合的数字文明时代已悄然开启。总结一句话计算机是人的工具人要协同⼯作注定了网络的产生是必然的。1.2 初识协议协议是一种约定例如两个人约定用0表示他不这么认为用1表示他这么认为这样就定好协议了。计算机之间的传输媒介是光信号和电信号。通过 “频率” 和 “强弱” 来表示0和1这样的信息。要想传递各种不同的信息就需要约定好双方的数据格式。想要两台主机相互通信只约定好协议还不够例如定好了协议但是你用频率表示01我用强弱表示01就好比我用中国话你用葡萄牙语一样虽然大家可能遵守⼀套通信规则但是语言不同即便是订好了基本的协议也是无法正常通信的。所以完善的协议需要更多更细致的规定并让参与的人都遵守。因此在国际上就会有很多定制协议的组织或者公司站出来例如IEEE电气电子工程师学会、ISO国际标准化组织、ITU国际电信联盟等等。1.3 协议分层协议本质也是软件在设计上为了更好的进行模块化、解耦合它也是被设计成为了层状结构。任何问题都可以通过添加一层软件层来解决。上图中协议只有两层语言层和通信设备层。分层可以实现解耦合让软件的维护成本更低。当我们的主机A想通过网络向主机B通信的时候会产生很多问题如下图例如你想向某个平台发送消息那么这个消息至少要先到达你家的路由器吧所以就有了问题一如何把数据在两个相邻设备之间进行传递而数据走向目的地的路径不止一条甚至路径繁多如何保证到达目标主机。所以就有了问题二目标主机定位和选择的问题。如果路上经过某个节点的时候这个节点的设备坏了怎么办。所以就有了问题三如果出现数据丢失的情况怎么办解决了这三个问题数据就可以从主机A跨网络到达主机B了。保证数据从主机A跨网络到达主机B是手段想要到达的目的是使用这个数据。所以就有了问题四如何处理这个数据呢解决完这四个问题才能达到网络通信的目的才能解决人的问题个人计算机内部也是网络结构但是它们之间的相互通信为什么不会产生问题呢因为它们之间的距离近彼此之间可以直接相连所以没有这些问题。但是两台主机通过网络通信就会产生这些问题根本原因就是物理距离变远了。这些问题的解决可以通过制定协议解决所以协议本质上是一种解决方案。如上一层协议解决一个问题这样分层就可以解耦合。网卡层解决如何把数据在两个相邻设备之间进行传递的问题互联网层解决目标主机定位和选择的问题传输层解决数据丢失的问题应用层解决处理数据的问题。1.3.1 OSI七层模型如上就是OSI七层参考模型。OSI的七层模型标准定的非常好只不过有些层在其它技术人员实现的时候没办法做进操作系统所以就减成了四层或五层典型的如TCP/IP协议栈。1.3.2 TCP/IP 协议栈TCP/IP五层(或四层)模型常被叫做TCP/IP协议栈。TCP/IP通讯协议采用了五层的层级结构每一层都呼叫它的下一层所提供的网络来完成自己的需求。物理层负责光/电信号的传递方式。比如现在以太网通用的网线双绞线、早期以太网采用的同轴电缆现在主要用于有线电视、光纤现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等。集线器Hub工作在物理层。数据链路层负责设备之间的数据帧的传送和识别。例如网卡设备的驱动、帧同步就是说从网线上检测到什么信号算作新帧的开始、冲突检测如果检测到冲突就自动重发、数据差错校验等工作。有以太网、令牌环网无线LAN等标准。交换机Switch工作在数据链路层。网络层负责地址管理和路由选择。例如在IP协议中通过IP地址来标识一台主机并通过路由表的方式规划出两台主机之间的数据传输的线路路由。路由器Router工作在网络层。传输层负责两台主机之间的数据传输。如传输控制协议TCP能够确保数据可靠的从源主机发送到目标主机。应用层负责应用程序间沟通如简单电子邮件传输SMTP、文件传输协议FTP、网络远程访问协议Telnet等。我们的网络编程主要就是针对应用层。数据链路层解决如何把数据在两个相邻设备之间进行传递的问题网络层解决目标主机定位和选择的问题传输层解决数据丢失的问题应用层解决处理数据的问题。1.3 再识协议TCP/IP协议的本质是一种解决方案TCP/IP协议能分层前提是因为问题本身能分层。1.4 协议和操作系统的关系操作系统是使用C语言汇编语言写的协议栈的部分是被设计到了操作系统内核中的所以协议栈本身也是C语言写的。因此网络也是操作系统的一部分。如上图网卡就是底层硬件数据链路层在驱动程序中网络层和传输层这两层是被集成在内核中的应用层在操作系统上层由用户实现。传输层最著名的协议是TCP网络层最著名的协议是IP而传输层和网络层这两层是现在内核中所以TCP、IP是核心因此把整个协议整体统称为TCP/IP并不过分。所有的主机上面安装的操作系统可以不同实际情况也是这样但是所有的主机上面的协议栈必须按照标准进行相同的实现这就是为什么不同的系统、主机之间可以相互通信。1.5 什么是协议操作系统可以不同但协议必须相同对于协议的理解我们可以单独抽出一层如上图我们抽出传输层假设在这一层定义一个struct protocol结构体双方约定都定义这样的结构体类型这样传输层传递给另一个主机的时候这个主机就可以分析出里面的数据。所以协议相同也可以理解成代码相同数据类型相同。在内核角度对协议的朴素理解协议的本质就是结构体假如你在快递软件买了一个物品你想要的是一个物品但是你收到的是物品快递单子这个快递单子将来就叫做协议报头。它上面会记录各种信息就像快递单子上一样记录着地址姓名等各种信息。这些信息可以使用结构体存储起来例如struct protocol header {...};所以协议报头本质就是结构体变量将来主机收到的也是协议报头数据也就是报文。下面是Linux内核中的以太网帧报头// include/uapi/linux/if_ether.hstructethhdr{unsignedcharh_dest[ETH_ALEN];// 目标MAC地址6字节unsignedcharh_source[ETH_ALEN];// 源MAC地址6字节__be16 h_proto;// 上层协议类型0x0800IP, 0x0806ARP};关于协议的朴素理解所谓协议就是通信双方都认识的结构化的数据类型。1.6 网络传输基本流程1.6.1 局域网通信以太网和令牌环网就是具体的局域网。两台主机在同一局域网中是可以直接进行通信的。原理类似上课同学们上课都可以听到。每台主机在局域网上要有唯一的标识来保证主机的唯一性mac地址它占48比特位由硬件固定一张网卡一个mac地址。Linux上可以通过ifconfig查询Windows上可以通过ipconfig /all查询。如上图主机A想要给主机E发消息源mac帧是MacA目的mac帧是MacE在这个过程中所在局域网的主机都可以收到这个消息但是这些主机发现目的mac帧和自己的不一样就会将这个消息丢弃掉这个丢弃的过程发生在物理层和数据链路层下两层上层根本感知不到。只有mac帧是MacE的主机可以收到消息并将消息传递给上层。当教室很安静的时候老师说的话都可以听清楚但是当教室很乱的时候自己说的话都可能听不清楚这时候就发生了碰撞。以太网也存在碰撞称为以太网碰撞域。任何主机都能进行碰撞检测原理就像你自己可以听到自己说话但如果你自己听到你的话和你说的不一样时就可以判断发生碰撞了。当主机发现发生碰撞之后就会执行碰撞避免算法也就是主机在接下来的一段时间不发消息。这个时候其它主机就可以趁空发送了。局域网通信就是基于碰撞检测和碰撞避免的不断重试的过程。技术没有好坏之分关键在于如何用上面的原理也可以被用来瘫痪局域网也就是通过某种工具绕过协议栈不停的向局域网中发送垃圾数据时刻产生碰撞让那些主机都执行碰撞避免算法。从系统视角看待上面的碰撞检测、碰撞避免就是为了保证任一时刻局域网只能由一个主机使用也就是局域网就是共享资源、临界资源我们要保证它的原子性。令牌环网也一样它是有一个唯一性的数据叫做令牌只有持有令牌的主机才可以在局域网中发消息没有持有的主机不准发消息这也保证了局域网的原子性。从系统角度来看这是事先加锁保证原子性的机制。我们上面的例子中主机A为什么要给主机E发消息呀是因为用户想要在主机A和主机E之间通信所以如下图用户在上层想要把数据发出去需要贯穿协议栈而其中每层都有协议所以当进行上述传输流程的时候就要进行封装和解包。其中上层传过来的数据叫做有效载荷而本层会在有效载荷前面加上本层的报头。如上图封装的过程就是入栈的过程。而解包的过程就是出栈的过程。所以才把TCP/IP协议叫做协议栈。封装的过程同层之间逻辑上认为它们可以直接通信因为这一层发送的报文与同层收到的相同。明确一下在不同层的报文的叫法数据链路层叫做数据帧网络层叫做数据报传输层叫做数据段应用层叫做请求与应答。协议本质是一个结构体类型所以报头也就是结构体变量每一层都会在报文前添加本层的报头。所以产生的报文需要在内核中找个缓冲区保存起来。以我们之前的图为例演示封装的过程如上图当要封装本层的报头的时候指针就指向报文的前面然后通过sizeof(结构体变量)提前开辟出空间将结构体变量拷贝进去。所以封装报头的本质其实就是在报文头部拷贝结构体变量下图为数据封装的过程解包和分用的过程从接收报文的主机角度来看整个过程是自底向上贯穿协议栈的。在解包和分用的过程中面临的第一个问题就是报头和有效载荷分离的问题。如上图每层之间都提前约定好了协议解包的时候就通过指针加上sizeof(结构体变量)就可以直接分离报头和有效载荷。当然原理很简单现实也面临其它问题。有的协议报头是固定的有的协议报头是可变的所以这时候就需要在结构体中标注清楚那里是报头那里是有效载荷。解决了上面的这个问题就解决了解包的问题。由于协议栈的每一层都有很多的协议通过之前的图片我们也可以看出来尤其是应用层协议非常多。所以在自底向上贯穿协议栈时在本层协议交付给上层时本层协议是如何知道自己应该把有效载荷交付给上层的哪一个协议呢协议内部是会标注自己应该交给上层的哪一个协议的所以问题就解决了至于协议是如何知道自己应该交给谁的这个问题答案是在封装的时候上层的XXX协议就告诉了下层协议它是谁因此下层协议就在封装的时候标记了自己在分用时应该交给上层的哪一个协议。因此这个时候就解决了分用的问题。下面是数据分用的过程。是一棵倒转的多叉树。1.6.2 跨网络通信认识 ip 地址IP协议有两个版本IPv4和IPv6。IP地址是在IP协议中用来标识网络中不同主机的地址。对于IPv4来说IP地址是一个4字节32位的整数。对于IPv6来说IP地址是一个16字节128位的整数。以下默认讲述IPv4。通常也使用 “点分十进制” 的字符串表示IP地址例如192.168.0.1用点分割的每一个数字表示一个字节范围是0 - 255。查询ip地址Linux:ifconfigWindows:ipconfig /all。IP侧重点更多的是标识公网中唯一一台主机。IP能够提供主机定位和路径选择的能力例如通过学生学号找到具体学生。Mac vs IP既然Mac地址能够标识主机的唯一性那为什么还要有IP地址呢西游记大家都看过唐僧一直有一套固定不变的地址源地址东土大唐目的地址西天。除此之外他每经过一个地方都会介绍说上一站地址是哪里这一站地址就到这里了。这也是一套地址不过这套地址一直在变化。在上面的例子中固定不变的地址就是IP地址一直在变化的地址就是Mac地址。IP地址的目的地址西天指引着唐僧规划路线合理的改变Mac地址所以IP地址提供长远目标是路径选择的依据Mac地址是当前或者下一跳的地址解决的是局域网转发的问题。跨网络通信流程图如上图主机A封装的过程和局域网相同不过跨网络通信时就会添加一个路由器角色它处于网络层所以封装好的报文会先进行解包分用到达路由器然后路由器找到目的地址位于的局域网在对报文进行封装交给目标主机网卡。再次封装时报文可能和之前解包的不同。然后到达目标主机后主机B收到的网络层之上的报文和主机A封装的相同。详细流程上层交付下来的数据到达网络层之后网络层通过检查目的IP地址和本局域网的IP就能够知道这个IP是本局域网的还是不是本局域网的。对应报文如果不是本局域网的主机网络层就可以将报文路径选择转发给路由器。网络层具有寻址、路径选择等功能。如上图上层交付的报文到达主机A的网络层后发现报文的目的IP地址不是当前局域网于是在交付给数据链路层后它封装的报头的目的Mac地址变成了路由器的一端的Mac地址macleft这样报文就到达了路由器然后经过路由器的解包、寻址就找到了报文要传递的主机的Mac地址然后路由器就交付给数据链路层由它封装报头报头的目的Mac地址就是macB了这样就在目的局域网中传递给了目标主机。上面就是详细流程此时你就会发现如上图网络层大家收发的都是同一种报文在早期的时候是局域网先出现的这个时候各个国家有自己的标准各自的标准不同虽说都能标识自己的主机但也仅限自己所在局域网内通信但是全球通信是绝对不可能的。也就是说局域网标准并不统一标准不同实现方式也不同。这就阻碍了互联网的发展。但在计算机世界中任何问题都可以通过添加一层软件层来解决所以网络层这一软件层屏蔽了底层硬件的差异让大家都能看到同一种网络IP网络所以**IP网络的意义还有统一互联网的通信标准路由器是实现IP通信的底层的最重要的硬件**Mac地址和硬件强相关所以它不适合用来互联网通信而使用IP地址进行互联网通信本质上也是一种解耦合Mac地址全球唯一这话没错但是Mac地址不适合用来全球通信它很难做到它最大的作用还是在局域网内标识一台主机的唯一性IP地址在整个路由过程中一直不变Mac地址一直在变。目的IP是一种长远目标Mac是下一阶段目标目的IP是路径选择的重要依据mac地址是局域网转发的重要依据。总结以上就是本期博客分享的全部内容啦如果觉得文章还不错的话可以三连支持一下你的支持就是我前进最大的动力技术的探索永无止境! 道阻且长行则将至后续我会给大家带来更多优质博客内容欢迎关注我的CSDN账号我们一同成长(▽)