✏️作者:银河罐头
系列专栏:JavaEE
“种一棵树最好的时间是十年前,其次是现在”
网络能够跨主机通信
局域网:把一些设备通过交换机和路由器连接到一起。
局域网要求这些设备不能离太远(同一个网吧,同一个学校,同一个公司…)
局域网组建网络的方式有很多种:
1)基于网线直连
2)基于集线器组建
3)基于交换机组建
4)基于交换机和路由器组建
集线器,交换机,路由器 , 这几个都是组建网络中涉及到的重要设备。
而现在,带有路由功能(三层转发)交换机也是很多很常见的,交换机和路由器之间的界限越来越模糊。
交换机有家用的,也有企业用的。
广域网:范围更大的局域网,把更多的局域网也连接到一起,把一个城市里的电脑都连起来,再把城市和城市之间的局域网也连接起来,越连越多,越连越大,就成了广域网。
单机 => 局域网 => 广域网
表示了网络上设备所在的位置。(用于定位主机的网络地址)
标识了一个具体的应用程序。
协议是网络通信中最核心的概念。
相当于是一种约定,商量好数据是啥样的格式进行传输的。有了这个约定才能让双方理解对方的含义。
发送方约好了我发的数据是啥样的,接收方按照这个固定的格式来进行解析。
一个协议,可能简单,也可能复杂。
举个栗子:像日常生活中使用的方言,“普通话”,“东北话”…就属于协议。
网络通信是一个比较复杂的事情,需求场景复杂了,实现功能也会比较复杂。如果这个协议太复杂了,学习成本、使用成本、理解成本、维护成本都会比较高。因此,实际采取的做法,是针对这个复杂的大协议,拆分成若干个相对简单的小协议。随着把这个大协议拆分成小协议(每个协议负责一部分功能),此时就发现,某些协议之间起到的功能是类似的。就针对这些小协议,进一步的"分类"(“分层”)。这就好比代码拆分出很多类,有些类功能差不多,就可以放到一个包里。
当前学习的网络协议是在分层的大背景下展开的。
协议分层有很多的好处:
1.降低了学习和维护的成本(封装)
2.可以灵活的针对这里的某一层协议进行替换。
当今互联网世界,协议分层主要有两种风格。(其实是一种)
OSI 七层网络模型
TCP/IP 五层(四层) 网络模型 [实际上的情况]
TCP/IP 是 OSI 简化的实现方式
越往下的越接近硬件设备,越往上就越接近用户。
物理层:约定了网络通信中基础的通信设备是啥样的。比如通信中使用的网线,网口等设备。
数据链路层:具体负责两个节点之间,具体怎么进行传输
网络层:主要负责路径的规划,走哪条路比较划算
传输层:端到端之间的传输。
应用层:应用程序,描述了传输的数据,用户要怎样来使用。
举个栗子:
在淘宝买件衣服,我需要写收件人姓名和地址,商家就会根据这个地址给我发快递。
站在我和商家的角度,并不关心快递传输的过程,只关心起点到终点,这个过程就是(传输层)做的工作。
假设这个快递是 上海 => 西安,快递公司就需要考虑从哪条路走。(网络层)
上海 -> 苏州 -> 西安
上海 -> 南京 -> 西安
上海 -> 徐州 -> 西安
…
假设快递按 上海 -> 南京 -> 西安 这条路线,
上海 -> 南京:通过卡车
南京 -> 西安:通过飞机
两个结点之间怎么运输(数据链路层)
要保证从起点到终点路上都是畅通的,公路,铁路,机场等基础设施…(物理层)
应用层:比如在淘宝买了个鸡毛掸子,可以用来除尘,还能用来打不听话的熊孩子…(doge)
网络分层,相当于上层协议调用下层协议,下层协议给上层协议提供服务
这五层协议各司其职。
以 QQ 为例,A 给 B 发送一个 hello
1.应用层:
用户在输入框中输入 hello 这个字符串,qq 这个应用程序,就把这个字符串给构造成一个应用层数据包。
一个假设的应用层协议的格式:
发送方QQ号;发送时间;接收方QQ号;消息内容
所谓的"应用层数据包"本质上就是一个遵守了约定格式的字符串
程序员要调用操作系统的 api ,把应用层数据交给传输层。
2.传输层(进入系统内核了)
在传输层中就要把上述应用层数据,构造成传输层的数据报。
传输层使用到的协议,最知名的就是 UDP 和 TCP.比如此处是使用 UDP ,需要构造出 UDP 数据报(在应用层数据基础上加个 UDP 报头)
UDP 报头,这是另外一个特定格式的字符串(这里涉及到源端口和目的端口),此处就好像字符串拼接一样,把这个报头和后面的数据拼到一起.
所谓的报头就是一个标签,,通过这个标签表示要把这个信息进行怎样的传输
传输层就把 UDP 这个数据报交给网络层
3.网络层
最知名的协议 IP 协议,IP 协议要基于上述数据,打包成一个 IP 数据报
IP 报头也相当于是一个字符串,,包含了另外一组信息,(最核心的信息,源 IP,目的 IP)
传输过程需要知道 源 IP,源端口,目的 IP,目的端口,协议类型。(一次通信中,基础的 五元组)
网络层数据已经准备好了,需要进一步交给数据链路层。
4.数据链路层
最知名的协议,叫做"以太网"。基于上述数据,还要打包成一个"以太网数据帧"
接下来这个数据继续向下传输,交给物理层
5.物理层
把上述二进制的数据(0101)转换出电信号/光信号。
此时就真正把数据传输出去了。
上述过程从应用层到物理层,层层加码,这个过程称为"封装"(这个封装不是面向对象的封装)
接收方的工作。(此处省略中间的转发过程) 此处只考虑B 的接收
1.物理层
网卡收到的光信号和电信号。是在物理层,把这个光电信号转换回二进制数据的,转换回的这个二进制数据其实就是一个以太网数据帧
2.把这个数据交给数据链路层解析
数据链路层需要去掉帧头帧尾,去除中间的载荷,交给上层的网络层,IP 协议。
以太网数据帧帧头里会记录这个载荷是不是一个 IP 数据报
3.网络层
IP协议针对这里进行解析,解析出 IP 报头,取出IP 协议的载荷,把这里得到的传输层协议交给上层传输层。
IP 报头里会记录载荷是 UDP 还是 TCP
4.传输层
UDP 再进行解析,取出报头,取出载荷,再把这个载荷交给对应的应用层程序。
UDP 报头里有一个重要的字段,目的端口,目的端口是一个具体的应用程序,关联在一起的,因此就可以根据这个端口来把数据交给应用程序了。
5.应用层
qq 应用程序,qq就会针对应用层协议 , 也进行解析,显示到界面上
上述,从下到上,层层解析,这个过程称为"分用"
HTTP 是一个应用层协议,和传输层没啥关系
TCP 和 UDP 报头结构不一样,前面拼接的字符串也是不同的, 报头不同,支持的功能和特性也是不同的。
TCP ,可靠传输。UDP,不可靠传输。
一次通信只能用一个(不能一次通信中发送方是 TCP , 接收方是 UDP)
整个网络协议中,协议分成了很多层。山城协议要调用下层协议(上层协议把数据交给下层,继续封装),下层协议要给上层协议提供支持(下层协议解析好数据交给上层)
这里的这几层协议之间是有明确的层级关系的,只有相邻的两层之间才能进行交互(不能跨层交互)
上述这些约束,让通信变得简单,清晰起来了。
路由器,三层转发,在网络层转发。
交换机,二层转发,在数据链路层转发。