网络编程-基础

网络编程

基本概念

所谓的网络编程,实际上就是使用编程语言实现多台计算机或多个应用程序之间的通信。

说到网络编程,那么我们必须要大概了解下网络通信技术。首先,所谓的通信技术是指实现人与人之间通过某种媒介进行的信息交流与传递的技术,例如:古代的飞鸽传书、鱼信雁书,或则现代的短信语音等,而网络通信技术则是指通过计算机和网络通讯设备对信息资料进行采集、存储、处理和传输等,使信息达到充分共享,让人与人之间完成信息交流和传递的技术。那么如何实现网络通信呢?

计算机网络

要实现网络通信就需要组建计算机网络,而所谓的计算机网络就是把各个计算机通过通信介质连接到一起,让这些计算机可以互相之间进行数据传输以达到通信的目的。那问题又来了,怎么组建计算机网络呢?

通过网线、无线电磁波、交换机、路由器、集线器组建。所以基于不同的传输介质组建起来的覆盖范围不同的计算机网络,我们一般也会进行分类。

根据传输介质划分:

  1. 有线网,是采用同轴电缆、双绞线或光纤等网线进行连接的计算机网络。
  2. 无线网,是采用无线电波或红外线等电磁波进行连接的计算机网络。

根据覆盖范围划分:

  1. 局域网(Local Area Network,LAN)是一种在小范围内由多台计算机连接实现的小型计算机网络,一般在一个建筑物内,或一个家庭、一个单位内部。局域网覆盖范围小的可以是两台计算机以内,多的可在十几公里以内数千台计算机。局域网一般都是封闭型的,专用性比较强,所以有时候也叫内网或私网。
  2. 城域网(MetropolitanAreaNetwork,MAN),严格来说就是局域网升级版,实现技术类似于局域网,只是其规模比局域网要大一些,是在一个城市范围内所建立的计算机通信网。
  3. 广域网(Wide Area Network,WAN),也叫远程网、外网或公网。所覆盖的范围从几十公里到几千公里,它能连接多个地区、城市和国家,或横跨几个洲并能提供远距离通信,形成国际性的远程网络,组件技术比上面两种网络都要更为复杂。

注意:单台计算机内部,通过虚拟机(VMware、virturalBox)实现的内部网络,叫虚拟局域网,并非真正的局域网。

组建了计算机网络以后,计算机之间是怎么进行通信的呢?

OSI模型

因为计算机通信技术的实现是基于硬件与软件组合的,所以计算机网络中把网络通信的实现过程的所有工作进行了7层分工,每一层完成不同阶段的操作,由此总结出了OSI参考模型的网络互连体系结构。

OSI (Open System Interconnection),译为"开放式系统互联",一般叫OSI参考模型,它详细规定了计算机网络通信过程中网络互连的7个层级的功能和实现,是设计和描述计算机网络通信的基本框架。

OSI 只是存在于概念和理论上的一种理想模型,它的缺点是分层太多,增加了网络工作的复杂性,所以很少有系统能够具有所有的七层。后来人们对 OSI 进行了简化,合并了顶部的3层,衍生了五层,后面由合并了底部2层,最终只保留4层,从下到上分别是接口层、网络层、传输层和应用层,这也就是目前最著名的TCP/IP四层模型。

bash 复制代码
物理层: 处于OSI参考模型的最底层,利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。

我们平常使用的程序(或者说软件)一般都是通过应用层来访问网络的,程序产生的数据会一层一层地往下传输,直到最后的网路接口层,就通过网线发送到互联网上去了。当另一台计算机接收到数据包时,会从网络接口层再一层一层往上传输,每传输一层就拆开一层包装,直到最后的应用层,就得到了程序要使用的的最原始数据。

那么,OSI针对每一层网络模型的功能都怎么进行规定的不同计算机之间完成通信流程呢?

