Linux的网络基础
目录
1、计算机的网络背景
2、协议
2.1 OSI七层模型和TCP/IP五层模型
2.2. TCP/IP协议与OS
3、网络通信
3.1 局域网通信
3.1.1 MAC地址 && Port端口号
3.1.2 以太网通信
3.1.3 同一个网段内的两台主机的通信
3.2 跨网络通信
3.2.1 IP地址
3.2.2 跨网络通信
4、Socket编程预备
4.1 理解Socket
4.2 TCP && UDP
4.3 网络字节序
4.4 Socket编程接口
1、计算机的网络背景
- 计算机是人类的工具,人之间需要协作,所以计算机之间需要协作,需要网络传输数据。
- 网络的产生:局部 -> 整体。局域网->广域网。
2、协议
- 协议:一种约定,方便快速形成共识,减少通信的成本。从软件到硬件,都有各自的协议。
- 协议分层,在设计上为了更好的进行模块化,解耦合,使维护成本更低。
2.1 OSI七层模型和TCP/IP五层模型
- ISO(国际标准化组织)提出OSI七层模型(理论标准/参考模型),而现实世界广泛应用 TCP/IP五层模型(事实上的工业标准)。
- 每层都有多种协议。
- 作者自此以TCP/IP的四层模型(不涉及物理层(硬件))的TCP/IP协议开始讲解。为什么叫TCP/IP协议?是因为TCP协议和IP协议是核心。
2.2. TCP/IP协议与OS
- 网络是OS的一部分。OS的分层,注定了网络协议的分层。
- 操作系统可以不同,但是网络协议必须相同(每层遵循相同的网络协议)。
- 网络通信的本质是进程间通信。因为主机上运行的是进程,是进程间收发数据,实现这一过程的核心链路就是"进程->OS->网络"。
3、网络通信
3.1 局域网通信
3.1.1 MAC地址 && Port端口号
-
之前我们说了,网络通信的本质是进程间通信,那么怎么定位进程?
-
MAC地址(全球唯一的硬件标识),负责链路层相邻硬件的识别;长度为48位,即6个字节,一般用16进制数字加上冒号的形式来表示,例如: 08:00:27:03:fb:19。
-
Port(端口号,主机内唯一的进程标识),负责跨主机定位进程。0-1023:知名端口号,HTTP,FTP,SSH等这些广为使用的应用层协议,他们的端口号都是固定的。1024-65535:操作系统动态分配的端口号,客户端程序的端口号,就是由操作系统从这个范围分配的。
3.1.2 以太网通信
-
因为网络的发展是从局部->整体的,现在留下来的局域网主要有:以太网,令牌环网,无线LAN。以下以 以太网 为例进行讲解。
-
在局域网中,主机之间可以直接通信。
-
以太网中,任何时刻,只允许一台机器向网络中发送数据,且在该以太网中的任何主机都能收到,只有目标主机会处理,其他主机会丢弃。
-
如果有多台同时发送,会发生数据干扰,我们称之为数据碰撞。
-
所有发送数据的主机要进行碰撞检测(自己能收到,进行检测)和碰撞避免。
-
没有交换机的情况下,一个以太网就是一个碰撞域。
-
局域网通信的过程中,主机对收到的报文确认是否是发给自己的,是通过目标 MAC 地址判定。
3.1.3 同一个网段内的两台主机的通信
- 所以,称网络协议栈。
- 每一层的报文 = 该层报头 + 有效载荷。
- 入栈是对数据进行封装(添加报头),出栈是对数据进行解包(分开报头和有效载荷)+分用(报头与有效载荷分别使用对应的协议)。
3.2 跨网络通信
3.2.1 IP地址
- IP协议有两个版本,IPv4和IPv6,我们之后提到IP协议,默认都是指IPv4。
- IP地址是在IP协议中,用来标识网络中不同主机的地址。
- 对于IPv4来说,IP地址是一个4字节,32位的整数。我们通常也使用"点分十进制"的字符串表示IP地址,例如192.168.0.1,用点分割的每一个数字表示一个字节,范围是0-255。
3.2.2 跨网络通信
- 跨网段的主机的数据传输,数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器。
- IP地址在整个路由过程中,一直不变(目前这样理解,后面再修正)。MAC地址一直在变。
- 目的IP地址是一种长远目标,MAC地址是下一阶段目标,目的IP地址是路径选择的重要依据,MAC地址是局域网转发的重要依据。
-
提供网络虚拟层,让世界的所有网络都是IP网络,屏蔽最底层网络的差异。
4、Socket编程预备
4.1 理解Socket
-
Socket = IP(主机标识)+Port(进程标识)+ 操作系统通信接口,是进程实现跨主机通信的工具。
-
Socket 的目标是 “定位进程”,IP+Port 已经能实现;MAC 是 “定位硬件”,属于更低层的逻辑,不需要放进 Socket。
4.2 TCP && UDP
- TCP,UDP都是传输层协议,这里先进行了解。
特性 | TCP(可靠,简单) | UDP(不可靠,简单) |
---|---|---|
连接 | 有连接(先握手) | 无连接(直接发) |
可靠性 | 可靠 (保证数据不丢、不错、顺序正确) | 不可靠 (不保证送达,可能丢失或乱序) |
速度 | 慢(因为要保证可靠) | 快(因为不管那么多) |
常用场景 | 网页、邮件、文件传输 | 视频通话、在线游戏、直播 |
4.3 网络字节序
- 有大端机和小端机之分,小端:低位字节放低地址。"低低小端"。大端:低位字节放高地址。
- 规定:网络中的数据都是按大端存储。
4.4 Socket编程接口
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);