1、用户数据报协议(UDP)
UDP是一个简单的传输层协议。应用进程往一个UDP套接字写入一个消息,该消息随后被封装到一个UDP数据报,该UDP数据报进而又被封装到一个IP数据报,然后发送到目的地。UDP不保证UDP数据报会到达其最终目的地,不保证各个数据报的先后顺序跨网络后保持不变,也不保证每个数据报只到达一次。
我们使用UDP进行网络编程所遇到的问题是它缺乏可靠性。如果一个数据报到达了其最终目的地,但是校验和检测发现有错误,或者该数据报在网络传输中被丢弃了,它就无法被投递给UDP套接字,也不会被源端自动重传。如果想要确保一个数据报到达其目的地,可以往应用程序中添加一大堆的特性:来自对端的确认、本端的超时与重传等。
每个UDP数据报都有一个长度。如果一个数据报正确地到达其目的地,那么该数据报的长度将随数据一道传递给接收端应用进程。而TCP是一个字节流协议,没有任何记录边界,这一点不同于UDP。
我们也说UDP提供无连接的服务,因为UDP客户端与服务器之间不必存在任何长期的关系。举例来说,一个UDP客户端可以创建一个套接字并发送一个数据报给一个给定的服务器,然后立即用同一个套接字发送另一个数据报给另一个服务器。同样地,一个UDP服务器可以用同一个UDP套接字从若干个不同的客户接收数据报,每个客户一个数据报。
2、传输控制协议(TCP)
由TCP向应用进程提供的服务不同于由UDP提供的服务。首先,TCP提供客户端与服务器之间的连接。TCP客户端先与某个给定服务器建立一个连接,再跨该连接与那个服务器交换数据,然后终止这个连接。
其次,TCP还提供了可靠性。当TCP向另一端发送数据时,它要求对端返回一个确认。如果没有收到确认,TCP就自动重传数据并等待更长时间。在数次重传失败后,TCP才放弃。
(注意:TCP并不保证数据一定会被对方端点接收,因为这是不可能做到的。如果有可能,TCP就把数据递送到对方端点,否则就通过放弃重传并中断连接这一手段通知用户,这么说来,TCP也不能被描述成是100%可靠的协议,它提供的是数据的可靠递送或故障的可靠通知。)
TCP含有用于动态估算客户端和服务器之间的往返时间(round-trip time,RTT)的算法,以便它知道等待一个确认需要多少时间。举例来说,RTT在一个局域网上大约是几毫秒,跨越一个广域网则可能是数秒钟。另外,因为RTT受网络流通各种变化因素影响,TCP还持续估算一个给定连接的RTT。
TCP通过给其中每个字节关联一个序列号对所发送的数据进行排序。举例来说,假设一个应用写2048字节到一个TCP套接字,导致TCP发送两个分节:第一个分节所含数据的序列号为1~1024,第二个分节所含数据的序列号为1025~2048。(分节是TCP传递给IP的数据单元。)如果这些分节非顺序到达,接收端TCP将先根据它们的序列号重新排序,再把结果数据传递给接收应用。如果接收端TCP接收到来自对端的重复数据(譬如说对端认为一个分节已丢失并因此重传,而这个分节并没有真正丢失,只是网络通信过于拥挤),它可以根据序列号判定数据是重复的,从而丢弃重复数据。【UDP】:UDP不提供可靠性,UDP本身不提供确认、序列号、RTT估算、超时和重传等机制。如果一个UDP数据报在网络中被复制,两份副本就可能都递送到接收端的主机。同样地,如果一个UDP客户端发送两个数据报到同一目的地,它们可能被网络重新排序,颠倒顺序后到达目的地。UDP应用必须处理所有这些情况。
再次,TCP提供流量控制。TCP总是告知对端在任何时刻它一次能够从对端接收多少字节的数据,这称为通告窗口。在任何时刻,该窗口指出接收缓冲区中当前可用的空间量,从而确保发送端发送的数据不会使接收缓冲区溢出。该窗口时刻动态变化:当接收到来自发送端的数据时,窗口大小就减少,但是当接收端应用从缓冲区中读取数据时,窗口大小就增大。通告窗口大小减小到0是有可能的:当TCP对应某个套接字的接收缓冲区已满,导致它必须等待应用从该缓冲区读取数据时,方能从对端再接收数据。【UDP】:UDP不提供流量控制,让较快的UDP发送端以一个UDP接收端难以跟上的速率发送数据报是非常容易的。
最后,TCP连接是全双工的。这意味着在一个给定的连接上应用可以在任何时刻在进出两个方向上既发送数据又接收数据。因此,TCP必须为每个数据流方向跟踪诸如序列号和通告窗口大小等状态信息。建立一个全双工连接后,需要的话可以把它转换成一个单工连接。(UDP也可以是双工的。)
【先大致有个印象,对于一些细节不必深究!】