目录
[2.1 OSI七层模型和TCP/IP五层模型](#2.1 OSI七层模型和TCP/IP五层模型)
[2.2. TCP/IP协议与OS](#2.2. TCP/IP协议与OS)
[3.1 局域网通信](#3.1 局域网通信)
[3.1.1 MAC地址 && Port端口号](#3.1.1 MAC地址 && Port端口号)
[3.1.2 以太网通信](#3.1.2 以太网通信)
[3.1.3 同一个网段内的两台主机的通信](#3.1.3 同一个网段内的两台主机的通信)
[3.2 跨网络通信](#3.2 跨网络通信)
[3.2.1 IP地址](#3.2.1 IP地址)
[3.2.2 跨网络通信](#3.2.2 跨网络通信)
[4.1 理解Socket](#4.1 理解Socket)
[4.2 TCP && UDP](#4.2 TCP && UDP)
[4.3 网络字节序](#4.3 网络字节序)
[4.4 Socket编程接口](#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编程接口
cpp
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);