OSI通过网络协议来实现不同通信节点之间对等层之间的通信。所谓的协议(protocol),通信计算机双方必须共同遵从的约定。只有遵守这个约定,计算机之间才能相互通信交流。协议往往分成几个层次进行定义,分层定义是为了使某一层协议的改变不影响其他层次的协议。

为什么会有这么复杂的结构呢?有必要定义那么多乱七八糟的协议吗?

局域网的网络通讯

计算机网络中,通过网线连接可以组件最简单的局域网。

上面的这种组件方式会存在很多的问题。

第一,计算机怎么区分信息是来自哪一台计算机的?怎么告诉其他计算机,自己是谁?

第二,计算机A与计算机D或计算机B与计算机C不能进行直接通信,如果数量更多的计算机集成到局域网中,会需要非常多的网线。

第一个问题,为了解决计算机在通信过程中区分其他计算机或证明自己是谁的问题上,计算机网络中会给一台计算机设置两个重要标识。

MAC地址(Media Access Control Address):是用来确认网络设备位置的物理地址,这个物理地址在网络设备制造商生产时烧录在网卡中的,是一个不可变的地址,也叫网卡地址或硬件地址。

IP地址(Internet Protocol Address):是计算机集成到计算机网络以后,用于标记一台机器的逻辑地址,在不同网络中,同一台机器会得到不同的地址,是一个可变的地址,也叫网络地址。

第二个问题,主要使用集线器、交换机、路由器来解决。

交换机:用于机器之间信号转发的网络设备,每一台机器和交换机相连,形成通信。
路由器:让不同的网段内的不同机器实现通讯,每一个局域网和路由器相连,形成通信。

IP地址

所谓的IP,即IP协议(Internet Protocol),是为计算机网络相互连接进行通信而设计的协议,属于OSI模型中的网络层协议。

IP地址是指IP协议地址(Internet Protocol Address,又译为网际协议地址),是IP协议提供的一种统一的地址格式,它为计算机网络中的每一台计算机分配一个唯一的逻辑地址(相当于一个计算机编号),以此来屏蔽物理地址的差异。这种唯一的地址,保证了计算机网络中的计算机能够高效而且方便地从千千万万台计算机中选出自己通信的对象出来。

在计算机技术发展过程中,首先出现的IP地址是互联网工程任务组(IETF)设计的IPV4(Internet Protocol version 4,互联网协议第4版)。

IPV4地址实际上是一个32位的二进制数,通常被分割为4个"8位二进制数"(也就是4个字节)。IPv4地址通常用"点分十进制"表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之间的十进制整数。例如,点分十进制IP地址(100.4.5.6),实际上是32位二进制数(01100100.00000100.00000101.00000110)转换而来的。

由于互联网的快速发展,IP地址的需求量也愈来愈大,已经到了枯竭的程度,严重制约了互联网的应用和发展。所以互联网工程任务组(IETF)又设计了用于替代IPv4的下一代IPv6地址(Internet Protocol Version 6,互联网协议第6版)。

IPV6地址实际上是一个128位的二进制数,通过被分割为8个"16位二进制数"(也就是32个字节)。IPv6地址通常用"冒分十六进制"表示成(a:b:c:d:e:f:g:h)的形式,其中,a,b,c,d,e,f,g,h都是0到ffff之间的十六进制整数。例如:冒分十六进制IP地址(2035:0001:2BC5:0000:0000:087C:0000:000A)实际上是128位二进制数:(0010000000110101:0000000000000001:0010101111000101:0000000000000000:0000000000000000:0000100001111100:0000000000000000:0000000000001010)转换而来的。

当然,就目前而言,使用最广泛的还是IPV4。所以接下来,我们继续讲解的内容还是围绕IPV4来进行讲解。

为了便于寻址以及层次化构造网络,每个IP地址包括两个标识码(ID),即网络ID(也就网络号)和主机ID(也叫主机号)。

  • 网络 ID:用于识别主机所在的网络,网络 ID 的位数直接决定了可以分配的网络数量。
  • 主机 ID:用于识别该网络中的主机,主机 ID 的位数则决定了网络中最大的主机数量。

