TCP/IP 6 TCP与UDP

传输层两个主要协议TCP(transmission control protocol)和UDP(user datagrame protocol)。

6.1 传输层的作用

TCP/IP中有两个具有代表性的传输层协议:TCP和UDP。TCP提供可靠的通信传输,而UDP则常被用于让广播和细节控制交给应用的通信传输。

6.1.1 传输层定义

IP首部中有一个字段,用来标识网络层(IP)的上一层所采用的是哪一种传输层协议。据此可以识别IP传输的数据是TCP还是UDP。

传输层的TCP和UDP,为了识别自己所传输的数据部分究竟应该发给哪个应用,也设定了端口号port。

6.1.2 通信处理

通过端口号识别应用程序,传输协议的数据将被传递给HTTP、TELNET以及FTP等应用层协议。

6.1.3 两种传输层协议TCP和UDP

1)TCP

TCP是面向连接的、可靠的流协议。流是指不间断的数据结构。当应用程序采用TCP发送消息时,虽然可以保证发送的顺序,但还是犹如没有任何间隔的数据流发送给接收端。

TCP为提供可靠性传输,实行“顺序控制”或“重发控制”机制。此外还具备“流控制(流量控制)”、“拥塞控制”、提高网络利用率等总多功能。

2)UDP

UDP是不具有可靠性的数据报协议。细微的处理它会交给上层的应用去完成。在UDP的情况下,虽然可以确保发送消息的大小,却不能保证消息一定会到达。因此,应用有时会根据自己的需要进行重发处理。

6.1.4 TCP与UDP区分

TCP用于在传输层有必要实现可靠传输的情况。由于它是面向有连接并具备顺序控制、重发控制等机制的,所以它可以为应用提供可靠传输。

UDP主要用于那些对高速传输和实时性有较高要求的通信或广播通信。

RIP、DHCP等基于广播的协议也要依赖于UDP

6.2 端口号

6.2.1 端口号定义

数据链路和IP中的地址,分别指的是MAC地址和IP地址。前者用来识别同一链路中不同的计算机,后者用来识别TCP/IP网络中互联的主机和路由器。在传输层也有类似的概念,那就是端口号。端口号用来识别同一台计算机中进行通信的不同应用程序。也被称为程序地址。

6.2.2 根据端口号识别应用

6.2.3 通过IP地址、端口号、协议号进行通信识别

仅凭目标端口识别某一个通信是远远不够的。

TCP/IP或UDP/IP通信中通常采用5个信息来识别一个通信:源IP地址、目标IP地址、协议号、源端口号、目标端口号。全相等时才是同一个通信。

6.2.4 端口号如何确定

1)标准既定的端口号

也叫静态方法。是指每个应用程序都有其指定的端口号。但不是说可以随意使用任何一个端口号。每个端口号都有其对应的使用目的。

如HTTP、TELNET、FTP等广为使用的应用协议中所使用的端口号就是固定的。这些端口号被称为知名端口号。应用程序应该避免使用知名端口号以免通信冲突。

知名端口号:1~1023

还有一些端口号也被正式注册:1024~49151

2)时序分配法

动态分配法。服务端有必要确定监听端口号,但是接受服务的客户端没必要确定端口号。

客户端应用程序可以完全不用自己设置端口号,而全权交给操作系统进行分配。操作系统可以为每个应用程序分配互不冲突的端口号。

49152~65535

6.2.5 端口号与协议

6.3 UDP

用户数据报协议

不提供复杂的控制机制,利用IP提供面向无连接的通信服务。它是将应用程序发来的数据在收到的那一刻,立即按照原样发送到网络上的一种机制。

无网络的拥塞控制。传输途中即使丢包,UDP也不会重发。甚至当出现包的到达顺序乱掉时也没有纠正的功能。

面向无连接,可以随时发送数据。

UDP适用于:

1)包总量较少的通信(DNS、SNMP等)

