TCP/IP协议的补充知识
在任何运行TCP/IP协议的主机上,数个应用程序可以同时运行。在日常生活中经常使用的电脑上,用户都可以同时打开并运行电子邮件程序、Web浏览器和聊天软件。
在TCP/IP环境下,在数据被传递给IP用于寻址和传送之前,传输协议(TCP或UDP)处理来自不同应用程序的多个出站数据流,TCP/IP可以提供这种机制,把多个应用程序区分开来。
入站数据的处理类似,传输层PDU的入站数据必须被检验和分离,并把结果消息交付给适宜的请求应用程序。
将各种各样不同来源的出站数据合并为一个单一数据流的过程称为多路复用(Multiplexing);拆分入站数据流、以便把分离的部分交付给正确应用程序的过程称为多路分解(Demultiplexing)。一般而言,多路复用或多路分解在传输层处理,出站消息被拆分为适合它们所传输网络要求大小的数据块,入站消息从入站数据块流中按照正确顺序被重组。
Ⅰ.协议号和端口号
协议号(Protocol Number),TCP/IP使用协议号来标识不同的协议,协议使用端口号(Port Number)来标识特定的应用层协议和服务。
常见的TCP/IP协议协议号和端口号起源于UNIX环境,使用的是一系列配置文件来实现。
许多端口号被保留用来标识公认协议(Well-Known Protocol)。公认协议(也叫公认服务(Well-Known Service))的默认端口号,用于表示大量基于TCP/IP的服务。UNIX机器(Linux系统)中用两个文本文件定义了该值:协议号定义在/etc/protocols中,端口号定义在/etc/services中。
LInux系统中常用的协议及其协议号在IP层将入站数据传递给位于传输层的TCP或UDP后,相关的协议必须履行职责,将数据传递给预定的应用进程,并且无论程序运行什么,都要依据用户的操作接收数据。
TCP/IP应用进程也被称作网络服务(network service),由端口号标识。
源端口号(Source Port Number)标识了发送数据的进程,目标端口号(Destination Port Number)标识了接收数据的进程。
端口号使用两个字节表示,一个字节是8个比特位,故端口号是16位的值,其总数共有216个,即65536个,取值范围为0~65535。
LInux中常见的端口号和其协议通常,小于256的端口号被保留用于公认服务,206~1024之间的端口号保留用于UNIX专用服务。因此,也认为小于1024的端口号都用于表示公认服务。
除此以外,还有与特定服务相关联的注册端口号(Registered Port),数值位于1024~65535之间。
Ⅱ.套接字
公认端口号或注册端口号代表了与特定网络服务特殊关联的预先分配端口号,这种预先分配的端口号,其发送方和接收方都一致同意特定服务和特定端口地址相关联,简化了客户端和服务器端的连接过程。
还有一种类型的端口号,被称为动态分配端口号,这些端口号不预先分配,而是在需要时为发送方和接收方之间提供有限数据交换的临时链接。
动态分配端口号允许每一个系统维持大量的打开连接,并为每一个连接分配它自己唯一的、动态分配的端口地址。动态分配的端口号范围在1024~65535,该范围内任何当前未用的都可以成为该临时用途的端口号。
在客户端或服务器使用端口号建立通信后,特定的IP地址(进程正在运行的机器上)与动态分配端口号(维持连接所需的),二者组合称为套接字地址(Socket Address),简称套接字(Socket)。套接字地址提供了发送方与接收方之间进一步通信所用的发送和接收端口号。
对于套接字,由于IP地址和动态分配的端口号都具有唯一性,因此每一个套接字地址在整个Internet上也是唯一的。
Ⅲ.数据封装
TCP/IP协议栈的各层-网络访问层、网络层、传输层、应用层(该层运行TCP/IP的诸多协议和服务,每一个都由一个或多个公认端口号表示)-出站数据都被封装和标识,以便交付给下一层。相应的,入站数据在交付给上层协议之前,下层协议拆封信息。
数据在个协议层的封装和解封因此,每一个PDU(协议数据单元)在开头都有自己一个特殊的部分,称为首部(Packet Header),也叫作数据包首部(Packet Header),标识了所用协议、发送方与预计的接收方,以及其他信息。
PDU的结尾也包含了一个特殊的部分,称为尾部(Trailer),也可以叫作数据包尾部(Packet Trailer),该部分包含对数据部分的数据完整性检查信息。
数据部分位于首部和尾部之间,也称作有效载荷(Payload),对有效载荷进行打包就是封装(Encapsulation),从上一层获取数据,传递给下一层,或是通过网络介质交付到其他地方之前,使用首部(或可能的尾部)对数据进行封装。
研究网络介质上任何通信的实际内容(也叫作“接线”(Across The Wire)),首先得需理解典型的首部和尾部结构,并能够把网络中移动的数据从协议栈重组为接近其原始形式的内容。