TCP报头结构

传输层定义了主机应用程序之间端到端的连通性。传输层中最常见的两个协议分别是传输控制协TCP(Transmission Control Protocol)和用户数据包协议UDP(User

Datagram Protocol)。

TCP位于TCP/IP模型的传输层,它是一种面向连接的端到端协议。TCP作为传输控制协议,可以为主机提供可靠的数据传输。两台主机在通信之前,需要TCP在它们之间建立可靠的传输通道。

TCP允许一个主机同时运行多个应用进程。每台主机可以拥有多个应用端口,每对端口号、源和目标IP地址的组合唯一地标识了一个会话。端口分为知名端口和动态端口。有些网络服务会使用固定的端口,这类端口称为知名端口,端口号范围为0-1023。如FTP、

HTTP、Telnet、SNMP服务均使用知名端口。动态端口号范围从1024到65535,这些端口号一般不固定分配给某个服务,也就是说许多服务都可以使用这些端口。只要运行的程序向系统提出访问网络的申请,那么系统就可以从这些端口号中分配一个供该程序使用。

TCP通常使用IP作为网络层协议,这时TCP数据段被封装在IP数据包内。TCP数据段由

TCP Header(头部)和TCP Data(数据)组成。TCP最多可以有60个字节的头部,如果没有Options字段,正常的长度是20字节。

16位源端口号:源主机的应用程序使用的端口号。

16位目的端口号:目的主机的应用程序使用的端口号。

每个TCP头部都包含源和目的端的端口号,这两个值加上IP头部中的源IP地址和目的IP 地址可以唯一确定一个TCP连接。

32位序列号:用于标识从发送端发出的不同的TCP数据段的序号。数据段在网络中传输时,它们的顺序可能会发生变化;接收端依据此序列号,便可按照正确的顺序重组数据。

32位确认序列号:用于标识接收端确认收到的数据段。确认序列号为成功收到的数据序列号加1。

4位头部长度:表示头部占32bit字的数目,它能表达的TCP头部最大长度为60字节。

16位窗口大小:表示接收端期望通过单次确认而收到的数据的大小。由于该字段为16 位,所以窗口大小的最大值为65535字节,该机制通常用来进行流量控制。

16位校验和:校验整个TCP报文段,包括TCP头部和TCP数据。该值由发送端计算和记录并由接收端进行验证。

TCP的可靠传输体现在TCP使用了确认技术来确保目的设备收到了从源设备发来的数据,并且是准确无误的。

确认技术的工作原理如下:

目的设备接收到源设备发送的数据段时,会向源端发送确认报文,源设备收到确认报文后,继续发送数据段,如此重复。如图所示,主机A向服务器A发送TCP数据段,为描述方便假定每个数据段的长度都是500个字节。当服务器A成功收到序列号是M+1499的字节以及之前的所有字节时,会以序列号M+1499+1=M+1500进行确认。另外,由于数据段

N+3传输失败,所以服务器A未能收到序列号为M+1500的字节,因此服务器A还会再次以序列号M+1500进行确认。

TCP滑动窗口技术通过动态改变窗口大小来实现对端到端设备之间的数据传输进行流量控制。

如图所示,主机A和服务器A之间通过滑动窗口来实现流量控制。为方便理解,此例中只考虑主机A发送数据给服务器A时,服务器A通过滑动窗口进行流量控制。主机A向服务器发送4个长度为1024字节的数据段,其中主机的窗口大小为4096个字节。服务器A收到第3 个数据段后,缓存区满,第4个数据段被丢弃。服务器以ACK 3073响应,窗口大小调整为 3072,表明服务器的缓冲区只能处理3072个字节的数据段。于是主机A改变其发送速率,发送窗口大小为3072的数据段。

TCP中有四种计时器(Timer),分别为:

1、 重传计时器:Retransmission Timer

2、 坚持计时器:Persistent Timer

3、 保活计时器:Keeplive Timer

4、 时间等待计时器:Timer_Wait Timer

