绝大多数客户/服务器网络应用使用TCP或UDP。SCTP是一个较新的协议。
UDP是一个简单的、不可靠的数据报协议。而TCP是一个复杂、可靠的字节流协议。
这里重点放在TCP中。
用户数据报协议(UNP)
应用程序往UDP套接字写入一个消息,该消息随后被封装到一个UDP数据报,该UDP数据报进而又被封装到一个IP数据报,然后发送到目的地(面向非连接的)。
UDP不保证UDP数据报会达到最终目的地,不保证各个数据报的先后顺序跨网路后保持不变,也不保证每个数据报只到达一次。
传输控制协议(TCP)
相对于UDP,TCP客户先于某个给定的服务器建立一个连接,再跨该连接与那个服务器交换数据,然后终止连接(面向连接的)。
其次,TCP还提供了可靠性:当TCP向另一端发送数据时,它要求对端返回一个确认。如果没有收到确认,TCP就自动重传数据并等待更长的时间。在数次重传失败后,TCP才放弃。
TCP连接的建立和终止
三次握手,建立一个TCP连接时会发生下述情况
1.服务器必须准备好接受外来连接。这通常通过调用socket、bind和listen这3个函数来完成,我们称之为被动打开。
2.客户通过调用connect发起主动打开。这导致客户TCP发送一个SYN(同步)分节,它告诉服务器将在(待建立)连接中发送的数据的初始序列号(J)。
3.服务器必须确认(ACK)客户的SYN,同时自己也得发送一个SYN分节,它含有服务器将在同一连接中发送数据的初始序列号(K)。
4.客户必须确认服务器的SYN。
图中客户的初始序列号是J,服务器的初始序列号是K。ACK中的确认号是发送这个ACK的一段所期待的下一个序列号。
TCP连接终止
TCP终止一个连接需要4个分节
1.某个应用进程首先调用close,我们称该端执行主动关闭。该端的TCP于是发送一个FIN分节,表示数据发送完毕。
2.接受到这个FIN的对端执行被动关闭。这个FIN由TCP确认。它的接收也作为一个文件结束符传递给接收端应用程序。
3.一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发送一个FIN。
4.接收这个最终FIN的原发送端TCP确认这个FIN。
TCP状态转换图
观察分组
下面展示了一个完整的TCP连接所发生的实际分组交换情况。
TIME_WAIT状态
TIME_WAIT状态有两个存在的理由:
1.可靠地实现TCP全双工连接的终止;
2.允许老的重复分节在网络中消逝。