本篇文章将从 What(是什么)、Why(为什么)、How(怎么做)?三个部分简单入门网络通信。
计算机网络是什么?
计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
简单来说,网络就是一种辅助双方甚至更多方能连接在一起的工具(也就是系统)。
为什么需要网络通信?
为了传递数据,当然数据的格式也是多种多样。网络通信就是为了联通多方然后进行通信用的,即把数据从一方传递给另一方。
如果现代社会没有网络,我们操作任何电脑或者手机都是单机模式,只能自己跟自己玩。
网络通信的本质:也即进程之间的通信
表现形式:不同的电脑间的数据传递。
如何连接网络——套接字
套接字是计算机网络数据结构,它体现了上节中所描述的“通信端点”的概念。在任何类型的通信开始之前,网络应用程序必须创建套接字。可以将它们比作电话插孔,没有它将无法进行通信。
两种类型的套接字:基于文件的和面向网络的。
1. AF_UNIX(又名AF_LOCAL)
UNIX 套接字是我们所讲的套接字的第一个家族,并且拥有一个“家族名字”AF_UNIX (又名AF_LOCAL,在POSIX1.g标准中指定),它代表地址家族(address family):UNIX。因为两个进程运行在同一台计算机上,所以这些套接字都是基于文件的,这意味着文件 系统支持它们的底层基础结构。这是能够说得通的,因为文件系统是一个运行在同一主机上 的多个进程之间的共享常量。
2. AF_INET(或者地址家族:因特网)
基于网络的,它也有自己的家族名字 AF_INET,或者地址家族: 因特网。另一个地址家族 AF_INET6 用于第 6 版因特网协议(IPv6)寻址。此外,还有其他的地址家族,这些要么是专业的、过时的、很少使用的,要么是仍未实现的。在所有的地址 家族之中,目前 AF_INET 是使用得最广泛的。
Python 只支持 AF_UNIX、AF_NETLINK、AF_TIPC 和 AF_INET 家族。
如果套接字像一个电话插孔——允许通信的一些基础设施,那么主机名和端口号就像区号和电话号码☎️的组合。
面向连接的套接字——TCP
面向连接的,字面解释——在进行通信之前必须先建立一个连接,例如,使用电话系统给一个朋友打电话。这种类型的通信也称为虚拟电路或流套接字。
实现这种连接类型的主要协议是传输控制协议(更为人熟知的是它的缩写 TCP)。
为了创建 TCP 套接字,必须使用 SOCK_STREAM 作为套接字类型。TCP 套接字的名字 SOCK_STREAM 基于流套接字的其中一种表示。
因为这些套接字(AF_INET)的网络版本使用因特网协议(IP)来搜寻网络中的主机,所以整个系统通常结合这两种协议(TCP 和 IP) 来进行(当然,也可以使用 TCP 和本地[非网络的 AF_LOCAL/AF_UNIX]套接字,但是很明显此时并没有使用 IP)。
无连接的套接字——UDP
与虚拟电路形成鲜明对比的是数据报类型的套接字,它是一种无连接的套接字。这意味着,在通信开始之前并不需要建立连接。此时,在数据传输过程中并无法保证它的顺序性、 可靠性或重复性。然而,数据报确实保存了记录边界,这就意味着消息是以整体发送的。
实现这种连接类型的主要协议是用户数据报协议(更为人熟知的是其缩写 UDP)。为了创建 UDP 套接字,必须使用 SOCK_DGRAM 作为套接字类型。你可能知道,UDP 套接字的 SOCK_DGRAM 名字来自于单词“datagram”(数据报)。因为这些套接字也使用因特网协议 来寻找网络中的主机,所以这个系统也有一个更加普通的名字,即这两种协议(UDP 和 IP) 的组合名字,或 UDP/IP。
IP地址——“标记”
就像现实生活中,收件地址就是标记一封信是给谁的;收货地址标记快递寄到哪。地址就是用来标记地点的。
IP地址(Internet Protocol Address)是指互联网协议地址,又译为网际协议地址。
IP地址的作用,就是用来标记网络上的一个电脑的。(不允许重复)比如类似192.268.1.1
这种格式。
通过命令可以查看本机的网卡信息:
Linux输入:ifconfig
Windows:ipconfig
每一个IP地址包含两个部分:网络地址和主机地址
- A类:7位网络号+主机24位
- B类:14位+16位
- C类:21位+主机号8位。192.168.1.1 ~255
- D类:用于多点广播。1110开始
- E类:用来保留
端口
有效的端口号范围为 0~65535(尽管小于 1024 的端口号预留给了系统)。
- 知名端口:从0到1023
例如:88端口分配给http、21分配给FTP
- 动态端口:1024~65535
在Linux/Mac系统下,可以在/etc/services
文件中找到系统预留端口号,包括服务器/协议和套接字类型。
还可以通过这个 网站查看一些众所周知的端口列表。
通俗来说,IP地址让我们找到了要互相通信的这台电脑,端口的作用就是告诉我该跟这台电脑的哪一个程序进行连接(通信)?
下一篇
当我们知道了有关套接字和网络方面的基础知识,接下来就让我们试着将这些概念应用到 Python 中,学习Python的socket模块。
站在巨人的肩膀上:
Python核心编程(第3版)