网络编程开发
两台计算机要互相传送文件需解决很多问题:
- 必须有一条传送数据的通路。
- 发起方必须激活通路。
- 要告诉网络如何识别接收方。
- 发起方要清楚对方是否已开机,且与网络连接正常。
- 发起方要清楚对方是否准备好接收和存储文件。
- 若文件格式不兼容,要完成格式的转换。
- 要处理各种差错和意外事故,保证收到正确的文件。
1.网络结构
OSI七层体系结构、TCP/IP四层协议与五层体系结构是计算机网络中三个关键的概念,它们各自代表了不同的网络设计哲学和实现方式。
首先,OSI(开放式系统互联)七层模型是由国际标准化组织(ISO)提出的一个用于理解和设计网络系统的框架。它包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。每一层都有特定的功能和协议,旨在促进不同计算机系统之间的互操作性。
其次,TCP/IP(传输控制协议/网际协议)四层模型则是实际在互联网中使用的模型,它包括网络接口层、网际层、传输层和应用层。TCP/IP模型以其实用性和灵活性而广受欢迎,是目前互联网的基础。
最后,五层体系结构是一个折中的模型,结合了OSI和TCP/IP的优点,通常用于教学和简化概念的理解。它包括物理层、数据链路层、网络层、运输层和应用层。
下面是 OSI七层模型与 TCP/IP四层模型历史渊源:
- 网络分层的必要性:网络分层是为了将复杂的网络问题分解成更小、更易管理的子问题。每一层只与紧邻的层直接通信,降低了设计的复杂性,并允许每一层独立地进行改进和发展。
- 早期网络体系结构的多样性:在OSI模型提出之前,不同的公司和组织开发了自己的网络体系结构,如IBM的SNA。这些体系结构虽然采用了分层的方法,但层次划分和功能分配各不相同。
- ISO的介入与OSI模型的诞生:为了统一网络体系结构,ISO在1977年提出了OSI参考模型,旨在创建一个统一的标准,使不同的网络能够互联。
- TCP/IP的兴起:尽管OSI模型得到了国际标准的地位,但TCP/IP因其早期在ARPANET中的应用和互联网的迅速发展而成为了事实上的标准。
- 五层体系结构的提出:为了在教学和设计中简化概念,同时保留OSI和TCP/IP的优点,提出了五层体系结构。这种模型在保持层次化设计的同时,减少了层次的数量,使得理解和应用更为直观。
OSI七层体系结构
高层,负责主机之间的数据传输 | 功能 |
---|---|
应用层(Applications Layer): | 网络服务与最终用户的一个接口 |
表示层(Presentation Layer): | 数据的表示、安全、压缩 |
会话层 (Session Layer): | 建立、管理、中止会话 |
低层:负责网络之间的数据传输 | 功能 |
---|---|
运输层 (Transport Layer): | 定义传输数据的协议端口号,以及流控和差错校验 |
网络层 (Network Layer): | 进行逻辑地址寻址、差错校验等功能 |
数据链路层 (Data Link Layer): | 建立逻辑连接、进行硬件地址寻址、差错校验等功能 |
物理层 (Physical Layer): | 建立、维护、断开物理连接 |
TCP/IP四层体系结构
-
是事实上的国际标准
-
实质上TCP/IP只有最上面的三层,最下面的网络接口层(链路层)并没有具体内容
-
链路层所使用的各种局域网标准是由IEEE的802委员会下属的各工作组负责制定的
-
路由器在转发分组时最高只用到网际层,没有使用运输层和应用层。
-
现在互联网使用的 TCP/IP 体系结构已经发生了演变,即某些应用程序可以直接使用 IP 层,或甚至直接使用最下面的网络接口层。
五层体系结构
计算机网络的五层体系结构包括应用层、运输层、网络层、数据链路层和物理层。这个模型结合了OSI七层模型和TCP/IP四层模型的优点,旨在简化网络设计并易于理解。以下是对各层功能的详细分析:
- 应用层
- 主要功能:应用层是五层体系结构中的最高层,直接为用户的应用程序提供服务。它负责确定进程之间通信的性质,以满足用户的需要。应用层处理数据的格式和语义,使得源端和目标端能够理解和处理数据内容。
- 常见协议:应用层协议包括HTTP(用于网页浏览)、FTP(文件传输协议)、SMTP(简单邮件传输协议)等。这些协议定义了如何通过网络进行特定的数据处理和传输。
- 运输层
- 主要功能:运输层负责主机中两个进程之间的通信。它提供了端到端的数据传输服务,确保数据的完整性和顺序。运输层通过端口号来区分同一台机器上运行的不同应用程序,从而实现多路复用。
- 核心协议:运输层的核心协议包括TCP(传输控制协议)和UDP(用户数据报协议)。TCP提供可靠的连接导向服务,而UDP则提供快速的无连接服务。
- 网络层
- 主要功能:网络层负责为分组交换网上的不同主机提供通信。它通过使用逻辑地址(如IP地址)来确定数据包的最佳传输路径。网络层还处理路由选择、分组的分段与重组以及拥塞控制。
- 关键设备:路由器是网络层的关键设备,它根据网络层的地址信息来决定数据包的转发路径。
- 数据链路层
- 主要功能:数据链路层的主要任务是将原始比特流划分为逻辑数据单元(帧),并通过物理网络进行传输。这一层还负责错误检测和校正,以确保数据的可靠传输。它还定义了如何格式化数据以进行传输,以及如何控制对物理介质的访问。
- 设备例子:交换机是数据链路层的关键设备,它根据数据帧的MAC地址来进行局部网络内的数据传递。
- 物理层
- 主要功能:物理层负责在传输媒体(如电缆、光纤)上建立、维护和终止物理连接。它处理与物理设备相关的所有功能,包括电压变化、信号调制和比特率控制等。物理层的主要作用是传输比特流,即由1和0组成的数据序列。
- 硬件标准:物理层的硬件标准包括网线的接口类型、光纤的接口类型以及各种传输介质的传输速率等。
这种分层的设计思想不仅简化了网络系统的设计与教学,也促进了不同网络系统之间的互操作性和兼容性。
2.IP地址与端口号
IP地址简介
IP地址是互联网协议(IP)提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。
为了全面理解IP地址的重要性和功能,以下将从多个角度进行分析:
- IP地址的定义与作用
- 定义:IP地址是一个由数字组成的标识符,用于标识互联网上的设备。这个地址确保数据能够被正确地发送到目标设备。
- 作用:IP地址使得终端设备之间的通信成为可能,无论这些设备的物理位置如何。它允许数据包在全球范围内的网络中路由和传输。
- IP地址的发展历程
- 起源:随着互联网的发展,需要一个统一的地址系统来识别和定位连网的设备。因此,IP地址的概念应运而生。
- 发展:最初的IP地址设计是基于32位的IPv4协议,随着互联网用户数量的增加,IPv4地址逐渐不足以满足需求,这导致了新版本IPv6的推出,它使用128位地址长度,极大地扩展了地址空间。
- IP地址的类型
- 公有地址:公有地址在互联网中是唯一的,用于公网上的设备,使得这些设备可以直接从互联网访问。
- 私有地址:私有地址用于内部网络中,如家庭、企业的内部网络。这些地址不能直接在互联网中使用,需要通过网络地址转换(NAT)技术转换为公有地址后才能访问互联网。
- IP地址的编址方式
- IP地址根据网络ID的不同分为5种类型,分别是A类地址、B类地址、C类地址、D类地址和E类地址
- IP地址的分配与管理
- 手动分配:网络管理员可以手动配置每个设备的IP地址,这种方法适用于小规模网络。
- 自动分配:通过DHCP(动态主机配置协议)服务器自动分配IP地址,当设备连接到网络时,会自动获取一个IP地址。这种方式简化了网络管理,特别是在设备频繁变动的大型网络中。
此外,在深入了解IP地址的配置和管理之后,还需要考虑一些实际操作时的注意事项:
- 子网划分:通过子网划分,可以将一个大网络划分为多个小网络,有助于优化网络的管理和安全性。
- 无类间路由:无类间路由(CIDR)是一种用于IP网络路由的技术,它旨在解决IPv4地址耗尽的问题,通过更灵活的路由策略来减少IP浪费。
- IPv6过渡:随着IPv4地址的耗尽,越来越多的网络正在向IPv6过渡。这一过程中需要解决两种协议的兼容性问题,确保平滑过渡。
IP地址表示方法
IP地址的分类
IP地址根据网络ID的不同分为5种类型,分别是A类地址、B类地址、C类地址、D类地址和E类地址。以下是对各类IP地址的详细阐述:
- A类IP地址:A类地址主要设计用于大型网络,其由1字节的网络地址和3字节的主机地址组成。网络地址的最高位必须是“0”,可用的A类网络有127个,每个网络能容纳约1677万个主机。地址范围从1.0.0.0到127.0.0.0,其中127.0.0.1是特殊的回环测试地址,用于本地机器的测试。
- B类IP地址:B类地址适用于中型网络,包含2个字节的网络地址和2个字节的主机地址。这类地址的网络部分以“10”开头,地址范围为128.0.0.0至191.255.255.255。每个B类网络可以容纳约6万多个主机。
- C类IP地址:C类地址是为小型网络设计的,包括3字节的网络地址和1字节的主机地址。这些地址的网络部分以“110”开始,地址范围从192.0.0.0到223.255.255.255。每个C类网络可容纳254个主机。
- D类IP地址:D类地址用于多点广播(Multicast)。它们的第一个字节以“1110”开始,专门保留用于多点广播。多点广播地址用来一次寻址一组计算机,通常标识共享同一协议的一组计算机。这类地址的范围是从224.0.0.0到239.255.255.255。
- E类IP地址:E类地址以“1111”开始,被保留用于将来使用或研究目的。这类地址的范围是从240.0.0.0到255.255.255.254,而255.255.255.255被定义为广播地址。
此外,在IP地址中还特别定义了一些私有地址范围,这些地址不会被路由到互联网上,而是用于内部网络中。私有地址范围包括:
- A类私有地址:10.0.0.0至10.255.255.255
- B类私有地址:172.16.0.0至172.31.255.255
- C类私有地址:192.168.0.0至192.168.255.255
了解这些分类对于正确配置网络设备和进行网络规划至关重要。每一类地址的设计都旨在满足不同规模网络的需求,从而有效管理IP地址资源并优化网络性能。
无类间路由(CIDR)
- CIDR表示法将IP地址与斜杠“/”和前缀长度结合,例如192.168.1.1/24,其中24是前缀长度,表示网络部分的位数。
优点:
- CIDR通过精确的地址分配避免了传统分类方式中的地址浪费,尤其在IPv4地址资源紧张的情况下,这一点显得尤为重要。
- 通过聚合相邻的地址块,CIDR减少了路由表中的条目数量,从而提高了路由器的性能和网络的稳定性。
- CIDR允许根据需要划分子网,不再受传统类别的限制,这使得网络管理员可以更好地适应组织内部结构的变化。
子网掩码
- 位数:32 位。
- 目的:让机器从 IP 地址迅速算出网络地址。
- 由一连串 1 和接着的一连串 0 组成,而 1 的个数就是网络前缀的长度。
默认地址的子网掩码
在实际应用中,子网掩码与IP地址结合使用,通过对IP地址和子网掩码进行逻辑AND操作,可以得到网络地址,从而确定某台主机是否处于同一网络或子网内。
IPv6表示
- 在 IPv6 中,每个地址占 128 位,地址空间大于 3.4 1038 。
- 使用冒号十六进制记法(colon hexadecimal notation, 简写为 colon hex):16 位的值用十六进制值表示,各值之间用冒号分隔。
//点分十进制数记法:
104.230.140.100.255.255.255.255.0.0.17.128.150.10.255.255
//冒号十六进制记法:
68E6:8C64:FFFF:FFFF:0000:1180:960A:FFFF
//冒号十六进制记法(零压缩):
68E6:8C64:FFFF:FFFF:0:1180:960A:FFFF
零压缩
零压缩 (zero compression):一串连续的零可以用一对冒号取代。
例:
FF05:0:0:0:0:0:0:B3
//压缩为:
FF05::B3
注意:在任一地址中,只能使用一次零压缩。
端口号
端口号的作用是区分不同的应用程序和会话,解决的问题是网络通信中不同应用的识别和服务定位。在深入理解端口号的重要性和应用之后,可以发现端口号不仅仅是简单的数字标识,而是网络通信中不可或缺的一部分。
- 区分应用程序
- 识别服务:端口号使得操作系统能够识别并转发数据到正确的应用程序。
- 多任务处理:通过端口号,同一台计算机上的多个程序可以同时进行网络通信而不会相互干扰。
- 支持并发操作
- 独立通信:每个应用程序可以独立地发起和接收数据,端口号确保了数据传输的准确性和独立性。
- 资源优化:系统能更有效地管理网络资源和处理进程,提高了整体的网络效率。
- 网络安全控制
- 过滤数据:端口号使防火墙能够基于特定的端口来允许或阻止数据流,增强了安全性。
- 防止冲突:为不同的应用程序分配不同的端口号,避免了地址冲突和服务混乱的问题。
- 实现动态分配
- 灵活通信:系统可以根据需要动态分配端口号,使得网络通信更为灵活和高效。
- 自动释放:使用完的端口可以被释放重用,优化了端口资源的利用率。
- 提供远程访问
- 访问控制:端口号允许外部设备通过特定的端口访问内部运行的服务,如HTTP服务通常监听80端口。
- 安全隔离:通过限制可访问的端口,系统可以更好地控制哪些服务可以从外部访问,增加了安全性。
端口的类型
常用端口
BSD端口
BSD端口,也称为BSD套接口,是UNIX系统中通用的网络接口,支持多种网络类型和内部进程间的通信机制。
- 概念功能
- BSD套接口是UNIX系统下用于网络通信的一种标准接口。
- 它不仅支持各种网络类型,还能用于同一台计算机内部不同进程之间的通信。
- 主要特点
- BSD套接口能够处理多种类型的套接口,每种套接口都有自己的寻址方法。
- 与管道不同,套接口对于可以容纳的数据大小没有限制。
- 套接口类型
- 流式套接口提供可靠的双向顺序数据流连接,如TCP协议所使用。
- 数据报套接口提供双向数据传输但不保证数据的完整到达,如UDP协议所使用。
- 通信模式
- 在客户机/服务器模式下,服务器通过套接口提供服务,而客户机则使用这些服务。
- 服务器创建一个套接口并绑定到特定地址,然后监听来自客户机的连接请求。
BSD保留端口和用户端口的不同用途
- 0-1023: BSD保留端口,也叫系统端口,这些端口只有系统特许的进程才能使用
- 1024~65535为用户端口,其中:
- 1024-5000: BSD临时端口,一般的应用程序使用1024到4999来进行通讯;
- 5001-65535:BSD服务器(非特权)端口,用来给用户自定义端口。
3.字节序
字节序分为大端序和小端序,大端序和小端序是两种不同的字节存储顺序。在计算机系统中,由于历史和技术的原因,不同的处理器架构采用了不同的字节序策略。以下是对大端序和小端序的相关介绍:
- 概念理解:
- 大端序(Big-endian):将最高位字节(即最重要的字节)存储在内存的最低地址处,最低位字节存储在最高地址处。
- 小端序(Little-endian):将最低位字节存储在内存的最低地址处,最高位字节存储在最高地址处。
- 实例演示:
- 假设有一个32位整数0x12345678,如果采用大端序存储,则内存中从低地址到高地址的顺序为0x12 0x34 0x56 0x78;而采用小端序时,顺序则为0x78 0x56 0x34 0x12。这种区别对于设计跨平台的软件和进行网络通信尤为重要,因为不同的处理器可能采用不同的字节序。
- 应用场景:
- 大端序:通常被许多网络协议采用,因此也被称为网络字节序。此外,某些处理器如PowerPC也默认使用大端序。
- 小端序:多数现代个人电脑和服务器采用的x86及x86_64架构支持小端序。由于其与处理器的读取顺序一致,这在一定程度上能提高数据处理的效率。
示例
查看主机字节序
#include <stdio.h> uint32_t val32 = 0x11223344; uint8_t val8 = *( (uint8_t *)&val32 ); if(val8 == 0x44) printf("本机是小端字节序\n"); else printf("本机是大端字节序\n");
定义了一个无符号32位整型变量
val32
,并且初始化为0x11223344
定义一个8位的无符号整型变量
val8
,并且将强转以后的val32
的数据赋值给val8
这样做的目的是获取变量
val32
第一个字节的值,后面就可通过判断val8
的值是0x44
或者0x11
来确定主机字节序是大端还是小端