走进网络世界
走进网络世界
在开始学习网络编程之前,你至少应当了解一些关于网络的基础知识,这些东西算不得很难,但却是学习网络编程之前的必备知识。这期的内容不会少,慢慢来吧
我们是如何连接到互联网的
首先我们来聊一聊你的手机是如何连接到互联网的。这涉及多个设备,我们一个个来看
终端设备,也就是我们的电脑,手机或其他的一切联网设备,在我们需要访问网络时向路由器发出一个信息,说明我们需要访问的网址与请求的 内容
路由器,互联网设备之间需要唯一的地址作为标识,也就是我们所说的ip地址,但是IP地址是有限的。如果每个设备都有一个公网上的IP地址,那么当前的地址是不够用的。所以就需要做出这样的处理:由一个路由器占据一个公网地址,然后再由路由器给与这个路由器相连的每个设备分配一个私网地址。此后这个路由器将作为一个转发者负责转发每个设备的请求信息并将获得的信息返回给设备
这里要说一点,实际上我们大部分人家中的路由器同样不是直连公网,而是连接到全小区公用的一个大服务器中
光猫,当今的网络主要通过光纤来传递信息,而我们所使用的设备传递的是电信号,光猫就是负责将路由器发出的电信号传递为光信号的设备
寻址服务器:这玩意涉及到一个流传已久的谣言,说什么所有的根服务器都在国外,一旦国外想要针对我们,我们全国范围内都会断网。这些所谓的根服务器就是寻址服务器,我们发送的请求时是向某个网址发送的,但是只有将网址转换为具体的ip地址才能够找到对应的服务器,此时就需要寻址服务器。这些服务器内存储了不同的网址ip地址的对应关系,我们的请求通过这种服务器知道了自己需要下一步去往哪里。想必你一定可以想到,所谓的根服务器只是存储的更多的不同网址与ip的关系,并没有什么高端的技术与神秘的数据
服务器,当你的请求到达各大厂商的服务器,这些服务器会处理你的请求并返回相应的信息
IP地址与端口
接下来我们再来聊一聊与IP地址和端口相关的事吧。先说说什么是IP地址
当前主要使用的是IPv4地址,这种地址由4个0到255之间的数字组成,(实际上是二进制的从0到10000000)每个数字之间由.
进行分割,这些地址每一个都代表着一个唯一的互联网中的地址,这些地址又被分为以下几类
1. A类地址 (Class A)
- 地址范围:
0.0.0.0
到127.255.255.255
- 网络前缀:第一个字节的最高位是0,表示A类地址。
- 网络数量:128个网络(从0到127),但是有些保留地址不能使用。
- 主机数量:每个网络支持大约 1677万个主机。
- 用途:适用于大型网络,需要大量主机的网络。
2. B类地址 (Class B)
- 地址范围:
128.0.0.0
到191.255.255.255
- 网络前缀:第一个字节的前两位是
10
,表示B类地址。 - 网络数量:16384个网络。
- 主机数量:每个网络支持大约 65,000个主机。
- 用途:适用于中等规模的网络,能够满足较大数量的主机需求。
3. C类地址 (Class C)
- 地址范围:
192.0.0.0
到223.255.255.255
- 网络前缀:第一个字节的前三位是
110
,表示C类地址。 - 网络数量:2097152个网络。
- 主机数量:每个网络支持254个主机(地址的第一位和最后一位用于网络标识和广播地址,无法分配给主机)。
- 用途:适用于小型网络,通常用于局域网(LAN)中。
4. D类地址 (Class D)
- 地址范围:
224.0.0.0
到239.255.255.255
- 网络前缀:第一个字节的前四位是
1110
,表示D类地址。 - 用途:D类地址用于多播(Multicast)通信,不用于普通主机和网络分配。
- 特别说明:它不分配给单个主机,而是用于一次发送给多个接收者的情况。
5. E类地址 (Class E)
- 地址范围:
240.0.0.0
到255.255.255.255
- 网络前缀:第一个字节的前五位是
11110
,表示E类地址。 - 用途:E类地址保留用于未来的研究或实验用途,通常不用于实际的网络通信。
- 特别说明:E类地址目前未被分配给公共网络,它主要用于实验、开发或特殊的协议。
这里稍微解释一下什么是主机数量,一般情况下分配IP地址时并不是单独分配,而是按照网段分配,几乎每个互联网大企业都占据这一个完整的网段,这里的不同类地址其实是指分配时网段的大小,如A类指明确4个数中的第一个,B类则明确四个数中的前两个,至于后面的数字则有每个获得网段的人自由分配
此外,从127.0.0.0
到127.255.255.255
的地址被称为回环地址,这些地址不会被发送到外界而是只会在本机内回环,通常用来访问当前的设备上的服务.当然,一般情况下我们都使用127.0.0.1
还有一部分私有地址是不会在互联网上使用的,这些地址仅在局域网内使用
- A类私有地址:
10.0.0.0
到10.255.255.255
- 子网掩码:
255.0.0.0
- 地址范围:
10.0.0.0/8
- 子网掩码:
- B类私有地址:
172.16.0.0
到172.31.255.255
- 子网掩码:
255.240.0.0
- 地址范围:
172.16.0.0/12
- 子网掩码:
- C类私有地址:
192.168.0.0
到192.168.255.255
- 子网掩码:
255.255.0.0
- 地址范围:
192.168.0.0/16
- 子网掩码:
现在你可以打开看一看你电脑的ip地址了,打开powershell,输入ipconfig
即可看到当前设备的ip信息
那么什么是端口呢,我们的设备上一般情况下都会运行着众多的服务,这些服务都需要联网,为了不造成各个服务之间的冲突,系统将信道划分为65536个端口,以数字0到65535标识。不同的应用会占用不同的端口进行通信。一般情况下,系统占用0到1023端口,剩下的端口由用户配置,大部分常用的端口实际上是固定的,比如一般的http使用80端口,mysql数据库使用3306端口等。特定的应用只会监听特定端口的信息
上面提到的路由器正是将不同的设备映射到路由器自身不同的端口上来实现区分不同的设备的(这被称为NAT技术)
最后再补充一点关于IPv6的知识,我们都知道IPv4的最大容量实际上只有2^32,也就是大概四十多亿,以目前的互联网体量来看是远不够用的,最明显的就是现在个人申请独立的公网ip越来越难了,所以我们创建了IPv6,它一般长这样
2001:0db8:85a3:0000:0000:8a2e:0370:7334
由八组四位的十六进制数组成,每组之间由:
分割,如果有一组数全为0,那么也可以省略为::
,但注意为了避免识别混乱,最多智能省略一组,它的存储上限几乎够给地球上的每一粒沙子编码,不用再担心用尽,但问题在于这玩意现在的使用推广情况还不是特别高,有部分路由器甚至依然不支持IPv6
域名与DNS
接下来解释一下域名与DNS是什么,所谓的域名也就是我们所说的网址,我们常见的.com,.cn等被称为顶级域名,这些顶级域名再加上一个二级域名如baidu就组了baidu.com就是我们一般使用的网址了。值得注意的是二级域名之下还有三级域名,四级域名等等只是一直在上一级域名之前加前缀而已。
这些域名被保存在DNS解析服务器也就是我们之前提到的寻址服务器中,当设备需要访问某个网址时通过域名解析服务器获得需要访问的具体ip地址
顺路提一嘴,如果你希望获得一个自己的域名,可以直接找阿里云,华为云,腾讯云等大厂,它们都提供域名出售服务,便宜一点的也就十几块钱一年(域名先到先得,被人占了就没办法了),然后在这些厂商提供的免费的DNS解析服务上添加你自己的信息即可
子网掩码
接下来要解释的是子网掩码,其定义如下
子网掩码(Subnet Mask)**是用于在IPv4网络中划分子网的工具,它定义了一个IP地址中哪些部分用于标识**网络**,哪些部分用于标识主机**。通过子网掩码,路由器和设备可以识别出IP地址属于哪个网络,以及它们是否处于同一子网内,从而决定是否需要跨网络通信。
有点整不明白是吗,再来看一些子网掩码的其他信息
一个IPv4地址是由32个比特(位)组成的,通常表示为四个8位的十进制数字。例如:192.168.1.1
。
子网掩码也是一个32位的地址,通常由四个十进制数字表示。其作用是通过“掩盖”IP地址的一部分来区分网络部分和主机部分。子网掩码中的“1”表示网络部分,“0”表示主机部分。
例如:
- 子网掩码:
255.255.255.0
- 对应的二进制表示:
11111111.11111111.11111111.00000000
在这个例子中,前24位(即255.255.255
)用于表示网络地址,而后8位(即0
)用于表示主机地址。
通常,子网掩码有一些常见的默认值,依据网络规模的不同,子网掩码也不同。最常见的默认子网掩码包括:
- A类地址(
0.0.0.0
到127.255.255.255
):- 默认子网掩码:
255.0.0.0
(或/8
) - 网络部分:8位
- 主机部分:24位
- 默认子网掩码:
- B类地址(
128.0.0.0
到191.255.255.255
):- 默认子网掩码:
255.255.0.0
(或/16
) - 网络部分:16位
- 主机部分:16位
- 默认子网掩码:
- C类地址(
192.0.0.0
到223.255.255.255
):- 默认子网掩码:
255.255.255.0
(或/24
) - 网络部分:24位
- 主机部分:8位
- 默认子网掩码:
现在是不是有点感觉了,所谓的子网掩码就是用来区分不同的网段的通过将子网掩码与ip地址进行与运算就能获得该网段的第一个地址,用于判断该地址到底是属于哪一个网段
一般子网掩码通过一下的方式表示
十进制表示:像 255.255.255.0
这样表示,每个部分是一个8位数的十进制数。
CIDR表示法(Classless Inter-Domain Routing,无类域间路由):例如 192.168.1.0/24
,/24
表示子网掩码的前24位是“1”。
二进制表示法:例如 11111111.11111111.11111111.00000000
,每个数字对应一个8位二进制数。
物理地址(MAC)
接下来再了解一下物理地址,所谓的物理地址是每一台能够联网的设备在互联网上世界的唯一标识,通常在网卡的制作阶段被烧录到网卡之中,
MAC地址通常由12位十六进制数表示,分为6组,每组2位,组与组之间用冒号(:)或连字符(-)分隔。例如,00:1A:2B:3C:4D:5E或00-1A-2B-3C-4D-5E都是常见的MAC地址格式。
MAC也可以作为网络中唯一的标识用于不同设备之间的通信
它与ip地址的主要区别是一般情况下物理地址只用在局域网中寻址,此时先天唯一的物理地址被路由器用来区分不同的设备,而ip地址更多的用于网络间的通信
OSI网络模型
在了解了这么多知识后我们终于可以开始了解真实的网络架构了,先来看一看这样的网络模型
第1层:物理层
- 主要功能
- 定义硬件接口、传输介质和信号特性(如电压、电流、光信号)。
- 负责比特流的编码、调制和传输。
- 常见设备:网线、光纤、集线器(Hub)。
- 协议和标准
- IEEE 802.3(以太网)、RS-232、USB、Bluetooth。
第2层:数据链路层
- 主要功能
- 将数据打包成帧(Frame),提供点到点的传输。
- 提供物理地址(MAC地址),支持局域网通信。
- 实现差错检测和流量控制。
- 常见设备:交换机(Switch)、网卡(NIC)。
- 协议和标准
- 以太网(Ethernet)、Wi-Fi(IEEE 802.11)、PPP、HDLC。
第3层:网络层
- 主要功能
- 负责不同网络之间的路由和转发。
- 使用逻辑地址(如IP地址)来标识设备。
- 实现拥塞控制和分组拆分。
- 常见设备:路由器(Router)。
- 协议和标准
- IPv4、IPv6、ICMP、OSPF、BGP。
第4层:传输层
- 主要功能
- 提供端到端的可靠或快速数据传输服务。
- 实现数据分段、流量控制和差错校验。
- 区分不同应用程序的数据流(使用端口号)。
- 常见设备:网关(Gateway)、防火墙。
- 协议和标准
- TCP(传输控制协议)、UDP(用户数据报协议)。
第5层:会话层
- 主要功能
- 管理应用程序之间的会话(通信)。
- 负责会话的建立、维护和终止。
- 提供会话恢复和同步功能。
- 协议和标准
- NetBIOS、RPC(远程过程调用)。
第6层:表示层
- 主要功能
- 确保数据的格式一致性和可读性。
- 实现数据压缩、加密和解密。
- 数据表示的转换,如文本编码(ASCII、Unicode)、图片格式(JPEG、PNG)。
- 协议和标准
- SSL/TLS、JPEG、MPEG。
第7层:应用层
- 主要功能
- 直接为用户提供网络服务和接口。
- 实现文件传输、邮件、远程登录等功能。
- 常见应用程序和服务:Web浏览器、邮件客户端。
- 协议和标准
- HTTP、FTP、SMTP、DNS、Telnet、SNMP。
OSI模型的特点
- 分层设计:
- 将复杂的网络通信分为七个独立的层次,每层完成特定的功能。
- 每层只需要与相邻层通信,层与层之间通过接口进行交互。
- 模块化和灵活性:
- 各层独立,可以方便地替换或升级其中的某一层而不影响其他层。
- 标准化:
- 提供统一的通信参考框架,使不同厂商和设备能够互联互通。
- 可移植性:
- OSI模型适用于各种硬件和软件环境。
怎么样,是不是有点记不住,放心,不用着急,时间长了自然理解
TCP协议
那么说了这么多,互联网之间的通讯到底是怎样进行的呢,我们先来看一种当下使用最多的TCP协议
TCP作为使用最多的传输层协议,主要有以下这些特点
- 面向连接:在数据传输前需要建立连接,在数据传输结束后需要释放连接。
- 可靠性:通过数据确认和重传机制,确保数据能够按照正确的顺序到达目的地。
- 拥塞控制:通过拥塞窗口和慢启动等机制,避免网络拥塞和数据丢失。
- 全双工通信:允许双方同时发送和接收数据。
- 流量控制:根据接收方的处理能力,控制发送数据的速度,避免数据丢失。
首先看一看建立连接的过程
第一步:客户端向服务器发送SYN(同步)包,请求建立连接。客户端发送的包中包含一个初始序列号,用于数据传输的顺序编号。
第二步:服务器接收到客户端发送的SYN包后,向客户端发送 SYN + ACK 包作为应答。服务器发送的包中除了确认客户端的SYN包外,还会发送自己的初始化序列号。
第三步:客户端接收到服务器发送的 SYN + ACK 包后,向服务器发送 ACK 包以确认连接。这时TCP连接建立成功,双方可以开始传输数据了。
为什么要进行这么复杂的操作呢
首先如果直接连接,连接双方都不知道对方是否是自己要连接的对象,会出现各种异常
其次如果在第一步后开始数据传输,万一服务器实际上没有收到消息呢,这样不就白传输了吗,所以第二部服务器的回传是必要的
那么我们只进行两步呢,万一客户端实际上收不到服务器的信息呢,第三步就可以很好的避免这一点
这三步很好的确保了双方都可以正常的收发消息,通常这些步骤被称为三次握手
那么通信结束后有改怎样呢,分为四步
第一步:客户端(或主动关闭方)发送一个带有FIN(完成)标志的报文段给服务器,表示它已经完成数据的发送工作,不再需要保持连接。
第二步:服务器(或被动关闭方)接收到FIN报文,回复一个带有ACK(Acknowledgment)标志的报文段,表明它已经收到关闭请求,但是由于连接可能还在使用,比如有数据包还没发完之类的,所以此时不会立即关闭。
第三步:服务器处理完手头剩下的事情后,发送一个带有FIN标志的报文段给客户端,表示它也准备好关闭连接。
第四步:客户端收到服务器的FIN报文,发送一个带有ACK标志的报文段作为最终确认。此时,客户端进入 TIME_WAIT
状态,一段时间后才真正关闭连接,目的是确保服务器能够收到ACK报文。
这四步的具体作用我不再具体分析,但想必你一定能看明白,这是一个十分严谨的过程,能充分保证信息的完整传输
而在数据传输时,收信方在收到信息后还会再向发信方再发送一个ack包告诉发信方信息已确认收到
在发信的过程中,发信方实际上会将一个大数据包拆分为多个小数据包放入缓存再一次发送,收信方也会将所有的信息缓存后再同意读取
TCP\IP协议栈
在前面我们谈到了OIS网络模型,事实上我们一般认为当前的网络是另一套更为简洁的架构,也就是TCP/IP协议栈,但注意OIS模型的不同层实际上都是可以映射到TCP/IP协议栈中的,先来看看它的结构吧
1. 应用层
- 功能
- 提供用户与网络通信的接口。
- 定义用于具体网络服务的协议,例如网页浏览、文件传输、邮件发送等。
- 将数据打包为适合网络传输的格式,并将接收到的数据转换为用户可理解的格式。
- 常见协议
- HTTP(超文本传输协议):用于Web浏览器和服务器之间的通信。
- DNS(域名系统):将域名解析为IP地址。
- FTP(文件传输协议):用于文件上传和下载。
- SMTP(简单邮件传输协议):用于电子邮件发送。
- Telnet:用于远程登录。
2. 传输层
- 功能
- 提供端到端的数据传输服务。
- 负责数据的分段、重组,以及流量控制和差错检测。
- 使用端口号区分应用程序的数据流。
- 主要协议
- TCP(传输控制协议)
- 面向连接,提供可靠的数据传输。
- 包括数据分段、确认应答、重传和流量控制。
- 使用场景:文件传输(FTP)、邮件(SMTP)、网页浏览(HTTP)。
- UDP(用户数据报协议)
- 无连接,不保证可靠性,但传输速度快。
- 使用场景:实时通信(VoIP)、视频流传输(直播)、DNS查询。
- TCP(传输控制协议)
3. 网络层
- 功能
- 负责数据包的路由和转发。
- 使用逻辑地址(IP地址)标识网络中的设备。
- 实现跨网络的通信。
- 主要协议
- IP(互联网协议)
- IPv4:32位地址空间,广泛使用。
- IPv6:128位地址空间,支持更大范围的设备。
- ICMP(互联网控制消息协议)
- 用于发送网络状态信息,如Ping测试的回应。
- ARP(地址解析协议)
- 将IP地址解析为物理地址(MAC地址)。
- RARP(反向地址解析协议)
- 将MAC地址解析为IP地址。
- OSPF、BGP
- 路由协议,用于动态路由信息交换。
- IP(互联网协议)
4. 数据链路层
- 功能
- 负责点到点的数据帧传输。
- 提供物理地址(MAC地址)和错误检测功能。
- 定义如何通过物理介质传输数据。
- 主要协议
- Ethernet(以太网协议)
- 定义局域网通信标准。
- Wi-Fi(无线网络协议)
- 提供无线局域网通信。
- PPP(点对点协议)
- 用于串行链路上的数据传输。
- VLAN(虚拟局域网)
- 提供局域网的逻辑分段。
- Ethernet(以太网协议)
TCP/IP协议栈与OSI模型的对比
OSI模型 | TCP/IP协议栈 | 功能描述 |
---|---|---|
应用层、表示层、会话层 | 应用层 | 提供用户服务和应用接口。 |
传输层 | 传输层 | 实现端到端的可靠或快速数据传输。 |
网络层 | 网络层 | 负责路由和跨网络传输,使用逻辑地址标识设备。 |
数据链路层、物理层 | 链路层 | 定义局域网通信和物理信号传输。 |
好的,我知道你记不住,我也记不住,但你至少要知道有这么回事,用得着的时候要知道查什么
UDP协议
好的,接下来简单说一说udp报文通信,这是和TCP并列的一种通信的方式,这种方式没有那么多复杂的流程,简单来说就是闭着眼发信息,只在信息头添加一个自己来自于何处,要发到哪里的声明,然后就是闭着眼发,没有任何的数据校验流程
这种方式显而易见的好处是快,或者说方便,一般在一些对信息的完整性要求没那么高又要求快的领域如直播内大量使用
结语
其实这些东西只是一点皮毛,但至少有了这么一个认识,接下来要讲的内容就好说多了.(我不会告诉你实际上是东西太多我有点写不动了),下一期预计也会在这几天,我们一起实现一个简单的群聊功能认识一下Java中如何实现网络通信