同一个物理网络上的所有主机都使用同一个网络ID,网络上的一个主机(包括网络上工作站,服务器和路由器等)有一个主机ID与其对应。网络ID相同的计算机之间可以直接通信,表示同一个网段。不同网段之间的计算机必须使用通信设备(如路由器等)才可以实现通信。

IP地址根据网络ID的不同分为5种类型,A类地址、B类地址、C类地址、D类地址和E类地址。

不同类型的IP地址因为拥有固定的网络ID,所以每类地址都有自己的范围:

  • A类:IP 地址范围为 0.0.0.0~127.255.255.255,一般分配给政府机关单位使用。
  • B类:IP 地址范围为 128.0.0.0~191.255.255.255,一般分配给中等规模的企业使用。
  • C类:IP 地址范围为 192.0.0.0~223.255.255.255,可以分配给任何需要的人使用。
  • D类:IP 地址范围为 224.0.0.0~239.255.255.255,属于隐藏地址。
  • E类:IP 地址范围为 240.0.0.0~255.255.255.254,属于隐藏地址。

那么,计算机网络中,怎么知道两个IP地址之间是否能进行通信呢?这就需要通过子网掩码来比对IP之间的网络ID是否相同了。

子网掩码

子网掩码则是用来指明地址中多少位用于子网 ID,保留多少位用于实际的主机 ID。

一般而言,A类地址的子网掩码是255.0.0.0;B类地址的则是255.255.0.0;C类地址的则是255.255.255.0。

使用子网掩码与IP地址进行二进制的按位与计算即可得到网络ID。

例如:ip1:192.168.10.12 与ip2:192.168.1.16进行判断。

python 复制代码
"""如果子网掩码是255.255.255.0"""
# 子网掩码
# 255.255.255.0 
# 11111111.11111111.11111111.00000000

# IP: 192.168.10.12
# 11000000.10101000.00001010.00001100

11000000.10101000.00001010.00001100
11111111.11111111.11111111.00000000
11000000.10101000.00001010.00000000 => 192.168.10.0

# IP:192.168.1.16
# 11000000.10101000.00000001.00010000

11000000.10101000.00000001.00010000
11111111.11111111.11111111.00000000
11000000.10101000.00000001.00000000 => 192.168.1.0

# 网络ID不一致,所以上面2个IP地址不能进行直接通信。

"""如果子网掩码是255.255.0.0"""
# IP: 192.168.10.12
11000000.10101000.00001010.00001100
11111111.11111111.00000000.00000000
11000000.10101000.00000000.00000000 => 192.168.0.0

# IP:192.168.1.16
11000000.10101000.00000001.00010000
11111111.11111111.00000000.00000000
11000000.10101000.00000000.00000000 => 192.168.0.0

# 网络ID一致,所以上面2个IP地址可以直接进行通信。

有了IP以后,在复杂而庞大的网络就可以让计算机可以精准的找到另一台计算机了。当然,在这个过程中,有一些 IP 地址具有特殊含义,不会分配给互联网的主机。例如,保留了一些 IP 地址范围,用于私有网络,这些地址被称为私有地址。再如,保留一部分地址用于测试,被称为保留地址。

地址类型 私有地址 保留地址
A类地址 10.0.0.0~10.255.255.255 127.0.0.0~127.255.255.255
B类地址 172.16.0.0~172.31.255.255 169.254.0.0~169.254.255.255
C类地址 192.168.0.0~192.168.255.255

有了 IP 地址虽然可以找到目标计算机,但仍然不能实现通信的。一台计算机可以同时提供多种网络服务,例如Web服务、FTP服务(文件传输服务)、SMTP服务(邮箱服务)等,仅有 IP 地址,计算机虽然可以正确接收到数据包,但是却不知道要将数据包交给哪个网络程序来处理,所以通信失败。

端口

