专栏简介: JavaEE从入门到进阶
题目来源: leetcode,牛客,剑指offer.
创作目标: 记录学习JavaEE学习历程
希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长.
学历代表过去,能力代表现在,学习能力代表未来!
目录
1.网络发展史
1.1 独立模式
1.2 网络互联
随着时代的发展 , 越来越需要计算机之间共享通信 , 数据和软件 , 即多个计算机协同完成任务 , 于是有了网络互联.
网络互联:将多台计算机连在一起完成数据共享.
数据共享的本质是网络传输 , 即计算机之间通过网络来传输数据 , 也称网路通信.
根据网络互联的规模不同 , 可以分为广域网和局域网.
1.3 局域网
局域网即 Local Area Network 简称LAN.局域网内的主机之间可以进行网络通信 , 又称内网. 但局域网和局域网之间在没有连接的情况下不能进行通信.
最初两个主机之间想要进行网络通信 , 通常采用网络直连的方式 , 但一次只能连一个电脑局限性较大.
随后出现了集线器的网络互联方式 , 但集线器没有寻址的功能 , 它会把信息同时发给相连的所有主机 , 由主机去辨认该信息是否是自己的 , 因此还是有很大的局限性.
交换机的出现解决了集线器无法寻址的缺陷 , 而且交换机相当于内置了一个号码本 , 可以精确的对应号码发送信息 , 如果发送信息时 , 号码本上没有对应的电话 , 这时才会进行广播式的发送 , 一但找到目标会立即更新号码本. 但只能组建局域网
路由器的出现解决了 , 局域网之间无法进行互联的局限.
1.4 广域网
广域网简称 Wide Area Network , 简称 WAN. 通过路由器将多个局域网组建起来构成广域网 , 广域网内部的每个局域网都是其子网.
2.网络通信基础
网络的互联的目的是进行网络通信 , 也就是网络数据传输 , 更具体一点就是 , 网络主机中的不同进程间基于网络传输数据.
那么 , 在组件网络中如何判断 , 到底是那台主机将数据传输到另一台主机上? 这时就需要IP地址.
2.1 IP地址
- 概念:
IP地址主要用于标识网络主机 , 其他网络设备(路由器)的网络地址 , 简单来说:IP地址用于定位主机的网络地址.
- 格式:
IP地址是一个32位的二进制数 , 通常被分割为4个"8位二进制数" , 也就是4个字节.
例如:01100100.00000100.00000101.00000110.
通常用"点分十进制来表示" , 即 a.b.c.d 的形式(a,b,c,d 都是 0-256之间的十进制整数).
例如: 100.4.5.6
- 特殊IP:
127.*的IP地址用于本机环回测试(loop back) , 通常是 127.0.0.1
本机环回主要用于本机到本机的网络通信(系统内部为了性能不会走网络的传输方式) , 对于网络编程而言 , 常见的开发方式都是本机到本机的网络通信.
IP地址解决了网络通信时 , 定位网络主机的问题 , 但是还存在一个问题 , 传输到目的主机后 , 由哪个进程来接收这个数据呢?这就需要端口号来标识.
2.2 端口号
概念:
在网络通信中 , IP地址用于标识主机网络地址 , 端口号可以标识主机中发送数据 , 和接收数据的进程 , 简单说: 端口号用于定位主机中的进程.
格式:
端口号是0-65535范围的数字 , 在网络通信中 , 进程可以通过绑定一个端口号 , 来发送及接收数据.
注意事项:
两个不同的进程 , 不能绑定同一个端口号 , 但一个进程可以绑定多个端口号.
一个进程启动后,系统会随机分配一个端口(启动端口)
程序代码中 , 进行网络编程时 , 需要绑定端口号(收发数据的端口) 来发送 , 接收数据.
进程绑定一个端口号后 , fork一个子进程 , 可以实现多个进程绑定一个端口号.
2.3 认识协议
有了IP地址和端口号 , 可以定位到网络中唯一一个进程 , 但还存在一个问题 , 网络通信是基于二进制0/1数据来传输 , 如何告诉对方发送的数据是什么样呢?
网络通信传输的数据类型可以有很多中: 图片,视频,文本等. 同一个类型的数据 , 格式也可能不同 , 如发送一个文本字符串 "你好,世界!" , 那么如果表示发送的数据是哪种类型?以及文本的编码格式是什么?
因此基于网络数据传输 , 需要使用协议来规定双方的数据格式
概念:
协议 , 网络协议的简称 , 网络协议是网络通信(即网络数据传输)经过的所有网络设备多必须遵从的一组约定,规则. 如怎样建立连接 , 怎样相互识别. 只有遵守这个约定 , 计算机之间才能通信交流. 通常由三要素组成:
1.语法: 即数据与控制信息的结构或格式:
- 类似打电话时双方约定都使用普通话
2.语义: 即需要发出何种控制信息 , 完成何种动作以及作出何种响应.
- 语义主要用来说明通信双方应当怎么做 , 用于协调与差错处理的控制信息.
- 类似于打电话时 , 一方说: 你愁啥? 另一方说: 瞅你咋地?
3.时序 , 即事件顺序的详细说明.
- 时序定义了何时进行通信 , 先讲什么 , 后什么 , 讲话的速度. 比如是采用同步传输还是异步传输.
- 类似于男生和女生打电话 , 总是有男生发起通话 , 而总是男生恋恋不舍的时候 , 由女生要求结束通话.
协议(protocol)最终体现在网络上传输数据包的格式.
作用:
为什么需要协议?
就好比见网友 , 彼此协商胸口插只玫瑰花见面 , 这就是一种提前的约定 , 也可以称之为协议.
计算机之间的传输媒介是光信号和电信号. 通过"频率"和"强弱"来表示 0 和 1 这样的信息. 想要传递各种不同的信息 , 就需要约定好双方的数据格式.
计算机生成厂商 , 操作系统 , 网络硬件设备都很多 , 如果让这些不同的厂商之间生产的计算机能够相互顺畅的通信? 就需要有人站出来约定一个共同的标准 , 大家都来遵守 , 这就是网络协议.
知名协议的默认端口:
系统端口号范围为 0-65535 , 其中: 0-1023 为知名端口号 , 这些端口预留给服务端程序绑定广泛使用的应用层协议 , 如:
- 22端口 : 预留给SSH服务器绑定SSH协议
- 21端口: 预留给FTP服务器绑定FTP协议
- 23端口: 预留给Telnet服务器绑定Telent协议
- 80端口: 预留给HTTP服务器绑定HTTP协议
- 443端口: 预留给HTTPS服务器绑定HTTPS协议
Tips: 以上只是说 0-1023 范围的知名端口号用于绑定知名协议 , 但某个服务器也可以使用其他1024-65535 范围内的端口来绑定知名协议.例如: 餐厅的VIP包房是给会员使用 , 但会员也可以不坐包房 , 坐普通位置.
2.4 五元组
在TCP/IP协议中 , 用五元组来标识一个网络通信:
1.源IP: 标识源主机
2.源端口号: 标识源主机中该次通信发送数据的进程
3.目的IP: 标识目的主机
4.标识目的端口号: 标识目的主机中该次通信接收数据的进程
5.协议号: 标识发送进程和接收进程双方约定的数据格式
五元组在网络通信中类似于发快递:
2.5 协议分层
对于网络分层来说 , 往往分成几个层次进行定义.
什么是协议分层
协议分层类似于打电话时 , 定义不同的层次协议.
上述例子中 , 协议只有两层 , 但是实际的网络通信会更复杂 , 需要更多的层次.
分层的作用
分层的最大好处类似于面向接口编程 , 定义好两层之间的接口规范 , 让双方遵循这个规范来对接.
在代码中 , 类似于定义好一个窗口 , 一方为接口的实现类(提供方 , 提供服务) , 一方为接口的使用类(使用方 , 使用服务).
- 对于使用方来说 , 并不关心提供方是如何实现的 , 只需使用接口即可
- 对于提供方来说 , 利用封装的特性 , 隐藏了实现的细节 , 只需要开放接口即可
这样可更好的展开和维护.
OSI七层模型:
OSI: 即Open System interconnection , 开放系统互联.
- OSI 七层网络模型是一个逻辑上的定义和规范: 把网络从逻辑上分成了七层.
- OSI 七层模型是一种框架上的设计方法 , 其中最主要的功能就是帮助不同类型的主机实现数据传输.
- 它最大的优点就是将服务 , 接口和协议这三个概念明确的区分开来 , 通过这七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯.
OSI 七层网络模型划分为以下七层 ,上层协议要调用下层协议(上层协议把数据交给下层继续封装) 下层为上层提供服务支持(下层协议解析好数据交给上级).
分层名称 | 功能 | 每层功能概览 | |
7 | 应用层 | 针对特定应用的协议 | 针对每个应用的协议 |
6 | 表示层 | 设备固有的数据格式和网络标准的数据格式的转换 | 接收不同表示形式的信息,如文字流,图像,声音等 |
5 | 会话层 | 通信管理,负责建立和断开通信连接 | 何时建立连接,何时断开连接以及保持多久连接? |
4 | 传输层 | 管理两个节点之间的数据传输 | 站在商家和客户的角度,不关心传输的过程只关心终点和起点.(上海---西安) |
3 | 网络层 | 地址管理与路由选择 | 上海--西安走哪条路线,最划算 上海--苏州--西安 上海--徐州--西安 |
2 | 数据链路层 | 互联设备之间传送和识别数据帧 | 每个站点之间做飞机还是火车.... |
1 | 物理层 | 界定连接器和网线的规格 | 相当于修路 |
OSI 七层网络模型既复杂又不实用 , 所以没有落地实现.
实现组件网络时 , 只是已 OSI 七层模型设计中的部分分层 , 即以下 TCP/IP五层(或四层) 模型来实现.
TCP/IP 五层模型
TCP/IP 是一组协议的代码词 , 它还包括许多协议 , 组成了 TCP/IP 协议簇.
TCP/IP 通信协议采用了五层的层级结构 , 每一层都呼叫它的下一层所提供的的网络来完成自己的需求.
- 应用层: 负责应用程序间沟通 , 如简单电子邮件传输(SMTP) , 文件传输协议(FTP) , 网络远程访问协议(Telnet) 等. 我们的网络编程主要针对应用层.
- 传输层: 负责两台主机之间的数据传输. 如传输控制协议(TCP) , 能够保证数据可靠的从源主机发送到目标主机.
- 网络层: 在IP协议中 , 通过IP地址来标识一台主机 , 并通过路由表示的方式规划出两台主机之间的数据传输路线. (路由器工作在网络层).
- 数据链路层: 负责设备之间数据帧的传输和识别 , 例如使用网线传输还是Wifi传输?(交换机工作在数据链路层)
- 物理层: 负责光/电信号的传递方式.(集线器工作在物理层)
由于物理层我们考虑的较少. 因此很多时候也可以称为 TCP/IP 四层模型.
网络分层对应
两台计算机通过 TCP/IP 通讯的过程如下:
2.6 封装和分用
- 不同的协议层对数据包有不同的称谓 , 在传输层叫段(segment) , 在网络层叫做数据报(datagram) , 在链路层叫做帧(frame).
- 应用层数据通过协议栈发到网络上时 , 每层协议都要加上一个数据首部(报头)(header) , 称为封装(Encapsulation)
- 首部信息中包含一些类似于首部有多长 , 载荷(payload)有多长 , 上层协议是什么....
- 数据封装成帧后发送到传输介质上 , 到达目的主机后每层协议再剥掉相应的首部 , 根据首部中的"上层协议字段"将数据交给对应的上层协议处理.
下图为数据封装的过程:
例如: 我们用QQ 给好友发送 hello 这个字符串.
- 应用层: 假设一个应用层协议格式(具体的应用格式只有开发App的程序猿才知道) , "应用层数据报" 本质上就是一个遵守约定格式的字符串 , 而程序员要做的是调用系统 api 把这个应用层数据 , 交给传输层.
- 传输层(进入系统内核) , 在传输层就是把上述应用层数据 , 构造成传输层的数据报. 传输层使用到的协议最知名的就是UTP和TCP , 假设构造 TCP 数据报(就是在应用层基础上加个TCP首部) , 这是另一个格式的字符串涉及到 源端口 和 目的端口.
- 网络层: 最知名的 IP 协议 , IP协议要基于上述数据 , 打包成一个 IP 数据报. 也相当于一个字符串 , 包含了另一组信息(源 IP , 目的 IP).
- 链路层: 最知名的协议 , 叫做"以太网". 基于上述数据还要打包成一个"以太网数据帧".
- 物理层: 最后交给物理层 , 把上述的二进制数据转化为 电信号 / 光信号.此时就把数据真正发送出去了.
下图为数据分用过程: