1.概念
计算机之间时独立的,而人类之间工作时分工的:

计算机连接起来,网络互联: 多台计算机连接在一起, 完成数据共享;

结论:计算机时人类的工具,人之间,是需要协作的,就注定了计算机之间要进行协作
****这就意味着网络的产生是必然的!!!
网络是怎么产生的???
->首先是局部产生的!产生第一个局域网
->局部之间进行连接,到整体产生,局域网之间进行连接形成广域网
局域网LAN:计算机数量更多了,通过交换机和路由器连接在一起

广域网WAN:将千里之外的计算机连接在一起

2.协议:减少通信的成本,用于快速形成共识
• "协议" 是一种约定.
• 打电话约定电话铃响的次数的约定

计算机之间的传输媒介是光信号和电信号. 通过 "频率" 和 "强弱" 来表示 0 和 1 这样的 信息. 要想传递各种不同的信息, 就需要约定好双方的数据格式.
思考: 只要通信的两台主机, 约定好协议就可以了么?
• 定好协议,但是你用频率表示 01,我用强弱表示 01,就好比我用中国话,你 用葡萄牙语一样,虽然大家可能遵守的一套通信规则,但是语言不同,即是订好了 基本的协议,也是无法正常通信的
• 所以,完善的协议,需要更多更细致的规定,并让参与的人都要遵守。
如何让参与的人都遵守一个协议呢?
• 计算机生产厂商有很多;
• 计算机操作系统, 也有很多;
• 计算机网络硬件设备, 还是有很多;
• 如何让这些不同厂商之间生产的计算机能够相互顺畅的通信? 就需要有人站出 来, 约定一个共同的标准, 大家都来遵守, 这就是 网络协议;
一般具有定制协议或者标准的资格的组织或者公司都必须是业界公认或者具有江湖地 位的组织或者公司。
协议分层:
协议本质也是软件,在设计上为了更好的进行模块化,解耦合,也是被设计成为 层状结构的
协议分层的基本概念
-
层次(Layer) :每一层是一个独立的功能模块,负责完成特定的通信任务。例如,物理层负责信号的传输,网络层负责路由选择等。
-
协议(Protocol) :规定了每一层在通信过程中需要遵循的规则和标准。协议定义了数据的格式、传输顺序、错误处理等。
-
接口(Interface) :相邻层之间的交互点,定义了上层可以调用下层的功能,以及下层向上层提供的服务。
-
封装(Encapsulation) :在数据传输过程中,每一层都会在其上层传递下来的数据前面添加协议头(有时也会在后面添加尾部),这个过程称为封装。封装使得每一层的数据能够被下一层正确理解和处理。

