201709 月发表在 分享

16网络编程基础中的基础(1) 何为网络

感觉身边许多人对如何入门网络编程有些迷茫,所以想写一系列文章分析一下网络编程。要想入门网络编程,我觉得有必要讲一下什么是网络

0x01 什么是网络

由于我自己也不是什么专家,所以概念性上的问题我也没有资格轻易下定义。所以直接看看维基百科上是怎么写的吧:

A telecommunications network is a collection of terminal nodes, links are connected so as to enable telecommunication between the terminals. The transmission links connect the nodes together. The nodes use circuit switching, message switching or packet switching to pass the signal through the correct links and nodes to reach the correct destination terminal.

个人翻译如下:

一个电信网络是一个终端节点的集合,终端之间存在链路,所以他们可以进行通信。传输链路将这些节点连接在一起。节点之间使用电路交换、消息交换或分组交换(包交换)来通过正确的链路和节点到达正确的目的终端。

这些概念,乍一看非常头疼,不过如果对照现实生活中的事物来讨论,我想应该会容易理解一些。我们先来看看现实生活中有哪些覆盖了全世界网络。

0x0101 Public Switched Telephone Network 公共交换式电话网络

简单点说,就是平时打电话用的网络,属于电路交换网络。不过这个网络正在走向衰落(具体原因稍后讲)。这个网络使用起来十分简单,拿起听筒,拨号就可以了。如果是手机,当然也可以点开主屏幕上绿绿的电话图标,输入电话号码。这就是传统的电话网络,电话网络的传输链路就是电话线。

当你输入电话号码后,电话线另一头的电话交换机(局端交换机)就会根据你所拨的电话号码(地址),决定如何建立通信电路。比如,如果你拨打了这个交换机下接的某一台座机,那么交换机内部就会向那台座机发送响铃信号,那台座机被摘机后,电话交换机会将两台座机的电话线连接在一起,两边就可以互相说话了。电话交换机是程序控制的,在计算机不是很发达的年代,存在一种工作叫做接线员。

0x0102 Internet 互联网

网络编程中的网络,多数情况下讨论的就是互联网了。互联网正在不断地侵蚀电话网的市场份额:

  • 有一些小事情要告诉别人(比如跟喜欢的学姐说...),你现在会优先考虑发QQ、微信还是打电话?
  • 2G、3G 网络是分为电路交换域分组交换域的,然而 4G 网络却只提供分组交换的业务,分组交换上面承载的,便是互联网

互联网是一个分组交换计算机网络,平时我们常说的抓,丢,包就是分组。其主要提供的业务,也是...嗯...在两边建立电路/笑哭。不过互联网建立的电路,和电话网建立的电路,并不太一样:互联网电路的两端,不是拿着听筒的人,而是拿着socket的进程。所以互联网电路上传输的也不再是语音,而是字节。

互联网的原理十分复杂,我觉得有必要单独开一篇讨论。但互联网能够侵蚀电话网市场份额的原因我觉得还是有必要提一下:

  • 互联网是一个计算机网络,能够有效地利用计算机技术来提高通信线路的利用效率。
  • 互联网的标准比起传统电话网络更为开放。
  • 电话网只能传输语音,但使用互联网,你可以传数据,传语音,传图片,甚至是开直播

640px-Internet_Connectivity_Distribution_&_Core.svg.png

然而互联网也有着很明显的缺点。由于分组交换很大程度上依赖于存储转发技术,所以互联网上的通信是有一定程度的延迟的。

0x02 互联网给程序开发人员提供了什么

由于电话网是直接提供给用户使用的,所以电话网使用起来十分简单。然而互联网是给计算机程序使用的网络,程序将用户想要传输的信息序列化成字节流,利用互联网电路传输给另一端,另一端再将字节流转化成用户能直接感觉到(看到、听到)的信息。所以我们在进行网络编程之前,还是需要先看看互联网提供了哪些编程接口:

  • 装电话:socket()
  • 拨号(对方号码):connect(对方地址)
  • 接听:accept()
  • 说话(语音):send(字节数组)
  • 听:recv()

除此之外,也有一些不能类比的操作:

  • bind: 由于一台计算机会对外提供多个端口,也可能有多个IP地址(比如有多个网卡),所以绑定一个{地址,端口}二元组是十分必要的。
  • listen: 监听{地址,端口}二元组。

0x03 总结

学习网络编程,对于网络一定要有一定程度的了解。一上来就去看"UNIX 高级网络编程"什么的,有毅力的话,可以找到点感觉,不过我觉得大多数人是没有这样的毅力的。在本文中,我尽可能隐藏了互联网底层的细节,突出了对于网络编程比较重要的部分。如果觉得我写的有意思的话,欢迎转发本文;如果发现了什么错误或不合理的地方,尽管在下方评论区指出,这相当于对我的支持。

0x0301 勘误历史

zyxwvu
UNDER CONSTRUCTION