网络为什么要分层?
要保证数据安全合理的发送给接收方,就需要很庞大的功能体系。如果将这些功能封装成一个个的接口放在系统中而不加以区分,无疑是很不科学的。 分层可以有效的对各层功能解耦合,将不同的功能分层,维护也更加方便。
网络的拓扑结构
最初计算机的不同主机之间是不能通信的,只能处理各自独立的数据,但当需要三个不同数据需要合并时,三台主机之间就必须建立通信,交换机将不同的主机连接起来,这时就有了数据交换的能力。 随着主机的增多,就有了局域网的雏形。 当不同的局域网之间需要数据连通时,路由器将不同的局域网连接起来,就组成了覆盖范围更广的城域网或广域网
局域网(覆盖范围1km以内) 城域网(覆盖范围20km以内) 广域网(覆盖访问20km以上)
IP协议
IP地址: ipv4: uint_32_t
--DHCP 动态地址分配
谁用给谁分配
--NAT 网络地址转换
给多台主机组织一个私网,私网中的主机使用私网的IP地址,对外通信时使用唯一的IP地址
ipv6: uint_8_t[16] 用于在网络中唯一标识一台主机 端口号: unit16_t 在一台主机上唯一标识一个网络通信的进程。 网络中的每条数据都带有两条信息:源端端口号/对端端口号 IP地址和端口号搭配使用,表示一台主机上的哪一条数据,要发送到哪一台主机的哪一个进程上去。
TCP/IP模型:
通信协议:数据格式约定 通过网络中服务不同,使用的协议不同,划分了不同的协议分层。 协议分层:OSI/TCP/IP OSI七层模型:应用层/表示层/会话层/传输层/网络层/链路层/物理层 TCP/IP五层模型:应用层/传输层/网络层/链路层/物理层 对于层状结构,尽管我们知道各层之前联系要依靠很多设备间接通信,但是由于这样的解耦合,我们仍然可以认为各层之间是直接沟通的:
应用层:负责应用程序之间的沟通 --- HTTP/FTP/DNS/DHCP....
传输层:负责端与端(两个节点)之间的数据传输 --- TCP/UDP
应用层和传输层没有对饮的设备,只在通信双方的计算机中存在,甚至有的路由器中就包含了
网络层:负责地址管理与路由选择 --- 主机IP地址的描述 --- IP --- 路由器
链路层:负责相邻设备之间的数据传输 --- 网卡硬件地址的描述(mac地址的描述) --- 以太网协议 /令牌环网--- 交换机
物理层:负责物理光电信号的传输 --- 以太网协议 --- 网线、同轴电缆、光纤、wifi无线网使用的电磁波、调制解调器(猫)集线器
关键名词:
集线器:光电信号在传输过程中是会衰减的,如果有这样一个设备可以对光电信号进行加强,使得光电信号可以传输的更远,
就可以实现远距离数据传输。这个设备就是集线器
以太网:以太网的名字来源于20世纪20年代的物理学假说:“以太假说”,物理学家认为,光的传输是需要媒介的,
太阳照到地球有八分钟的路程,那么是不是宇宙中充满了像“以太”这样的物质呢?当然这个假说被推翻了。
但是当时参与演讲的还有两个计算机工程师,既然在物理学中不存在,但是在我们的局域网里是存在的呀,所以就命名了“以太网”作为互联网的网络标准。
层状结构的网络通信
在一台计算机主机中,从上到下由用户层、系统调用层、内核层、驱动、硬件组成,负责网卡驱动的部分就是网络通信,也叫网络协议栈(应用层、传输层、网络层、链路层)。网络通信时,两台主机之间的通信,是由两台主机的网络协议栈完成的,所以可以理解为,就是两个网络协议栈的通信。 在网络通信中,网络层负责将数据发送到哪里的问题,传输层负责数据真正的传输过程,这就好比一个武士,练就了一身武艺(传输层)他要杀人,也知道要杀谁(网络层),但是他可以保证一定能杀死吗? 这时候它就需要一把宝刀,可以保证他可以杀死对手并或者回来(传输层:负责处理数据传输过程中遇到的问题,保证数据安全可靠) 但是他为什么要啥人呢?他是一个刺客,客户要他杀谁,他就得去(应用层) 这样的层状结构,当网络通信出现问题时,可以根据问题快速找出错误位置,所以层状结构的本质就是:
1.软件工程上的解耦合,层与层之间只有接口的相互调用关系
2.增加代码的可维护性和可扩展性
局域网(物理层)通信:
在局域网通信中,本质是,所有的主机都收到了任何数据,只不过应该筛选提交上来了,收到发给自己的数据。 1.局域网中,网络本身的特性是要求,同一时刻只能有一个机器进行发送数据。 2.如果网络中的数据发生了“碰撞”,当前主机是可以检测到的 3.所有的主机都要进行“避免碰撞算法”(就是等一下再发) MAC地址: MAC地址就是局域网地址,也叫以太网地址或物理地址,顾名思义,就是局域网中数据传输的地址。用于在网络中标识一个网卡的位置,是全球唯一的。 MAC数据帧: 在数据经过链路层时,会对数据进程封包,封包的内容就包括源端的mac地址和对端的mac地址。组成的数据就是mac数据帧。 链路层封包完成之后,就会将数据扔进局域网中,所有的主机都收到了这个mac数据帧,
单项数据发送:若这个数据帧dest_src等于某一个主机(假设B)的src_mac,那么所有的主机经过解析之后,B知道,这是发给自己的,就向上层交付,其他主机知道这不是发给自己的,就丢弃。 广播发送数据:若这个数据帧的dest_mac等于FFFF……FFFF,即发送给全部主机,所有的主机都知道这是发送给自己的,就像上层交付。
网络通信中的数据封装与分用流程:
在一个局域网中,A端想要发送一个“你好”给B端,经历了TCP/IP的五层协议的封装与分用,每经过一层,对应的协议就会给有效数据添加报头,这个报头其实就是一个结构体,添加在缓冲区中数据的前面。 当报头添加完毕之后,可以进行传输了,根据IP协议的ip和port就可以找到对应的B端主机,将封装好的数据发送给B端。 B端收到数据之后,就会自下而上对数据进行解包,分用。
那么当前层是如何得知报头和有效载荷之间的分割呢?
1.报头定长
2.自定义描述字段
怎么知道,将有效载荷交付给哪个上层呢?
每个报头结构体中都包含了一个type字段,可以确定有效载荷会交给谁
也是因为 这一点,我们可以认为,服务端的某一层和客户端的某一层直接联系
这就是所有协议的共性:
广域网(互联网)通信
局域网链路层的网络不只是有以太网,还有令牌环网。 两者的区别就是,针对在网线中发生碰撞的处理方法不用,令牌环网是谁拿到令牌谁就发送数据。 其上层的方式相同,但是下层的组网方式是不同的。这就意味着,当局域网和局域网之前通信时,还要经过一些必要的过程。 当以太网的数据帧传输到路由器,路由器的物理层收到数据帧,向上交付给路由器的链路层,链路层完成解包,再讲有效载波交付到路由器的网络层。 网络层查看到数据的IP信息,就知道要发送给哪个局域网中的哪台主机,但是不是直接交给这台主机的网络层呢? 答案是绝对不是! 如果数据横跨两种不同组网方式的网络,那么还要使数据要能被对方网卡的驱动程序识别,所以路由器还必须向下层封包交付,再放入其网线碰撞域。 这个局域网的所有主机就开始识别,(以太网识别以太网,令牌环网识别令牌环网),最后收到数据,按照各自的格式向上交付。 这样的过程,保证了上层数据的完全一致,虽然下面的数据是不同的,但上层数据的交流完全不需要关心下层的不同。
IP地址: 上面的过程中,IP地址起着重要的作用:就是虚拟化了底层网络的差异(虚拟地址空间和一切皆文件也有这样的思想) 这样的虚拟化使得,上层交流不需要考虑下层的差异,使得通信变得方便起来。 上层只需要负责通信的内容,下层只需要构建好通信的方式,上层和上层之间的通信甚至不需要考虑下层。
网络字节序:
主机字节序: 字节序:cpu对内存中数据的存取顺序 主机字节序的分类: 大端字节序(低地址存高位) 小端字节序(低地址存低位) 主机字节序对网络通信的影响:造成数据二义 如下图,如果小端主机要发送一个整形1给一个大端主机,会按照小端字节顺序发送给大端主机,大端主机在收到数据之后,却会按照大端的字节序存入数据,这样一来小端主机发送的的整形1就变成了一个很大的数字。 网络字节序: 单单按照主机字节序的方式传输数据,一旦主机的大小端不同,就会造成数据二义,那么我们就需要制定一种数据传输的协议,避免这种事情的发生。 网络字节序:网络通信中的字节序标准(将自己的数据的字节序转换为标准的字节序之后再进行传输),避免因为主机字节序不同造成的数据二义。 网络字节序的标准——大端字节序 复习: 字节序针对的数据类型:存储单元大于一个字节的数据类型,short,int,long,float,double这种的。 char buf[]字符串是不需要考虑字节序的。 编写代码判断主机大小端:
Ⅰ
int a = 1; char* b = (char*)&a; if(b == 1){小端}
(b[0] 就是低地址,b[3]就是高地址)--- 地址一般用下标来说
(0x00 00 00 01 从左到右就是比特位的从高到低)
Ⅱ
union{int a,char b;}tmp_t tmp_t tmp; tmp.a = 1; if(tmp.b == 1) {小端}
union联合体成员共用同一个空间,如果a值为1,在空间中存储为:01 00 00 00(小端)或 00 00 00 01(大端),
而b是一个char类型,只获取一个字节大小,所以如果b,是01就是小端,b是00就是大端。
TCP和UDP
在网络通信协议分层中,我们应用层由程序员自己订立或选择,往下的各层由系统搞定。 在传输层我们说到两个协议:TCP和UDP 经常会被问到的问题是:在网络通信程序编程时,到底在传输层使用TCP协议好还是UDP协议好? 其实是不分好坏的,存在即合理。 tcp协议 是传输控制协议,它是面向连接,面向字节流,是可靠传输。 udp协议 是用户数据报协议,它是无连接的,面向数据报,是不可靠传输。 tcp保证可靠传输,但是速度没有udp快。 tcp应用于安全性要求高于实时性的场景,udp适用于实时性要求高于安全性的场景
|