3.3 哪张嘴说什么话

既然协议是我们说的话,那么用什么嘴说什么话就涉及到一个新名词了:“端口”。端口这个词在很多地方都会用到,我们在这里单指协议当中的端口,port。我们要的是逻辑意义上的端口,指的是TCP/IP协议组中的端口。

如果把操作系统比喻成一间房子,端口就是出入这间房子的门和窗。真正的房子只有几个门窗,但是端口可以有65536(即:2^16)个之多!端口是通过端口来标记的,端口只有整数,范围是从0 到65535(2^16-1)。端口的范围从0到65535。但是事实上,我总觉得端口要多余65536个,因为这里指的65536个是一种协议所开放的端口,实际上每个端口都可以有TCP和UDP两种模式存在,也就是TCP端口和UDP端口。由于TCP和UDP两个协议是独立的,因此各自的端口也相互独立,比如TCP有8080端口,UDP也可以有8080端口,两者并不冲突。

既然TCP和UDP有端口的概念,其他协议呢?比如IP协议或者HTTP协议。这里就会出现下面两种情况,第一种情况,IP协议这种低于传输层的协议,还是用房间来举例子,我们先要找到我们的房间,才能看见门和窗,IP协议实际上是指导我们如何找到房间的,所以在IP协议这个层面不存在端口这个概念,也就是网络层和网络接口层没有端口;那么第二种情况高于传输层的应用层呢?应用层的端口实际上是使用传输层提供的端口,应用层的每一种应用都会对应一个或者多个端口,这个端口可以是默认的、公认的或者自定义的,这不重要,重要的是这就像我们房子的某一扇门或者窗一样,我们的房子需要多少门窗,是在传输层已经定义好的,具体某一扇门和窗户是什么样式、颜色这个是应用层定义的,也就是说,一个应用可以决定它要使用哪种传输层协议的哪一个端口,前提是端口没有被占用,也没有出圈,这个应该很好理解,一间房子,有安装门窗的位置才可以安装,如果已经安装好了门窗,也不能再次安装了。

端口根据协议分为两类,这个已经说了,另外根据用途,或者说根据应用可以分为三类:

老规矩,逐个来说。公认端口有些人也称它为周知端口,其实就是英文惹的祸,因为它的英文名是Well Known Ports,具体翻译为什么,个人感觉还是公认端口书面一些。公认端口说的是0至1023之间的端口。这些端口由一个叫做互联网数字分配机构(简称IANA)的组织分配和管理。它们把这些端口分配给最重要的一些应用程序,让所有的用户都知道,当一种新的应用程序出现后,IANA必须为它指派一个公认端口。 常见的公认端口比如说访问网站用的80端口,DNS用的53端口。

注册端口,从1024到49151端口,分配给用户进程或应用程序。这些进程主要是用户选择安装的一些应用程序,而不是已经分配好了公认端口的程序。在大多数情况下,这些应用程序可以被非特权用户打开。这些端口在没有被服务器资源占用的时候,可以被其他程序占用。这其中比较常见的就是1433端口,它是SQL Server默认的端口,SQL Server服务使用两个端口:TCP协议的1433端口、UDP协议的1434端口。其中1433用于供SQL Server对外提供服务,1434用于向请求者返回SQL Server使用了哪个TCP/IP端口。这里SQL Server就是可以选择安装的,有用再装。而且普通计算机用户大部分时间用不到。而且SQL Server并不是必须依靠特权用户权限才能打开的。

动态端口,有时候也被称为用户端口,从49152到65535,之所以称为动态端口,是因为它 一般不固定分配某种服务,而是动态分配。这类端口仅在进程运行时才动态选择,因此又叫做短暂端口。被保留给客户端进程选择暂时使用的。也可以理解为,客户端启动的时候操作系统随机分配一个端口用来和服务器通信,客户端进程关闭下次打开时,又重新分配一个新的端口。其实这个动态端口结束再哪里我知道,一般从哪里开始我也不记清楚了,所以多数情况下我的个人习惯使用50000到65535之间。而注册端口记忆是从1024到49000之间,这样方便记忆,也不容易产生错误。如果我们愿意查看的话,浏览网站时候用的浏览器,无论是哪款的什么版本,端口一定是开放的动态端口,访问网站的80端口或者是使用安全通信https的443端口。

下面是互联网数字分配机构公布的一些端口占用情况,我们摘一些常用常见的看看。

|协议|端口|占用应用| |:-:|:-:|:-| |TCP|20|FTP| |TCP|21|FTP| |TCP|22|SSH| |TCP|23|Telnet| |TCP|25|SMTP| |TCP/UDP|53|DNS| |TCP|80|Http| |TCP|110|Pop3| |TCP/UDP|135|微软RPC| |TCP/UDP|137|微软Netbios,网上邻居使用| |UDP|138|微软Netbios数据服务| |TCP|139|微软Netbios会话服务| |TCP|443|HTTPS| |TCP/UDP|1433|Microsoft SQL server| |TCP/UDP|3389|windows远程桌面|

几乎每个系统中都会有一个services文件来保存端口和应用信息,Windows是在系统盘\Windows\System32\drivers\etc下;类unix系统一般是在/etc/下。有兴趣的可以看看。

3.4 网络身份证

既然已经知道了房间的门窗,那么我们房间的位置在哪里呢?这就涉及到其他的一些问题了,比如说MAC地址、IP地址等等。我们还是一个一个说吧。