协议分层的好处
协议分层是计算机网络中一种重要的设计方法,它将复杂的网络通信过程划分为多个层次,每一层负责特定的功能,并通过相邻层之间的接口进行交互。这种分层结构使得网络的设计、实现、管理和扩展变得更加简单和高效。以下是关于协议分层的详细介绍:
1. 协议分层的基本概念
层次(Layer):每一层是一个独立的功能模块,负责完成特定的通信任务。例如,物理层负责信号的传输,网络层负责路由选择等。
协议(Protocol):规定了每一层在通信过程中需要遵循的规则和标准。协议定义了数据的格式、传输顺序、错误处理等。
接口(Interface):相邻层之间的交互点,定义了上层可以调用下层的功能,以及下层向上层提供的服务。
封装(Encapsulation):在数据传输过程中,每一层都会在其上层传递下来的数据前面添加协议头(有时也会在后面添加尾部),这个过程称为封装。封装使得每一层的数据能够被下一层正确理解和处理。
2. 常见的协议分层模型
(1)OSI七层模型
OSI(Open Systems Interconnection)模型是由国际标准化组织(ISO)提出的,它将网络通信划分为七个层次,从下到上依次为:
物理层(Physical Layer):
功能:负责信号的物理传输,包括定义物理介质的电气特性、机械特性等。
协议示例:以太网物理层标准(如1000BASE-T)、无线通信标准(如802.11)。
数据链路层(Data Link Layer):
功能:将物理层的信号组织成帧,并负责帧的传输和差错控制。
协议示例:以太网(Ethernet)、点对点协议(PPP)。
网络层(Network Layer):
功能:负责路由选择和分组转发,将数据从源主机传输到目的主机。
协议示例:IP协议(Internet Protocol)。
传输层(Transport Layer):
功能:负责端到端的可靠传输,提供进程之间的通信服务。
协议示例:TCP(传输控制协议)、UDP(用户数据报协议)。
会话层(Session Layer):
功能:负责建立、管理和终止会话,提供进程之间的通信控制。
协议示例:RPC(远程过程调用)。
表示层(Presentation Layer):
功能:负责数据格式的转换和加密解密,确保数据在不同系统之间能够正确理解。
协议示例:ASCII编码、MIME(多用途互联网邮件扩展)。
应用层(Application Layer):
功能:为用户提供各种网络应用服务,如文件传输、电子邮件、网页浏览等。
协议示例:HTTP(超文本传输协议)、FTP(文件传输协议)、SMTP(简单邮件传输协议)。
(2)TCP/IP四层模型
TCP/IP模型是实际应用中广泛使用的网络协议模型,它将网络通信划分为四个层次:
链路层(Link Layer):
功能:与OSI模型中的物理层和数据链路层相对应,负责将数据封装成帧并传输到物理介质上。
协议示例:以太网、ARP(地址解析协议)。
网络层(Internet Layer):
功能:负责路由选择和分组转发,与OSI模型中的网络层功能类似。
协议示例:IP协议。
传输层(Transport Layer):
功能:负责端到端的可靠传输,与OSI模型中的传输层功能类似。
协议示例:TCP、UDP。
应用层(Application Layer):
功能:为用户提供各种网络应用服务,与OSI模型中的应用层、表示层和会话层的功能合并。
协议示例:HTTP、FTP、SMTP等。
3. 协议分层的工作原理
数据封装与解封装:
封装:当数据从应用层向下传递时,每一层都会在其上层的数据前面添加协议头(有时也会在后面添加尾部)。例如,应用层数据在传输层被封装为TCP或UDP报文,在网络层被封装为IP数据报,在链路层被封装为以太网帧。
解封装:当数据从链路层向上传递时,每一层会去掉其协议头(和尾部),并将其数据部分传递给上一层。最终,应用层接收到原始数据。
层间交互:
相邻层交互:每一层通过接口向上层提供服务,同时调用下层的服务。例如,应用层调用传输层的服务来发送数据,传输层则调用网络层的服务来转发数据。
对等层交互:虽然数据在垂直方向上逐层传递,但协议的交互是在对等层之间进行的。例如,发送方的传输层与接收方的传输层之间通过TCP协议进行交互。
4. 协议分层的好处
简化设计:将复杂的网络通信过程分解为多个层次,每一层只负责特定的功能,便于设计和实现。
提高灵活性:各层之间相对独立,修改某一层的协议或技术不会影响到其他层次。
促进标准化:每一层都有明确的协议标准,便于不同厂商的设备和软件实现互操作。
便于教学和学习:分层结构使得网络知识更容易理解和掌握,适合分层次教学。
5. 协议分层的局限性
层次划分不够清晰:某些功能可能跨越多个层次,导致层次之间的界限不够明确。
性能开销:每一层的封装和解封装过程可能会引入额外的性能开销。
复杂性增加:虽然分层简化了设计,但过多的层次和协议也会增加系统的复杂性。
结论:

