概述
本章的焦点是传输层,包括TCP、 UDP和SCTP (Stream Control Trasnission Protocol, 流控制传输协议)。绝大多数客户/服务器网络应用使用TCP或UDP。SCTP是一一个较新的协议,最初设计用于跨因特网传输电话信令。这些传输协议都转而使用网络层协议IP:或是IPv4, 或是IPv6。尽管可以绕过传输层直接使用IPv4或IPv6,但这种技术(往往称为原始套接字)却极少使用。
UDP是一个简单的、不可靠的数据报协议,而TCP是一个复杂、可靠的字节流协议。SCTP与TCP类似之处在于它也是一个可靠的传输协议,但它还提供消息边界、传输级别多宿(multihoming)支持以及将头端阻塞(head of-lie blocking)减少到最小的一种方法。
TCP的某些特性一旦理解,就很容易编写健壮的客户和服务器程序,也很容易使用诸如netstat等普遍可用的工具来调试客户和服务器程序。本章将阐述以下相关主题: TCP的三路握手、TCP的连接终止序列和TCP的TIME _WAIT状态,SCTP的四路握手和SCTP的连接终止,加上由套接字层提供的TCP、UDP和SCTP缓冲机制,等等。
总图
虽然协议族被称为“TCP/IP", 但除了TCP和IP这两个主要协议外,还有许多其他成员。图2-1展示了这些协议的概况。
图2-1中同时展示了IPv4和IPv6,从右向左查看该图,最右边的5个网络应用在使用IPv6;我们将在第3章中随sockaddr_in6结构讲解AE_ INET6常值。 随后的6个网络应用使用IPv4。
最左边名为tcpdump的网络应用或者使用BSD分组过滤器(BSD packet filter, BPF), 或者使用数据链路提供者接口(datalink provider interface, DLPI) 直接与数据链路进行通信。处于其右边所有9个应用下面的虚线标记为API,它通常是套接字或XTI.访问BPF或DLPI的接口不使用套接字或XTI。
![](https://i-blog.csdnimg.cn/blog_migrate/e8f814408b42a15702414fd44c2dd08d.png)
图2-1中还标明traceroute程序使用两种套接字: IP套接字用于访问IP,ICMP套接字用于访问ICMP。
下面我们讲解一下图2-1中的每一个协议框。
IPv4
网际协议版本4 ( Internet Protocol version 4)。IPv4 (通常称之为IP)自20世纪80年代早期以来一-直是网际协议族的主力协议。它使用32位地址(见A.4节)。IPv4给TCP、UDP、SCTP、 ICMP和IGMP提供分组递送服务。
IPv6
网际协议版本6 ( Internet Protocol version 6)。IPv6是在20世纪90年代中期作为IPv4的-一个替代品设计的。其主要变化是使用128位更大地址(见A.5节)以应对20世纪90年代因特网的爆发性增长。IPv6给TCP、 UDP、 SCTP和ICMPv6提供分组递送服务。当无需区别IPv4和IPv6时,我们经常把“IP”一词作为形容词使用,如IP层、 IP地址等。
TCP
传输控制协议( Transmission Control Protocol)。TCP是一个面向连接的协议,为用户进程提供可靠的全双工字节流。TCP套接字是-种流套接字( stream
socket)。TCP关心确认、超时和重传之类的细节。大多数因特网应用程序使用
TCP。注意,TCP既可以使用IPv4,也可以使用IPv6。
UDP
用户数据报协议(User Datagram Protocol)。UDP是-一个无连接协议。UDP套接字是- -种数据报套接字(datagram socket)。UDP数据报不能保证最终到达它们的目的地。与TCP一样,UDP既可以使用IPv4,也可以使用IPv6。
SCTP
流控制传输协议(Stream Control Transmission Protocol)。SCTP是一一个提供可靠全双工关联的面向连接的协议,我们使用“关联”- -词来指称SCTP中的连接,因为SCTP是多宿的,从而每个关联的两端均涉及一组IP地址和一 -个端口 号。SCTP提供消息服务,也就是维护来自应用层的记录边界。与TCP和UDP