首先说MAC地址,MAC地址(Media Access Control Address),直译为媒体访问控制地址,也叫硬件地址、局域网地址、以太网地址或物理地址,它是一个用来确认网上设备位置的地址。在OSI参考模型中,第二层数据链接层则负责MAC地址。MAC地址用于在网络中唯一标示一个网卡,一台设备若有一或多个网卡,则每个网卡都需要并会有一个唯一的MAC地址。MAC地址长度是48比特(6字节),由16进制的数字组成,分为前24位和后24位:前24位叫做组织唯一标志符,是由IEEE的注册管理机构给不同厂家分配的代码,区分了不同的厂家。后24位是由厂家自己分配的,称为扩展标识符。同一个厂家生产的网卡中MAC地址后24位是不同的。MAC地址是房间的具体位置,就好像有人告诉我们:“你直走到路口左转,第一个门上三楼”。就这样。

然后我们要说IP地址,IP地址是指互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),是IP Address的缩写。IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址。IP地址分为A、B、C、D、E5类,它们适用的类型分别为:大型网络;中型网络;小型网络;多目地址;备用。常用的是B和C两类。IP地址可以视为网络标识号码与主机标识号码两部分,因此IP地址可分两部分组成,一部分为网络地址,另一部分为主机地址。IP地址就像是我们的家庭住址一样,如果你要到某人家,你就要知道他(她)的地址,这样才能到。这个家庭地址一定是唯一的。IP地址工作在OSI参考模型的第三层网络层。和MAC地址两者之间分工明确,默契合作,完成通信过程。IP地址专注于网络层,将数据包从一个网络转发到另外一个网络;而MAC地址专注于数据链路层,将一个数据帧从一个结点传送到相同链路的另一个结点。

剩下的就是网关、网络ID、子网掩码,这些东西如果一个一个解释下来,就是在抄书,真没有什么意思。还是用一个类比的方式来解释,IP地址是一个家庭住址,网络ID是所在小区,网关是小区大门,子网掩码是小区大小,MAC地址是进小区之后具体位置。

大概就是这么个意思。说到这里,就不得不说点重点了,就是通信五要素。

网络注册流程解析(啥都玫说之网络篇-3协议部分)(1)

3.5 有些东西在这说

有些东西很难归类到系统还是协议的问题,先些在这里吧。

第一个要说的就是MTU,通信术语里最大传输单元,英文是Maximum Transmission Unit是指一种通信协议的某一层上面所能通过的最大数据包大小,这个大小以字节为单位。最大传输单元这个参数通常与通信接口有关,在这里我们一般只得也就是网络接口卡,俗称网卡。

因为协议数据单元的包头和包尾的长度是固定的,MTU越大,则一个协议数据单元的承载的有效数据就越长,通信效率也越高。MTU越大,传送相同的用户数据所需的数据包个数也越低。MTU也不是越大越好,因为MTU越大, 传送一个数据包的延迟也越大;并且MTU越大,数据包中bit位发生错误的概率也越大。MTU越大,通信效率越高而传输延迟增大,所以要权衡通信效率和传输延迟选择合适的MTU。以以太网传送IPv4报文为例。MTU表示的长度包含IP包头的长度,如果IP层以上的协议层发送的数据报文的长度超过了MTU,则在发送者的IP层将对数据报文进行分片,在接收者的IP层对接收到的分片进行重组。这里举一个具体的例子说明IP包分片的原理。以太网的MTU值是1500字节,假设发送者的协议高层向IP层发送了长度为3008字节的数据报文,则该报文在添加20字节的IP包头后IP包的总长度是3028 字节,因为3028>1500,所以该数据报文将被分片,注意:分片时仅仅对上层的数据进行分片,不需要对原来的IP首部分片,所以要分片的数据长度只有3008,而不是3028。这特别容易出错。分片过程如下:

从以上分片例子可以看出第一、二个分片包组成的IP包的长度都等于MTU即1500字节。

在网络通讯中,需要尽量避免发生分片和重组,因为分片重组对网络性能影响较大。数据包发送时选择合适的MTU大小对提高通讯性能很有必要。MTU大小的选择有协议协商方式,通过全路径的MTU发现机制,找到整条路径的最小MTU(也就是路径MTU),然后报文发送式小于等于路径MTU,这就避免了数据传输过程中产生分片,从而提高数据转发性能。MTU的协议发现机制由于安全等方面的原因,并不能总是生效,这时候就需要根据网络的特性选择合理的MTU。如果在报文传送过程中分片是不可避免的,那么要想办法让重组尽量在终端进行,避免在转发路径中进行。

在TCP/IP协议中,将要传输的数据分成较小的组进行传输,每个组的大小为576字节。Windows默认的为1500字节,这是以太网的分组标准。ADSL使用的PPPoE略小于这个数值,一般为1492字节。而某些网站采用的MTU大于1492字节,所以,可能导致某些网页不能访问。修改Windows默认的MTU可以解决这个问题。不论是PC机上安装的PPPoE软件或者是内置在Modem的 PPPoE软件,在使用中都有可能遇到这个问题。 如果使用路由器出现此种情况, 将MTU改为手工, 设置为1492即可。

网络中一些常见链路层协议MTU的缺省数值如下:

FDDI协议这个东西,简单点说一般应用在钢线网络当中,这样就理解它为什么MTU比较大了。X.25协议我已经不确定是不是以前电话线拨号上网时候的调制解调器用的那个协议了。看大小差不多。

如果在IP层要传输一个数据报比链路层的MTU还大,那么IP层就会对这个数据报进行分片。一个数据报会被分为若干片,每个分片的大小都小于或者等于链路层的MTU值。当同一网络上的主机互相进行通信时,该网络的MTU对通信双方非常重要。但当主机间要通过很多网络才能通信时,对通信双方最重要的是通信路径中最小的MTU,因为在通信路径上不同网络的链路层MTU不同。通信路径中最小的MTU被称为路径MTU。

,