TCP:传输控制协议

首先TCP和UDP都是使用相同的网络层IP,TCP向应用层提供与UDP完全不同的服务。

TCP是面向连接的,可靠的字节流服务。面向连接意味着两个使用TCP的程序进行通信时首先要进行三次握手连接;TCP的可靠性由他的 头部和多种方式实现。

 两个应用程序通过TCP连接交换8BIT字节 构成 的字节流。TCP不在字节流中插入记录标识符。我们将这称为流式服务。如果一方的应用程序先传10字节,又传20字节,再传30字节,连接的另一端无法了解发送方每次发送了多少字节。收方可以3次接收这60字节,也可以一次接收。

        在一个TCP连接中,仅有两方进行 彼此通信,广播和多播不能用于TCP。

       TCP可靠性由以下方式提供:

  • 应用数据报被分割成TCP认为最合适的数据块。由TCP传递给IP的信息称为报文段或段。
  • 当TCP发出一个段后,他启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
  • TCP将保持他首部和数据的检验和。这是一个端到端的检验和,目的是监测数据在传输过程中的任何变化,如果收到的检验和有差错,TCP将丢弃这个报文段和不确认收到次报文段(希望超时重传)。
  • TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将受到的数据以正确的顺序交给应用层。
  • 因为IP数据报会发生重复,TCP的接收端必须丢弃重复的数据。
  • TCP还能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收缓冲区所能接纳的数据。浙江防止较快主机致使较慢主机的缓冲区溢出。

   TCP:传输控制协议

                                           TCP头部

  1. 每个TCP段包含的源端口和目的端口,加上IP首部中的源IP和目的IP唯一确定一个TCP连接。一个IP地址和一个端口号也称为一个插口socket。
  2. 序号 用来标识从TCP发端向TCP收端发送的数据字节流,他表示在这个报文段中的第一个数据字节。如果将字节流看做在两个应用程序间的单向流动,则TCP用序号对每个字节进行计数。序号是32bit的无符号位,序号达2^32-1后从0开始。       
  3.   确认号包含发送确认的一端所期望收到的下一个序号。因此,确认号应当是上次已成功收到数据字节序号加1.只有ACK标志位为1时确认号字段才有效。
  4. 首部长度给出首部中32bit字的数目。需要这个值是因为任选字段的长度是可变的。这个字段占4bit,因此TCP最多有60字节的首部。然而吗,没有任选字段,正常的长度是20字节。
  5. 6个标志比特,他们中的多个可以同时被设置为1.          URG 紧急指针 ACK确认号有效  PSH 接收方应尽快将这个报文段交给应用层 RST 重建连接 SYN 同步序号,用来发起一个连接  FIN 发端完成发送任务。
  6. TCP的流量控制由连接的每一端通过声明的窗口大小来提供。窗口大小为字节数,起始于确认号字段指明的值,这个值是接收端正期望接收的字节。窗口大小是一个16bit字段,因而窗口大小最大为65535字节。
  7. 检验和覆盖了整个的TCP报文段:TCP首部和TCP数据。这是一个强制性的字段,一定是由发端计算和存储,并由收端进行验证。TCP检验和的计算和UDP检验和的计算相似。使用伪首部。
  8. 只有当URG标志置1 时紧急指针才有效。紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。

    

TCP的半关闭

TCP提供了连接的一端在结束它的发送后还能接收另一端数据的能力。这就是所谓的半关闭。为了使用这个特性,变成接口必须为应用程序提供 一种方式来说明“我们已经完成了数据传输,因此发送一个文件结束FIN给另一端,但我还想接收另一端发来的数据,直到他给我发来文件结束FIN”。(如果应用程序不调用close而调用shutdown,且第二个参数设置为1,则插口的API支持半关闭)

2MSL等待状态

 TIME_WAIT状态也称为2MSL等待状态。每个具体TCP实现必须选择一个报文段最大生存时间MSL。他是任何报文段被丢弃前在网络内的最长时间。我们知道这个时间是有限的,因为TCP报文段以IP数据报在网络内传输,而IP数据报则有限制其生存时间TTL字段。

复位报文段

 TCP首部中的RST比特是用于“复位”的。一般来说,无论何时一个报文段发往基准的连接出现错误,TCP都会发出一个复位报文段。

    到不存在的端口的请求

     当连接请求到达时,目的端口没有进程正在听。对于UDP,当一个数据报到达目的端口时,该端口没有在使用,它将产生一个ICMP端口不可达的信息。而TCP使用RST复位。

 异常终止一个连接

     终止一个连接的正常方式是一方发送FIN。有时也称为有序释放,因为在所有排队数据都已经发送后才发送FIN,正常情况下没有任何数据丢失。但是也有可能发送一个复位报文段而不是FIN来中途释放一个连接,有时称这为异常释放。

     异常终止一个连接对应用程序来说有两个优点:(1)丢弃任何待发数据并立即发送复位报文段;(2)RST的接收方会区分另一端执行的时异常关闭还是正常关闭。应用程序使用的API必须提*生异常关闭而不是正常关闭的手段。