在计算机领域中,网络是信息传输、接收、共享的虚拟平台,通过它把各个点、面、体的信息联系到一起,从而实现这些资源的共享。或者更为详细的说,网络是指将多台计算机或者设备通过通信线路、传输线路和网络设备连接起来,形成一个资源互通和相互通信的整体。

此时数据传输,是通过物理设备(如数据线、磁带、网盘)将设备连接在一起,从而实现数据传输。

此时数据传输,变成了通过网络,将资源在网络之间传递,实现数据传输。
此处按照网络覆盖范围,大体可以将网络分为局域网(LAN)、城域网(MAN)、广域网(WAN)。
协议是一种约定或者规定。用于指导多方在特定情况下的行为和相互之间的关系。
在网络中,为了确保数据传输的稳定性、高效性,实现互联互通,也定义了属于网络的协议-----网络协议。那为什么要存在网络协议呢?以及网络协议解决了什么问题?
我们可以看到,随着网络的发展,客观事实是主机之间距离越来越远了,这就产生了问题:
那我们就需要一种解决方法来解决这些问题。即我们的网络协议,也就是说,网络协议是一种解决方案。
在实际生活中,网络协议是按层划分的。为什么呢?是因为这样层与层之间是松耦合的,方便维护与随时替换。
• OSI(Open System Interconnection,开放系统互连)七层网络模型称为开放 式系统互联参考模型,是一个逻辑上的定义和规范; • 把网络从逻辑上分为了7层. 每一层都有相关、相对应的物理设备,比如路由器,交换机; • OSI 七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输; • 它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚, 理论也比较完整. 通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯;
OSI(Open Systems Interconnection)七层模型每一层具有特定的功能和职责。下面是对OSI七层模型各层的详细解释:
具体可以看下图:

其实在网络角度,OSI 定的协议 7 层模型其实非常完善,但是在实际操作的过程中,会话层、表示层是不可能接入到操作系统中的,所以在工程实践中,最终落地的是 5 层协议(物理层我们考虑的比较少,我们只考虑软件相关的内容. 因此很多时候我们直接称为TCP/IP 四层模型)。
TCP/IP 是一组协议的代名词,它还包括许多协议,组成了 TCP/IP 协议簇. TCP/IP 通讯协议采用了 5 层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。
OSI七层模型与IP/TCP五层(或四层)模型对比:

一般而言
• 对于一台主机, 它的操作系统内核实现了从传输层到物理层的内容; • 对于一台路由器, 它实现了从网络层到物理层; • 对于一台交换机, 它实现了从数据链路层到物理层; • 对于集线器, 它只实现了物理层;
所以可以知道,在模型中越在高层的一般会兼容下层的功能。


下面来看一个图:

问题:主机 B 能识别 data,并且准确提取 a=10,b=20,c=30 吗? 回答:答案是肯定的!因为双方都有同样的结构体类型 struct protocol。也就是说, 用同样的代码实现协议,用同样的自定义数据类型,天然就具有”共识“,能够识别 对方发来的数据,这不就是约定吗? 站在语言角度,关于协议的朴素理解:所谓协议,就是通信双方都认识的结构化的数据类型。 因为协议栈是分层的,所以,每层都有双方都有协议,同层之间,互相可以认识对 方的协议。
MAC帧地址是Media Access Control Address的缩写,也称为物理地址或硬件地址。它是一个用于在局域网中唯一标识网络适配器(如网卡)的48位二进制数。每个网络适配器都有一个唯一的MAC地址,它由厂商在生产时烧录到适配器中。MAC帧地址用于在局域网中寻找目标设备,它是数据链路层的一部分,用于将数据包从源设备传输到目标设备。在以太网中,MAC地址是数据包在局域网中传输所必需的信息。
结构: MAC地址的结构分为两个部分:
作用:假设我们有两台计算机,分别是主机A和主机B,它们需要通过一个以太网交换机进行通信。
00:1A:2B:3C:4D:5E
08:76:5F:4E:3D:2C
现在,假设主机A想要向主机B发送数据。在以太网帧中,数据包含了源MAC地址和目标MAC地址,以确保数据被正确地发送到目标设备。
00:1A:2B:3C:4D:5E (主机A的MAC地址)08:76:5F:4E:3D:2C (主机B的MAC地址)当主机A准备发送数据时,它会将数据包封装在以太网帧中,并在帧头部分配源MAC地址和目标MAC地址。交换机在接收到这个数据帧后,会检查目标MAC地址,然后决定将数据帧转发给连接在它的哪个端口上的设备(在这个例子中,是主机B)。 这个过程保证了数据的准确传输,因为每个设备的MAC地址是唯一的,并且以太网交换机能够根据MAC地址来决定数据包的流向。这种方式比广播或者简单的数据包转发更高效,因为它允许网络设备直接与目标设备进行通信,而不是向所有设备广播数据。
在计算机网络中,报头(Header)是数据包或数据帧中的一个特定部分,包含了用于路由、传输、解析和处理数据的重要信息。不同的网络协议和标准定义了不同的报头格式,每个报头包含了若干字段(segments),这些字段负责描述和控制数据包的传输和处理过程。 报头的各段(Segments):
这些是报头中常见的一些段(segments),具体的报头结构和字段取决于使用的网络协议和标准。每个段的存在和格式都有助于确保网络数据能够安全、有序、高效地传输和处理。
报头在计算机网络通信中起着至关重要的作用,主要包括以下几个方面:
报头通过包含必要的控制信息和元数据,使得网络数据能够安全、可靠、高效地在不同设备和网络之间传输和处理。不同协议和网络层次的报头可能具有不同的字段和功能,但它们都是实现网络通信的基础。
网络传输流程如下:

