OSI模型、网络地址、与协议
目录
一、IP地址和MAC地址比对
二、协议
三、UDP与TCP协议
四、自定义协议
一、IP地址和MAC地址比对
1、OSI参考模型
上层 ------> 下层
用户层 传输层 网络层 数据链路层 硬件层
(应用层、表示层、会话层)
传统交换机和路由器分别在数据链路层和网络层进行工作,路由器满足了跨网通信,能够使不同的网络通信方式:无限Lan,以太网,令牌环网等在网络层之上看来并无区别,其中内置了多张网卡来进行收发信息
2、数据链路层完成MAC帧同步、差错控制、流量管理、链路管理、网络拓扑等工作
3、MAC地址的大小是6字节,出厂就确定在硬件设备上了,不允许进行修改,在数据链路层上用于区分相邻设备,完成相邻设备之间的数据传输;而我们的ip地址是一个逻辑地址,用于表示全网范围内的唯一一台主机,而端口号则表示了该主机上唯一的进程,所以通过ip+端口号我们就可以与全网中唯一的一个进程进行通信
4、在osi结构中,大部分结构都会在上一层得到的有效载荷的前面加上自己这一层的数据报头,而数据链路层不仅会在头部添加以太网报头,还会在尾部添加以太网报尾
5、不同数据层对数据包有不同的称呼:传输层叫做段,网络层叫做数据报,数据链路层叫做帧
二、协议
传输层+网络层都在操作系统内部,数据链路层是驱动程序,应用层是程序执行逻辑,
也就是我们的代码,解决日常需求的网络程序。
协议就是双方约定好的结构化的数据,读取的数据看成是什么东西:消息、地址等等
(创建套接字、内容结构体绑定、收发消息、监听套接字和服务套接字)
方案一:长字符串(序列化和反序列化,转化时转化成合法的结构体)
方案二:结构体对象
可以将结构体对象直接发送,但是可能存在跨平台问题,比如说C/C++/Java/Python
这些对于结构体的对齐等等处理不一样导致信息传递存在误差
但是直接传递也是存在的,比如在操作系统中都是直接传递结构体,因为操作系统都是
C语言写的
进行网络通信,在应用层建议使用序列化和反序列化,而直接传结构体的方案,除非
场景特殊,否则不建议——所有的语言都支持字符串
调用read、write都是将数据发到操作系统内核的发送缓冲区、接受缓冲区中,read和write
本质上都是拷贝函数,而什么时候发送发送多少都有tcp自主决定,所有tcp叫做传输控制协议
操作系统将数据发送到网络里本质上也是拷贝。
计算机世界里,通信即拷贝,主机间通信,本质上是将发送方缓冲区中的内容拷贝到接收方
的缓冲区当中。所以tcp通信时全双工的,主机双方各自之间接受和发送时分离的,两条线路互不
打扰——这就是系统和用户之间的生产者消费者模型,所谓tcp协议就是四个系统和用户之间的
生产者消费者模型,写时缓冲区已满阻塞或者读时缓冲区为空阻塞都是用户在和系统之间进行同步
三、UDP与TCP协议
计算机是人类的工具,人之间是需要进行协作的,就注定计算机之间也是需要协作的
协议就是约定,各方都要遵守,减少通信成本,用于快速形成共识
协议分层,在设计上是为了更好的模块化、解耦合,协议在本质上也是软件
所有软件都是层状的、模块化的
在计算机角度、在操作系统角度怎样理解?
前者是硬件属性,
TCP/IP协议:
本地通信:所有设备都是“线”连接起来的,具体到计算机中就是各种电路。所以计算接内部,
冯诺伊曼结构,本身就是一个网络结构;多台主机,网络通信,本质也是设备到设备,
其中唯一一个区别,单纯的距离变长了,但是这一点改变也会导致出现问题
TCP/IP协议解决的就是这里出现的问题,本事上就是一种网络长距离通信的解决方案
TCP/IP协议与操作系统的关系
网络是操作系统的一部分
硬件部分---------驱动程序----------操作系统-------------系统调用--------用户层(用户操作接口和用户)
网卡 网卡驱动 传输层and网络层 系统调用 应用层
所有操作系统内,网络部分完全一样
操作系统怎样管理这些报文呢?协议的本质就是约定好的结构体,协议的双方的网络代码一样,
立马就能识别出相应信息,快速建立共识
网络通信:
局域网通信原理:(以以太网为例)
——当时物理学家提出光传播的介质是以太(后来被证伪了),后来处于个人幽默将这种标准称为以太,
表示物理上没有的我们计算机有
----------------------------------------------------------------------
每台主机在局域网上,都有MAC地址这个唯一的标识符(48个比特位)
其实磁盘也有,叫做序列号。
局域网通信发送消息其实每个人都可以收到,但消息内容中包含目标,非目标的不会对消息
进行处理。(被叫做泛洪)这也就是为什么网卡有一个全世界唯一(通常)的48位序列号
所以网络会被监视,所以存在抓包,因为局域网是透明的。
以太网中同一时刻,只允许一个机器向我们的网络中发送数据,多台机器同时发送就可能会
发生数据干扰,叫做数据碰撞,在没有交换机的情况下,一个以太网就是一个碰撞域。
所有发送数据的主机都要进行碰撞检测(是否有其他机器正在发送数据)和碰撞避免(
有碰撞避免的算法,有正在发的就等着,所以人多的地方网速慢,发生碰撞的概率大),
以太网本质上就是共享的资源,其实就是临界资源,具有互斥属性,只不过不是加锁的方式,
而是先干,冲突了再说
主机之间通信,本质上是两个协议栈在通信,发送数据的原始动力大多数时候是人
网卡 数据链路层-》网络层-》传输层-》应用层
网络协议栈每一层都有协议,同层之间,每一层都认为自己在和对方同层在进行通信
(类似于在网购时,并不是直接把商品寄给你,还会有包装盒等等,这些其他东西就叫做
协议报头,而我们实际买的商品叫做有效载荷)
在以上协议栈一层层封装的过程就是封装的过程。为什么从上到下封装呢?
必须贯穿操作系统,操作系统是网卡的管理者,封装的过程就是一层层添加协议报头的过程。
解包和分用的过程:对端同层要先解包:包头和载荷的有效分离,所以在同层看来,同层之间
在直接进行通信;任何一层,只认识自己的报头,不关心其他的有效载荷
不考虑应用层协议,任何协议
1、包头必须能做到和有效载荷分离的能力 2、包头中必须包含如何将自己的有效载荷交付给
上层的哪一个具体协议
为什么叫做协议“栈”呢?一次进行包装,从最新的包装到最旧的包装一次解包,类似于栈的出栈
网卡有一种混杂模式,当网卡收到一个数据帧时,不管是不是给自己发的,都往上传输,
这就是抓包工具的原理,而非混杂模式就会直接丢弃不是发给自己的数据包
网络中的地址管理:IP地址(ipv6是中国提出的(比如北京奥运会用的就是ipv6)解决了ip数目不足的问题)
IP地址用来表示全球范围内,主机的唯一性
只要有网络层,就会有路由功能:发现不是发给自己局域网主机的报文,就直接将这个报文
交给路由器。主机和路由器能直接通信:同一个局域网里的主机可以直接通信。
路由器就是一个一个节点的指路人,最终找到我们的des
网络层之上,一切皆ip,再往下就是经过数据链路层封装的报头来进行在以太网、令牌环网、
无线lan等等具体网络通信原理来进行数据的传输与接受,需要改变的只是相应的驱动程序
。路由过程中,ip地址不变,但是mac地址一直在变。
总结就是:全世界的所有网络都是ip网络,屏蔽最底层网络的差异
"192.168.0.123"->点分十进制的ip地址
网络通信时,ip必须是四字节的
端口号:表示机器中需要数据的进程,是一个2字节16位的整数
四、自定义协议
传输层+网络层都在操作系统内部,数据链路层是驱动程序,应用层是程序执行逻辑,
也就是我们的代码,解决日常需求的网络程序。
协议就是双方约定好的结构化的数据,读取的数据看成是什么东西:消息、地址等等
(创建套接字、内容结构体绑定、收发消息、监听套接字和服务套接字)
方案一:长字符串(序列化和反序列化,转化时转化成合法的结构体)
方案二:结构体对象
可以将结构体对象直接发送,但是可能存在跨平台问题,比如说C/C++/Java/Python
这些对于结构体的对齐等等处理不一样导致信息传递存在误差
但是直接传递也是存在的,比如在操作系统中都是直接传递结构体,因为操作系统都是
C语言写的
进行网络通信,在应用层建议使用序列化和反序列化,而直接传结构体的方案,除非
场景特殊,否则不建议——所有的语言都支持字符串
调用read、write都是将数据发到操作系统内核的发送缓冲区、接受缓冲区中,read和write
本质上都是拷贝函数,而什么时候发送发送多少都有tcp自主决定,所有tcp叫做传输控制协议
操作系统将数据发送到网络里本质上也是拷贝。
计算机世界里,通信即拷贝,主机间通信,本质上是将发送方缓冲区中的内容拷贝到接收方
的缓冲区当中。所以tcp通信时全双工的,主机双方各自之间接受和发送时分离的,两条线路互不
打扰——这就是系统和用户之间的生产者消费者模型,所谓tcp协议就是四个系统和用户之间的
生产者消费者模型,写时缓冲区已满阻塞或者读时缓冲区为空阻塞都是用户在和系统之间进行同步
udp:用户数据报
tcp:面向字节流:对方收多少次和接受多少次没有严格的1:1的对应关系,这就是
面向字节流
定制的协议应该具有的功能:
1、结构化的字段,提供好序列化分反序列化方案
2、解决因为字节流的问题导致读取报文不完整的问题