目录
1. 网络发展背景
1.1计算机网络背景
- 独立模式: 计算机之间相互独立;
- 网络互联: 多台计算机连接在一起, 完成数据共享;
- 局域网LAN: 计算机数量更多了, 通过交换机和路由器连接在一起;
- 广域网WAN: 将远隔千里的计算机都连在一起;
1.2 网络分类
- 以覆盖范围划分:局域网-1km、城域网-20km、广域网
- 以组网技术划分:以太网、令牌环网
1.3 常用名词
- 互联网:就是所说的因特网(国际范围的广域网)
互联网公司:依托于互联网生存的公司。不做实体。 - 端口(PORT):
- 主机上一个网络通信进程的标识、表示这个数据应该被主机上的哪个进程处理。(为什么不用进程pid标识呢,因为进程pid是会变化的。进程重启之后会重新分配。端口号是固定不变的)
- 网络通信的每一条数据都包含两条信息:源端端口、源端IP、对端端口、对端IP。
- uint_t类型的数据(范围是0~65535)
- 一个端口只能被一个进程占用。一个进程中可以占用多个端口。
- 一条网络通讯数据中,包含了源端IP地址、源端端口。对端IP、对端端口。才能完整描述数据从哪来到哪去应该被谁处理。
- 网卡:实现网络通信。不同厂商生产的网卡可能对于电信号的处理不同。
2. 网络中的地址管理
2.1 IP地址
- IP协议有两个版本, IPv4和IPv6.
- 是每一台主机在网络中的唯一标识。
- 网络中的每一条数据都具有两个关键信息:源端IP、对端IP,描述了数据从哪来,到哪去。
- ipv4:unit32_t类型的整数,(2^32=不到43亿)
(1)DHCP(动态地址分配-谁上网给谁分配地址)
(2)NAT-地址转换技术-用于组建私网(私网内的只用一个公网地址) - ipv6:unit8_t ip[16] (2^128)、不兼容IPv4
2.2 MAC地址
- MAC地址用来识别数据链路层中相连的节点;
- 长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
- 在网卡出厂时就确定了, 不能修改. mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可能会冲突;也有些网卡支持用户配置mac地址).
3. 网络协议初识
- 计算机之间的传输媒介是光信号和电信号. 通过 “频率” 和 “强弱” 来表示 0 和 1 这样的信息. 要想传递各种不同的信息, 就需要约定好双方的数据格式.
- “协议” 是一种约定。
- 网络通信协议就是网络通信中的数据格式约定。
- 协议分层:网络通信协议比较复杂,不可能使用一个协议就把整个通信过程定义了。国际的一些标准化组织,就根据网络通信环境当中不同的服务,将整个通信过程进行了分层,每一层定义不同的协议标准,实现不同的服务。或者说基于通信提供的服务,所使用的的协议,提供的接口将整个网络通信环境划分为多层:OSI七层网络开发互联模型、TCP/IP五层模型.
3.1 OSI七层模型
- OSI(Open System Interconnection,开放系统互连)七层网络模型称为开放式系统互联参考模型,是一个逻辑上的定义和规范;
- 把网络从逻辑上分为了7层. 每一层都有相关、相对应的物理设备,比如路由器,交换机;
- OSI 七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输;
- 它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整. 通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯。
但是, 它既复杂又不实用; 所以我们按照TCP/IP四层模型来讲解.
3.2 TCP/IP五层(或四层)模型
TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇.
TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求
- 物理层: 负责光/电信号的传递方式.
典型协议:以太网协议
比如现在以太网通用的网线(双绞线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤,现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等. 集线器(Hub)工作在物理层. - 数据链路层: 负责设备之间的数据帧的传送和识别.
负责相邻设备的数据传输——MAC地址(典型设备:交换机(ETH)(两个相邻网络之间的数据传输))通过mac地址来进行确定相设备。
例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作. 有以太网、令牌环网, 无线LAN等标准. 交换机(Switch)工作在数据链路层. - 网络层: 负责地址管理和路由选择.
地址管理就是IP的管理,路由选择就是数据传输路线(典型设备:路由器)。描述了数据的起点和终点。但是不是一步到位的,需要经过各个节点。路由选择根据IP地址规划。
例如在IP协议中, 通过IP地址来标识一台主机, 并通过路由表的方式规划出两台主机之间的数据传输的线路(路由). 路由器(Router)工作在网路层. - 传输层: 负责两台主机之间的数据传输. 负责进程之间的传输.描述这个数据是哪两个进程之间传输的。(包含了进程端口信息)
如传输控制协议 (TCP), 能够确保数据可靠的从源主机发送到目标主机、UDP. - 应用层: 负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、浏览器使用的协议HTTP协议、SSH、网络远程访问协议(Telnet)等.
我们的网络编程主要就是针对应用层.
什么是软件——应用程序——程序员写的代码,编译出的可执行程序
4. 网络传输的基本流程
以QQ发消息为例理解基本流程:
4.1 网络传输图
同一个网段内的两台主机进行文件传输.
跨网段的主机的文件传输. 数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器.
4.2 数据包封装和分用
- 不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报 (datagram),在链路层叫做帧(frame).
- 应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation).
- 首部信息中包含了一些类似于首部有多长, 载荷(payload)有多长, 上层协议是什么等信息.
- 数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部, 根据首部中的 “上层协议字段” 将数据交给对应的上层协议处理.
- 下图为数据封装的过程:
- 下图为数据分用的过程:
5. 网络字节序
5.1 什么是字节序
- 字节序:CPU对内存中数据进行存取的顺序
- 内存:有高低地址,一块空间的起始地址就是低地址
- 数据二进制:有高低位,0X0232 ,左边是高位。右边是低位
5.2 主机字节序的分类
- 大端:低地址存高位(在内存的低地址处存储一个数据的高比特位)
- 小端:地址值存低位(在内存的低地址处存储一个数据的低比特位)
5.3 字节序对于网络通信的影响
字节序取决于CPU,不同于架构的CPU字节序可能不同,如果不同的计算机使用了不同架构的CPU,或者说不同主机字节序的主机进行网络通信卡就有可能出问题。
常见X86架构,采用的是小端字节序。 MIPS:大端字节序
因为主机字节序对网络通信可能造成影响,因此在网络通信汇总订立网络字节序标准——在网络通信中必须使用大端字节序。
这样的话不管发送方的字节序是什么,能够确保网络中的数据是大端的,接收方只需要根据自己主机字节序进行转换即可。
字节序针对的数据类型:存储单元大于一个字节的类型。
short、int、float、double以及对应的无符号类型。
char arr[10]——不涉及字节序,因为本身单字节存储。
int arr[10]——只需要考虑数组内部的存储。数组的元素本身就是单个存储。