目录
一. 了解网络
1.1 什么是网络
在计算机领域中,网络是信息传输、接收、共享的虚拟平台,通过它把各个点、面、体的信息联系到一起,从而实现这些资源的共享。或者更为详细的说,网络是指将多台计算机或者设备通过通信线路、传输线路和网络设备连接起来,形成一个资源互通和相互通信的整体。
1.2 网络发展
- 独立阶段:各台主机之间相互独立
此时数据传输,是通过物理设备(如数据线、磁带、网盘)将设备连接在一起,从而实现数据传输。
- 网络互联阶段:通过网络将设备连接在一起
此时数据传输,变成了通过网络,将资源在网络之间传递,实现数据传输。
1.3 网络分类
此处按照网络覆盖范围,大体可以将网络分为局域网(LAN)、城域网(MAN)、广域网(WAN)。
局域网(LAN):局域网是指在一个相对较小的区域范围内建立的计算机网络。它通常覆盖一个办公楼、学校或者是家庭等局部区域。局域网的主要特点是传输速度快、延迟低,组网开销低、并且用于连接同一组织内部的计算机和设备。例如,一家公司内部多台电脑通过路由器或交换机连接在一起形成的网络就是局域网。
城域网(MAN):城域网是指连接位于同一个城市或者地理范围内的不同机构、公司或校园网络的计算机网络。城域网的覆盖范围比局域网稍广,它可以通过光纤、无线电或其他传输介质来连接各个网络设施。城域网的主要特点是传输距离较长,覆盖范围广,一般用于满足互联网接入的需求或者连接企事业单位之间的网络通信。
广域网(WAN):广域网是指跨越较大地理范围的计算机网络。它通常由多个局域网或城域网互相连接而成。广域网可以覆盖多个城市、省份甚至国家之间的分支机构或办公地点,并且利用互联网等公共网络进行数据传输。广域网允许远程地点的计算机和用户之间实现高速、可靠的连接,以满足远程办公、数据共享和协作等需求。
二. 协议
协议是一种约定或者规定。用于指导多方在特定情况下的行为和相互之间的关系。
在网络中,为了确保数据传输的稳定性、高效性,实现互联互通,也定义了属于网络的协议-----网络协议。那为什么要存在网络协议呢?以及网络协议解决了什么问题?
我们可以看到,随着网络的发展,客观事实是主机之间距离越来越远了,这就产生了问题:
- 如何使用数据的问题
- 可靠性问题
- 主机定位问题
- 数据包局域网转发的问题
那我们就需要一种解决方法来解决这些问题。即我们的网络协议,也就是说,网络协议是一种解决方案。
在实际生活中,网络协议是按层划分的。为什么呢?是因为这样层与层之间是松耦合的,方便维护与随时替换。
三. 网络模型
3.1 OSI七层模型
• OSI(Open System Interconnection,开放系统互连)七层网络模型称为开放 式系统互联参考模型,是一个逻辑上的定义和规范;
• 把网络从逻辑上分为了7层. 每一层都有相关、相对应的物理设备,比如路由器,交换机;
• OSI 七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输;
• 它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚, 理论也比较完整. 通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯;
OSI(Open Systems Interconnection)七层模型每一层具有特定的功能和职责。下面是对OSI七层模型各层的详细解释:
- 物理层(Physical Layer):物理层是最底层的一层,它负责传输数据的物理介质,如电缆、光纤等。物理层的主要任务是转换比特流(bits)为信号,并控制传输介质的物理连接。
- 数据链路层(Data Link Layer):数据链路层负责将物理层传输的原始数据流转换为帧(Frame),并提供可靠的点对点数据传输。它在通信实体之间建立了逻辑连接,并通过差错检测和纠正机制来保证数据的可靠性。
- 网络层(Network Layer):网络层通过IP(Internet Protocol)地址识别不同主机和网络之间的路径选择,以实现数据包的路由和转发。它负责将数据分割为数据包,并通过寻址、路由和流量控制等机制来确保数据的正确传输。
- 传输层(Transport Layer):传输层负责提供端到端的可靠、无差错的数据传输服务。它通过协议(如TCP、UDP)和端口号来实现进程之间的通信,并提供流量控制、拥塞控制和错误恢复等功能。
- 会话层(Session Layer):会话层为网络中两个应用程序之间建立和维护通信会话,并管理会话的控制和同步。它提供了会话的建立、维护和终止,以及数据传输的同步点标记和恢复机制。
- 表示层(Presentation Layer):表示层负责数据的格式化和表示,确保不同系统之间的数据能够正确解释和理解。它处理数据的加密、压缩和转换等操作,以便于应用层的交互和共享。
- 应用层(Application Layer):应用层是最高层也是最接近用户的一层,它提供了用户与网络服务的接口。应用层包含了各种网络应用和协议,如HTTP、FTP、SMTP等,用于实现特定的网络功能和服务。
具体可以看下图:
3.2 IP/TCP五层(或四层)模型
其实在网络角度,OSI 定的协议 7 层模型其实非常完善,但是在实际操作的过程中,会话层、表示层是不可能接入到操作系统中的,所以在工程实践中,最终落地的是 5 层协议(物理层我们考虑的比较少,我们只考虑软件相关的内容. 因此很多时候我们直接称为TCP/IP 四层模型)。
TCP/IP 是一组协议的代名词,它还包括许多协议,组成了 TCP/IP 协议簇. TCP/IP 通讯协议采用了 5 层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。
- 物理层: 负责光/电信号的传递方式. 比如现在以太网通用的网线(双绞 线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤, 现在的 wifi 无线网使用 电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗 干扰性等. 集线器(Hub)工作在物理层.
- 数据链路层: 负责设备之间的数据帧的传送和识别. 例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作. 有以太网、令牌环网, 无线 LAN 等标准. 交换机(Switch)工作在数据链路层.
- 网络层: 负责地址管理和路由选择. 例如在 IP 协议中, 通过 IP 地址来标识一台 主机, 并通过路由表的方式规划出两台主机之间的数据传输的线路(路由). 路由器(Router)工作在网路层.
- 传输层: 负责两台主机之间的数据传输. 如传输控制协议 (TCP), 能够确保数据 可靠的从源主机发送到目标主机.
- 应用层: 负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等. 我们的网络编程主要就是针对应用层.
OSI七层模型与IP/TCP五层(或四层)模型对比:
一般而言
• 对于一台主机, 它的操作系统内核实现了从传输层到物理层的内容;
• 对于一台路由器, 它实现了从网络层到物理层;
• 对于一台交换机, 它实现了从数据链路层到物理层;
• 对于集线器, 它只实现了物理层;
所以可以知道,在模型中越在高层的一般会兼容下层的功能。
3.3 网络与OS之间的关系
3.4 再识协议
下面来看一个图:
问题:主机 B 能识别 data,并且准确提取 a=10,b=20,c=30 吗?
回答:答案是肯定的!因为双方都有同样的结构体类型 struct protocol。也就是说, 用同样的代码实现协议,用同样的自定义数据类型,天然就具有”共识“,能够识别 对方发来的数据,这不就是约定吗?
站在语言角度,关于协议的朴素理解:所谓协议,就是通信双方都认识的结构化的数据类型。
因为协议栈是分层的,所以,每层都有双方都有协议,同层之间,互相可以认识对 方的协议。
四. MAC地址
MAC帧地址是Media Access Control Address的缩写,也称为物理地址或硬件地址。它是一个用于在局域网中唯一标识网络适配器(如网卡)的48位二进制数。每个网络适配器都有一个唯一的MAC地址,它由厂商在生产时烧录到适配器中。MAC帧地址用于在局域网中寻找目标设备,它是数据链路层的一部分,用于将数据包从源设备传输到目标设备。在以太网中,MAC地址是数据包在局域网中传输所必需的信息。
结构: MAC地址的结构分为两个部分:
OUI部分(Organizationally Unique Identifier):占24位(前3个字节)。由IEEE(电气和电子工程师协会)分配给网络设备制造商,用来标识设备制造商的唯一性。
设备ID部分:占24位(后3个字节)。由制造商分配给具体的设备,用来标识同一厂商生产的不同设备。
作用:假设我们有两台计算机,分别是主机A和主机B,它们需要通过一个以太网交换机进行通信。
主机AMAC地址:
00:1A:2B:3C:4D:5E
主机BMAC地址:
08:76:5F:4E:3D:2C
现在,假设主机A想要向主机B发送数据。在以太网帧中,数据包含了源MAC地址和目标MAC地址,以确保数据被正确地发送到目标设备。
- 数据包构成:
- 源MAC地址:
00:1A:2B:3C:4D:5E
(主机A的MAC地址)- 目标MAC地址:
08:76:5F:4E:3D:2C
(主机B的MAC地址)当主机A准备发送数据时,它会将数据包封装在以太网帧中,并在帧头部分配源MAC地址和目标MAC地址。交换机在接收到这个数据帧后,会检查目标MAC地址,然后决定将数据帧转发给连接在它的哪个端口上的设备(在这个例子中,是主机B)。
这个过程保证了数据的准确传输,因为每个设备的MAC地址是唯一的,并且以太网交换机能够根据MAC地址来决定数据包的流向。这种方式比广播或者简单的数据包转发更高效,因为它允许网络设备直接与目标设备进行通信,而不是向所有设备广播数据。
五. 网络传输基本流程
5.1 报头
5.1.1 含义
在计算机网络中,报头(Header)是数据包或数据帧中的一个特定部分,包含了用于路由、传输、解析和处理数据的重要信息。不同的网络协议和标准定义了不同的报头格式,每个报头包含了若干字段(segments),这些字段负责描述和控制数据包的传输和处理过程。
报头的各段(Segments):
报头起始标识符(Start of Header, SOH):
在一些协议中,SOH标识了报头的开始。它通常是一个特定的位序列或者字节值,用于指示数据包的第一个字节是报头的开始。版本号(Version Number):
报头中的版本号字段指示了使用的协议版本,有些协议可能会有多个版本,版本号字段用于识别和兼容不同的协议版本。长度字段(Length Field):
报头中的长度字段表示整个数据包或数据帧的长度,或者特定部分的长度。这个字段对于接收端来说很重要,因为它帮助确定需要处理和接收的数据量。源地址(Source Address)和目标地址(Destination Address):
这些字段指示了数据包的发送者和接收者的地址信息。在网络通信中,这些地址可以是MAC地址(在链路层)或者IP地址(在网络层)。序列号(Sequence Number):
如果数据包需要顺序传输或者流控制,序列号字段用于标识和排序数据包。接收方可以使用这个字段来检查是否有数据包丢失或者乱序。校验和(Checksum):
校验和字段用于检测报头或数据的完整性。发送端计算校验和并将其添加到报头中,接收端再次计算并比较以确认数据的完整性。选项字段(Options):
一些报头可能包含可选字段,这些字段提供了关于数据包额外信息或者指示。选项字段在不同的协议中具有不同的含义和格式。标志位(Flags):
标志位字段通常是一些二进制标志,用于控制或者指示数据包的特定属性或者状态。例如,TCP报头中的SYN、ACK、FIN等标志位用于控制连接建立、确认和连接关闭等状态。优先权字段(Priority Field):
一些协议支持优先级字段,用于标识数据包的优先级,以便在网络拥塞或者流量控制时进行合理的调度和处理。流标记字段(Flow Label Field):
IPv6中的报头可能包含流标记字段,用于指示数据包的特定流量类型或者服务质量(QoS)要求。这些是报头中常见的一些段(segments),具体的报头结构和字段取决于使用的网络协议和标准。每个段的存在和格式都有助于确保网络数据能够安全、有序、高效地传输和处理。
5.1.2 作用
报头在计算机网络通信中起着至关重要的作用,主要包括以下几个方面:
识别和定位:
报头中的地址字段(如IP地址、MAC地址等)能够唯一标识数据包的发送者和接收者,确保数据包能够正确地被送达目标地址。这些地址在网络层和链路层起着至关重要的作用。传输控制:
报头中的控制字段(如序列号、确认号等)用于实现可靠的数据传输机制,包括错误检测、数据重传、流量控制等,确保数据的顺序和完整性。路由和转发:
报头中的路由信息(如TTL字段、IP地址等)帮助网络设备进行数据包的路由选择和转发,从而实现数据在复杂网络结构中的正确传递。错误检测和校验:
报头中的校验和字段用于检测数据包在传输过程中是否发生了错误或者数据的篡改,确保数据的完整性和安全性。服务质量控制:
一些报头中可能包含有关服务质量(QoS)的信息,如优先级字段、流标记字段等,帮助网络设备进行合理的流量调度和管理,以满足不同应用对延迟、带宽等要求的不同需求。协议版本兼容性:
报头中的版本号字段可以指示使用的协议版本,帮助接收端正确地解析和处理数据包,确保不同版本的协议之间的兼容性和互操作性。报头通过包含必要的控制信息和元数据,使得网络数据能够安全、可靠、高效地在不同设备和网络之间传输和处理。不同协议和网络层次的报头可能具有不同的字段和功能,但它们都是实现网络通信的基础。
5.2 网络传输流程
5.2.1 同网段传输
网络传输流程如下:
用户在主机1应用层发送消息,不能直接传递到对方主机2应用层,而是往下层经过传输层、网络层、数据链路层,在经过每层时,会在数据前方添加对应层的报头,这个过程叫封装。
再通过局域网发送给对方,对方拿到有多层报头修饰的数据时,由于各主机相同层报头属性相同,那么数据会在对方主机上向上层经过数据链路层、网络层、传输层,在经过每层时,会取下对应的报头,这个过程叫做解包与分用。由此对方就拿到了用户发送的数据。
下面来明确一下概念:
- 报头部分,就是对应协议层的结构体字段,我们一般叫做报头
- 除了报头,剩下的叫做有效载荷
- 故,报文 = 报头 + 有效载荷
然后,我们在明确一下不同层的完整报文的叫法:
- 不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报 (datagram),在链路层叫做帧(frame).
- 应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation).
- 首部信息中包含了一些类似于首部有多长, 载荷(payload)有多长, 上层协议是什么等信息.
- 数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,根据首部中的 "上层协议字段" 将数据交给对应的上层协议处理.
那么不同层对应的协议:
5.2.2 跨网段传输
上述是同一个网段(以太网)内传输,那么如果两台主机分别位于不同的网段呢?
跨网段的主机的数据传输. 数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器
根据封装与解包流程:
对比 IP 地址和 Mac 地址的区别
• IP 地址在整个路由过程中,一直不变(目前,我们只能这样说明,后面在修正)
• Mac 地址一直在变
• 目的 IP 是一种长远目标,Mac 是下一阶段目标,目的 IP 是路径选择的重要依 据,mac 地址是局域网转发的重要依据
• IP 网络层存在的意义:提供网络虚拟层,让世界的所有网络都是 IP 网络,屏蔽最底层网络的差异
六. IP地址
IP地址是Internet Protocol Address的缩写,它是用于在互联网上唯一标识和定位设备的一组数字。IP地址由32位二进制数或4个八位二进制数组成的十进制数表示。
它分为两部分:网络地址和主机地址,网络地址用于标识所连接的网络,而主机地址则用于标识具体的设备。
IP地址用于在网络上进行数据包的传输和路由选择。
当你连接到互联网上时,你的设备会被分配一个IP地址,以便在网络中唯一标识和定位你的设备。 IP协议有两个版本,IPv4和IPv6。以下是两个示例IP地址的解释:
IPv4地址:
IPv4(Internet Protocol version 4)是目前广泛使用的网络层协议版本之一,它使用32位二进制数来表示一个IP地址。IPv4地址通常以点分十进制的形式表示,例如192.168.1.1
。每个IPv4地址由四个8位组成,每个组的取值范围是0到255。IPv4地址被广泛用于互联网和局域网中,用于唯一标识网络中的每个设备。IPv6地址:
IPv6(Internet Protocol version 6)是IPv4的后续版本,设计目的是解决IPv4地址空间不足的问题。IPv6地址采用128位的地址长度,通常表示为8组由冒号分隔的十六进制数,例如2001:0db8:85a3:0000:0000:8a2e:0370:7334
。IPv6地址的地址空间非常庞大,远远超过了IPv4的地址空间,能够支持更多的网络设备和应用场景。这两种IP地址在网络通信中都起着关键作用,但由于IPv4地址资源有限的问题,全球逐渐推广和过渡到IPv6,以满足未来互联网设备数量爆炸性增长的需求。
七. 端口号
端口号(port)是传输层协议的内容。也可以说端口号是用于标识在一台设备上运行的不同网络应用程序或服务的数字标识符。当一个应用程序或服务需要通过网络进行通信时,它会打开一个特定的端口,并侦听该端口上的连接。这个侦听过程称为绑定(binding)。当其他设备或应用程序尝试连接到此端口时,操作系统会将连接转发给已经绑定到该端口的应用程序进程。
- 端口号是一个 2 字节 16 位的整数;
- 端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理;
- IP 地址 + 端口号能够标识网络上的某一台主机的某一个进程;
- 一个端口号只能被一个进程占用.
同一台设备上的不同进程可以绑定不同的端口号。这样就使得多个应用程序能够同时进行网络通信,而无需担心冲突。每个进程可以通过独立的端口号进行区分和识别,从而实现并发的网络通信。
端口号范围划分:
- 0 - 1023: 知名端口号, HTTP, FTP, SSH 等这些广为使用的应用层协议, 他们的端口号都是固定的.
- 1024 - 65535: 操作系统动态分配的端口号. 客户端程序的端口号, 就是由操作系统从这个范围分配的.
常见的端口号有:
- 20和21:FTP
- 22:SSH
- 25:SMTP(用于发送电子邮件)
- 53:DNS(域名系统)
- 80:HTTP
- 443:HTTPS
- 161:SNMP(用于网络管理系统监控网络设备的协议)
八. socket编程准备
8.1 理解socket
综上,IP 地址用来标识互联网中唯一的一台主机,port 用来标识该主机上唯一的一个网络进程。IP+Port 就能表示互联网中唯一的一个进程。所以,通信的时候,本质是两个互联网进程代表人来进行通信,{srcIp,srcPort,dstIp,dstPort}这样的 4 元组就能标识互联网中唯二的两个进程。
所以,网络通信的本质,也是进程间通信,我们把 ip+port 叫做套接字 socket。
8.2 认识TCP与UDP协议
此处我们先对 TCP(Transmission Control Protocol 传输控制协议)和UDP(User Datagram Protocol 用户数据报协议)有一个直观的认识,后面再讨论一些细节问题。
TCP:
• 传输层协议
• 有连接
• 可靠传输
• 面向字节流
UDP:
• 传输层协议
• 无连接
• 不可靠传输
• 面向数据报
8.3 网络字节序
我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的 多字节数据相对于文件中的偏移地址也有大端小端之分, 网络数据流同样有大端小端之 分. 那么如何定义网络数据流的地址呢?
- 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出;
- 接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存;
- 因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址.
- TCP/IP 协议规定,网络数据流应采用大端字节序,即低地址高字节.
- 不管这台主机是大端机还是小端机, 都会按照这个 TCP/IP 规定的网络字节序来发送或接收数据;
- 如果当前发送主机是小端, 就需要先将数据转成大端; 否则就忽略, 直接发送即可;
为使网络程序具有可移植性,使同样的 C 代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换。
- 这些函数名很好记,h 即host,表示主机;n 即network,表示网络,l 表示 32 位长整数,s 表示 16 位短整数。
- 例如 htonl 表示将 32 位的长整数从主机字节序转换为网络字节序,例如将 IP 地址转换后准备发送。
- 如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回;
- 如果主机是大端字节序,这些函数不做转换,将参数原封不动地返回。
要深入了解这些函数,读者可自行搜索理解,本文不做说明。
8.4 socket常见接口
// 创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器)
int socket(int domain, int type, int protocol);
// 绑定端口号 (TCP/UDP, 服务器)
int bind(int socket, const struct sockaddr *address, socklen_t address_len);
// 开始监听 socket (TCP, 服务器)
int listen(int socket, int backlog);
// 接收请求 (TCP, 服务器)
int accept(int socket, struct sockaddr* address, socklen_t* address_len);
// 建立连接 (TCP, 客户端)
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
要深入了解这些函数,读者可自行搜索理解,本文不做说明。
8.5 sockaddr结构
socket API 是一层抽象的网络编程接口,适用于各种底层网络协议,如 IPv4、IPv6,以及后面要讲的 UNIX Domain Socket. 然而, 各种网络协议的地址格式并不相同.
- IPv4 和 IPv6 的地址格式定义在 netinet/in.h 中,IPv4 地址用 sockaddr_in 结构体表示,包括 16 位地址类型, 16 位端口号和 32 位 IP 地址.
- IPv4、IPv6 地址类型分别定义为常数 AF_INET、AF_INET6. 这样,只要取得某 种 sockaddr 结构体的首地址,不需要知道具体是哪种类型的 sockaddr 结构体,就可 以根据地址类型字段确定结构体中的内容.
- socket API 可以都用 struct sockaddr *类型表示, 在使用的时候需要强制转化成sockaddr_in; 这样的好处是程序的通用性, 可以接收 IPv4, IPv6, 以及 UNIX Domain Socket 各种类型的 sockaddr 结构体指针做为参数;
sockaddr 结构:
sockaddr_in 结构:
虽然 socket api 的接口是 sockaddr, 但是我们真正在基于 IPv4 编程时, 使用的数据结 构是 sockaddr_in; 这个结构里主要有三部分信息: 地址类型, 端口号, IP 地址。
in_addr 结构:
in_addr 用来表示一个 IPv4 的 IP 地址. 其实就是一个 32 位的整数。
总结:
好了,到这里今天的知识就讲完了,大家有错误一点要在评论指出,我怕我一人搁这瞎bb,没人告诉我错误就寄了。
祝大家越来越好,不用关注我(疯狂暗示)
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » 网络基础入门
发表评论 取消回复