理解面向连接和无连接协议之间的区别
网络编程中最基本的概念就是面向连接(connection-oriented)和无连接(connectionless)协议。
面向连接和无连接指的都是协议。也就是说,这些术语指的并不是无理介质本身,而是用来说明如何在物理介质上传输数据。面向连接和无连接协议可以,而且通常也确实会共享一条物理介质。
它们的本质区别在于,对无连接协议来说,每个分组的处理信息都独立于所有其他分组,而对面向连接的协议来说,协议实现则维护了与后继分组有关的状态信息。
无连接协议中的分组被称为数据报(datagram),每个分组都是独立寻址。
面向连接的协议则维护了分组之间的状态,使用这种协议的应用程序通常都会进行长时间的对话。记住这些状态,协议就可以提供可靠的传输。
典型的面向连接协议有三个阶段。第一阶段,在对等实体间建立连接。接下来是数据传输阶段,在这个阶段中,数据在对等实体间传输。最后,当对等实体完成数据传输时,连接被拆除。
连接为我们维护的状态中包含了这些地址。我们只要发送数据就行了,不需要考虑寻址或其他与协议相关的数据。
使用无连接协议可以很方便地支持一对多和多对一通信,而面向连接协议通常都需要多个独立的连接才能做到。但更重要的是,无连接协议 是构建面向连接协议 的基础。
TCP和UDP都是建立在IP之上的。因此,IP是构建整个TCP/IP协议族的基础。但IP提供的是一种尽力而为的、不可靠的无连接服务。它接收来自其上层的分组,将它们封装在一个IP分组中,根据路由为分组选择正确的硬件接口,从这个接口将分组发送出去。一旦将分组发送出去了,IP就不在关心这个分组了。
IP可以运行在任何能够承载分组的网络上。
TCP的分组被称为段(segment), 是放在IP数据报中发送的,因此,根本无法假定这些分组会抵达目的地,更不用说保证分组无损坏且已原来的顺序到达了。为了提供可靠性,TCP向基本的IP服务添加了三项功能。首先,它为TCP段中的数据提供了校验和。这样有助于确保抵达目的地的数据在传输过程中不会被网络损坏。第二,它为每个字节分配了一个序列号,这样,如果数据抵达目的地时真的错序了,接受端也能够按照恰当的顺序将其重装起来。第三,TPC提供了一种确认-重传机制,以确保最终每个端都会被传送出去。
TCP连接的每一端都维护了一个接受窗口(receive window),接受窗口就是可以从对等实体接受的数据序列号范围。除了接受窗口之外,每个TCP还维护了一个发送窗口(send window),发送窗口被划分为两部分:已发送还未被确认的字节,以及可以发送但还未发送的字节。
RTO(Retransmission Timeout) 超时重传。
UDP只向底层IP协议中添加了两项功能。首先,它提供了一个可选的校验和来检测数据的损坏情况。尽管IP也有校验和,但它只对IP分组首部进行计算。UDP向 IP添加的第二项特性就是端口的概念。
应用程序可以通过显式的bind调用来设置这个端口,也可以有操作系统为其选择。分组到达时,内核会搜索器套接字列表,查找一个与分组中的协议、地址、和端口号相匹配的套接字。如果找到了匹配的套接字,就由指定的协议来处理数据,并将这些数据提供给所有打开了匹配套接字的应用程序。