Fork me on GitHub

传输层协议:UDP与TCP(一)

协议 特点 应用
UDP 无连接,给应用提供发送数据包功能并允许它们在所需的层次之上架构自己的协议 客户-服务器交互和多媒体应用
TCP 面向连接,建立连接并通过重传机制增加了可靠性,同时还进行流量控制和拥塞控制,为使用它的应用程序做了所有的一切 为大多数Internet应用提供可靠的、按序递交的传输

TCP是为数据的可靠传输而设计的。如果数据在传输中丢失或损坏,TCP会保证再次发送数据。如果数据包乱序到达,TCP会将其置回正确的顺序。对于连接来说,如果数据到来的速度太快,TCP会降低速度,以免数据报丢失。程序永远不需要担心接收到乱序或不正确的数据。不过,这种可靠性是有代价的。这个代价就是速度。建立和撤销TCP连接会花费相当长的时间。UDP是在IP之上发送数据的另一种传输层协议,速度很快,但不可靠。当发送UDP数据时,无法知道数据是否会到达,也不知道数据的各个部分是否会以发送时的顺序到达。不过,确实能到达的部分一般都会很快到达。可以用电话系统和邮局的关系来对照解释TCP与UDP的区别。

UDP

UDP(用户数据包协议)为应用程序提供了一种无需建立连接就可发送封装的IP数据包的方法。

UDP的段

UDP传输的段由8字节的头和有效载荷字段构成。头信息中包含的两个端口(port)分别用来标识源机器和目标机器内部的端点。当一个UDP数据包到来时,它的有效载荷被递交给与目标端口相关联的哪个进程。采用UDP而不是原始IP的最主要价值在于增加了源端口和目标端口。

UDP段中还包含了一个可选的校验和来提供额外的可靠性,当不使用校验和时,则将该字段填为0。

功能总结

UDP只是提供了一个与IP协议的接口,并在此接口上通过端口号复用多个进程的功能,以及可选的端到端错误检测功能。

应用领域
客户机-服务器开发

客户端向服务器发送一个简短的请求报文,并期待来自服务器的简短服务报文。如果请求或回复报文丢失,客户端就会超时,然后再试一次。

同时,这也是RPC(远程过程调用)的基础

域名系统

一个程序需要查询某个主机名的IP地址,那么它可以给DNS服务器发送一个包含该主机名的UDP数据包。服务器用一个包含了该主机IP地址的UDP数据包作为应答。实现不需要建立连接,事后也不需要释放连接。只有两条消息通过网络就够了。

多媒体

RTP(实时传输协议)与RTCP(实时传输控制协议)都是位于UDP之上的协议,广泛应用于多媒体应用程序。

TCP

TCP(传输控制协议)是为了在不可靠的互联网上提供端到端字节流而专门设计的一个传输协议。

TCP段

TCP段由一个固定大小的20字节的头以及随后0个或者多个数据字节构成。TCP软件决定了段的大小。它可以将多次写操作中的数据累计起来,放到一个段中发送。有两个因素限制了段的长度。首先,包括TCP头在内的每个段,必须适合IP的65515个字节有效载荷;其次,每个网络都有一个最大传输单元(MTU)。发送端和接收端的每个段必须适合MTU,才能以单个不分段的数据包发送和接收。然而,当IP数据包穿过一条网络路径,其上某条链路有更小的MTU时,还是有可能要对携带TCP段的该IP数据包实行分段操作。TCP实体使用的基本协议是具有动态窗口大小的滑动窗口协议。当发送端传送一段时,它启动一个计时器。当该端到达接收方时,接收端的TCP实体返回一个携带确认号和剩余窗口大小的段,并且确认号的指等于接收端期望接收的下一个序号。如果发送端的计时器在确认段到达之前超时,则发送端再次发送原来的段。

TCP段的头

TCP段的结构如图所示。每个段的起始部分是一个固定格式的20字节头。固定的头部之后可能有头的选项。如果该数据段有数据部分的话,那么在选项之后是最多可达65535 - 20 -20 = 65495个字节的数据,这里的第一个20是指IP头,第二个20指TCP头。没有任何数据的TCP段也是合法的,通常被用作确认和控制消息。

捕获.PNG

  • 源端口(Source port)和目标端口(Destination port)字段标识了连接的本地端点。TCP端口加上所在主机的IP地址组成了48位的唯一端点。

  • 序号(Sequence number)和确认号(Acknowledgement number)字段执行它们的常规功能。请注意,后者指定的是下一个期待的字节,而不是已经正确接收到的最后一个字节。它是累计确认(cumulative acknowledgement),因为它用一个数字概括了接收到的所有数据,它不会超过丢失的数据。这两个字段都是32位长,因为一个TCP流中的每一个数据字节都已经被编号了。

  • TCP头长度(TCP header length)字段指明了TCP头包含多少个32位的字。这个信息是必需的,因为选项(Options)字段是可变长的,因而整个头也是边长的,这个字段实际上指明了数据部分在段内的起始位置。

