前言
在这个信息爆炸的时代,计算机网络已经渗透到我们生活的方方面面,从日常工作到娱乐休闲,都离不开网络的支持。而作为程序员,了解网络原理以及使用网络编程是每个程序员不可或缺的一个能力。今天我将为大家分享关初识计算机网络相关的知识。
计算机网络的发展史
要想了解网络原理,就需要先知道现在的网络是如何发展来的。网络发展史大体上可以划分为以下几个阶段:
- 面向终端的计算机网络。这个阶段是从20世纪50年代到60年代,当时计算机还是一种新鲜玩意儿,人们通过各种类型的终端,包括远程终端、拨号终端等,使用不同的物理媒体如电话线、同轴电缆、明线等来进行通信。
- 以共享硬件资源为主的网络。这个阶段是从20世纪60年代到70年代,人们开始意识到硬件资源的共享可以大大提高效率,因此出现了文件服务器、数据库服务器和应用服务器等。
- 以网络协议标准化的计算机网络。这个阶段是从20世纪70年代到80年代,随着标准化工作的不断推进,出现了许多网络协议,如TCP/IP、HTTP等,这些协议使得不同的计算机网络可以相互通信。
- 互联网的诞生和发展。这个阶段是从20世纪90年代至今,互联网的发展大大加快了信息的传播速度,使得人们可以轻松地获取和共享各种信息。
网络互连
网络互连是指将不同的网络连接起来,以构成更大规模的网络系统,实现网络间的数据通信、资源共享和协同工作。这个过程可以包括局域网与局域网的互连、局域网与广域网的互连、广域网与广域网的互连等形式,其目的是为了扩大资源共享的范围,使更多的资源可以被更多的用户共享。
局域网
局域网(Local Area Network,LAN)是指在某一区域内由多台计算机互联成的计算机组,一般是方圆几千米以内。它可以由办公室内的两台计算机组成,也可以由一个公司内的上千台计算机组成。局域网可以实现文件管理、应用软件共享、打印机共享、工作组内的日程安排、电子邮件和传真通信服务等功能,并且局域网是封闭型的,可以通过数据通信网或专用数据电路,与远方的局域网、数据库或处理中心相连接,构成一个较大范围的信息处理系统。局域网主要由网络硬件(包括网络服务器、网络工作站、网络打印机、网卡、网络互联设备等)和网络传输介质,以及网络软件所组成。
局域网内的主机之间能方便的进行网络通信,又称为内网;局域网和局域网之间在没有连接的情况下,
是无法通信的。
局域网组建网络的方式
局域网组建网络的方式主要有以下三种:
- 通过路由器组建本地局域网:这种方式的优点是主机可以动态获取IP地址,不需要手动设置IP地址。但是,内网数据传输效率会受到路由器性能的影响。
- 通过交换机组建本地局域网:特点是主机需要手动设置IP地址,内网数据传输效率受交换机性能的影响。
- 通过网线直连组建本地局域网:这也是一种比较传统的方式,特点也是主机需要手动设置IP地址。它的传输效率在三者中最高,超5类网线传输效率可以达到100M/s,超6类网线传输效率甚至可以达到1000M/s。这种连接方式适合用于主机之间大文件、多批量、数据传送。
广域网
广域网(Wide Area Network,WAN),又称外网、公网,是连接不同地区局域网或城域网计算机通信的远程网。它通常跨接很大的物理范围,所覆盖的范围从几十公里到几千公里,能连接多个地区、城市或国家,或横跨几个洲并能提供远距离通信,形成国际性的远程网络。
广域网的通信子网主要使用分组交换技术,可以利用公用分组交换网、卫星通信网和无线分组交换网,将分布在不同地区的局域网或计算机系统互连起来,达到资源共享的目的。
广域网的特点包括适应大容量与突发性通信的要求、适应综合业务服务的要求、开放的设备接口与规范化的协议以及完善的通信服务于网络管理。
广域网并不等同于互联网,如果属于全球化的公共型广域网,则称为互联网。
所谓 “局域网” 和 “广域网” 只是一个相对的概念。比如,我们有 “天朝特色” 的广域网,也可以看做一个比较大的局域网。
网络通信基础
网络通信是通过网络将各个孤立的设备进行连接,通过信息交换实现人与人,人与计算机,计算机与计算机之间的通信。但是有那么多计算机,究竟如何判断从哪台计算机发送到哪一台计算机呢?这就需要用到 IP 地址来标识。
IP 地址
IP地址是指互联网协议地址,是连接到Internet的设备的编号。它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。
在计算机中,每台电脑都有一个对应的IP地址,IP地址是一个数字列表,在当前IPv4的版本中,IP地址是一个32位的二进制数,分成4个字节,01100100.00000100.00000101.00000110。最常见的表示方法是将这些二进制数用点分十进制表示,共4段,100.4.5.6。
IP地址类型有两种类型,一种是公有地址(全局IP地址),另外一种就是私有地址(专用IP地址)。公有地址是由因特网直接负责,IP地址向因特网提出申请,由此进行访问。私有地址是属于非注册的地址,有专门的机构使用。
特殊 IP
127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1
本机环回主要用于本机到本机的网络通信(系统内部为了性能,不会走网络的方式传输),对于开发网络通信的程序(即网络编程)而言,常见的开发方式都是本机到本机的网络通信。
IP地址解决了网络通信时,定位网络主机的问题,但是还存在一个问题,传输到目的主机后,由哪个进
程来接收这个数据呢?这就需要端口号来标识。
端口号
端口号是网络通信中用于标识服务的整数,可以类比为房屋的“门牌号”。
在网络通信中,主机需要使用一种方式来识别和连接不同的应用程序和服务。为了实现这一目标,每个应用程序都被分配了一个独立的端口号。
端口号有两种类型:逻辑端口号和物理端口号。逻辑端口号用于区分不同的服务,例如HTTP服务的端口号为80,FTP服务的端口号为21等。物理端口号则用于连接物理设备之间的接口,例如ADSL Modem、集线器、交换机、路由器上用于连接其他网络设备的接口等。
一个IP地址的端口通过16bit进行编号,最多可以有65536个端口,端口号范围从0到65535。不同操作系统对临时端口号的分配不同,大多数TCP/IP实现给临时端口号分配1024-5000之间的端口号。0~1023这个范围的端口号通常是系统留作特殊用途,也就是一些常见的服务器使用。例如:
- 22 -> ssh
- 80 -> http
- 443 -> https
- 23 -> telnet
两个不同的进程不能绑定同一个端口号,但是一个进程可以绑定多个端口号。
端口的分配和管理是由操作系统或者特定的网络协议(例如TCP/IP)来控制的。通过使用特定的端口号,不同的应用程序和服务可以在网络上正确地通信。
当知道了从哪台电脑的哪个程序传数据到指定电脑的指定程序了之后,还有一个问题,就是因为传输的数据都是基于二进制的形式传输的,那么如何让对方知道你传输的数据是什么格式并且以这种格式来解析成我们能看懂的数据呢?这就需要使用到我们的协议。
网络协议
网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合。例如,网络中一个微机用户和一个大型主机的操作员进行通信,由于这两个数据终端所用字符集不同,因此操作员所输入的命令彼此不认识。为了能进行通信,规定每个终端都要将各自字符集中的字符先变换为标准字符集的字符后,才进入网络传送,到达目的终端之后,再变换为该终端字符集的字符。当然,对于不相容终端,除了需变换字符集字符外还需转换其他特性,如显示格式、行长、行数、屏幕滚动方式等也需作相应的变换。
网络协议是由三个要素组成:
- 语义,定义了协议中的信息含义。
- 时序,定义了事件的前后顺序。
- 语法,定义了协议信息的格式和传输方式。
网络协议的作用
- 数据传输:网络协议规定了数据在网络中的传输方式和传输速率,使得数据能够在不同的计算机和设备之间进行传输。例如,TCP/IP协议规定了数据传输的流程和格式,使得数据能够在互联网中进行传输。
- 网络管理:网络协议也可以用于网络管理,例如,SNMP协议可以用于网络设备的管理和监控,使得网络管理员能够对网络设备进行远程管理和监控。
- 安全保障:网络协议还可以用于网络安全保障,例如,SSL/TLS协议可以用于加密网络通信,保护数据的安全性。另外,IPSec协议可以用于网络安全隧道的建立,保护网络通信的安全性。
总的来说,网络协议在计算机网络中的作用是保证数据传输的可靠性、效率和安全性,以及实现网络设备的远程管理和监控。
五元组
在 TCP/IP 协议中,用五元组来标识一个网络通信:
- 源IP:标识源主机
- 源端口号:标识源主机中该次通信发送数据的进程
- 目的IP:标识目的主机
- 目的端口号:标识目的主机中该次通信接收数据的进程
- 协议号:标识发送进程和接收进程双方约定的数据格式
我们通过一个例子来理解为什么网络通信需要这些五元组。
假设我从网上买了一个东西,当我完成订单之后,商家就需要将发件人地址、发件人姓名电话以及收件人地址、收件人姓名电话发送给快递公司,那么这个收件人地址就相当于 目的IP ,而只是将快递送到了某个小区还不行,还得知道要送给谁,所以这里的收件人姓名和电话就相当于 目的端口 ,具体使用京东还是中通快递,这个则是属于 协议类型 ,对应的发件人地址、发件人姓名和电话则相当于 源IP 和 源端口。
协议分层
为什么需要协议分层?因为网络通信的场景比较复杂,有很多的问题都需要使用到协议,如果使用一个大的协议去处理这些所有场景的话,那么这个协议的的体积就会非常庞大,就不利于我们的学习和理解,所以在这种情况下就出现了协议分层。
什么是协议分层?
协议分层是一种网络协议的实现方式,它根据网络通信所需的功能和服务,将协议体系结构划分为若干个层次,每个层次负责完成一定的任务,并提供特定的服务。
协议分层的目的是为了简化网络协议的复杂性,提高协议实现的效率和可靠性,同时降低开发成本和维护难度。通过分层,不同层次之间的协议可以独立设计和实现,使得不同类型的应用程序和设备可以在同一网络中通信,实现互操作性。
协议分层具有概念化和结构化的特点,每个层次都有其特定的功能和职责,上层协议调用下层协议,下层协议为上层协议提供服务。不同层次的协议通过接口进行通信,并且每一层都对其下层提供的服务进行抽象和封装。
举个例子:假设我创办了一个公司,公司刚起步的时候,员工就十几个,我一个人就可以管理过来这些员工,但是随着公司规模的不断扩大,公司员工由十几个扩大为一百多个,这个时候光靠我一个人管理公司的所有员工是不现实的,所以这时我就招聘几个中层领导专门负责管理底层员工,而我则只需要管理这十几个中层领导就可以了,这样既可以达到管理的目的也能减轻我的负担。
常见的协议分层结构有TCP/IP协议栈和OSI模型。TCP/IP协议栈将协议分为应用层、运输层、网络层和链路层,而OSI模型则分为应用层、表示层、会话层、运输层、网络层、链路层和物理层。这些层次都有其特定的功能和职责,例如应用层负责应用程序的通信和数据传输,运输层负责端到端的数据传输等。
- 对于使用方来说,并不关心提供方是如何实现的,只需要使用接口即可
- 对于提供方来说,利用封装的特性,隐藏了实现的细节,只需要开放接口即可。
OSI 七层模型
OSI七层模型是一种开放式系统互联通信参考模型,由国际标准化组织提出,旨在使各种计算机在世界范围内互连为网络的标准框架。根据建议X.200,OSI将计算机网络体系结构划分为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
具体而言,物理层负责将数据转换为电子信号,数据链路层负责将电子信号封装成数据帧,并将帧数据发送到网络层,网络层负责决定数据路由,传输层负责提供可靠连接,会话层负责允许用户建立连接,表示层负责协商数据交换格式,应用层为用户应用程序和网络之间的接口,负责发送和接收数据。
每一层负责一项具体的工作,然后数据由高层向低层传送,分别做相应的处理。OSI七层模型的功能和应用非常广泛,它是网络通信的基础之一,也是计算机网络体系结构的重要组成部分。
OSI 模型通常只是出现在教科书上的,而现实中我们比较常用的则是 TCP/IP五层协议。
TCP/IP 五层协议
TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。
-
应用层:负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远
程访问协议(Telnet)等。我们的网络编程主要就是针对应用层。 -
传输层:负责两台主机之间的数据传输。如传输控制协议 (TCP),能够确保数据可靠的从源主机发
送到目标主机。 -
网络层:负责地址管理和路由选择。例如在IP协议中,通过IP地址来标识一台主机,并通过路由表
的方式规划出两台主机之间的数据传输的线路(路由)。路由器(Router)工作在网路层。 -
数据链路层:负责设备之间的数据帧的传送和识别。例如网卡设备的驱动、帧同步(就是说从网线
上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工
作。有以太网、令牌环网,无线LAN等标准。交换机(Switch)工作在数据链路层。 -
物理层:负责光/电信号的传递方式。比如现在以太网通用的网线(双绞 线)、早期以太网采用的的
同轴电缆(现在主要用于有线电视)、光纤,现在的wifi无线网使用电磁波等都属于物理层的概念。
物理层的能力决定了最大传输速率、传输距离、抗干扰性等。集线器(Hub)工作在物理层。
我们还是通过一个例子来理解 TCP/IP 五层模型中各层的作用。
当我们在网上买了一个商品的时候,就需要提供 发件人地址——源IP、发件人姓名和电话——源端口号、收件人地址——目的 IP、收件人姓名和电话——目的端口号等的信息,商家通过这些信息就确定了发货位置和收货位置,并且确定某个快递公司——协议类型,我们就属于是应用层,而这个商家就实现了传输层的作用,确定数据传输的起始位置就属于传输层的作用,当数据传输到快递公司了之后,首先快递公司会先规划路线,看哪条路线距离最短、时间最快,规划路线就属于是网络层的作用,当快递公司确定好路线了之后,就会将这个包裹给快递小哥,而这个路程之间肯定需要经过很多城市,不同城市之间的运输方式也会有不同,两个节点之间的数据传输路线以及数据传输方式就是数据链路层需要做的事情,而物理层则是网线、信号塔等这些硬件设施,当快递到达我们手上之后,如何使用这个商品,也就是我们为什么买这个商品就看我们自己的决定了,应用层则是需要我们程序员需要重点关注的事情。
MAC地址是作用于两个相邻节点之间的数据传输。
网络设备所在分层
- 对于一台主机,它的操作系统内核实现了从传输层到物理层的内容,也即是TCP/IP五层模型的下
四层; - 对于一台路由器,它实现了从网络层到物理层,也即是TCP/IP五层模型的下三层;
- 对于一台交换机,它实现了从数据链路层到物理层,也即是TCP/IP五层模型的下两层;
- 对于集线器,它只实现了物理层;
注意我们这里说的是传统意义上的交换机和路由器,也称为二层交换机(工作在TCP/IP五层模型的下两
层)、三层路由器(工作在TCP/IP五层模型的下三层)。
提到交换机,你可能会问什么是交换机呢?
交换机(Switch)是一种用于电(光)信号转发的网络设备,它可以为接入交换机的任意两个网络节点提供独享的电信号通路。最常见的交换机是以太网交换机,其他常见的还有电话语音交换机、光纤交换机等。
按照通信两端传输信息的需要,交换机能自动把要传输的信息送到符合要求的相应路由上,这种技术称为交换技术。
交换机根据工作位置的不同,可以分为广域网交换机和局域网交换机。广域网交换机应用在数据链路层,能完成信息交换功能的设备在通信系统中。局域网交换机则应用在局域网组网技术中,网络交换机是最为普及的。
说通俗点,大家家里应该都有路由器吧,路由器的网口通常有5个,并且这五个网口的作用是不同的:
- 1个WAN口,用来连接上级路由器
- 4个LAN口,用来连接本地电脑
如果本地电脑很多的话,那么这四个 LAN 口是不够用的,所以就需要使用交换机来连接 LAN 口之后,本地电脑就可以连接这个交换机了。交换机可以扩展网口。
封装和分用
封装和分用描述了网络通信过程中,基本的数据传输流程。
- 不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报
(datagram),在链路层叫做帧(frame)。 - 应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装
(Encapsulation)。 - 首部信息中包含了一些类似于首部有多长,载荷(payload)有多长,上层协议是什么等信息。
- 数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,根据首部中
的 “上层协议字段” 将数据交给对应的上层协议处理
那么我们通过模拟出我向别人发送一个微信消息的过程来为大家讲解关于封装和分用的过程。
发送方
1.应用层
假设我向某人发送一个 “hello”,当发送的时候,这个消息会根据应用层协议也就是程序员规定的协议将这个数据打包成一个应用层的数据包。假设这个应用层协议是这样的。
四个字段,每个字段用 , 分隔开,这样就构成了一个应用层数据包(字符串拼接),上面的几个字段分隔开以及用什么符号分隔开都是可以灵活变化的。当生成了应用层的数据包了之后,就会通过操作系统的 API ,将数据传输给传输层。
2.传输层
当传输层接收到应用层传过来的应用层数据包的时候,传输层也会对数据包进行打包,本质上也是字符串拼接,但是使用的协议是不同的协议。在传输层中典型的协议就是 UDP 和 TCP 协议,这里协议的具体内容我后面会为大家详细讲解。我们这里以 UDP 协议为例。
UDP 报头中的数据是二进制数据, UDP报头 中主要包含了源端口和目的端口信息。当生成了传输层数据包之后,这个数据会继续传输给网络层。
3.网络层
网络层中典型的协议就是 IP 协议。
IP 报头中主要包含源IP和目的IP等重要信息。当生成了网络层数据包了之后,这个数据又会继续交给数据链路层进行传输。
4.数据链路层
数据链路层中典型的协议就是以太网协议。
以太网报头中包含 MAC 地址等重要信息,MAC 地址也是用来描述一个设备在网络上的地址。当生成数据链路层的数据包之后,会继续将这个数据传给物理层进行传输。
5.物理层
当物理层拿到数据链路层的数据包之后,会将该数据转换为二进制数据,并且通过光/电信号传输。
当数据发出之后,因为A和B一般不是直接由网线连接的,中间还需要经过很多的路由器和交换机进行转发。
以上过程就是对数据的封装过程。当B拿到数据之后,就会针对上面的数据进行“分用”处理。
接收方
1.物理层
当接受数据经过物理层的时候,会将拿到的光电信号 -》二进制数据 -》以太网数据,然后再将这个数据传给数据链路层进行处理。
2.数据链路层
通过以太网协议,针对以太网数据进行解析,解析出以太网报头、报尾和以太网载荷,根据这个以太网报头中的 MAC 地址决定将以太网载荷传递给目的地址,也就是网络层。
3.网络层
通过 IP 协议,针对这个数据包进行解析,解析出 IP 报头和 IP 载荷,并且根据 IP 报头中的目标 IP 将 IP 载荷传给传输层。
4.传输层
当经过传输层的时候,会通过 UDP 协议,对数据包尽心解析,解析出 UDP 报头和 UDP 载荷,并且根据 UDP 报头中的端口号将 UDP 载荷传给对应的应用层。
5.应用层
当数据传输到应用层的时候,会通过指定的端口号将数据传输到微信上,然后微信这个程序通过应用层协议对这个数据进行解析,最终取出“hello”并显示到界面上。