计算机通信原理
TCP/IP协议簇
TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。
最具代表性的TCP/IP协议簇:
各层传输数据单元:
物理层
:主要是处理机械的、电气的和过程的接口,以及物理传输介质等,是面向硬件的,传输的基本单元是比特。
数据链路层
:对来自网络层的数据进行封装形成数据帧,是传输数据的物理媒。数据帧是数据链路层的传输的基本单元。
网络层
:网络层的传输数据的单元式数据包或分组。来自传输层的TCP或UDP报文段到达网络层时也要经过网络层协议的再次封装,网络层为ip协议,该层也定义了IP规范。
传输层
:传输层数据传输的单元是报文段,来自应用层的报文到达传输层是由传输层协议再次封装,形成TCP或UDP报文。
应用层
:应用层都是以原始的数据传输的,应用层使用不同的协议对数据封装形成报文。如HTTP报文,DNS报文,FTP报文。
数据封装和解封装
TCP/IP 协议族定义了计算机通信的规范。根据这个规范,每台私人计算机都可以通过网线或无线网络连接起来,实现数据共享。数据共享重要的是封装和解封装的过程。然而,TCP/IP协议族已经制定了规范。面对不同的层次,它们被封装成不同的传输单元。
整个数据传输过程中,数据在发送端自上而下逐层传输。每层必须封装一次。解封装来自上层的数据加上本层通信协议的参数信息。该参数信息用于识别正确的数据并解析所需的协议。
如上图所示,只有经过层层封装最终转化为比特流后才能通过电脑在网线上“传输”。
这里的传送并不是真正的传送,不像传送带。网线上真正传输的是电信号,因为比特流的0和1只是标识符,不存在于显示器中,不能作为传输单元。电信号(电频率)在现实中存在。接收端的计算机接收的不是比特流,而是电信号。这些电信号是有规律的,接收端的计算机通过规则将电信号转换成比特率。例如,传输数据的时间为2秒,传输时间间隔为1秒。那么在2秒的传输时间内,一个正电平和一个负电平都是1,先负后正为0。那么根据这个规则,就可以构造比特流了。比特流经过TCP/IP协议族中的物理层解封装,然后逐层解封装得到原始数据。按照TCP/IP协议族封装的数据可以正常解封装。因此,TCP/IP协议族是数据传输的基础。
数据传输的单元
报文
:应用层传输单元。面向应用,将应用产生的数据封装为报文。主要协议由HTTP(超文本传输协议),FTP(文件传输协议),SMTP(电子邮件传输协议),DNS(域名管理系统)。如Java中,提供了Servlet容器将Java的对象,集合以及基本数据类型的数据封装为报文。
报文段
网络层传输单元。对应用层的报文再次封装,定义IP,端口等信息,定义数据发送的目的地。
数据包
将网络层的报文段封装,添加IP头部等信息,定义传输的具体细节。
帧
:数据包再次封装的结果,面向计算机硬件。
比特流
:对帧的进一步封装,成为最终的类型,计算机将比特流转化为规律信号再网线等传输介质上传递。
封装和解封装是这四种类型数据的直接转换。同一类型的数据必须面向同一层才能正常解析。物理层、数据链路层、甚至网络层都是由计算机自动完成的。传输层和应用层都是由程序完成的。例如,Java的Socket可以将Java数据封装成TCP或UDP消息段,然后计算机可以将其封装并接收传输指令,然后再进行传输。 Java的Servlet容器可以将Java数据封装成HTTP消息并发送。包括电子邮件SMTP、文件FTP消息等。
字节,字符,编码
网络传输的基本单位是比特流。比特流对于计算机来说很容易识别,但是对于用户来说却很难理解。需要将比特流转换成人们可以识别的文本(字符)。
比特流并不是直接转化为字符,而是经过了字节的转化,在编码为字符。
字节
(Byte):一个字节占8位(bit),在计算机和网络中是通过二进制字节传递信息的。也就是一个字节由由八位二进制组成。计算机中64位系统就代表了64位的二进制代表一个字,换算成字节就是64/8=8,即是说由8字节构成一个字,32位系统就是32/8=4,4个字节代表一个字。
字符
(character):字符是人所能读写的最小单位,例如汉字“我”、字母“A”、符合“+”等,计算机所能支持的字符组成的集合,就叫做字符集。
编码
(encode):在计算机和网络中无法直接传递字符,但是可以解析字节,所以需要将字符转化为字节,个解析操作就叫做编码(encode),而相应的,将编码的字节还原成字符的操作就叫做解码(decode)。编码和解码都需要按照一定的规则,这种把字符集中的字符编码为特定的字节的规则就是字符编码(Character encoding)。
字符集
ASCII码
在计算机发展的早期,字符集和字符编码一般使用相同的命名,例如最早的字符集ASCII(American Standard Code for Information Interchange),它既代表了计算机所支持显示的所有字符(字符集),又代表了这个字符集的字符编码。
ASCII字符集是一个二维表,支持128个字符。 128 个代码点由 7 位二进制数表示。由于计算机的1个字节是8位二进制数,因此最高位为0,即00000000-01111111或0x00-0x7F。
慢慢地,只支持128个码点的ASCII已经不能满足我们的需求了。在原来的ASCII的基础上,扩展为256个字符,成为EASCII(扩展ASCII)。 EASCII有256个代码点,用8位二进制数表示,即00000000-11111111或0x00-0xFF。
ISO-8859
当计算机传到了欧洲,EASCII也开始不能满足需求了,但是改改还能凑合。于是国际标准化组织在ASCII的基础上进行了扩展,形成了ISO-8859标准,跟EASCII类似,兼容ASCII,在高128个码位上有所区别。但是由于欧洲的语言环境十分复杂,所以根据各地区的语言又形成了很多子标准,如ISO-8859-1、ISO-8859-2、ISO-8859-3、……、ISO-8859-16。
因此,ISO-8859不是一个标准,而是一系列标准。它们的子标准都使用相同的代码点来对应不同的字符集。
GBK
全称叫《汉字内码扩展规范》,是国家技术监督局为 windows95 所制定的新的汉字内码规范,它的出现是为了扩展 GB2312,加入更多的汉字,它的编码范围是 8140~FEFE(去掉 XX7F)总共有 23940 个码位,它能表示 21003 个汉字,它的编码是和 GB2312 兼容的,也就是说用 GB2312 编码的汉字可以用 GBK 来解码,并且不会有乱码。
Unicode字符编码
后来计算机传入亚洲,由于亚洲语种和文字都十分丰富,256个码位就显得十分鸡肋了。于是继续扩大二维表,单字节改双字节,16位二进制数,65536个码位。在不同国家和地区又出现了很多编码,大陆的GB2312、港台的BIG5、日本的Shift JIS等等。
为了解决传统字符编码方案的局限性,引入了Unicode和通用字符集(UCS)来取代原来基于语言的系统。通用字符集的目的是覆盖世界上所有的字符。 Unicode是计算机科学领域的行业标准,包括字符集、编码方案等。
Unicode编码方式:Unicode采用16位编码空间,即每个字符占用2个字节。这样,理论上最多可以表示2的16次方(即65536)个字符。
Unicode 是如何实现的: Unicode 的实现与编码不同。字符的 Unicode 编码是确定的。但在实际传输过程中,由于不同系统平台的设计不一定一致,并且出于节省空间的目的,Unicode编码的实现方式也有所不同。 Unicode 的实现也称为 Unicode Transformation Format(简称 UTF)。目前主流的实现方式是UTF-16和UTF-8。
UTF-8
UTF-8是一种变长编码,它将基本7位ASCII字符仍用7位编码表示,占用一个字节(首位补0)。而遇到与其他Unicode字符混合的情况,将按一定算法转换。
UTF-8每个字符使用1-3个字节编码,并利用首位为0或1进行识别。
1、如果一个字节,最高位(第 8 位)为 0,表示这是一个 ASCII 字符(00 - 7F)。可见,所有 ASCII 编码已经是 UTF-8 了。
2、如果一个字节,以 11 开头,连续的 1 的个数暗示这个字符的字节数,例如:110xxxxx 代表它是双字节 UTF-8 字符的首字节。
3、如果一个字节,以 10 开始,表示它不是首字节,需要向前查找才能得到当前字符的首字节
UTF-16
UTF-16 具体定义了 Unicode 字符在计算机中存取方法。UTF-16 用两个字节来表示 Unicode 转化格式,这个是定长的表示方法,不论什么字符都可以用两个字节表示,两个字节是 16 个 bit,所以叫 UTF-16。UTF-16 表示字符非常方便,每两个字节表示一个字符,这个在字符串操作时就大大简化了操作,这也是 Java 以 UTF-16 作为内存的字符存储格式的一个很重要的原因。