结论1:两种视角,普通用户,工程师视角
结论2:同层之间才可以通信
结论3:分层之后,可以无障碍替换任意一层 --- 分层 --- 解耦,分层可以实现解耦合,让软件维护的 成本更低。
常见的几种协议分层:
OSI七层模型:标准
• OSI(Open System Interconnection,开放系统互连)七层网络模型称为开放 式系统互联参考模型,是一个逻辑上的定义和规范;
• 把网络从逻辑上分为了 7 层. 每一层都有相关、相对应的物理设备,比如路由 器,交换机;
• OSI 七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型 的主机实现数据传输;
• 它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚, 理论也比较完整. 通过七个层次化的结构模型使不同的系统不同的网络之间实现可 靠的通讯;
• 但是, 它既复杂又不实用; 所以我们按照 TCP/IP 四层模型来讲解.
其实在网络角度,OSI 定的协议 7 层模型其实非常完善,但是在实际操作的过程 中,会话层、表示层是不可能接入到操作系统中的,所以在工程实践中,最终落地的
TCP/IP五层模型 :应用
TCP/IP 通讯协议采用了 5 层的层级结构,每一层都呼叫它的下一层所提供的接口来完 成自己的需求.
• 物理层: 负责光/电信号的传递方式. 比如现在以太网通用的网线(双绞 线)、早 期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤, 现在的 wifi 无线网使用 电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗 干扰性等. 集线器(Hub)工作在物理层.
• 数据链路层: 负责设备之间的数据帧的传送和识别**.** 例如网卡设备的驱动、帧同 步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就 自动重发)、数据差错校验等工作. 有以太网、令牌环网, 无线 LAN 等标准. 交换机
(Switch)工作在数据链路层.
• 网络层: 负责地址管理和路由选择. 例如在 IP 协议中, 通过 IP 地址来标识一台 主机, 并通过路由表的方式规划出两台主机之间的数据传输的线路(路由). 路由器
(Router)工作在网路层.
• 传输层:负责两台主机之间的数据传输. 如传输控制协议 (TCP), 能够确保数据 可靠的从源主机发送到目标主机.
• 应用层: 负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协 议(FTP)、网络远程访问协议(Telnet)等. 我们的网络编程主要就是针对应用层.

**物理层我们考虑的比较少,**我们只考虑软件相关的内容. 因此很多时候我们直接称为
TCP/IP 四层模型.
再谈协议
为什么要有TCP/IP协议???
• 首先,即便是单机,你的计算机内部,其实都是存在协议的,比如:其他设备和 内存通信,会有内存协议。其他设备和磁盘通信,会有磁盘相关的协议,比如:
SATA,IDE,SCSI 等。只不过我们感知不到罢了。而且这些协议都在本地主机各自 的硬件中,通信的成本、问题比较少。"协议普遍存在"
• 其次,网络通信最大的特点就是主机之间变远了。 任何通信特征的变化,一定会 带来新的问题,有问题就得解决问题,所以需要新的协议咯。"距离产生问题,问题引入协议"
什么是 TCP/IP 协议?
• TCP/IP 协议的本质是一种解决方案
• TCP/IP 协议能分层,前提是因为问题们本身能分层
网络的引入导致距离变长了,所以我们引入协议来解决问题
TCP/IP和操作系统之间的关系

协议注定是层状的结构

为甚windows和Linux可以互相发送消息,因为,它们在网络层一定是一样的!
结论图:
所以究竟什么是协议?
所以究竟什么是协议?
协议本质:就是约定好的结构体

问题:主机 B 能识别 data,并且准确提取 a=10,b=20,c=30 吗?
回答:答案是肯定的!因为双方都有同样的结构体类型 struct protocol。也就是说, 用同样的代码实现协议,用同样的自定义数据类型,天然就具有"共识",能够识别 对方发来的数据,这不就是约定吗?
关于协议的朴素理解:所谓协议,就是通信双方都认识的结构化的数据类型 因为协议栈是分层的,所以,每层都有双方都有协议,同层之间,互相可以认识对 方的协议。
网络传输基本流程
局域网网络传输流程图
局域网通信标准:
以太网,
令牌环网:谁持有令牌,谁就可以发送信息,这令牌就是锁
无线LAN(无线网)
局域网(以太网为例)通信原理
• 首先回答,两台主机在同一个局域网,是否能够直接通信?是的
• 原理类似上课
• 每台主机在局域网上,要有唯一的标识来保证主机的唯一性:mac 地址
以太网:
查看以太网地址的操作:

