目录
1、互联网与物联网
互联网:不同主机通过网络进行通信--万物互联
物联网:不同智能终端通过互联网实现终端控制
2、计算机网络分类
(1)按地理范围分类
- 个人区域网(PAN,Personal Area Network)
- 范围:几米到十几米
- 用途:连接个人设备,如收集、电脑、笔记本电脑、智能手表
- 示例:蓝牙(Bluetooth)、红外线通信(Infrared Communication)
- 局域网(LAN,Local Area Network)
- 范围:覆盖一个建筑物、办公室、校园
- 用途:小范围内实现高速数据传输和资源共享
- 示例:以太网(Ethernet)、Wi_Fi(Wireless Fidelity)
- 城域网(MAN,metropolitan Area Network)
- 范围:覆盖一个城市或多个相邻城市
- 用途:连接多个局域网,提供城域范围内的数据传输服务
- 示例:光纤网络(Fiber OpticNetwork)、有线电视和DSL(Digital Subscriber Line)连接
- 广域网(WAN,Wide Optic Network)
- 范围:覆盖国家、洲际甚至全球范围
- 用途:连接多个局域网和城域网、实现长距离数据传输
- 示例:互联网(Internet)、企业专用网(Enterprise Private Network)
(2)按网络拓扑分类
- 总线型拓扑(Bus Topology)--所有设备共享一条通信介质(总线)
- 优点:布线简单,成本低。
- 缺点:总线故障会导致整个网络瘫痪。
- 常见场景:家庭小型网络(所有设备都连接同一个WIFI或者路由)
- 星型拓扑(Star Topology)--所有设备通过单独的通信链路连接到一个中央节点
- 优点:易于管理和扩展,单个设备故障不会影响整个网络。
- 缺点:中央节点故障会导致整个网络瘫痪。
- 常见场景:教室机房网络,交换机
- 环形拓扑(Ring Topology)
- 优点:数据传输延迟低,适合实时通信。
- 缺点:任何一个节点或链路故障都会影响整个网络。
- 常见场景:小区小型网络
- 网状拓扑(Mesh Topology)
- 优点:高度冗余,可靠性强,任意节点或链路故障不影响整体通信。
- 缺点:布线复杂,成本高。
(3)按网络用途分类
- 互联网(Internet)
- 全球范围内连接各种网络的集合
- 提供全球范围的通信和信息共享。
- 企业内部网(Intranet)
- 仅限于企业或组织内部使用的网络。
- 提供内部资源共享和通信。
- 外联网(Extranet)
- 连接企业内部网与外部合作伙伴或客户的网络。
- 在安全受控的环境下,与外部实体进行通信和协作。
3、套接字
socket在Linux系统中指的是一种特殊接口,该接口可以实现互联网中不同主机上的应用进程之间进行双向通信。socket的中文翻译具有“插座/插孔”的含义,而插座需要选择合适的线才可以正常连通,如果把插座理解为互联网中的主机,则合适的线指的是网络协议。
socket接口一般采用的是C/S架构,C指的是客户端(client),S指的是服务器(server)。也就是说利用该接口可以实现支持多个客户端对同一个服务器进行并发访问,也可以实现一对一通信。
4、网络的七层模型(OSI--国际化标准)
OSI(Open System Interconnection)七层理论模型是一个理想状态。
5、TCP/IP四层协议栈
OSI七层模型只是一个理想状态,对应现实中的实际存在的TCP/IP四层协议栈。OSI理论模型与TCP/IP四层协议栈型对应
- 应用层:
- 包含 OSI 模型中的最顶部三层,加密、压缩、编码、会话、语义等等功能统统是应用程序 APP 所辖范畴。
- 应用程序 APP 可以很简单,也可以很复杂。
- 传输层(位与操作系统内核):
- 与 OSI 模型对应,负责传输控制。
- 网络层(位与操作系统内核):
- 与 OSI 模型对应,负责路由选择。
- 网络接口与物理层(位与操作系统内核):
- 这包括实际数据传输的物理媒介,及其对应的驱动层软件。
6、网络协议
(1)协议
协议就是通信双方预先商量好的一组“暗号”,将彼此之间需要协定的东西写入数据包的固定位置,大家使用相同的方式来解读这一组特定的信息,最终达到能互相理解对方意图的方式。对应于不同的网络分层,每一层都有一个或多个协议,比如应用层中的 HTTP、FTP、NFS、TELNET 等等。在不同的网络拓扑和场景下,使用到的网络协议纷繁复杂,林林总总,但在互联网领域中,应用最为广泛的是所谓 TCP/IP 协议栈。
(2)TCP/IP协议栈
TCP/IP 协议栈名称的由来是历史原因,它们并不仅指 TCP 协议和 IP 协议,广义上而言,协议栈囊括众多使用基于 IP 协议的应用层协议,传输层最重要的 TCP 和 UDP 协议,以及众多 IP 协议的辅助协议。
层次 | 协议 |
应用层 | DNS, FTP, HTTP, IMAP, POP3, SMTP, SSH, Telnet, SSL, … |
传输层 | TCP, UDP, … |
网络层 | IP (IPv4, IPv6), ICMP, ARP, … |
数据链路与物理层 | 802.3(Ethernet), 802.11(Wi-Fi), PPP, … |
(3)数据包
数据包在网络中传输时,发送方逐层对数据包进行对应协议的封装,这个过程类似于寄包裹的时候往包裹上贴标签。而接收方执行相反的过程,接收方拆包裹并读取对应协议信息(一般称为协议头)。各种协议的头部数据如下图所示:
7、IP地址
(1)IP地址标识符
IP 地址实质上等同于一台计算机的 ID,用来便于在世界范围内更加方便地唯一标识某一台机器。以 IPv4 为例,IP 地址总共32位,通常的形式是所谓点分式的字符串:
(2)IP地址分类
一个 IP 地址从形式上可以分成前后两段,前半段称为网络号,后半段称为主机号。
网络号用来作为该主机所在的网络在全世界范围内的唯一标识,
主机号用来作为该主机在其所在的网络内部的唯一标识。
由此,根据网络号和主机号所占位数的不同,将 IP 地址分为以下类别:
- A类地址
- 第1字节为网络地址,其他3个字节为主机地址。
- 第1字节的最高位固定为0
- 1.0.0.1 – 126.255.255.255
- B类地址
- 第1字节和第2字节是网络地址,其他2个字节是主机地址。
- 第1字节的前两位固定为10
- 128.0.0.1 – 191.255.255.255
- C类地址
- 前3个字节是网络地址,最后1个字节是主机地址。
- 第1字节的前3位固定为110
- 192.0.0.1 – 223.255.255.255
- D类地址(组播地址)
- 不分网络地址和主机地址,第1字节的前4位固定为1110
- 224.0.0.1 – 239.255.255.255
(3)子网属性
IP地址与子网掩码相与之后的结果被称为网段:网段 = IP & 子网掩码
上述例子中,子网掩码是 255.255.255.0,因此网段就是 192.168.9.x,局域网内通信的主机应该都要处于同一网段内,否则数据无法被该网段所属的网关(192.168.9.1)路由转发。
在很多场合下,子网掩码会以比特位的形式跟IP地址写在一起,例如上述子网属性可以写成:
192.168.9.88/24,后面的 /24 代表该IP地址所在的网段是前24比特位,也就是说子网掩码是 255.255.255.0
8、端口
IP 地址可以唯一标识一台计算机,但通信的双方并不是两台计算机,而是计算机内部的进程。很明显,为了区分一台主机接收到的数据包应该转交给哪个进程来进行处理,使用端口号来加以区分。
端口号是一个短整型数据,长度为16位。具体分布:
- 系统端口:1~1023
- 注册端口:1024~49150
- 动态或私有端口:49151~65535(这是平常做实验可用的端口号范围)
注意:
- TCP端口号与UDP端口号独立
- 端口号一般由IANA (Internet Assigned Numbers Authority) 管理
9、字节序
当一个数据需要使用2个或以上字节来存储时,就会出现所谓字节序的概念。即可以将低有效位放在低地址处,也可将低有效位放在高地址处,就会产生大端和小端的问题。
大端存储:低地址存放高字节
小端存储:低地址存放低字节
字节序是系统内部的存储方式,与程序无关。在网络编程中,由于数据是在两台不同的机器中传输和表达,因此如果字节序不一致,将会导致结果牛头不对马嘴。
解决的办法是:将网络中的数据,统一为某种固定的字节序(如大端序)。这样一来,凡是从主机往外发送的数据,还是从网络接收的数据,一律是统一之后的字节序,网络字节序屏蔽了通信双方的具体细节,从而使得双方能够进行通信。
10、大端小端笔试题
笔试题:如何检测当前设备是大端存储还是小端存储?
方法一:将一个int型的数据放入char型变量中
int main()
{
char a;
int b=0x12345678;
a=b;
if(a=0x12)
{
printf("Big\n");
}
if(a=0x78)
{
printf("Little\n");
}
return 0;
}
int main(int argc, char *argv[])
{
printf("%#hhx\n", 0x12345678);
return 0;
}
方法二:用联合体
union test{
char a;
int b;
};
int main()
{
test.b=0x12345678;
test.a=b;
if(test.a=0x12)
{
printf("Big\n");
}
if(test.a=0x78)
{
printf("Little\n");
}
return 0;
}