UNIX 网络编程(第2章) - 传输层:TCP、UDP和SCTP

用户数据报协议(UDP)

UDP是一个简单的传输层协议。UDP不保证UDP数据报会到达其最终目的地,不保证各个数据报的先后顺序跨网络后保持不变,也不保证每个数据报只到达一次。

每个UDP数据报都有一个长度。

我们也说UDP提供无连接的(connectionless)服务,因为UDP客户和服务器之间不必存在任何长期的关系。举例来说,一个UDP客户可以创建一个套接字并发送一个数据报给一个给定的服务器,然后立即用同一个套接字发送另一个数据报给另一个服务器。同样的,一个UDP服务器也可以用同一个UDP套接字从若干个不同的客户端接收数据报,每个客户一个数据报。

传输控制协议(TCP)

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

TCP不能被描述成是100%可靠的协议,它提供的是数据的可靠递送或故障的可靠通知。

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

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

TCP提供流量控制(flow control)。TCP总是告知对端在任何时刻它一次能够从对端接收多少字节的数据,这称为通告窗口(advertised window)。在任何时刻,该窗口指出接收缓冲区中当前可用的空间量,从而确保发送端发送的数据不会使接收缓冲区溢出。该窗口时刻动态变化。

TCP连接是全双工的(full-duplex)。建立一个全双工连接后,需要的话可以把它转换为一个单工连接。

流传输控制协议(SCTP)

SCTP在客户和服务器之间提供关联(association)。并像TCP那样给应用提供可靠性、排序、流量控制以及全双工的数据传送。SCTP支持多宿而涉及不止两个地址。

与TCP不同的是,SCTP是面向消息的(message-oriented)。它提供各个记录的按序递送服务,与UDP一样,由发送端写入的每条记录的长度随数据一道传递给接收端应用。

SCTP能够在所连接的断点之间提供多个流,每个流各自可靠地按序递送消息。一个流上某个消息的丢失不会阻塞同一关联其他流上消息的投递。

SCTP还提供多宿特性,使得单个SCTP端点能够支持多个IP地址。该特性可以增强应对网络故障的健壮性。

三路握手

UNIX 网络编程(第2章) - 传输层:TCP、UDP和SCTP_第1张图片

TCP 选项

  • MSS选项 发送SYN的TCP一端使用本选项通告对端它的最大分节大小(maximum segment size)即MSS,也就是它在本连接的每个TCP分节中愿意接受的最大数据量。
  • 窗口规模选项
  • 时间戳选项 作为网络编程选项,我们无需考虑这个选项。

TCP连接终止

UNIX 网络编程(第2章) - 传输层:TCP、UDP和SCTP_第2张图片
UNIX 网络编程(第2章) - 传输层:TCP、UDP和SCTP_第3张图片

当一个Unix进程无论自愿地(调用exit或从main函数返回)还是非自愿地(收到一个终止本进程的信号)终止时,所有打开的描述符都被关闭,这也导致仍然打开的任何TCP连接上也发出一个FIN。

TCP状态转换图

UNIX 网络编程(第2章) - 传输层:TCP、UDP和SCTP_第4张图片

这些状态可以使用netstat显示。

观察分组

UNIX 网络编程(第2章) - 传输层:TCP、UDP和SCTP_第5张图片

注意,服务器对客户请求的确认是伴随其应答发送的,这种做法称为捎带(piggybacking),它通常在服务器处理请求并产生应答的时间少于200ms时发生。如果服务器好用更长时间,譬如1s,那么我们将看到先是确认后是应答。

许多网络应用仍然使用UDP构建的,因为它们需要交换的数据量较少,而UDP避免了TCP连接建立和终止所需的开销。

你可能感兴趣的:(UNIX 网络编程(第2章) - 传输层:TCP、UDP和SCTP)