1 初识协议

协议的本质就是一种约定
总的来说,协议在生活中无处不在。

1.1 协议分层

协议本质上也是软件,在设计上为了更好地模块化、解耦合,也是被设计为层状结构的
分层就是解耦合的有效方式,增强了代码的可维护性

1.2 不同视角来看待协议

从外行人来看,同层之间是直接通信的
从设计师或者内行人员来看,同层之间是通过下层提供的服务来间接实现通信的

2 OSI七层模型

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
接下来我们只学习1-4层,其它层基本使用不到

2.1 物理层

负责光/电信号的传递方式. 比如现在以太网通用的网线(双绞 线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤, 现在的 wifi 无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等. 集线器(Hub)工作在物理层.

2.2 数据链路层

负责设备之间的数据帧的传送和识别. 例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作. 有以太网、令牌环网, 无线 LAN 等标准. 交换机(Switch)工作在数据链路层.

2.3 网络层

负责地址管理和路由选择. 例如在 IP 协议中, 通过 IP 地址来标识一台主机, 并通过路由表的方式规划出两台主机之间的数据传输的线路(路由). 路由器(Router)工作在网路层.

2.4 传输层

负责两台主机之间的数据传输. 如传输控制协议 (TCP), 能够确保数据可靠的从源主机发送到目标主机.

2.5 应用层

负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等. 我们的网络编程主要就是针对应用层.

在这里插入图片描述

OSI参考模型中,传输层的主要任务是向用户提供可靠的端到端服务,透明地传送报文,它向高层屏蔽了下层数据通信的细节,是计算机通信体系结构中最关键的一层。网络层的主要任务是通过路由算法,为分组通过通信子网选择最适当的路径。数据链路层的主要任务是在链路上无差错地传送以帧(frame)为单位的数据。物理层的主要任务是把用户的数据转换为电信号,透明地传送信号,是通信系统中最基本的扫描算法实现层。

3 TCP/IP协议族

计算机内部也存在协议,总线也是传输数据的,例如:其他设备和内存,存在内存协议等等

在这里插入图片描述

所以,为什么要有 TCP/IP 协议?本质就是通信主机距离变远了
网络通信最大的特点就是主机之间变远了。任何通信特征的变化,一定会带来新的问题,有问题就得解决问题,所以需要新的协议咯。

3.1 什么是TCP/IP协议?

TCP/IP 协议的本质是一种解决方案
TCP/IP 协议能分层,前提是因为问题本身能分层

3.2 OS与网络关系

在这里插入图片描述

总结:网络就是OS的一部分,TCP/IP网络也是C语言写的,不管什么OS,网络代码和数据一定是一样的,所谓的协议就是一个结构体

关于协议的朴素理解:所谓协议,就是通信双方都认识的结构化的数据类型(结构体)
因为协议栈是分层的,所以,每层都有双方都有协议,同层之间,互相可以认识对方的协议。

3.3 再谈协议

在这里插入图片描述

在这里插入图片描述

4 网络传输的基本流程

4.1 局域网

两台主机连接同一个局域网是能够直接通信的,原理类似于,我们假设一个局域网就是一个教室,所有在教室内的人互相说话都能够听到

4.2 MAC地址

(1)MAC 地址用来识别数据链路层中相连的节点;
(2)长度为 48 位,及 6 个字节. 一般用 16 进制数字加上冒号的形式来表示(如:08:00:27:03:fb:19)
(3)在网卡出厂时就确定了, 不能修改. mac 地址通常是唯一的(虚拟机中的 mac 地址不是真实的 mac 地址, 可能会冲突; 也有些网卡支持用户配置 mac 地址).
命令:
ifconfig,查看自己的MAC地址(linux)(ehth0)
ipconfig(windows下查看本电脑MAC)

(4)下面这张图假设就是主机之间的通信

在这里插入图片描述

其中src和dst就是协议

(5)局域网通信示例:

在这里插入图片描述

将每一台设备都看为一个网络协议栈,主机A向主机E发送信息,实际上是向所有的设备都发送这条信息,然后经由数据链路层来判断是否向本机发送的,如果不是,直接忽略即可,所以对于上层的我们来说,我们根本不知道接没接收到消息

在以太网中同一时刻只允许存在一份报文,因为如果有多台设备互相发消息,可能会造成数据的污染,在这里以太网被视为临界资源,我们需要互斥的访问

1、以太网中,任何时刻,只允许一台机器向网络中发送数据
2、如果有多台同时发送,会发生数据干扰,我们称之为数据碰撞
3、所有发送数据的主机要进行碰撞检测和碰撞避免
4、没有交换机的情况下,一个以太网就是一个碰撞域
5、局域网通信的过程中,主机对收到的报文确认是否是发给自己的,是通过目标mac 地址判定
这里可以试着从系统角度来理解局域网通信原理

在这里插入图片描述

(6)其中每层都有协议,所以当我进行进行上述传输流程的时候,要进行封装 和 解包与分用(包头和有效载荷)

在这里插入图片描述

有效载荷:

在这里插入图片描述

(7)每一层添加报头的过程就是封装的过程

在这里插入图片描述

(8)问题:OS怎么知道有数据传来?(网卡(硬件)通过中断),网卡怎么知道有数据?(硬件规定,电压的不同)

(9)整体复盘一下

在这里插入图片描述

从今天开始,我们学习任何协议,都要先宏观上建立这样的认识:
1.要学习的协议,是如何做到解包的?只有明确了解包,封包也就能理解
2.要学习的协议,是如何做到将自己的有效载荷,交付给上层协议的?(分用)

5 跨网络传输

5.1 IP地址

IP 协议有两个版本, IPv4 和 IPv6. 我们整个的课程, 凡是提到 IP 协议, 没有特殊说明的,默认都是指 IPv4
• IP 地址是在 IP 协议中, 用来标识网络中不同主机的地址
• 对于 IPv4 来说, IP 地址是一个 4 字节, 32 位的整数
• 我们通常也使用 “点分十进制” 的字符串表示 IP 地址, 例如 192.168.0.1 ; 用点分割的每一个数字表示一个字节, 范围是 0 - 255

(1)ifconfig :查看linux机器的ip地址

(2)Mac VS IP:

在这里插入图片描述

目的IP地址在网络传输中不会发生改变,所以目的IP地址就是最终要到达的主机
MAC地址随节点变化,所以MAC地址一般而言只在局域网中有效

主机之间的通信示意图:

在这里插入图片描述

(3)路由器是工作在网络层的设备,在A和B看来路由器就是一台主机,主机A和主机B也可以视为具有路由功能

在这里插入图片描述

(4)为什么主机A发送的数据会发送给路由器?因为目的IP的网络前缀跟我的网络前缀不一样,那么主机A就会将数据发送给路由器

在这里插入图片描述

(5)在同一个路由器子网中,路由器会自动分配IP地址,同一个子网IP地址前缀一致

(6)真实的网络通信:

在这里插入图片描述

(6)IP 网络层存在的意义:提供网络虚拟层,让世界的所有网络都是 IP 网络,屏蔽最底层网络的差异,所以WLAN、令牌环网、以太网在上层都可以互相通信

6 Socket编程预备

6.1 源IP地址和目的IP地址

IP 在网络中,用来标识主机的唯一性
数据传输到主机不是目的,而是手段。到达主机内部,再交给主机内的进程,才是目的。

在这里插入图片描述

IP地址解决的仅仅是主机之间的通信,而进程之间的通信,才是真正的目的,所以端口号才是解决进程之间的通信

6.2 端口号

端口号(port)是传输层协议的内容.
• 端口号是一个 2 字节 16 位的整数;
端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理;
• IP 地址 + 端口号能够标识网络上的某一台主机的某一个进程;
一个端口号只能被一个进程占用.

在这里插入图片描述

IP地址标识特定主机,端口号标识特定进程

在这里插入图片描述

端口号范围划分
• 0 - 1023: 知名端口号, HTTP, FTP, SSH 等这些广为使用的应用层协议, 他们的端口号都是固定的
• 1024 - 65535: 操作系统动态分配的端口号. 客户端程序的端口号, 就是由操作系统从这个范围分配的

总结:网络通信的本质就是进程间的通信,而网络就是公共资源其中IP地址 + 端口号我们称为socket

补充:网卡是不是物理设备,我们之前说linux下一切皆文件,网卡也是以文件的形式被管理,所以后面我们的代码一定用文件描述符来操作网卡

7 传输层的典型代表

如果我们了解了系统,也了解了网络协议栈,我们就会清楚,传输层是属于内核的,那么我们要通过网络协议栈进行通信,必定调用的是传输层提供的系统调用,来进行的网络通信。

在这里插入图片描述

7.1 TCP与UDP 协议

7.1.1 TCP协议

认识 TCP 协议
此处我们先对 TCP(Transmission Control Protocol 传输控制协议)有一个直观的认识;后面我们再详细讨论 TCP 的一些细节问题.
1、传输层协议
2、有连接
3、可靠传输
4、面向字节流

7.1.2 UDP协议

认识 UDP 协议
此处我们也是对 UDP(User Datagram Protocol 用户数据报协议)有一个直观的认识; 后面再详细讨论.
1、传输层协议
2、无连接
3、不可靠传输
4、面向数据报

因为我们暂时还没有深入了解 tcp、udp 协议,此处只做了解即可

7.2 网络字节序

(1)我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分, 网络数据流同样有大端小端之分. 那么如何定义网络数据流的地址呢?

发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出;
接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存;
•因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址.
TCP/IP 协议规定,网络数据流应采用大端字节序,即低地址高字节.
•不管这台主机是大端机还是小端机, 都会按照这个 TCP/IP 规定的网络字节序来发送/接收数据;
•如果当前发送主机是小端, 就需要先将数据转成大端; 否则就忽略, 直接发送即可;

在这里插入图片描述

(2)一个IP地址如果采用4个整数来存的话太浪费空间了,使用4个char类型可以避免浪费,所以我们需要学会IP地址的转化(整数转字符)
在这里插入图片描述

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