TCP协议详解

来源:互联网 发布:淘宝助理如何图片搬家 编辑:程序博客网 时间:2024/05/22 06:46

本文从如下四方面来讨论TCP协议

  • TCP头部信息
    出现在每个TCP报文段中,用于指定通信的源端端口号、目的端端口号,管理TCP连接,控制两个方向的数据流。

  • TCP状态转移过程
    TCP连接的任意一端都是一个状态机。在TCP连接从建立到断开的整个过程中,连接两端的状态机将经历不同的状态变迁。

  • TCP数据流
    通过分析TCP数据流,我们就可以从网络应用程序外部来了解应用层协议和通信双方交换的应用程序数据。这一部分将讨论两种类型的TCP数据流:交互数据流和成块数据流。TCP数据流中有一种特殊的数据,称为紧急数据,也将简单讨论之。

  • TCP数据流的控制
    为了保证可靠传输和提高网络通信质量,内核需要对TCP数据流进行控制。这一部分讨论TCP数据流控制的两个方面:超时重传和拥塞控制。

先简单介绍一下TCP服务的特点,以及它和UDP服务的区别。

1 TCP服务的特点

传输层协议主要有两个:TCP协议和UDP协议。
TCP协议相对于UDP协议的特点是:面向连接、字节流和可靠传输。

使用TCP协议通信的双方必须先建立连接,然后才能开始数据的读写。
双方都必须为该连接分配必要的内核资源,以管理连接的状态和连接上数据的传输。
TCP连接是全双工的,即双方的数据读写可以通过一个连接进行。
完成数据交换之后,通信双方都必须断开连接以释放系统资源。

TCP协议的这种连接是一对一的,所以基于广播和多播的应用程序不能使用TCP服务。而无连接协议UDP则非常适合

字节流服务和数据报服务的区别对应到实际编程中,体现为通信双方是否必须执行相同次数的读、写操作(这只是表现形式)。
当发送端应用程序连续执行多次写操作时,TCP模块先将这些数据放入TCP发送缓冲区中。
当TCP模块真正开始发送数据时,发送缓冲区中这些等待发送的数据可能被封装成一个或多个TCP报文段发出。
因此,TCP模块发送出的TCP报文段的个数和应用程序执行的写操作次数之间没有固定的数量关系。

当接收端收到一个或多个TCP报文段后,TCP模块将它们携带的应用程序数据按照TCP报文段的序号依次放入TCP接收缓冲区中,并通知应用程序读取数据。
接收端应用程序可以一次性将TCP接收缓冲区中的数据全部读出,也可以分多次读取,这取决于用户指定的应用程序读缓冲区的大小。
因此,应用程序执行的读操作次数和TCP模块接收到的TCP报文段个数之间也没有固定的数量关系。

综上,发送端执行的写操作次数和接收端执行的读操作次数之间没有任何数量关系,这就是字节流的概念:应用程序对数据的发送和接收是没有边界限制的。
UDP则不然。发送端应用程序每执行一次写操作,UDP模块就将其封装成一个UDP数据报并发送之。接收端必须及时针对每一个UDP数据报执行读操作(通过recvfrom系统调用),否则就会丢包(这经常发生在较慢的服务器上)。并且,如果用户没有指定足够的应用程序缓冲区来读取UDP数据,则UDP数据将被截断。

原创粉丝点击