2)视频、音频等多媒体通信(即时通信)

3)限定于LAN等特定网络中的应用通信

4)广播通信(广播、多播)

6.4 TCP

对传输、发送、通信都进行控制。

丢包超时时重传,对次序乱掉的分包进行顺序控制,面向连接,控制流量,拥塞控制。

可靠性。

6.4.1 TCP的特点及其目的

TCP通过检验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输。

6.4.2 通过序列号与确认应答提高可靠性

在TCP中,当发送端的数据到达接收主机时,接收端主机会返回一个已收到消息的通知。这个消息叫做确认应答(ACK)。

TCP通过肯定的确认应答ACK实现可靠的数据传输。

在一定时间内没有等到确认应答,发送端就可以认为数据已经丢失,并进行重发。由此,即使产生了丢包,仍然能够保证数据能够到达对端,实现可靠传输。

此外,有可能因为一些原因导致确认应答延迟到达,在源主机重发数据后才到达的情况。此时需要一种机制,它能够识别是否已经接收数据,又能够判断是否需要接收。

上述这些确认应答处理、重发控制以及重复控制等功能都可以通过序列号实现。序列号是按顺序给发送数据的每一个字节(8位)都标上号码的编号。接收端查询接收数据TCP首部中的序列号和数据的长度,将自己下一步应该接收的序号作为确认应答返送回去。

6.4.3 重发超时如何确定

重发超时是指在重发数据之前,等待确认应答到来的那个特定时间间隔。如果超过了这个时间仍未收到确认应答,发送端将进行数据重发。

这个重发超时的具体时间长度如何确定?找到一个最小时间,他能保证“确认应答一定能在这个时间内返回”。然而这个时间长短随着数据包途径的网络环境的不同而有所变化。

TCP要求不论处在何种网络环境下都要提供高性能通信,并且无论网络拥堵情况发生何种变化,都必须保持这一特性。为此,它在每次发包时都会计算往返时间及其偏差。将这个往返时间和偏差相加重发超时的时间,就是比这个总和要稍大一点的值。

数据被重发之后若还是收不到确认应答,则进行再次发送。此时,等待确认应答的时间将会以2倍、4倍的指数函数延长。

此外,数据也不会被无限、反复地重发。达到一定重发次数之后,如果仍没有确认应答返回,就会判断为网络或对端主机发生了异常,强制关闭连接,并通知应用通信异常强行终止。

6.4.4 连接管理

三次握手、四次挥手

6.4.5 TCP以段为单位发送数据

在建立TCP连接的同时,也可以确定发送数据包的单位,我们也可以称其为“最大消息长度”MSS。最理想的情况是,最大消息长度正好是IP中不会被分片处理的最大数据长度。

TCP在传送大量数据时,是以MSS的大小将数据进行分割发送。进行重发时也是以MSS为单位。

MSS是在3次握手的时候,在两端主机之间被计算得出。两端主机在发出建立连接的请求时,会在TCP首部中写入MSS选项,告诉对方自己的接口能够适应的MSS的大小。然后选择两者之间的较小值。

6.4.6 利用窗口控制提高速度

TCP以1个段为单位,每发一个段进行一次确认应答的处理。包的往返时间越长通信性能就越低。

为了解决这个问题,TCP引入了窗口这个概念。即使在往返时间较长的情况下,它也能控制网络性能的下降。确认应答不再是以每个分段,而是以更大的单位进行确认,转发时间将会被大幅度缩短。即发送端主机不需要在发送一个请求后,等到确认应答然后才继续发送。

这个机制实现使用了大量的缓冲区,通过对多个段同时进行确认应答的功能。

6.4.7 窗口控制与重发控制

在使用窗口控制中,如果出现段丢失该怎么办?

首先,先考虑确认应答未能返回的情况。这时数据到达了对端。如果该数据之后的某个包的确认应答到达了发送端,那么就判断此包之前所有包都正确地发送接受了。

