计算机网络由通过通信信道互连的机器组成。这些机器称为主机(host)和路由器(router)。主机上运行的应用程序是网络的真正“用户”。路由器又称为网关,负责把信息从一条通信信道中继或转发到另一条通信信道,它们可能运行程序,但通常不会运行应用程序。
通信信道(communication channel)是把字节序列从一台主机传送到另一台主机的工具。
路由器并不把每一台主机直接连接到所有其它的主机,而是将少数几台主机连接到一个路由器,再把该路由器连接到其它路由器,从而构成网络。这种安排允许利用数量相对较少的通信信道连接每台机器,大多数主机只需要一条通信信道。通过网络交换信息的程序不会直接与路由器交互,它们基本上感觉不到路由器的存在。
信息:由程序构造和解释的字节序列。
协议:关于通信程序交换的分组机器含义的协定。协议说明如何构造分组,以及如何解释信息。
TCP/IP协议族中唯一的网络层协议是网际协议IP,它解决的问题是使任意两台主机之间的信道和路由器序列看起来像是主机到主机之间的单独一条信道。
IP层上面是传输层,允许两种协议中选择其一:TCP和UDP。每种协议都构建于IP提供的服务上,但采用不同的方式提供不同类型的传输。TCP和UDP具有一个共同的功能:寻址。IP把分组递送到主机,需要进行更细粒度的寻址以便把分组送到特定的应用程序。TCP和UDP使用端口号来确定主机内的应用程序。TCP和UDP被称为端到端传输协议,它们把数据从一个程序运送到另一个程序,而IP只把数据从一台主机运送到另一台主机。
TCP被设计成在IP提供的主机到主机信道中检测可能发生的丢失、复制分组及其它错误,并从中恢复过来。它是面向连接的协议:在把它用于通信之前,两个程序必须先建立一条TCP连接,这涉及在两台通信的计算机上的TCP实现之间完成握手消息的交换。
UDP不会尝试从IP经历的错误中恢复,它只是扩展IP“尽力而为”的数据报服务,使得它在应用程序之间(而不是主机之间)工作。
每个Internet地址都指的是主机与底层通信信道之间的连接(网络接口)。一台主机可能具有多个接口,每个接口属于单个主机。因此,Internet地址标识主机及其通往网络的连接。反之不然,因为单个主机可能具有多个接口,并且每个接口可能具有多个地址。
客户程序发起通信,而服务器程序则被动地等待,然后响应联系它的客户。
程序充当客户还是服务器决定了它使用Sockets API与其对应方(peer)建立通信的一般形式。客户最初需要知道服务器的地址和端口,但是服务器则不然。一旦建立了连接,服务器与客户之间的区别就消失了。
套接字是一个抽象层,应用程序可以通过它发送和接收数据,套接字允许应用程序插入到网络中,并与插入到同一网络中的其它应用程序通信。不同类型的套接字对应于不同的底层协议族以及协议族内的不同协议栈。TCP/IP中主要类型的套接字是流套接字和数据报套接字。
TCP/IP套接字是由IP地址、端到端协议和端口号唯一标识。
一个程序可以同时使用多个套接字,多个程序可以同时使用同一套接字抽象层。
每个套接字有一个关联的本地TCP或UDP端口,用于把传入的分组指引到应该接收它们的应用程序。
实际上端口标识主机上的套接字而不是主机上的应用程序。由于多个套接字可以与一个本地端口相关联,不能仅仅使用端口来标识套接字。