xshell操作:
ifconfig:
eth0:网络接口
ether:以太
以太网为什么叫以太网?
在局域网通信,我们假说宇宙中有一种光传播的介质,叫做以太,但后来证明不存在,后来局域网通信标准,取名字,叫做以太网。
以太网的通信原理:
本质:我发的消息,大家都可以受到,这玩意叫做泛洪 。多台主机通信,都要要求每台主机都要有唯一的标识符。
总结:发给一个,一群吃瓜。
认识MAC地址
MAC地址:MAC地址通常是全球唯一的。
windows和虚拟机的MAC地址可能不一样,因为虚拟机时虚拟出来的。
每台主机都有自己的标识符,那就是MAC地址。
• MAC 地址用来识别数据链路层中相连的节点;
• 长度为 48 位, 及 6 个字节. 一般用 16 进制数字加上冒号的形式来表示
(例如: 08:00:27:03:fb:19)
• 在网卡出厂时就确定了, 不能修改. mac 地址通常是唯一的(虚拟机中的 mac 地 址不是真实的 mac 地址, 可能会冲突; 也有些网卡支持用户配置 mac 地址).
数据碰撞
以太网原理:主机A给主机E发消息:
原MAC地址:A
目的MAC地址:E
结果:发送到网络里,主机BCD都收得到。"如果是多个主机同时发送,那么就可能会造成数据碰撞"

• 以太网中,任何时刻,只允许一台机器向网络中发送数据
• 如果有多台同时发送,会发生数据干扰,我们称之为数据碰撞
• 所有发送数据的主机要进行碰撞检测和碰撞避免
• 没有交换机的情况下,一个以太网就是一个碰撞域
• 局域网通信的过程中,主机对收到的报文确认是否是发给自己的,是通过目标
mac 地址判定:
如果目标mac地址是自己,那就接受,如果不是自己,那就拒绝接收
• 这里可以试着从系统角度来理解局域网通信原理 初步明白了局域网通信原理,再来看同一个网段内的两台主机进行发送消息的过程
报文的封装和解包、分用 :本质就是同层之间,直接通信。
封装:
向下封装的过程中,每经历一层协议,就要添加一个报头,不同协议对应不同报头,然后把封装好的报文传递给下一层
为什么要自顶向下封装???
必须贯穿操作系统,贯穿协议栈
解包和分用的过程:
解包:把接收到的报文拆分成有效载荷和报头,报头部分对应该层的协议,报头和有效载荷进行分离
分用:将解包后得到的有效载荷传送给上层
有效载荷和报头
• 报头部分,就是对应协议层的结构体字段,我们一般叫做报头
• 除了报头,剩下的叫做有效载荷
• 故,报文 = 报头 + 有效载荷
不同层下对于报文的叫法:
报文在不同层的叫法:
应用层:叫做请求和应答
传输层:数据段
网络层:数据包
数据链路层:数据帧
混杂模式:不管是不是自己的,都收下。进行解包和分用。
• 应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部
(header),称为封装(Encapsulation).
• 首部信息中包含了一些类似于首部有多长, 载荷(payload)有多长, 上层协议是 什么等信息.
• 数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,
根据首部中的 "上层协议字段" 将数据交给对应的上层协议处理.
协议栈:

封装和解包、分用的过程:
封装:添加报头-----也就是入栈的过程
解包和分用:分离报头 ----出栈过程,所以这就是协议栈
TCP/IP协议过程