其次,另一种数据包在发送过去的途中丢失。接收主机如果收到一个自己应该接收的序号以外的数据时,会针对当前为止按顺序收到的包进行确认应答。所以会出现重复应答的情况,重复次数超过一定值时,进行窗口的移动和重发操作。

6.4.8 流量控制

TCP提供一种机制可以让发送端根据接收端的实际接收能力控制发送的数据量,这就是流控制。

它的具体操作是,接收端主机向发送端主机通知自己可以接收的数据大小(TCP首部中的接收窗口),于是发送端会发送不超过这个限度的数据。该大小限度就被称作窗口大小。

TCP首部中的接收窗口字段,接收主机根据自己情况进行设置。这个值越大,说明网络的吞吐量越高。接收端窗口很小时也会通知发送端不要发送过多数据。

6.4.9 拥塞控制

慢启动、拥塞避免、快重传、快恢复

计算机网络都处在一个共享的环境。因此也有可能会因为其它主机之间的通信使得网络拥堵。在网络出现拥堵时,如果突然发送一个较大量的数据,极有可能会导致整个网络的瘫痪。

TCP为了防止该问题的出现,在通信一开始时就会通过一个叫做慢启动的算法得出的数值,对数据发送量进行控制。

首先,为了在发送端调节所要发送数据的量,定义了一个叫做“拥塞窗口”的概念。于是在慢启动时,将这个拥塞窗口的大小设置为1个数据段(1 MSS)发送数据,之后每收到一次确认应答(ACK),拥塞窗口的值就加1。在发送数据包时,将拥塞窗口的大小与接收端主机通知的窗口大小做比较,然后按照它们当中较小的那个值,发送比其还要小的数据量。

如果重发采用超时机制,那么拥塞窗口的初始值可以设置为1以后再进行慢启动修正。

随着包的每次往返,拥塞窗口也会以1、2、4等指数函数的增长,拥堵状况激增甚至导致网络拥塞的发生。为了防止这些,引入了慢启动阈值的概念。只要拥塞窗口的值超出了这个阈值,在每次收到一次确认应答时,只允许以下面这种比例放大拥塞窗口:一般加1。

拥塞窗口越大,确认应答的数目也会增加。不过随着每收到一个确认应答,其涨幅也会逐渐减少,甚至小过一个数据段还要小的字节数。因此,拥塞窗口的大小会呈直线上升的趋势。

TCP的通信开始时,并没有设置相应的慢启动阈值。而是在超时重发时,才会设置为当时拥塞窗口一半的大小。

由重复确认应答而触发的高速重发与超时重发机制的处理多少有些不同。因为前者要求至少3次的确认应答数据段到达对方主机后才会触发,相比后者网络的拥堵要轻一些。

而由重复确认应答进行高速重发控制时,慢启动阈值的大小被设置为当时窗口大小的一半。然后将窗口的大小设置为该慢启动阈值+3个数据段的大小。然后进入拥塞避免。

当TCP通信开始以后,网络吞吐量会逐渐上升,但是随着网络拥堵的发生吞吐量也会急速下降。于是会再次进入吞吐量慢慢上升的过程。

6.6 UDP首部的格式

--------------------------------------------

16位源端口号、16位目标端口号

16位包长度、16位校验和

数据部分

--------------------------------------------

源端口号:表示发送端端口号,字段长16位。可选项,有时不会设置源端口号,此时设置为0.用于不需要返回的通信中。

目标端口号:16位,接收端端口。

包长度:该字段保留UDP首部的长度跟数据的长度之和。单位为字节。

校验和:为提供可靠的UDP首部和数据而设计。在计算校验和时,将首部和数据填充为16的倍数位。将UDP首部的校验和字段设置为“0”。然后以16比特为单位进行1的补码和,并将所得到的1的补码和写入校验和字段。