TCP头长度字段之后为4位没有被使用的字段,用来备用(可用这些位来修正原来设计中的错误),原先有6位

  • 8个1比特的标志位
  1. CWR和ECE:用作拥塞控制的信号。当TCP接收端收到了来自网络的拥塞指示后,就设置ECE以便给TCP发送端发ECN-Echo信号,告诉发送端发慢发送速率。TCP发送端设置CWR,给TCP接收端发CWR信号,这样接收端就知道发送端已经放慢速率,不必再给发送端发ECN-Echo信号。

  2. ACK:ACK被设置为1表示确认号字段是有效的。几乎所有的数据包都会用到这个标志位。如果ACK为0,则该段不包含确认信息,所以,确认号字段可以被忽略。

  3. PSH:指出这是被推送的数据。特此请求接收端一旦收到数据后立即将数据递交给应用程序,而不是将它缓冲起来直到缓冲区满为止。

  4. RST:被用于突然重置一个已经变得混乱的连接,混乱有可能是由于主机崩溃,或者其他什么原因造成的。该标志位也可以用来拒收一个无效的段,或者拒绝一个连接请求。

  5. SYN:被用于建立连接过程。在连接请求中,SYN=1和ACK=0表示该段没有使用捎带确认字段。但是,连接应答捎带了一个确认,因此SYN=1和ACK=1.

  6. FIN被用来释放一个连接。它表示发送端已经没有数据需要传输了。然而,在关闭一个连接之后,关闭进程可能会在一段不确定的时间内继续接收数据。SYN和FIN段都有序号,从而保证了这两种段以正确的顺序被处理。

  • 窗口大小(Window size):TCP中的流量控制是通过一个可变大小的滑动窗口来处理的。窗口大小字段指定了从被确认的字节算起可以发送多少个字节。窗口大小字段为0是合法的,说明到现在为止已经接收到了多达确认号-1个字节,但是接收端没有更多的机会来消耗数据,希望别再发数据。以后,接收端可以通过发送一个具有同样确认号但是非零窗口大小字段的段来通知发送端继续发送端。

  • 校验和(Checksum)提供了额外的可靠性。它校验的范围包括头、数据,以及与UDP一样的概念性伪头。

  • 紧急指针(Urgent pointer):如果使用了紧急指针,则将URG设置为1。紧急指针指向从当前序号开始找到紧急数据的字节偏移量。这个设施是中断消息的另一种途径。该设施允许发送端以少得不能再少的方式给接收端发送信号。

  • 选项(Options):选项字段提供了一种添加额外设施的途径,主要针对常规头覆盖不到的方面。协议定义了许多选项,有几个已经被广泛使用。

1.用途最广的选项允许每台主机指定它愿意接收的最大段长(MSS,Maximum Segment Size)。2.窗口尺度选项允许发送端和接收端在连接建立阶段协商窗口尺度因子。3.时间戳选项携带由发送端发送的时间戳,并被接收端回应,一旦在连接建立阶段启用了它,那么每个数据包都要包含这个选项,主要用来计算来回时间样值,该样值被用在估算多久之后数据包可以被认为丢失。4.选择确认选项使得接收端可以告诉发送端已经接收到端的序号范围。

TCP连接管理模型

建立连接和释放连接所需要的步骤可以用一个有限状态机来表示,该状态机的11中状态如图所示。

状态 描述
CLOSED 没有活跃的连接或者挂起
LISTEN 服务器等待入境呼叫
SYN RCVD 到达一个连接请求,等待ACK
SYN SENT 应用以及启动了打开一个链接
ESTABLISHED 正常的数据传送状态
FIN WAIT1 应用已经没有数据要发了
FIN WAIT2 另一端同意释放连接
TIME WAIT 等待所有数据包寿终正寝
CLOSING 两端同时试图关闭连接
CLOSE WAIT 另一端已经发起关闭连接
LAST ACK 等待所有数据包寿终正寝

每个连接都从CLOSED状态开始。当它执行了一个被动打开操作(LISTEN),或者主动打开操作(CONNECT)后,它就离开CLOSED状态。如果另一端执行了相反的操作,则连接就建立起来,当前状态变成ESTABLISHED。连接的释放过程可以由任何一方发起。当释放完成时,状态又回到CLOSED。

状态是针对每个连接的,并且每个连接的状态被记录在响应的连接记录中。