协议
在网络通信中,协议本质是一种约定
协议本质也是软件,软件是分层的
是为了更好的模块化和解耦合
网络中的协议是分层的
同层协议之间在互相通信
同层协议之间是没有直接通信的
是各自使用下层提供的结构能力,完成通信
分层就是解耦合的有效方式,是为了代码的可维护性
eg.


OS和网络之间的关系
网络是操作系统的一部分

因为windows和Linux使用相同的网络协议栈
所以他们虽然OS不同,但是可以互相通信,因为他们必须遵守相同的协议
OSI七层模型和TCP/IP四层(五层)模型

OSI将网络协议定成了七层
但实际工程实践中(TCP/IP)只有四层
链路层,网络层,传输层,应用层(没包括物理层)


TCP/IP协议族
为什么要有TCP/IP协议
TCP/IP协议本质是一种解决方案
TCP/IP协议能够分层,前提是因为问题本身是可以分解的

网络通信最大的特点就是主机之间的距离变远了
这会导致一些问题
如何局域网通信,如何定位主机,丢包如何解决等
这些不同性质的问题
TCP/IP协议就是这些问题的解决方案
TCP/IP协议是分层的,就是因为这些不同性质的问题

协议本身就是为了操作系统之间为了能够网络通信,所约定的数据结构
所以协议就是结构体

所谓协议,就是双方都认识的结构化的数据类型
网络传输的基本流程
局域网(以太网为例)通信原理
每台主机在局域网,都有一个唯一的标识来保证主机的唯一性
这个唯一的标识就是mac地址
两台主机在同一个局域网,可以直接通信
原理:
所有的主机都能收到消息和目标主机的mac地址
然后将报文中包含的mac地址和自己的mac地址对比
和自己相同就接受该报文
不同就丢弃报文
mac地址用来识别数据链路层中相连的节点
长度位48bit,即6个字节,一般用十六进制加冒号标识(08:00:27:03:fb:19)
mac地址在网卡出厂时就确定了


主机会在数据链路层来对比mac地址并选择是否丢弃
上面的层是不会知道被自己丢弃的的报文的
一个局域网是一个碰撞域
在一个碰撞域如果同时发消息,就是发生了碰撞
则这些同时发消息的主机会随机休眠一段时间
这就是碰撞避免
所有主机都可以访问以太网
但同一时间只能由一个主机访问
本质是一种临界资源
一个子网中的主机数越多,发生碰撞的概率越高

发送的过程:
主机A逐层将信息封装,发送到主机B,然后逐层解包

同层之间都认为自己在和对方的同层直接通信,但是实际上确实逐层封装解包的
同层间拿到的报头是一样的
报文 = 报头 + 有效载荷
报头的共性:
1.报头和有效载荷的分离问题
2.报头内部,必须包含一个字段,叫做交给上层的谁的字段---分用

跨网传输
IP协议有两个版本,分别是IPv4和IPv6,但是没有特殊说明,都是IPv4
对于IPv4,IP地址是一个4字节,32比特的整数
通常用点分十进制来标识,如192.168.0.1

mac与ip的区别:
源ip地址 -> 目的ip地址
源 地址到最终目的地址
源mac地址 -> 目的mac地址
当前 地址到下一个地址
传输mac地址的两个设备在同一个局域网
局域网通信需要mac地址,mac地址,一般只在局域网有效

自己机器要发送的报文会发送至自己的网络层
自己的机器有路由功能
网络层发现要发送的报文的目的ip地址与自己的局域网的ip地址前缀不同
则会将报文发给路由器,路由器是连接外网的唯一出口
随后由路由器将报文解包,分用,然后封装,发给别的局域网

网络层,全网同一层,拿到的报文时一样的,是统一的
网络报文流通的真实流程:
