今天我们来了解一些网络编程核心基础。本文将会介绍IP,端口,IO 模型,通信框架四个部分的入门基础。
1.IP
IP可以通俗地理解为机器在网络中的地址。它是分配给网络中每台主机 / 设备的唯一标识 ,用于在网络中定位设备。它的格式分为IPv4(32位)和IPv6(128位)两种,IPv6 是为了解决 IPv4 地址容量小,地址枯竭的问题而诞生的。数据在网络中传输时,通过目标 IP 确定要发送到哪台设备,通过源 IP确定数据来自哪台设备。
2.端口
在网络通信中,IP 地址 的作用是定位网络中的某一台设备,而端口 的核心意义,是定位这台设备上的某一个网络应用程序。它是区分设备不同网络程序的逻辑标识,用 16位整数表示,范围是0~65535 。这些端口又分为知名端口(0~1023)和动态端口(1024~65535),知名端口是预留给系统核心服务的,比如 HTTP 用 80,HTTPS 用 443。我们在编程中一般使用动态端口。
3.IO 模型
IO(Input/Output) 即输入输出,网络 IO 指程序与网络之间的数据读写过程。IO 模型决定了程序如何处理 "等待数据" 和 "读写数据" 这两个核心步骤,直接影响程序的并发性能。 下面我们介绍3种较常见的 IO 模型。
- 阻塞 IO(BIO):程序发起 IO 请求后,一直等待数据就绪,期间不能做其他事,实现简单 ,但并发能力差,一个连接占用一个线程 ,适合连接数少、对并发要求低的场景,比如简单的客户端 - 服务器聊天程序。
- 非阻塞 IO(NIO):程序发起 IO 请求后,立即返回结果,可循环查询数据是否就绪,不阻塞线程,可处理多个连接。
- 异步 IO(AIO):程序发起 IO 请求后直接返回,内核完成数据读写后再通知程序完全异步,性能最优,但相应的实现复杂,依赖操作系统支持。
4.通信框架
通信框架是封装了网络编程底层细节的工具库 / 组件,开发者无需关注 socket 建立、IO 模型选择、数据编解码等底层操作,只需调用框架提供的 API 即可实现通信。我们来看三种主流网络通信架构。
- C/S:分为客户端(Client) 与**服务器(Server)**两个角色。客户端是安装在用户设备上的程序,负责和用户交互;服务器是部署在远程机房的高性能设备,负责处理核心业务逻辑。比如说微信App就是客户端,服务器就是服务端,你发消息时客户端把数据传给服务器,服务器再把消息送给对方客户端------这便完成了你与好友间的通信。
- B/S:它可以看成是C/S 架构的一种 "特殊简化版"。它的 "客户端" 是通用浏览器(Browser),浏览器负责解析 HTML/CSS/JS,展示界面并和用户交互,这样就不需要再单独开发客户端程序了。
- P/P:这是一种"去中心化"结构,网络中的所有设备(称为 Peer,节点 )地位平等,没有固定的 "服务器" 和 "客户端" 之分。每个节点既可以请求 其他节点的资源(充当客户端),也可以提供自己的资源(充当服务器)。数据直接在节点之间传输,无需经过中间服务器转发。蓝牙传输文件就是一个例子。