目录
[四、TCP/IP 五层协议](#四、TCP/IP 五层协议)
[4.1 为什么要有 TCP/IP 协议](#4.1 为什么要有 TCP/IP 协议)
[4.2 什么是TCP/IP协议?](#4.2 什么是TCP/IP协议?)
[五、TCP/IP 协议在操作系统的关系](#五、TCP/IP 协议在操作系统的关系)
[7.1 同一个局域网中的两台主机进行文件传输](#7.1 同一个局域网中的两台主机进行文件传输)
[7.2 跨网段的主机的文件传输](#7.2 跨网段的主机的文件传输)
1) 数据封装的过程 数据封装的过程)
2) 数据分用的过程 数据分用的过程)
[九、 ip地址 VS Mac地址](#九、 ip地址 VS Mac地址)

一、网络诞生背景及产生的诸多问题
计算机最开始就是一台一台的电脑,也是相互独立的,但是人们的很多工作需要相关协议来完成,可能计算机A有着客户A的数据,计算机B有着客户B的数据,计算机C有着客户C的数据,但是计算机是相互独立的,想要将这些数据结合到一起,那就需要用到拷贝。
当时的做法是,通过硬件将数据拷贝给其他人,但是该过程涉及到人力,需要不停地来回的拷贝,这就导致效率极低。
因此在现在," 网络 " 被发明了

后来因为网络的诞生,计算机的数量也越来越多,我们通过交换机和路由器将众多计算机连接在了一起,构成了局域网LAN。
因为局域网是有局限性的,并不能进行太远的连接。
但是我们需要将相隔千里的计算机连接起来,比如中国的计算机和美国的计算机连接起来,这就导致局域网并不能完全满足我们的需求,所以我们发明了广域网。
二、初识协议
" 协议 " 是一种约定,(下面会讲协议具体是什么内容) ,计算机之间的传输媒介是光信号和电信号,通过" 频率 " 和 " 强弱 " 来表示 0 和 1这样的信息,要想传递各种不同的信息,就需要约定好双方的数据格式。

为什么要约定好协议 ?
定好协议是非常重要的一点,如果我的计算机用01表示频率,你的计算机用01表示强度,那么当我的计算机向你的计算机传递频率时,你的计算机就会误认为这是强度,这就导致数据不一致,是相当严重的问题
所以,完善的协议,需要更多更细致的规定,并让参与的人都要遵守
计算机的生产厂商有很多,计算机操作系统也有很多,计算机网络硬件设备也有很多,如果都不遵守协议,你用你的我用我的,不仅仅各大计算机难以沟通,就连我们用户使用起来也相当复杂。
三、OSI七层模型(网络协议栈)
- 
OSI七层网络模型也称为开放式系统互联参考模型,是为了解决协议问题,从逻辑上的定义和规范。
 - 
OSI七层模型把网络从逻辑上分了7层,每一层都有相关,相对应的物理设备,比如路由器,交换机。
 - 
OSI 七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输,它的最大优点是将服务
、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整! 

现在还不需要知道每一层是干什么的,未来会慢慢讲解。
在网络角度,OSI定的协议7层模型非常完善,但是在实际操作的过程中,表示层和会话层 是不可能接入到操作系统中的,因此最上面的三层只剩下了应用层,所以在工程实践中,最终落地的是5层协议。
而这5层协议也被叫做 TCP/IP 五层协议
要写彻底理解刚才所说的内容,需要我们继续学习才可以彻底理解,这里先了解接口。
每一层协议的解决问题如下

- 物理层: 负责光/电信号的传递方式. 比如现在以太网通用的网线(双绞 线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤, 现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等. 集线器(Hub)工作在物理层.
 - 数据链路层: 负责设备之间的数据帧的传送和识别. 例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作. 有以太网、令牌环网, 无线LAN等标准. 交换机(Switch)工作在数据链路层.
 - 网络层: 负责地址管理和路由选择. 例如在IP协议中, 通过IP地址来标识一台主机, 并通过路由表的方式规划出两台主机之间的数据传输的线路(路由). 路由器(Router)工作在网路层.
 - 传输层: 负责两台主机之间的数据传输. 如传输控制协议 (TCP), 能够确保数据可靠的从源主机发送到目标主机.
 - 应用层: 负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等. 我们的网络编程主要就是针对应用层
 
四、TCP/IP 五层协议
在刚才我们讲解了OSI七层模型,其中最上面的三层因为有两层实践不到,所以只剩下了一个应用层。那么最终剩下的就是五层协议,这五层协议也被叫做 TCP/IP 协议。
- 
TCP/IP 是一组协议的代名词,它内部还包括许多协议,最终组成了 TCP/IP 协议
 - 
TCP/IP 通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求
 - 
物理层我们考虑的比较少,我们只考虑软件相关的内容,因此很多时候我们直接称为TCP/IP四层模型。
 
对于一台主机,它的操作系统内核实现了从传输层到物理层的内容
对于一台路由器,它实现了从网络层到物理层
对于一台交换机,它实现了从数据链路层到物理层
对于集线器,它只实现了物理层
但是并不绝对,很多交换机也实现了网络层的转发,很多路由器也实现了部分传输层的内容
4.1 为什么要有 TCP/IP 协议
首先,即使是单机,你的计算机内部,其实也是存在协议的,只不过我们感知不到。
其次,网络通信最大的特点是主机之间变远了,在通信方面,任何通信特征的变化一定会带来新的问题,有了新的问题就需要解决问题,所以 TCP/IP 协议就出现了
所以,为什么要有 TCP/IP 协议,本质上就是主机变远了
4.2 什么是TCP/IP协议?
TCP/IP 协议本质上一种解决方案
TCP/IP 能分为一个个不同的分层,前提是因为问题们本身能分层
五、TCP/IP 协议在操作系统的关系
对于一台主机,网络部分核心的设备为网卡,数据链路层就工作在网卡的驱动程序中。
在往上,传输层和网络层其实工作在操作系统中,再往上就到了应用层
所以,作为一个操作系统内核,不仅仅要实现内存管理,进程管理等,也要实现网络协议栈中的两层。
当然,应用层也是在操作系统中实现的,只不过不是在内核中实现的。数据链路层在驱动程序中,但是驱动程序同时也是操作系统内核的一部分,所以数据链路层也是在操作系统内部实现的。
我们进行网络通信时,其实就是想要使用网卡,但是我们并不能直接使用网卡,因为我们用户是要从应用层开始的。
这就意味着想要实现网络通信我们必须使用网络协议栈,也就是需要通过传输层和网络层,而传输层和网络层和数据链路层是在操作系统内核中实现的**,**以及应用层都是在操作系统中实现的,所以本质上我们在网络通信就是在使用操作系统!所以OS要基于 tcp/ip 为我们提供网络对应的系统调用接口!

不同的操作系统的内核实现可能差别很大,但对于网络协议的实现是基本一样的,尤其是传输层和网络层!相当于每台计算机都遵循相同的协议,相关的约定,从而保证所有计算机之间都能顺利通信,使得不同操作系统的主机能够进行可靠的通信!
六、究竟什么是协议?

思考一下,主机A给主机B发送对象data,主机B能识别data并精准提取a = 10,b = 20, c = 30 吗?
答案是肯定能。因为双方约定了一下,都有同样的结构体类型struct protocol。
也就是说,协议,就是双方用同样的代码实现协议,用同样的自定义数据类型,这样双方天然就具有" 共识 " ,能够识别对方发来的数据,这不就是约定吗?这不就是协议吗?
所以,关于协议的朴素理解: 所谓协议,就是通信双方都认识的结构化的数据类型
同时,因为协议是分层的,所以每层的双方都有协议。同层之间,互相可以认识对方的协议
七、网络传输基本流程
在实际生活中,我们收到的快递除了物品本身外,还包含快递单。快递单中回填从相关信息:有谁发的,从哪里发给哪里...这些数据收和发两者都知道认识,更多的是给物流体系知道,指导快递的发送!所以长距离运输,快递 = 内容 + 快递单。而快递单本身就是一种约定,为接收双发知道,是一种协议,我们将之称为报头!
收快递的过程中,实际收到的要比期望收到的东西要多,多出来的部分称为报文。而在计算机通常是由一个结构化字段表征,这个结构化字段定义的对象称为协议报头!

7.1 同一个局域网中的两台主机进行文件传输
1)两台主机通信原理
在同一个作用域中,两台主机是可以直接发消息的!每台主机都存在一个网卡设备,在全球中每台计算机的网卡Mac地址都是唯一的。主机A向主机B发送消息"你好"时,除了内容本身,还包含相关协议。而协议中包含接收主机的Mac地址和发送主机的Mac地址。
当主机A将数据发到局域网中时,当前局域网中的所有主机网卡设备都会收到该消息。但其他网卡收到消息后,发现接收方的Mac地址不是自己后会直接丢弃!但某一时刻,可能多台主机同时向局域网中发送消息,此时数据会发送碰撞,导致数据失效,而此时的局域网也被称为碰撞域。此时发送方会执行碰撞监测算法(在随机时间后重新发送)。
即:要正确的发送数据,任何时刻局域网中只允许一台主机在局域网中发送消息!

- 这种基于碰撞域、碰撞监测、碰撞避免的通信方式,并且有概率碰撞的。我们将这种局域网称为以太网!
 - 碰撞域本身就是一个临界资源,而碰撞监测、避免和重发完成的就是互斥访问临界资源!
 
2)两台主机通信过程
两台主机通信发送消息"你好"时,无论是TCP还是UDP,都是先通过网卡设备再通过以太网推送给另一台主机的网卡设备的。
所以需要贯穿网络协议栈,然后从上往下依次添加对应层的协议报头。当目标主机网卡接收到消息后,会从下往上依次解析,将报头和有效载荷进行分离,将有效载荷逐次传给上一层进行分用。

- 报文 = 报头 + 有效载荷。应用层报文称为 request&response;传输层报文称为数据段;网络层报文称为数据报;数据链路层报文称为数据帧。它们每一层的报文就是它们在添加完自己的报头后的属于该层的独特报文。
 
7.2 跨网段的主机的文件传输

八、数据包封装和分用
不同的协议层对数据包有不同的称谓,在应用层报文称为 request&response;传输层报文称为数据段;网络层报文称为数据报;数据链路层报文称为数据帧。
应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装!转发一定要考虑后续解包过程:①如何将报文中有效载荷和报头分开 ②如何将自己的有效载荷交给上一层那个协议。
所以每一层的首部信息中都包含了一些类似于首部从哪开始到哪结束。载荷从哪开始到哪结束。上层协议是什么,如数据链路层该把数据交给网络层的哪个协议(如IP还是ARP),网络层该把数据交给传输层的哪个协议等等(如是交给TCP还是UDP)。
1) 数据封装的过程

2) 数据分用的过程

九、 ip地址 VS Mac地址
- ip地址在网络层使用,用来标识互联网中不同主机的地址。 主要用于网络通信中的路由选择。ip地址是一个4字节整数,通常用点分十进制表示。如:192.168.0.1
 - Mac地址应用于数据链路层,用来识别数据链路层中相连节点。 主要用于局域网中的数据包如何从当前节点传输到下一个节点。MAC地址是长度为6字节,通常用16进制加冒号表示。如: 08:00:27:03:fb:19
 - port 是 2 字节 16 位大小。