在网络传输的过程:
数据不是直接发送给对方主机的,而是先要自顶向下将数据交 付给下层协议,最后由底层发送,然后由对方主机的底层来进行接受,在自底向上进 行向上交付。
跨网络传输流程图
认识 IP 地址
IP地址,用来标识,全球范围内,主机的唯一性(公网IP)
IP 协议有两个版本, IPv4 和 IPv6. 我们整个的课程, 凡是提到 IP 协议, 没有特殊说明的,
默认都是指 IPv4
• IP 地址是在 IP 协议中, 用来标识网络中不同主机的地址;
• 对于 IPv4 来说, IP 地址是一个 4 字节, 32 位的整数;
• 我们通常也使用 "点分十进制" 的字符串表示 IP 地址, 例如 192.168.0.1 ; 用点 分割的每一个数字表示一个字节, 范围是 0 - 255;
• IPv6:用来解决ip地址不足的问题。

- FTP 客户端发起文件传输请求,数据交给 TCP 层。
- TCP 层将数据分段,加上 TCP 头后交给 IP 层。
- IP 层加上 IP 头,交给以太网驱动封装为以太网帧,发送到路由器。
- 路由器接收以太网帧,解封装得到 IP 包,查询路由后,将 IP 包封装为令牌环帧,转发到令牌环网络。
- 服务器端令牌环驱动接收帧,解封装后交给 IP 层,再向上递交给 TCP 层,最终由 FTP 服务器处理请求。
- 响应数据按原路反向传输回客户端
跨网段的主机的数据传输. 数据从一台计算机到另一台计算机传输过程中要经过一个或 多个路由器.,

简单就过程来说就是,当目的mac地址在本地以太网找不到目标的时候,就会确认目的不在本地,于是找上了路由器,跟路由器进行解包和重新封装,把原ip地址和目的ip地址传递上去,封装后,mac地址发生变化,而IP地址不发生变化
报头:mac地址 要发生变化
有效载荷:IP地址 不发生变化
路由过程中,IP地址不变,mac地址一直在变,mac地址只会在本局域网内有效

• IP 地址在整个路由过程中,**一直不变(**目前,我们只能这样说明,后面在修正)
• Mac 地址一直在变
• 目的 IP 是一种长远目标,Mac 是下一阶段目标,目的 IP 是路径选择的重要依 据,mac 地址是局域网转发的重要依据 提炼 IP 网络的意义和网络通信的宏观流程
IP地址:长远来看
MAC地址:从近的来看


理解上网的两种目的:


传输不是目的,而是手段,目的是把数据交给主机内部的进程,进程再对数据及逆行一系列的操作
端口号:用来表示系统中用来进行网络通信的进程。
进程和端口号进行关联。
• 端口号是一个 2 字节 16 位的整数;
• 端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来 处理;
• IP 地址 + 端口号能够标识网络上的某一台主机的某一个进程;
• 一个端口号只能被一个进程占用.
•端口号必须唯一,即多个进程可以有多个端口号,但一个端口号只可以有一个进程
•端口号必须在1024及以上才可以有效----自定义