用户在主机1应用层发送消息,不能直接传递到对方主机2应用层,而是往下层经过传输层、网络层、数据链路层,在经过每层时,会在数据前方添加对应层的报头,这个过程叫封装。

再通过局域网发送给对方,对方拿到有多层报头修饰的数据时,由于各主机相同层报头属性相同,那么数据会在对方主机上向上层经过数据链路层、网络层、传输层,在经过每层时,会取下对应的报头,这个过程叫做解包与分用。由此对方就拿到了用户发送的数据。

下面来明确一下概念:

然后,我们在明确一下不同层的完整报文的叫法:
那么不同层对应的协议:

上述是同一个网段(以太网)内传输,那么如果两台主机分别位于不同的网段呢?
跨网段的主机的数据传输. 数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器

根据封装与解包流程:

对比 IP 地址和 Mac 地址的区别 • IP 地址在整个路由过程中,一直不变(目前,我们只能这样说明,后面在修正) • Mac 地址一直在变 • 目的 IP 是一种长远目标,Mac 是下一阶段目标,目的 IP 是路径选择的重要依 据,mac 地址是局域网转发的重要依据 • IP 网络层存在的意义:提供网络虚拟层,让世界的所有网络都是 IP 网络,屏蔽最底层网络的差异
IP地址是Internet Protocol Address的缩写,它是用于在互联网上唯一标识和定位设备的一组数字。IP地址由32位二进制数或4个八位二进制数组成的十进制数表示。 它分为两部分:网络地址和主机地址,网络地址用于标识所连接的网络,而主机地址则用于标识具体的设备。 IP地址用于在网络上进行数据包的传输和路由选择。
当你连接到互联网上时,你的设备会被分配一个IP地址,以便在网络中唯一标识和定位你的设备。 IP协议有两个版本,IPv4和IPv6。以下是两个示例IP地址的解释:
192.168.1.1。每个IPv4地址由四个8位组成,每个组的取值范围是0到255。IPv4地址被广泛用于互联网和局域网中,用于唯一标识网络中的每个设备。2001:0db8:85a3:0000:0000:8a2e:0370:7334。IPv6地址的地址空间非常庞大,远远超过了IPv4的地址空间,能够支持更多的网络设备和应用场景。这两种IP地址在网络通信中都起着关键作用,但由于IPv4地址资源有限的问题,全球逐渐推广和过渡到IPv6,以满足未来互联网设备数量爆炸性增长的需求。
端口号(port)是传输层协议的内容。也可以说端口号是用于标识在一台设备上运行的不同网络应用程序或服务的数字标识符。当一个应用程序或服务需要通过网络进行通信时,它会打开一个特定的端口,并侦听该端口上的连接。这个侦听过程称为绑定(binding)。当其他设备或应用程序尝试连接到此端口时,操作系统会将连接转发给已经绑定到该端口的应用程序进程。
同一台设备上的不同进程可以绑定不同的端口号。这样就使得多个应用程序能够同时进行网络通信,而无需担心冲突。每个进程可以通过独立的端口号进行区分和识别,从而实现并发的网络通信。

端口号范围划分:
常见的端口号有:
综上,IP 地址用来标识互联网中唯一的一台主机,port 用来标识该主机上唯一的一个网络进程。IP+Port 就能表示互联网中唯一的一个进程。所以,通信的时候,本质是两个互联网进程代表人来进行通信,{srcIp,srcPort,dstIp,dstPort}这样的 4 元组就能标识互联网中唯二的两个进程。
所以,网络通信的本质,也是进程间通信,我们把 ip+port 叫做套接字 socket。
此处我们先对 TCP(Transmission Control Protocol 传输控制协议)和UDP(User Datagram Protocol 用户数据报协议)有一个直观的认识,后面再讨论一些细节问题。
TCP: • 传输层协议 • 有连接 • 可靠传输 • 面向字节流
UDP: • 传输层协议 • 无连接 • 不可靠传输 • 面向数据报
我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的 多字节数据相对于文件中的偏移地址也有大端小端之分, 网络数据流同样有大端小端之 分. 那么如何定义网络数据流的地址呢?

为使网络程序具有可移植性,使同样的 C 代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换。

要深入了解这些函数,读者可自行搜索理解,本文不做说明。
// 创建 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);
要深入了解这些函数,读者可自行搜索理解,本文不做说明。
socket API 是一层抽象的网络编程接口,适用于各种底层网络协议,如 IPv4、IPv6,以及后面要讲的 UNIX Domain Socket. 然而, 各种网络协议的地址格式并不相同.

sockaddr 结构:

sockaddr_in 结构:

虽然 socket api 的接口是 sockaddr, 但是我们真正在基于 IPv4 编程时, 使用的数据结 构是 sockaddr_in; 这个结构里主要有三部分信息: 地址类型, 端口号, IP 地址。
in_addr 结构:

in_addr 用来表示一个 IPv4 的 IP 地址. 其实就是一个 32 位的整数。
总结:
好了,到这里今天的知识就讲完了,大家有错误一点要在评论指出,我怕我一人搁这瞎bb,没人告诉我错误就寄了。
祝大家越来越好,不用关注我(疯狂暗示)