接收主机在收到UDP数据报以后,从IP首部获知IP地址信息构造UDP伪首部,再进行校验和计算。接收端计算的16位和为全1。

UDP中也有可能不用校验和,此时校验和字段中填入0。

6.7 TCP首部格式

----------------------------------------------------------------

16位源端口号               |       16位目标端口号

32位序列号

32位确认应答号

数据偏移(4)   保留位   控制位(7)   窗口大小(16)

16位校验和                   |        16位紧急指针

选项        填充

数据部分

-------------------------------------------------------------------

1)源端口号:发送端端口号

2)目标端口号:接收端端口号

3)序列号:32位。序列号(有时也叫序号)是指发送数据的位置。每发送一次数据,就累加一次该数据字节数的大小。序列号不会从0或1开始,而是建立连接时由计算机生成的随机数作为其初始值,通过SYN包传给接收端主机。然后再将每转发过去的字节数累加到初始值上表示数据的位置。此外,在建立连接和断开连接时发送的SYN包和FIN包虽然并不携带数据,但是也会作为一个字节增加对应的序列号。

4)确认应答号:32位,是指下一次应该收到的数据的序列号。实际上,它是指已收到确认应答号减一为止的数据。发送端收到这个确认应答以后可以认为在这个序号以前的数据都已被正常接收。

5)数据偏移:

4位,表示TCP所传输的数据部分应该从TCP包的哪个位开始计算,也可以看作TCP首部的长度。

TCP首部长度无可选项时为20字节。

6)保留:4位,一般为0.

7)控制位:8位,CWR,ECE,URG,ACK,PSH,RST,SYN,FIN。这些控制标志也叫做控制位。

CWR:与ECE标志都用于IP首部的ECN字段。ECE标志为1时,则通知对方已将拥塞窗口缩小。

ECE:ECE标志表示ECN-Echo。置为1会通知通信对方,从对方到这边的网络有拥塞。在收到数据包的IP首部中ECN为1时将TCP首部中ECE设置为1.

URG:该位为1时,表示包中有需要紧急处理的数据。

ACK:该位为1时,确认应答的字段变为有效。TCP规定除了最初建立连接时的SYN包之外该位必须设置为1.

PSH:该位为1时表示需要将收到的数据立刻传给上层应用协议。PSH为0时,则不需要立即传而是先进行缓存。

RST:该位为1时表示TCP连接中出现异常必须强制断开连接。例如一个没有被使用的端口即使发来连接请求,也无法进行通信。此时就可以返回一个RST设置为1的包。

SYN:用于建立连接。SYN为1表示希望建立连接,并在其序列号的字段进行序列号初始值的设定。

FIN:该位为1时,表示今后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换FIN位置为1的TCP段。每个主机又对对方的FIN包进行确认应答以后就可以断开连接。不过,主机收到FIN设置为1的TCP段以后不必马上回复一个FIN包,而是可以等到缓冲区中的所有数据都已成功发送而被自动删除之后再发。

8)窗口大小:16位。用于通知从相同TCP首部的确认应答号所指位置开始能够接受的数据大小(单位字节)。TCP不允许发送超过此处所示大小的数据。不过,如果窗口为0,则表示可以发送窗口探测,已了解最新的窗口大小。但这个数据必须是1个字节。

9)校验和:TCP的校验和与UDP类似,区别在于TCP的校验和无法关闭。TCP校验和也是校验TCP首部和数据。

10)紧急指针:16位。只有在URG控制位为1时有效。该字段的数值表示本报文段中紧急数据的指针。从数据部分的首位到紧急指针所指示的位置为止为紧急数据。因此也可以说紧急指针指出了紧急数据的末尾在报文段中的位置。

11)选项:该字段用于提高TCP的传输性能。因为根据数据便宜(首部长度)进行控制,所以选项段长度最大为40字节。

原文地址:https://www.cnblogs.com/cjj-ggboy/p/12483411.html