这里根基端口号逆序向上找到对应端口号的进程:
传输层维护了一张哈希表。
8080,端口号,
用8080在哈希表里面寻找对应的进程
目的端口:8080
传递到网络层,查到目的端口,根据端口找到对应进程
端口号范围划分
• 0 - 1023: 知名端口号, HTTP, FTP, SSH 等这些广为使用的应用层协议, 他们的 端口号都是固定的.
• 1024 - 65535: 操作系统动态分配的端口号. 客户端程序的端口号, 就是由操作 系统从这个范围分配的.
理解 "端口号" 和 "进程 ID"
我们之前在学习系统编程的时候, 学习了 pid 表示唯一一个进程; 此处我们的端口号也 是唯一表示一个进程. 那么这两者之间是怎样的关系?
例子:
一个进程可以绑定多个端口号; 但是一个端口号不能被多个进程绑定;
• 进程 ID 属于系统概念,技术上也具有唯一性,确实可以用来标识唯一的一个进 程,但是这样做,会让系统进程管理和网络强耦合,实际设计的时候,并没有选择这 样做。
端口号 vs pid:pid也可以表示进程,而为什么还要有端口号呢?
1.不是所有的进程,都要进行网络通信
2.从技术角度,pid是可行的!!但是,如果根据pid来实现,pid是一个系统的概念,pid如果变化,网络也要跟着变,没必要
本质是解耦。 身份证vs学号
IP地址表示全网内唯一的一个主机
port端口号:该主机内唯一的一个网络进程
IP+ port = 全网内唯一的一个进程!!!
理解源端口号和目的端口号
传输层协议(TCP 和 UDP)的数据段中有两个端口号, 分别叫做源端口号和目的端口号.
就是在描述 "数据是谁发的, 要发给谁";
理解 socket
• 综上**,IP 地址用来标识互联网中唯一的一台主机,port 用来标识该主机上唯一的 一个网络进程**
• IP+Port 就能表示互联网中唯一的一个进程
• 所以,通信的时候,本质是两个互联网进程代表人来进行通信,{srcIp,srcPort,dstIp,dstPort}这样的 4 元组就能标识互联网中唯二的两个进程
• 所以,网络通信的本质,也是进程间通信
• 我们把 ip+port 叫做套接字 socket,用来标记互联网唯一一台主机的唯一一个网络进程
传输层的典型代表

认识 TCP 协议

此处我们先对 TCP(Transmission Control Protocol 传输控制协议)有一个直观的认识;
• 传输层协议
• 有连接
• 可靠传输
• 面向字节流
认识 UDP 协议
此处我们也是对 UDP(User Datagram Protocol 用户数据报协议)有一个直观的认识; 后 面再详细讨论.
• 传输层协议
• 无连接
• 不可靠传输
• 面向数据报
网络字节序


小端:低权值位存在低地址去
大端:低权值位存在高地址处
• 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出;
• 接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从 低到高的顺序保存;
• 因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高 地址.
• TCP/IP 协议规定,网络数据流应采用大端字节序,即低地址高字节.
• 不管这台主机是大端机还是小端机, 都会按照这个 TCP/IP 规定的网络字节序来 发送/接收数据;
• 如果当前发送主机是小端, 就需要先将数据转成大端; 否则就忽略, 直接发送即 可;
为使网络程序具有可移植性,使同样的 C 代码在大端和小端计算机上编译后都能正常运 行,可以调用以下库函数做网络字节序和主机字节序的转换。
网络字节序和主机序列转换的接口
• 这些函数名很好记,h 表示 host,n 表示 network,l 表示 32 位长整数,s 表示 16 位 短整数。
• 例如 htonl 表示将 32 位的长整数从主机字节序转换为网络字节序,例如将 IP 地 址转换后准备发送。
• 如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回;
• 如果主机是大端字节序,这些函数不做转换,将参数原封不动地返回
socket 编程接口
网络通信的本质,其实是进程间通信
system V --- 本地进程间通信,已被淘汰
posix标准 --- 网络通信,进程通信
也可以进行本地通信
网络socket:主要的,网络通信可以本地通信。
本地socket:本地通信
原始socket:×

sockaddr的子类:
sockaddr_in:网络通信
sockaddr_un:本地通信
为了统用
设计sockaddr,
前16位,区别是什么地址类型
传参必须是sockaddr
创建则用sockaddr_in或者sockaddr_un,函数调用的时候就用子类进行强转即可
自行区分,是本地还是网络address->sin_famliy进行区分
sockaddr 结构


sockaddr_in 结构

in_addr 结构

sockaddr_in:网络通信 -- AF_INET
sockaddr_un:本地通信 -- AF_UNIX
使用的时候同一使用sockaddr进行传数据,通过判断协议家族来判断是网络通信还是本地通信。
本质就是继承和多态







