【Java网络编程01】网络原理初识
1. 网络通信基础概念
网络通信:网络互连的目的就是网络通信,即网络数据传输,再直白点而言就是不同主机的不同进程之间基于网络进行数据的传输交互。
那么,在组建的网络上有各种各样的主机,我们如何确定数据的传送方和接收方主机呢?这就需要用到IP地址了
1.1 IP地址
IP地址:IP地址就是用来标识主机、其他网络设备(如路由器)的网络地址。简单来说就是IP地址就是区分不同网络主机的唯一标识。
格式:IP地址是一个32位的二进制数,通常被分为4个"8位二进制数"(也就是4个字节),如01100100.00000100.00000101.00000110
,为了方便表示与记忆,通常使用"点分十进制"的方式进行表示,即a.b.c.d
的方式(a,b,c,d都是0-255之间的十进制整数)如100.4.5.6
特殊IP:
127.*的IP地址用于本地环回测试,通常是127.0.0.1
本机环回主要用于本机到本机的网络通信(系统内部为了提升性能,不会走网络的方式进行传输)对于网络编程程序而言,常见的开发方式都是本机到本机的网络通信
IP地址解决了在网络通信过程中标识源主机和目的主机的问题,但是我们如何确定数据是由源主机上的哪个进程发出的以及由目的主机上哪个进程进行接收呢?这就要用到我们 端口号 的概念了
1.2 端口号
端口号:IP地址用于定位网络上的主机,而端口号用于定位主机上特定的进程。例如在收发快递的过程中,不仅需要有收件人的收货地址(IP地址),也需要有收货人联系方式(端口号)
格式:端口号是一个0-65535范围的数字,在网络通信中,进程可以通过绑定一个端口号进行数据的传输
新的问题:
现在我们已经可以根据IP地址和端口号确定网络数据收发双方了,但是网络通信依靠二进制数据进行传输,传输的内容可以是文本、视频、音频等等不同类型,因此收发双方必须使用一致的数据格式和编解码方式,于是就引出了 **协议 **的概念。
1.3 协议
协议:是网络协议的简称,协议就是网络通信过程中全部的网络设备都需要遵守的一组规定,例如如何建立连接、如何识别对方。只有遵守这个约定,计算机之间才能互相通信交流,协议通常由以下三部分构成:
- 语法:即数据与控制信息的结构与格式
- 语义:需要发出哪种控制信息,完成何种动作以及做出何种响应?
- 时序:事件实现顺序的详细说明
协议(protocol)最终体现为在网络上传输的 数据包格式。
作用:
计算机设备之间的传输媒介通常是光/电信号,使用光的频率和高低电平来表示0/1信号,要想传递信息,就需要统一通信双方使用的数据格式
- 计算机制造厂商有很多
- 计算机的操作系统也有很多
- 计算机网络设备也有很多
- 如何让不同厂商制造出的不同操作系统的计算机之间可以互相正常通信?,这就需要有人站出来制定一个统一的标准,这就是协议
知名协议默认端口号:
系统端口号为0-65535,其中:0-1023为知名端口号,这些端口号被预留给服务器程序用于绑定特定的应用层协议,如:
- 21端口号:预留给SSH服务器绑定SSH协议
- 22端口号:预留给FTP服务器绑定FTP协议
- 23端口号:预留给Telnet服务器绑定Telnet协议
- 80端口号:预留给HTTP服务器绑定HTTP协议
- 443端口号:预留给HTTPS服务器绑定HTTPS协议
1.4 五元组
在TCP/IP协议中,使用五元组来标识一个网络通信
- 源IP:标识源主机
- 源端口号:标识源主机上发送数据的进程
- 目的IP:标识目标主机
- 目的端口号:标识目的主机中接收数据的进程
- 协议号:标识发送进程与接收进程之间的数据格式
在Windows中我们可以打开cmd输入命令netstat -ano
查看五元组信息:
1.5 协议分层
协议分层:对于网络协议来说,往往分成几个层次来定义
分层的作用:网络通信过程中所涉及到的细节是非常多的,如果只用一个协议来描述,那么这个协议就会变的十分复杂,需要确定好方方面面的内容,因此设计分层的概念是十分有必要的!
分层最大的好处:提供面向接口编程的实现,定义好相邻两层之间的接口规范,实现方将接口功能实现,而调用方只需要调用接口使用提供的服务。
- 对于提供方而言,利用封装思想,隐藏内部实现细节,只开放提供的服务即可
- 对于使用方而言,无需关心提供方如何实现,只需要调用接口使用提供的服务即可
- 某一层的协议被替换后,对于其他层无影响(无痛替换)
两套协议标准:
最常见的协议分层体系模型有两种,一种是OSI七层模型,另一种是TCP/IP五层(或四层)模型
-
OSI七层体系模型:由物理层、数据链路层、网络层、传输层、会话层、表示层、应用层,但是这种方案过于复杂,因此没有落地实现,只是"理想中的方案"
-
TCP/IP五层协议:
名称 作用 代表协议 应用层 负责应用程序间的沟通 SMTP、FTP、HTTP等协议 传输层 负责两台主机之间的数据传输 TCP、UDP等协议 网络层 负责地址管理和路由选择 IP、ARP、ICMP协议 数据链路层 负责设备间数据帧的传送和识别 网卡层 物理层 负责光/电信号的传输 硬件层
网络设备所在分层:
- 对于一台主机而言,它的操作系统内核实现了从传输层到物理层的内容,即TCP/IP五层模型的下四层
- 对于路由器,它实现了从网络层到物理层的实现,即TCP/IP协议的下三层
- 对于交换机,它实现了从数据链路层到物理层的实现,即TCP/IP协议的下两层
- 对于集线器,它只实现了物理层
注意:这只是传统意义上的交换机和路由器,事实上随着网络设备技术的发展,也出现了很多3层、4层交换机,4层路由器。
1.6 封装和分用
封装和分用是网络传输数据过程中,最核心的流程
我们通过使用QQ传送一个"hello"消息为例讲解网络传输的过程,并体会TCP/IP五层协议各自的工作流程
封装流程:
-
应用层(应用程序)
接收方QQ客户端从消息输入框中获取到用户输入的"hello",然后就会把这个字符串封装构造成一个应用层的数据包,我们可以理解为QQ的程序内部内置了一个应用层协议,应用层数据包就是根据这个协议而封装成的,我们假设此应用层协议为:
发送方QQ号;接收方QQ号;发送时间;消息正文
此时应用程序就会调用操作系统提供API,把这个数据包交给传输层 -
传输层
传输层会把上述应用层数据包作为一个整体,然后依据选用的传输层协议,封装成传输层数据包,这里我们假设使用UDP协议,就会在整个应用层数据包前拼接UDP报头成UDP数据包。
其中应用层数据包以一个整体作为UDP数据报的载荷部分,封装为传输层数据包后就要进一步调用网络层提供的API,将数据包交给网络层进行处理 -
网络层
网络层最核心的协议就是IP协议,会把传输层数据包进一步封装成IP数据包,具体做法是将传输层数据包作为一个整体为载荷部分,前部拼接一个IP协议报头。
封装成IP数据包后调用下层数据链路层提供API,并将IP数据包交给数据链路层进行处理。 -
数据链路层
数据链路层涉及到的核心协议就是以太网了,会把上层的IP数据包当作整体为载荷部分,并在前头添加以太网帧头,尾部添加以太网帧尾,封装成以太网帧
然后调用下层物理层提供的API,将以太网数据帧交给物理层 -
物理层
将上述这样的以太网数据帧,二进制结构(0101数据串)转换成光信号/电信号/电磁波信号然后进行发送
以上的这些层层封装数据包的过程就成为 **封装 **,而封装的逆过程就被称为 **分用 **
我们暂且不考虑中间过程,假定数据包已经传送到了接收方B的网卡,B如何处理的过程就是分用的过程。
分用流程:
-
B的物理层将接收到的光/电/电磁波信号转化为数字信号(0101二进制串),得到一个以太网帧,进一步把这个以太网帧交给数据链路层处理。
-
数据链路层会按照协议,使用相同的以太网帧格式解析,去掉以太网帧头和以太网帧尾,取出其中载荷部分交给上层网络层
-
网络层会按照IP协议进行解析,去掉IP首部,取出其中载荷部分再交给上层传输层
-
传输层根据指定的UDP协议进行解析,去掉UDP报头首部,取出其中载荷部分再交给上层应用层
-
应用层中的QQ应用程序就会按照QQ内部应用层协议进行解析数据,QQ程序拿到相关信息后就会在窗口弹出提示,并把消息内容、发送人、发送时间都显示在屏幕上。
1.7 其他概念
再来谈谈网络编程中的其他重要概念
客户端VS服务器端:
客户端:在网络通信过程中主动发起请求的一方,称为"客户端"
服务器端:在网络通信过程中被动接受请求的一方,称为"服务器端"
需要注意一个程序在不同的场景中,可能是客户端,也可能是服务器端,例如在如下分布式系统中,客户端请求入口服务器,此时入口服务器是接收请求方,是服务器端(Server),但是入口服务器如果需要负载均衡,则需要请求分布式服务器A和B,此时入口服务器又作为了客户端(Client)
请求VS响应:
客户端发送给服务器端的就是请求(Request)
服务器端返回给客户端的就是响应(Response)
客户端与服务器端交互有很多种模式:
- “一问一答型”:一个请求对应一个响应,这是最常见的,在网站开发中(Web开发)中经常使用
- “一问多答型”:一个请求对应多个响应,主要应用于"下载"场景中
- “多问一答型”:多个请求对应一个响应,主要应用于"上传"场景中
- “多问多答型”:多个请求对应多个响应,主要应用于"远程桌面控制"场景中