1、 重传计时器

  TCP是保证数据可靠传输的?带确认的重传机制。在滑动窗口协议中,接受窗口会在连续收到的包序列中的最后一个包向发送端发送一个ACK,当网络拥堵的时候,发送端的数据包和接收端的ACK包都有可能丢失。TCP为了保证数据可靠传输,就规定在重传的“时间片”到了以后,如果还没有收到对方的ACK,就重发此包,以避免陷入无限等待中。当TCP 发送报文段时,就创建该特定报文的重传计时器。可能发生两种情况:

  若在计时器截止时间到之前收到了对此特定报文段的确认,则撤销此计时器。

  若在收到了对此特定报文段的确认之前计时器截止时间到,则重传此报文段,并将计时器复位。

2、 坚持计时器

  先来考虑一下情景:发送端向接收端发送数据包,直到接受窗口填满了,然后接受窗口告诉发送方接受窗口填满了停止发送数据。此时的状态称为“零窗口”状态,发送端和接收端窗口大小均为0,直到接受方发送一个窗口非0的确认消息。但这个确认会丢失。我们知道TCP中,对确认是不需要发送确认的。若确认丢失了,接受TCP并不知道,而是会认为它已经完成了任务,并等待着发送TCP接着会发送更多的报文段。但发送TCP由于没有收到确认,就等待对方发送确认来通知窗口大小。双方的TCP都在永远的等待着对方。

  要打开这种死锁,TCP为每一个链接使用一个坚持计时器。当发送TCP收到窗口大小为 0的确认时,就坚持启动计时器。当坚持计时器期限到时,发送TCP就发送一个特殊的报文段,叫做探测报文。这个报文段只有一个字节的数据。他有一个序号,但他的序号永远不需要确认;甚至在计算机对其他部分的数据的确认时该序号也被忽略。探测报文段提醒接受

TCP:确认已丢失,必须重传。

  坚持计时器的值设置为重传时间的数值。但是,若没有收到从接收端来的响应,则需发送另一个探测报文段,并将坚持计时器的值加倍和复位。发送端继续发送探测报文段,将坚持计时器设定的值加倍和复位,直到这个值增大到门限值(通常是60秒)为止。在这以后,发送端每个60秒就发送一个探测报文,直到窗口重新打开。

3、 保活计时器

   保活计时器使用在某些实现中,用来防止在两个TCP之间的连接出现长时间的空闲。假定客户打开了到服务器的连接,传送了一些数据,然后就保持静默了。也许这个客户出故障了。在这种情况下,这个连接将永远的处理打开状态。

  要解决这种问题,在大多数的实现中都是使服务器设置保活计时器。每当服务器收到客户的信息,就将计时器复位。通常设置为两小时。若服务器过了两小时还没有收到客户的信息,他就发送探测报文段。若发送了10个探测报文段还没有响应,就假定客户除了故障,

因而就终止了该连接。这种连接的断开当然不会使用四次握手,而是直接硬性的中断和客户端的TCP连接。

4、 时间等待计时器  时间等待及时器用于TCP“四次挥手”阶段。当客户端向服务器发送最后一次确认报文时,就设定一个时间等待及器,等待2MSL时间后再结束连接。 MSL:最长报文段寿命,大小为30s~2分钟。根据不同的应用有不同的设置。

TCP三次握手和四次断开

TCP有6个控制位:

URG(urgent紧急):此标志表示TCP包的紧急指针域(后面马上就要说到)有效,用来保证TCP连接不被中断,并且督促中间层设备要尽快处理这些数据;

ACK(acknowledgement 确认) :此标志表示应答域有效,就是说前面所说的TCP应答号将会包含在TCP数据包中;有两个取值:0和1,为1的时候表示应答域有效,反之为

0;

PSH(push传送) :这个标志位表示Push操作。所谓Push操作就是指在数据包到达接收端以后,立即传送给应用程序,而不是在缓冲区中排队;

RST(reset重置) :这个标志表示连接复位请求。用来复位那些产生错误的连接,也被用来拒绝错误和非法的数据包;

SYN(synchronous建立联机) :表示同步序号,用来建立连接。SYN标志位和ACK标

志位搭配使用,当连接请求的时候,SYN=1,ACK=0;连接被相应的时候,SYN=1,

