网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
在计算机网络常常会听到什么IP地址,端口号啊什么的,下面我们就来了解了解计算机网络中常见的名词概念。
IP地址: 这个很好理解,其实就是相当于我们平常的住址,地址啥的,就是描述主机的位置在哪里,本质上就是一个32位的整数,为了方便人类的记忆,把这串32位的二进制数字使用“点分十进制”来表示,比如218.85.118.211
这一串数字,有一个特殊的IP地址,叫做环回IP127.0.0.1
,这个IP地址表示自己这个主机。
端口号: 你的设备上有那么多运行的程序,仅仅确定了IP(也就是你的设备在哪里)是不足以通信的,可以理解为找到了你住哪一栋楼,但是不知道你具体住在那一层或者那一间房子,所以引出了端口号,相当于你房间的门牌号,一台主机上都有唯一的一个端口号对应与一个应用程序,如果你把IP地址比作收件地址,那么端口号就是收件号码。端口号本质上就是一个2字节的整数,范围是0-65535
,一般服务器的端口号需要自己指定,如果随机分配的话,你的客户端要怎么访问你的服务器呢?毕竟客户端才是主动的一方,知道服务器在哪里才能与它“约会”嘛!
协议: 想要进行有效的通信,前提需要明确两者间的协议,毕竟你和动物交流是做不到的嘛!协议本质上就是对数据发送的格式做出要求,然后你和接收方约定好按照你的要求去解析这个数据。网络通信本质传输的是电信号与光信号,通过光信号的频率来决定电平到底是0
还是1
。
网络通信的过程是一个非常复杂的过程,一个协议往往是不足以支撑起庞大的网络通信的,所以更好的办法就是把一个复杂的协议给拆分成多个小的协议,每个协议负责一小部分的工作,将这些协议进行分层,毕竟三个臭皮匠赛过一个诸葛亮。
这样有几个好处,一是该层协议不必关心其他层协议的细节,更好地做到了封装,二是能够把对应层的协议转换成其他层的协议,这样就能更好地解耦合。
这样打电话的人不必知道电话的工作原理(封装),打电话的人可以使用有线电话,也可以使用无线电话(解耦合)。
接下来我们就来了解了解协议分层。
🍋2.计算机网络分层
🍒2.1协议分层模型
教科书上面的协议分层模型,OSI七层模型,从硬件到软件分别为物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。
🍇各层协议的工作如下(来源图解TCP/IP):
- 应用层 为应用程序提供服务并规定应用程序中通信相关的细节。包括文件传输、电子邮件、 远程登录(虚拟终端)等协议。
- 表示层 将应用处理的信息转换为适合网络传输的格式,或将来自下一层的数据转换为上层能 够处理的格式。因此它主要负责数据格式的转换。 具体来说,就是将设备固有的数据格式转换为网络标准传输格式。不同设备对同一比
特流解释的结果可能会不同。因此,使它们保持一致是这一层的主要作用。- 会话层 负责建立和断开通信连接(数据流动的逻辑通路),以及数据的分割等数据传输相关 的管理。
- 传输层 起着可靠传输的作用。只在通信双方节点上进行处理,而无需在路由器上处理。
- 网络层 将数据传输到目标地址。目标地址可以是多个网络通过路由器连接而成的某一个地 址。因此这一层主要负责寻址和路由选择。
- 数据链路层 负责物理层面上互连的、节点之间的通信传输。例如与1个以太网相连的2个节点之间 的通信。 将0、1序列划分为具有意义的数据帧传送给对端(数据帧的生成与接收)。
- 物理层 负责0、1比特流(0、1序列)与电压的高低、光的闪灭之间的互换。
在实际实现的时候,并不会使用OSI七层协议,因为太麻烦了,而开发中用的最多的就是TCP/IP五层协议,或者说是四层协议,因为物理层是硬件,我们程序员不必去关心。
🍇各层的作用:
物理层:针对硬件设备间的协议,保证所有的主机和网络设备之间都是相互匹配的。
数据链路层:完成两个相邻设备间的通信。
网络层:负责网络中任意两点之间的通信,为这两点的通信规划出一条“最佳”路径。
传输层:负责端与端之间的通信,只关注结果(数据有没有收到),不关心过程。
应用层:和应用程序密切相关,关注所传输的数据是用来干什么的。
对于主机实现了物理层到应用层五层,对于路由器实现了物理层到网络层三层。对于交换机实现了物理层到数据链路层两层。上面的路由器和交换机只是针对传统意义上的路由器与交换机,现在的路由器与交换机的界限越来越模糊了(就是现在的路由器有交换机的功能,交换机有路由器的功能)。
下面我们以QQ发送消息的过程来解释数据是怎么传输的。
🍒2.2数据在各个层的传输过程
在应用层,会将用户需要发送的数据进行封装构造成一个应用层协议报文。
这个应用层的协议是程序员来设计的,不同应用程序的应用层协议是不同的,假设有用户A在QQ上发送了一句消息Hello
给用户B,发送时间为2022-04-20 12:22:22
,我们来模拟该数据发送的过程。
假设应用层的报文如下:
应用层会调用操作系统锁提供的API,将应用层数据交给传输层。
传输层常用的协议有UDP与TCP,以TCP为例,传输层会基于应用层的数据来构造一个传输层的报文。该报文由协议报头加上数据载荷构成。
接下来传输层会将传输层的数据转交给网络层。
网络层常用的协议有IP协议,会将TCP数据报继续封装成IP数据报,也是在原来数据的基础上加上一个IP协议报头,新的网络层IP数据报是由IP协议报头加上数据载荷组成。
然后,网络层会将封装的数据交给数据链路层,数据链路层会在IP协议数据报的基础上,加上帧头与帧尾,封装构造成数据链路层数据帧(以太网数据帧)。
最后,数据链路层的数据交给物理层,物理层会将以太网数据帧(本质就是二进制数据),物理层会将二进制数据转换成高低电平通过网线或者无线的形式发送出去。
上面从应用层到物理层数据的转变过程称为封装,当接收方收到数据时会将已经封装好的数据进行拆分,这个过程叫做分用。
当用户B的主机接收到用户A发送的数据后,就会从物理层开始,逐级向应用层进行对应层协议的解析,这个过程就是分用,它是封装的逆过程。
但是在实际的过程中,并不是直接从A的主机到达B的主机,而是在这两点的过程中会经历许许多多的“中转站”,这个中转站最常见的就是路由器,交换机等类似的设备,在数据到达一个路由器时会先将数据分用,也就是从物理层解析至网络层,然后在重新封装重新发送,任意一台设备接收到数据时都会先进行分用,分用获取到相关传输信息后再决定是继续发送还是直接使用,但是数据的发送次数是有限制的,每经历一个设备(路由器/交换机)发送次数都会减一,当次数为0时,转发设备就会丢弃这个数据,为什么要这么做呢?因为可能存在发送的目的地地址根本不存在,总不能一直转发浪费资源吧!一般来说这个转发最大限制次数是可以配置的,配置时都会设置一个只有地址无效时才会超过的转发次数。
🍇几个专有名词:包、帧、数据报、段、消息
以上五个述语都用来表述数据的单位,大致区分如下:
包可以说是全能性述语。帧用于表示数据链路层中包的单位。而数据报(包)是IP和UDP等网络层以上的分层中包的单位。段则表示TCP数据流中的信息(传输层的数据包的单位)。最后,消息是指应用协议中数据的单位。
🍒2.3TCP与UDP
对于网络编程,操作系统提供了一组API,叫做socket
,可以视为应用层与传输层之间的通信桥梁,而传输层中有两个非常重要的协议,那就是TCP与UDP。
TCP是一种面向有连接的传输层协议。它可以保证两端通信主机之间的通信可达。
TCP能够正确处理在传输过程中丢包、传输顺序乱掉等异常情况。此外,TCP还能够有效利用带宽,缓解网络拥堵。
然而,为了建立与断开连接,有时它需要至少7次的发包收包,导致网络流量的浪费。
此外,为了提高网络的利用率,TCP协议中定义了各种各样复杂的规范,因此不利于视频会议(音频、视频的数据量既定)等场合使用。
UDP有别于TCP,它是一种面向无连接的传输层协议。UDP不会关注对端是否真的收到了传送过去的数据,如果需要检查对端是否收到分组数据包,或者对端是否连接到网络,则需要在应用程序中实现。UDP常用于分组数据较少或多播、广播通信以及视频通信等多媒体领域。
总的来说,TCP是有连接,可靠传输,面向字节流,全双工,而UDP是无连接,不可靠传输,面向数据报,全双工。
这里的可靠与不可靠传输不是指的不是安全,而是指你发送出数据后,能不能判断对方已经收到,如果能够确定对方是否收到则就是可靠传输,否则就是不可靠传输。
全双工是指,一条链路,双向通信,除了全双工还有一个概念叫做半双工,表示一条链路,单向通信。
了解了一些网络知识之后,我们就可以开始学习java中的网络编程了,学习网络编程过程中,你就会很明显感受到TCP与UDP之间的区别,对于网络编程,请听下回分解。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!