绝大多数的客户-服务器应用程序都使用TCP或UDP。这两个协议转而使用网络层协议IP;P版本4(IPv4)或IP版本6(IPv6)。尽管可以绕过传输层直接使用IPv4或IPv6,但这种技术(称为原始套接口)较少使用。
UDP是一种简单的,不可靠的数据报协议,而TCP是一种精致的、可靠的字节流协议。
总图
虽然称为“TCP/IP"协议族,但是本协议族还有许多其他成员。图2.1展示了这些协议的概貌。
在这个图中,我们展示了IPv4和IPv6。从右向左观察这个图,最右边的4个应用程序使用IPv6,这涉及到第3章中的AF…INET6常值和sockaddr-in6结构。另外的5个应用程序使用IPv4。
最左边的应用程序(tcpdump)直接使用BPF(BSD分组过滤器>或DLPI(数据链路提供者接口)同数据链路层进行通信。右边9个应用程序的下面用虚线标记出API,它通常是套接口或XTI。使用BPF或DLPI的接口不用套接口或XTI。
协议 | 说明 |
---|---|
IPv4 | 网际协议,版本4。IPv4(我们通常就称之为IP)自80年代早期以来一直是网际协议族的主力协议。它使用32位的地址(A.4节)。IPv4给TCP、UDP、ICMP和IGMP提供递送分组的服务。 |
IPv6 | 网际协议,版本6。IPv6在90年代中期设计出来,用以替代IPv4。主要IPv6变化是使用128位的大地址(A.5 节)以处理90年代因特网燥发性的增长。IPv6给TCP.UDP和 ICMPv6提供递送分组的服务。当无需区别IPv4和IPv6时,我们经常使用IP这个形容词,如I层、IP地址等等。 |
TCP | 传输控制协议。TCP是一种面向连接的协议。它给用户进程提供可靠的全双工的字节流。TCP套接口是字节流套接口(stream socket)的一种。TCP关心确认.超时和重传等具体细节。大多数因特网应用程序使用TCP。注意,TCP可以使用IPv4或IPv6。 |
UDP | 用户数据报协议。UDP是一种无连接协议。UDP套接口是数据报套接口(datagram socket)的一种。与TCP不同,UDP不能保证每–UDP数据报可以到达目的地。与TCP相同的是,UDP也可以使用IPv4或IPv6。 |
ICMP | 网际控制消息协议。ICMP处理路由器和主机间的错误和控制消息。这些消息-般由TCP/IP网络软件自身(而不是用户进程)产生和处理,不过图中展示的Ping 程序也使用ICMP。有时我们称这个协议为ICM-Pv4,用于区别ICMPv6。 |
IGMP | 网际组管理协议。IGMP用于多播(第19章),它在IPv4中是可选的。 |
ARP | 地址解析协议。ARP 把IPv4地址映射到硬件地址(如以太网地址)。ARP一般用于广播网络,如以太网、令牌环网和FDDI,但不用于点对点网络。 |
RARP | 反向地址解析协议。RARP把硬件地址映射到IPv4地址。它有时用于无盘节点,如引导时的X终端。 |
ICMPv6 | 网际控制消息协议,版本6。ICMPv6综合了ICMPv4、IGMP和ARP的功能。 |
BPF | BSD分组过滤器。它为进程提供访问链路层数据的接口。一般在源自Berkeley的内核中可以找到它。 |
DLPI | 数据链路提供者接口,这是提供访问数据链路的接口,一般由SVR4提供。 |
我们使用术语“IPv4/IPv6主机”或“双栈主机”表示同时支持IPv4和IPv6的主机。
有关TCP/IP协议的其他细节见TCPv1。
UDP:用户数据报协议
UDP是一个简单的传输层协议,在RFC768[Postel 1980]中有详细描述。应用进程写一数据报到UDP 套接口,由它封装(encapsulating)成IPv4或IPv6数据报,然后发送到目的地。但是,UDP并不能确保UDP数据报最终可到达目的地。
使用UDP进行网络编程所碰到的问题是缺乏可靠性。如果我们要确保一个数据报到达目的地,我们必须在应用程序里建立一大堆的特性:来自另一端的确认、超时、重传等等。
每个UDP数据报都有一定长度,我们可以认为一个数据报就是一个记录。如果数据报最终正确地到达目的地(即分组到达目的地且校验和正确),那么数据报的长度将传递给接收方的应用进程。我们已经提到TCP是一字节流协议,无记录边界(1.2节),这与UDP不同。
我们也称UDP提供无连接的(connectionless)服务,因为UDP客户与服务器不必存在长期的关系。例如,一个UDP客户可以创建一个套接口并发送一个数据报给-个服务器,然后立即用同一个套接口发送另一个数据报给另一个服务器。同样,一个UDP服务器可以用同一个UDP 套接口从5个不同的客户一连串接收5个数据报。
TCP:传输控制协议
向应用进程提供的TCP服务与UDP服务不相同。(TCP在RFC793[Poste1 1981c]中介绍。)
首先,TCP提供客户与服务器的连接(connection)。一个TCP客户建立与一个给定服务器的连接,跨越连接与那个服务器交换数据﹐然后终止连接。
其次,TCP提供可靠性。当TCP向另端发送数据时,它要求对方返回-个确认。如果确认没有收到,TCP自动重传数据并等待更长时间。在数次重传失败后,TCP才放弃。重传数据所花的总时间传统上是4~10分钟(与实现有关)。TCP含有用于动态估算客户到服务器往返所花时间RTT(round-trip time)的算法,因此它知道等待一确认需要多少时间。例如,RTT在一局域网上大约几毫秒,而跨过广域网则需数秒钟。另外,某时刻TCP可能测到客户到服务器的RTT为1秒钟,而过30秒后却测到同一连接的RTT为2秒钟,这是因为网络传输的拥挤情况是在不断变化的。
第三,TCP通过给所发送数据的每一个字节关联一个序列号进行排序。例如,假设一个应用进程写2048字节到一个TCP套接口,导致TCP发送2个分节,第1个分节所含数据的序列号为1-1024,第2个分节所含数据的序列号为1025-2048(分节是TCP传递给IP的数据单元)。如果这些分节非顺序到达,接收方的TCP将根据它们的序列号重新排序,再把结果数据传递给应用进程。如果TCP接收到重复的数据(譬如说对方认为一个分节已丢失并因而重传,而它并没有真正丢失,只是刚才网络通信过于拥挤),它也可以判定数据是重复的(根据序列号),从而把它丢弃掉。
第四,TCP提供流量控制。TCP总是告诉对方它能够接收多少字节的数据,这称为通告窗口(advertised window)。任何时刻,这个窗口指出接收缓冲区中的可用空间,从而确保发送方发送的数据不会溢出接收缓冲区。窗口时刻动态地变化;当接收发送方的数据时,窗口大小减小,而当接收方应用进程从缓冲区中读取数据时,窗口大小增大。窗口的大小减小到0是有可能的:TCP的接收缓冲区满,它必须等待应用进程从这个缓冲区读取数据后才能再接收从发送方发来的数据。
最后,TCP的连接是全双工的。这意味着在给定的连接上应用进程在任何时刻既可以发送也可以接收数据。因此,TCP必须跟踪每个方向数据流的状态信息,如序列号和通告窗口的大小。UDP可以是全双工的。