您的位置:首页 > 理论基础 > 计算机网络

Unix网络编程二:传输层:TCP、UDP、SCTP

2017-04-05 09:05 267 查看

一、概述

UDP是一个简单的、不可靠的数据报协议,TCP是一个复杂的、可靠的字节流协议。SCTP(Stream control transmission protocol)与TCP类似之处在于他也是一个可靠的传输协议,但它还提供消息边界、传输级别多宿支持以及将头阻塞减少到最小的一种方法。

本章描述以下相关主题:TCP的三路握手、TCP的连接终止序列和TCP的TIME_WAIT状态,SCTP的四路握手和连接终止,加上由套接字层提供的TCP、UDP和SCTP的缓冲机制等。

二、总图

图2-1展示了TCP/IP协议族的概况。从右往左查看该图,最右边的5个网络应用在使用IPv6,随后的6个网络应用使用IPv4。最左边的名为tcpdump的网络应用或者使用BSD分组过滤器,或者使用数据链路提供者接口(datalink provider interface,DLPI)直接与数据链路层进行通信。



IPv4:网际协议版本4,IPv4自20世纪80年代早期以来一直是网际协议族的主力协议,他使用32为地址。IPv4为RCP、UDP、SCTP、ICMP和IGMP提供分组传递服务

IPv6:网际协议版本6。IPv6在20世纪90年代中期作为IPv4的一个替代品设计的。其主要变化是使用128位更大的地址以应对20世纪90年代因特网的爆发性增长。IPv6为RCP、UDP、SCTP、ICMPv6提供分组传递服务

TCP:传输控制协议,TCP是一个面向连接的协议,为用户进程提供可靠的全双工字节流。TCP套接字是一种流套接字。TCP关心确认、超时和重传之类的细节。大多数因特网应用程序使用TCP

UDP:用户数据报协议,UDP是一个无连接协议。UDP套接字是一种数据报套接字。UDP的数据报不能保证最终达到他们的目的地。

SCTP:流控制传输协议,SCTP是一个通过可靠全双工的面向连接的协议,我们使用“关联”一词来指称SCTP中的连接,因为SCTP是多宿的,从而每个关联的两端均涉及一组IP地址和一个端口号。SCTP提供消息服务,也就是维护来自应用层的记录边界

ICMP:网际控制消息协议(Internet control Message Protocol),处理在路由器和主机之间的错误和控制消息。这些消息通常由TCP/IP网络支持软件本身(而不是用户进程)产生和处理

IGMP:网际组管理协议,用于多播

ARP:地址解析协议,ARP把一个IPv4地址映射成一个硬件地址

RARP:反向地址解析协议,把一个硬件地址映射成一个IPv4地址

ICMPv6:网际控制消息协议版本6,总和了ICMPv4、IGMP和ARP的功能

BPF:BSD分组过滤器,该接口提供对于数据链路层的访问能力

DLPI:数据链路提供者接口,该接口也提供对于数据链路层的访问能力

三、用户数据报协议

应用进程往一个UDP套接字写入一个消息,该消息随后被封装到一个UDP数据报,该UDP数据吧进而又被封装到一个IP数据报,然后发送到目的地。UDP不保证UDP数据会到达其最终目的地,不保证各个数据报的先后顺序跨网络后保持不变,也不保证每个数据报只到达一次

四、传输控制协议

TCP提供客户与服务器之间的连接,TCP客户先与某个服务器建立一个连接,在跨该连接与那个服务器交换数据,然后终止这个连接。

其次,TCP还提供了可靠性,当TCP向另一端发送数据时,它要求对端返回一个确认。如果没有收到确认,TCP就自动重传数据并等待更长的时间。在数次重传失败后,TCP才放弃。

TCP含有用于动态估算客户和服务器之间的往返时间的算法,以便他知道等待一个确认需要多少时间。

TCP通过给其中每个字节关联一个序列号对所发生的数据进行排序。

TCP提供流量控制,TCP总是告知对端在任何时刻它依次能够从对端接收多少字节的数据,这称为通告窗口。在任何时刻,该窗口指出接收缓冲区中当前可用的空间量,从而确保发送端发送的数据不会使接收缓冲区溢出。该窗口时刻动态变化,当接收到来自发送端的数据时,窗口大小就减小,但是当接收端应用从缓冲区读取数据时,窗口大小就增大。

TCP连接是全双工的。这意味着在一个给定的连接上应用可以在任何时刻在两个方向上既发送数据又接收数据。因此,TCP必须为每个数据流方向跟踪诸如序列号和通告窗口等状态信息

五、流控制传输协议

SCTP在客户和服务器之间提供关联,并像TCP那样给应用提供可靠性、排序、流量控制以及全双工的数据传送,SCTP中使用关联一词指代两个系统之间的一次通信,他可能是因为SCTP是吃多宿而涉及不止两个地址。

