1.概念
1.OSI 七层模型
OSI 七层模型是国际标准化组织(ISO)制定的网络通信分层架构参考标准,核心是将网络通信的复杂流程拆分为 7 个独立层级,每层负责特定功能,上下层之间通过接口协作,实现跨系统的标准化通信。

2.tcp/ip模型
但是在实际应用中我们对osi7层模型做了简化 优化成了tcp/ip模型
TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇.
TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求
.
物理层: 负责光/电信号的传递方式. 比如现在以太网通用的网线(双绞 线)、早期以太网采用的的同轴电缆
(现在主要用于有线电视)、光纤, 现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决
定了最大传输速率、传输距离、抗干扰性等. 集线器(Hub)工作在物理层.
数据链路层: 负责设备之间的数据帧的传送和识别. 例如网卡设备的驱动、帧同步(就是说从网线上检测
到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作. 有以太
网、令牌环网, 无线LAN等标准. 交换机(Switch)工作在数据链路层.
网络层: 负责地址管理和路由选择. 例如在IP协议中, 通过IP地址来标识一台主机, 并通过路由表的方式规
划出两台主机之间的数据传输的线路(路由). 路由器(Router)工作在网路层.
传输层: 负责两台主机之间的数据传输. 如传输控制协议 (TCP), 能够确保数据可靠的从源主机发送到目标
主机.
应用层: 负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问
协议(Telnet)等. 我们的网络编程主要就是针对应用层
物理层我们考虑的比较少. 因此很多时候也可以称为 TCP/IP四层模型.

3.认识IP地址
IP协议有两个版本, IPv4和IPv6. 我们整个的课程, 凡是提到IP协议, 没有特殊说明的, 默认都是指IPv4
IP地址是在IP协议中, 用来标识网络中不同主机的地址;
对于IPv4来说, IP地址是一个4字节, 32位的整数;
我们通常也使用 "点分十进制" 的字符串表示IP地址, 例如 192.168.0.1 ; 用点分割的每一个数字表示一个
字节, 范围是 0 - 255;
4.认识MAC地址
MAC地址用来识别数据链路层中相连的节点;
长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
在网卡出厂时就确定了, 不能修改. mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可
能会冲突; 也有些网卡支持用户配置mac地址)
5.ip地址和mac地址的区别
ip地址和mac地址的区别在于
mac地址是唯一的 但是ip地址只在局域网内是唯一的
比如我们写信的时候一般要写+收件地址+收件人
mac地址好比收件地址 ip地址好比收件人
mac地址就是网卡的物理地址
我们网络中发送消息和写信不一样
网络中我们只要写好了内容和ip地址
操作系统会自动查询对应的mac地址
操作系统如何知道ip地址的
设备入网后根据DHCP协议会向外外送DHCP请求分配ip地址
操作系统如何知道对方的mac地址的
比如a给b别发送消息 a不会立即返送消息 而是·先发送一份报文出去
其他不是对应ip地址的设备都会丢弃这份报文
只有对应ip地址的设备才会接收到这份报文 并返回mac地址
然后我们有了收件人(ip地址)收件地址(mac地址)和内容
就可以向设别b发送消息了
6.同一局域网内的端到端通信

发送端(FTP 客户):从上到下封装
应用层:生成原始文件 / 命令数据(初始载荷)
传输层:给数据加 TCP 头部 → 封装成 TCP 报文段(载荷 = 应用层数据)
网络层:给 TCP 报文段加 IP 头部 → 封装成 IP 数据报(载荷 = TCP 报文段)
链路层:给 IP 数据报加以太网头 + 尾 → 封装成以太网帧(载荷 = IP 数据报)
传输
以太网帧通过物理链路传输到接收端。
接收端(FTP 服务器):从下到上解封装
链路层:剥掉以太网头 + 尾 → 取出 IP 数据报
网络层:剥掉 IP 头部 → 取出 TCP 报文段
传输层:剥掉 TCP 头部 → 取出应用层原始数据
应用层:处理原始数据,完成端到端传递
7.跨不同链路层网络的通信

- 发送端(FTP 客户):从上到下封装
应用层:生成原始文件 / 命令数据(初始载荷)
传输层:加 TCP 头部 → 载荷为应用层数据,形成 TCP 报文段
网络层:加 IP 头部 → 载荷为 TCP 报文段,形成 IP 数据报
链路层:加以太网头 + 尾 → 载荷为 IP 数据报,形成以太网帧
-
路由器转发(跨链路时)
接收以太网帧,剥去以太网头 + 尾 → 取出 IP 数据报
网络层保持 IP 数据报不变(载荷仍为 TCP 报文段)
链路层换上令牌环网头 + 尾 → 载荷为 IP 数据报,形成令牌环帧 -
接收端(FTP 服务器):从下到上解封装
链路层:剥去令牌环网头 + 尾 → 取出 IP 数据报
网络层:剥去 IP 头部 → 取出 TCP 报文段
传输层:剥去 TCP 头部 → 取出应用层原始数据
应用层:处理原始数据,完成端到端传递
思考
这样实现有什么好处???
我们发现每一层无论是发送端还是接收端收到的内容都是一致的
此外路由器实现了不同链路层的物理接口,能基于 IP 协议实现互联互通。
路由器的本质是网络层(IP 层)设备,它的核心作用不是直接处理 "驱动程序",而是实现不同链路层网络之间的 IP 互通
数据段、数据报、数据帧:是各层的完整协议数据单元(PDU),包含了本层的控制头部(和链路层的尾部),以及来自上层的 "载荷"。
- 数据段(Segment)
对应层级:传输层(TCP)
- 数据报(Datagram)
对应层级:网络层(IP)
- 数据帧(Frame)
对应层级:链路层(以太网、令牌环网)
8.端口号和socket
1.网络协议中的下三层,主要解决的是,数据安全可靠的送到远端机器
2.用户使用应用层软件,完成数据发送和接受的。
因此我们要先把这个软件启动起来
我们日常网络通信的本质:
就是进程间通信!!
但是同时我们应用层可能有多个进程
比如我一个手机有抖音淘宝等进程等待
因此要实现准确的网络通信 我们还需要端口号
作用类似于进程的pid
但是为什么不直接用进程pid呢
主要原因是确保进程pid和网络通信之间的独立性(低耦合)
一个进程可以绑定多个端口号吗? 可以
一个端口号可以被多个进程绑定吗? 不可以
端口号(port)是传输层协议的内容.
端口号是一个2字节16位的整数;
端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理;
IP地址 + 端口号能够标识网络上的某一台主机的某一个进程;
可以近似认为「IP + 端口号」是 Socket 地址也称套接字
9.TCP和UDP协议
TCP和UDP协议都是基于传输层的协议
我们目前先做一些简单的了解
TCP协议的特点
细节问题.
传输层协议
有连接
可靠传输
面向字节流
UDP协议的特点
传输层协议
无连接
不可靠传输
面向数据报
10.网络字节序
TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节.
不管这台主机是大端机还是小端机, 都会按照这个TCP/IP规定的网络字节序来发送/接收数据;
如果当前发送主机是小端, 就需要先将数据转成大端; 否则就忽略, 直接发送即可

这三个结构体是 Socket 编程中用于表示地址的核心结构
套接字编程的种类:
1.域间套接字编程->同一个机器内
2.原始套接字编程>网络工具
3.网络套接字编程->用户间的网络通信
但是这样太麻烦了我们一般取前16位
为了统一接口

对应下列套接字相关接口的参数sockaddr