ACK=1;

FIN(finish结束) :表示发送端已经达到数据末尾,也就是说双方的数据传送完成,没有数据可以传送了,发送FIN标志位的TCP数据包后,连接将被断开。

TCP在传输数据前,需要先建立连接,这个过程为3次握手过程:

TCP是一种可靠的,面向连接的全双工传输层协议。 TCP连接的建立是一个三次握手的过程。如图所示:

1.     主机A(通常也称为客户端)发送一个标识了SYN的数据段,表示期望与服务器A建立连接,此数据段的序列号(seq)为a。

2.     服务器A回复标识了SYN+ACK的数据段,此数据段的序列号(seq)为b,确认序列号为主机A的序列号加1(a+1),以此作为对主机A的SYN报文的确认。

3.     主机A发送一个标识了ACK的数据段,此数据段的序列号(seq)为a+1,确认序列号为服务器A的序列号加1(b+1),以此作为对服务器A的SYN报文的确认。

TCP支持全双工模式传输数据,这意味着同一时刻两个方向都可以进行数据的传输。在传输数据之前,TCP通过三次握手建立的实际上是两个方向的连接,因此在传输完毕后,两个方向的连接必须都关闭。TCP连接的建立是一个三次握手的过程,而TCP连接的终止则要经过四次握手。

如图所示:

1.  主机A想终止连接,于是发送一个标识了FIN,ACK的数据段,序列号为a,确认序列号为b。

2.  服务器A回应一个标识了ACK的数据段,序列号为b,确认序号为a+1,作为对主机A的

FIN报文的确认。

3.  服务器A想终止连接,于是向主机A发送一个标识了FIN,ACK的数据段,序列号为b,确认序列号为a+1。

4.  主机A回应一个标识了ACK的数据段,序列号为a+1,确认序号为b+1,作为对服务器A的FIN报文的确认。

以上四次交互便完成了两个方向连接的关闭。

UDP报头结构

当应用程序对传输的可靠性要求不高,但是对传输速度和延迟要求较高时,可以用

UDP协议来替代TCP协议在传输层控制数据的转发。UDP将数据从源端发送到目的端时,无需事先建立连接。UDP采用了简单、易操作的机制在应用程序间传输数据,没有使用TCP 中的确认技术或滑动窗口机制,因此UDP不能保证数据传输的可靠性,也无法避免接收到重复数据的情况。

UDP是一种无面向连接的传输层协议,不能保证传输可靠性。

UDP报文分为UDP报文头和UDP数据区域两部分。报头由源端口、目的端口、报文长度以及校验和组成。UDP适合于实时数据传输,如语音和视频通信。相比于TCP,UDP的传输效率更高、开销更小,但是无法保障数据传输的可靠性。UDP头部的标识如下:

1.   16位源端口号:源主机的应用程序使用的端口号。

2.   16位目的端口号:目的主机的应用程序使用的端口号。

3.   16位UDP长度:是指UDP头部和UDP数据的字节长度。因为UDP头部长度为8字节,所以该字段的 小值为8。

4.   16位UDP校验和:该字段提供了与TCP校验字段同样的功能;该字段是可选的。

主机A发送数据包时,这些数据包是以有序的方式发送到网络中的,每个数据包独立地在网络中被发送,所以不同的数据包可能会通过不同的网络路径到达主机B。这样的情况下,先发送的数据包不一定先到达主机B。因为UDP数据包没有序号,主机B将无法通过 UDP协议将数据包按照原来的顺序重新组合,所以此时需要应用程序提供报文的到达确认、排序和流量控制等功能。通常情况下,UDP采用实时传输机制和时间戳来传输语音和视频数据。

UDP不提供重传机制,占用资源少,处理效率高。

UDP适合传输对时延敏感的流量,如语音和视频。在使用TCP协议传输数据时,如果一个数据段丢失或者接收端对某个数据段没有确认,发送端会重新发送该数据段。TCP重新发送数据会带来传输延迟和重复数据,降低了用户的体验。对于时延敏感的应用,少量的数据丢失一般可以被忽略,这时使用UDP传输将能够提升用户的体验。