与TCP不同的是,SCTP是面向消息的,它提供各个记录的按序递送服务。SCTP能够在所连接的端口之间提供多个流,每个流各自可靠的按序递送消息。一个流上某个消息的丢失不会阻塞同一关联其他流上消息的投递。

六、TCP连接的建立与终止

三次握手

服务器必须准备好接收外来连接。这通常通过调用socket、bind、listen这三个函数来完成,我们称之为被动打开

客户通过调用connect发起主动打开,这导致客户TCP发送一个SYN(同步)分节,他告诉服务器客户将在连接中发送的数据的初始序列号。通常SYN分节不携带数据,其所在的IP数据报只含有一个IP首部,一个TCP首部以及可能有的TCP选项

服务器发送确认客户的SYN,同时自己也得发送一个SYN分节,它含有服务器将在同一连接中发送的数据的初始序列号。服务器在单个分节中发送SYN和对客户SYN的ACK(确认)

客户必须确认服务器的SYN

这种交换至少需要三个分组,因此称之为TCP的三次握手,图2-2展示了所交换的3个字节。客户的初始序列号为J,服务器的初始序列号为K,ACK中的确认号是发送这个ACK的一端所期待的下一个序列号。因为SYN占据一个字节的序列号空间,所以每一个SYN的ACK中的确认号就是该STN的初始号加1,类似的,每一个FIN的ACK中的确认号为该FIN的序列号加1



TCP选项:每一个SYN可以含有多个TCP选项,下面是常用的TCP选项

- MSS选项:发生SYN的TCP一端使用本选项通过对端它的最大分节大小(maximum segment size),也就是它在本连接的每个TCP分节中愿意接收的最大数据量。

- 窗口规模选项:TCP连接的任何一端能够通告对端的的最大窗口大小是65535,因为在TCP首部中相应的字段占16位。

- 时间戳选项:可以防止由失而复现的分组可能造成的数据破坏

**TCP连接终止

TCP连接需3个分片,终止一个连接则需要4个分节**

- 某个应用程序首先调用close,我们称该端执行主动关闭。该端的TCP于是发送一个FIN分节,表示数据发送完毕

- 接收到这个FIN的对端执行被动关闭,这个FIN由TCP确认,他的接收也作为一个文件结束符传递给接收端应用进程(放在已排序等待该应用进程接收的任何其他数据之后),因为FIN的接收意味着接收端应用进程在相应的连接上再无额外数据可接收

- 一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发送一个FIN

- 接收到这个最终FIN的原发送端TCP确认这个FIN

图2-3展示了这些分节,类似SYN,一个FIN也占据一个字节的空间号序列,因此每个FIN的ACK确认好就是这个FIN的序列号加1



当套接字被关闭时,其所在端TCP各自发送一个FIN,我们在图中指出,这是由应用进程调用close而发生的,不过需认识到,当一个Unix进程无论自愿地(调用exit或从main函数返回)或者非自愿地(收到一个终止本进程的信号)终止时,所有打开的描述符都是被关闭,这也导致仍然打开的任何TCP连接上也发送一个FIN

TCP状态转换图

TCP为一个连接定义了11种状态,并且TCP规则规定了如何基于当前状态及在改状态下所接收的分节从一个状态转换到另一个状态。举例来说,当某个应用进程在CLOSED状态下执行主动打开时,TCP将发送一个SYN,且新的状态是SYN_SENT,如果这个TCP接收收到一个带有ACK的SYN,它将发送一个ACK,且新的状态是ESTABLISHED。

自ESTABLISHED状态引入两个箭头处理连接终止。如果某个应用程序在接收到一个FIN之前调用close(主动关闭),那就转换发哦FIN_WAIT_1状态,但是如果某个应用进程在ESTABLISHED状态接收期间接收到一个FIN(被动关闭),那就转换到CLOSE_WAIT状态

用粗实线表示通常客户状态转换,用粗虚线表示通常服务器状态转换。图中存在两个为讨论的转换:同时打开(发生在两端几乎同时发送AYN并且这两个SYN在网络中交错的情形下),同时关闭(发生在两端几乎同时发送FIN的情形下)。它们可能发生,但非常罕见



观察分组

图2-5展示了一个完整的TCP连接送发生的实际分组交换情况,包括连接建立、数据传送和连接终止三个阶段。

一旦建立一个连接,客户就构造一个请求发送给服务器。服务器处理并发送一个应答。注意,服务器对客户请求的确认是伴随其应答发送的,这种做法称为捎带



七、TIME_WAIT状态

八、SCTP关联的建立和终止

九、端口号

十、TCP端口号和并发服务器

十一、缓冲区大小及限制

十二、标准因特网服务

十三、常见因特网应用的协议使用

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  网络编程