为了区分不同的网络程序,计算机会为每个网络程序分配一个独一无二的网络端口(Port),例如,Web服务的端口号是 80,FTP 服务的端口号是 21,SMTP 服务的端口号是 25。

网络端口(Port)是一个虚拟的、逻辑上的概念。可以将端口理解为一道门,数据通过这道门流入流出,每道门有不同的编号,就是端口号。如下图所示:

注意:计算机中的端口可分为虚拟端口和物理端口。其中,物理端口就是设备用于外界进行数据传输的硬件端口,如:usb端口等。而虚拟端口,也叫网络端口。是具体某个程序与外界进行数据传输的进出口。使用端口号进行唯一区分,取值范围:0~65535。一般1024以下的端口号作为系统保留端口,用于提供给系统应用程序使用。

所以计算机网络中, 实现通信的两台计算机之间的访问地址往往是IP地址+端口号来进行通信的,如:192.168.2.1:80。

协议

协议(Protocol)就是网络通信的约定,通信的双方必须都遵守才能正常收发数据。协议有很多种,例如 TCP、UDP、IP 等,通信的双方必须使用同一协议才能通信。协议是一种规范,由计算机组织制定,规定了很多细节,例如,如何建立连接,如何相互识别等。一般一个协议都会对应着一个端口号。

注意:协议仅仅是一种规范,必须由计算机软件来实现。例如 IP 协议规定了如何找到目标计算机,那么各个开发商在开发自己的软件时就必须遵守该协议,不能另起炉灶。

所谓协议族(Protocol Family),就是一组协议(多个协议)的统称。最常用的是 TCP/IP 协议族,它包含了 TCP、IP、UDP、Telnet、FTP、SMTP 等上百个互为关联的协议,由于 TCP、IP 是两种常用的底层协议,所以把它们统称为 TCP/IP 协议族。

传输数据流程

局域网模型
局域网内,各个主机的通讯
arp协议

ARP(Address Resolution Protocol)地址解析协议。通过ip地址找mac地址,通过交换机一次广播,一次单播找到通信的另一台计算机,

广域网模型
广域网内,各个主机的通讯

B/S与C/S架构

bash 复制代码
C/S 架构 : Client/Server,例如:QQ,王者荣耀等。
B/S 架构 : Brower/Server,例如:百度,京东等。

C/S 架构

B/S 架构

bash 复制代码
两者区别:
C/S:
    优点: 交互性好,对服务器压力小,安全;
    缺点: 开发成本高,占用应用空间大,服务器更新时需要同步更新客户端,兼容性差
B/S:
    优点: 开发成本低,维护方便,不需要更新客户端
    缺点: 交互性差,安全性低
相关推荐
大G哥7 分钟前
鸿蒙Next开发实战教程-使用WebSocket实现即时聊天
网络·websocket·网络协议
m0_7482565619 分钟前
Rust环境安装配置
开发语言·后端·rust
程序猿阿伟21 分钟前
《C++巧铸随机森林:开启智能决策新境界》
开发语言·c++·随机森林
假意诗人42 分钟前
【NextJS】Arco Design与Next.js快速上手
开发语言·javascript·arco design
凡人的AI工具箱1 小时前
40分钟学 Go 语言高并发教程目录
开发语言·后端·微服务·性能优化·golang
pzx_0011 小时前
【论文阅读】相似误差订正方法在风电短期风速预报中的应用研究
开发语言·论文阅读·python·算法·leetcode·sklearn
每天写点bug1 小时前
【golang】匿名内部协程,值传递与参数传递
开发语言·后端·golang
抽风侠1 小时前
qt实现窗口的动态切换
开发语言·qt
liuweni1 小时前
Next.js系统性教学:深入理解缓存交互与API缓存管理
开发语言·前端·javascript·经验分享·缓存·前端框架·交互
AI人H哥会Java2 小时前
【JAVA】Java高级:多数据源管理与Sharding:在Spring Boot应用中实现多数据源的管理
java·开发语言