目录
计算机网络背景
网络发展
独立模式:计算机之间互相独立;
↓
网络互联:多台计算机连接在一起,完成数据共享;
↓
局域网LAN:计算机数量多,通过交换机和路由器连接在一起;
↓
广域网WAN:将远隔千里的计算机都连在一起;
初识协议
- 协议是一种约定

计算机之间的传输媒介是光信号和电信号。通过"频率"和"强弱"来表⽰0和1这样的信息.要想传递各种不同的信息,就需要约定好双⽅的数据格式.
协议分层
- 协议本质也是软件,在设计上为了更好的进⾏模块化,解耦合,也是被设计成为层状结构的
软件分层的好处
分层可以实现解耦合,让软件维护的成本更低
OSI七层模型
OSI(OpenSystemInterconnection,开放系统互连)七层⽹络模型称为开放式系统互联参考模型,是⼀个逻辑上的定义和规范;
• 把⽹络从逻辑上分为了7层.每⼀层都有相关、相对应的物理设备,⽐如路由器,交换机;
• OSI七层模型是⼀种框架性的设计⽅法,其最主要的功能使就是帮助不同类型的主机实现数据传输;
• 它的最⼤优点是将服务、接⼝和协议这三个概念明确地区分开来,概念清楚,理论也⽐较完整.通过七个层次化的结构模型使不同的系统不同的⽹络之间实现可靠的通讯;
• 但是,它既复杂⼜不实⽤;所以我们按照TCP/IP四层模型来讲解.
分别对应:
应用层:针对特定应用的协议
↓
表示层:设备固有数据格式和网络标准数据格式的转换。
↓
会话层:通信管理。负责建立和断开通信连接(数据流动的逻辑通路)。管理传输层以下的分层。
↓
传输层:管理两个节点之间的数据传输。负责可靠传输
↓
网络层:地址管理与路由选择。
↓
数据链路层:互连设备之间传送和识别数据帧。
↓
物理层:以"0"、"1"代表电压的高低、灯光的闪灭。界定连接器和网线的规格。
- 其实在⽹络⻆度,OSI定的协议7层模型其实⾮常完善,但是在实际操作的过程中,会话层、表⽰层是不可能接⼊到操作系统中的,所以在⼯程实践中,最终落地的是5层协议。
但是要理解上⾯的话,需要我们学习完⽹络才可以理解,这⾥就知道就可以。
TCP/IP五层(或四层)模型
TCP/IP是⼀组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇.
TCP/IP通讯协议采⽤了5层的层级结构,每⼀层都呼叫它的下⼀层所提供的⽹络来完成⾃⼰的需求.

为什么要有TCP/IP协议?
其次,⽹络通信最⼤的特点就是主机之间变远了。任何通信特征的变化,⼀定会带来新的问题,有
问题就得解决问题,所以需要新的协议咯。
本质就是通信主机距离变远了。
什么是TCP/IP协议?
TCP/IP协议的本质是⼀种解决⽅案
TCP/IP协议能分层,前提是因为问题们本⾝能分层

所谓协议,就是通信双⽅都认识的结构化的数据类型
网络传输基本流程
每台主机在局域⽹上,要有唯⼀的标识来保证主机的唯⼀性:mac地址
认识MAC
- MAC地址用来识别数据链路层中相连的节点;
- 长度为48比特位,即6个字节。一般用16进制数字加上冒号的形式来表示(例如:08:00:27:03:fb:19)
- 在网卡出厂时就确定了,不能修改.mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址,可能会冲突;也有些网卡支持用户配置mac地址)
- windows>ipconfig /all

- 以太网中,任何时刻,只允许一台机器向网络中发送数据
- 如果有多台同时发送,会发生数据干扰,我们称之为数据碰撞
- 所有发送数据的主机要进行碰撞检测和碰撞避免
- 没有交换机的情况下,一个以太网就是一个碰撞域
- 局域网通信的过程中,主机对收到的报文确认是否是发给自己的,是通过目标mac地址判定
- 这里可以试着从系统角度来理解局域网通信原理
认识IP地址
IP 协议有两个版本, IPv4 和 IPv6 .我们整个的课程, 凡是提到IP协议, 没有特殊说明的,默认都是 指IPv4

Mac vs IP
IP几乎不会变的
一般而言, mac地址,只在局域网中有效
Socket编程接口
socket API 是一层抽象的网络编程接口,适用于各个底层网络协议,如IPv4、IPv6,以及UNIX Domain Socket。然而,各种网络协议的地址格式并不相同

sockaddr 结构
cpp
struct sockaddr
{
__SOCKADDR_COMMON(sa_); /* 地址族与长度 */
char sa_data[14]; /* 地址数据 */
};
sockaddr_in 结构
cpp
struct sockaddr_in
{
__SOCKADDR_COMMON(sin_); /* 地址族与长度 */
in_port_t sin_port; /* 端口号(网络字节序) */
struct in_addr sin_addr; /* IPv4 地址 */
unsigned char sin_zero[...];/* 填充至与 sockaddr 同大小 */
};
虽然socketapi的接⼝是sockaddr,但是我们真正在基于IPv4编程时,使⽤的数据结构是sockaddr_in;
这个结构⾥主要有三部分信息:地址类型,端⼝号,IP地址
in_addr结构
cpp
typedef unit32_t in_addr_t;
struct in_addr
{
in_addr_t s_addr;
}
in_addr用来表示一个IPv4的IP地址,其实就是一个32位的整数