图解 TCP/IP 第六章 TCP与UDP 笔记6.1 传输层的作用
传输层必须指出这个具体的程序,为了实现这一功能,使用端口号这样一种识别码。根据端口号,就可以识别在传输层上一层的应用程序所有进行处理的具体程序。
6.1.1 传输层定义
6.1.2 通信处理
6.1.3 两种传输层协议 TCP和UDP
TCP 是面向连接的、可靠的流协议。流就是指不间断的数据结构,你可以把它想象成排水管道中的水流。
UDP 是不具有可靠性的数据包协议 。细微的处理会交给上层的应用去完成。在UDP 的情况下,虽然可以确保发送消息的大小,却不能保证消息一定会到达。
6.1.4 TCP与UDP 区分
TCP 用于在传输层有必要实现可靠性传输的情况。由于它是面向有连接并具备顺序控制、重发控制等机制的,所以它可以为应用提供可靠传输。
UDP主要用于那些对高速传输和实时性有较高要求的通信或广播通信。IP电话,如果使用TCP,如果数据丢失会被重发,但这样无法流畅的传输通话人的声音,会导致无法进行整长交流。而采用UDP ,它不会进行重发处理。从而也就不会有声音大幅度延迟到达的问题。
应用在使用TCP或UDP时,会用到操作系统提供的类库。
使用TCP或UDP 通信时,又会广泛使用到套接字(socket)的API。
6.2 端口号
6.2.1 端口号定义
6.2.2 根据端口号识别应用
6.2.3 通过IP地址、端口号、协议号进行通信识别
6.2.4 端口号如何确定
6.2.5 端口号与协议
端口号 由其使用的传输层协议决定。因此,不同的传输层协议可以使用相同的端口号。例如,TCP与UDP使用同一个端口号,但是使用目的各不相同。这是因为端口号上的处理是根据每个传输协议不同而进行的。
6.3 UDP
6.4 TCP
6.4.1 TCP的特点及其目的
TCP通过检验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输
6.4.2 通过序列号与确认应答提高可靠性
在TCP中,当发送端的数据到达接受主机时,接收端主机会返回一个已收到消息的通知。这个消息叫做确认应答(ACK)。
6.4.3 重发超时如何确定
6.4.4 连接管理
可以使用TCP首部用于控制的字段来管理TCP连接。一个连接的建立与断开,正常过程至少需要来回发送7个包才能完成。
6.4.5 TCP以段为单位发送数据
在建立TCP连接的同时,也可以确定发送数据包的单位,也可以称为最大消息长度(MSS :Maximum Segment Size)。
MSS 是在三次握手的时候,在两端主机之间被计算得出。两端的主机在发出建立连接的请求时,会在TCP首部中写入MSS选项,告诉对方自己的接口能够适应的MSS大小。然后会在两者之间选择一个较小的值投入使用。
6.4.6 利用窗口控制提高速度
TCP 以1个段为单位,每发一个段进行一次确认应答的处理。这样的传输方式有一个缺点。那就是,包的往返时间越长通信性能就越低。
为解决这个问题,TCP引入了窗口这个概念。即使在往返时间较长的情况下,它也能控制网络性能的下降。
确认应答不再是以每个分段,而是以更大的单位进行确认时,转发时间将会被大幅度的缩短。发送段主机在发送一个段以后不必要一直等待确认应答,而是继续发送。
窗口大小就是指无需等待确认应答而可以继续发送数据的最大值。
这个机制实现了使用大量的缓冲区,通过对多个段同时进行确认应答的功能。
从该窗口中能看到的数据因某种数据已在传输中丢失,所以发送段未收到确认应答,这种情况也需要重新发送。为此,发送端主机在等到确认应答返回之前,必须在缓冲区中保留这部分数据。
收到确认应答的情况下,将窗口滑动到确认应答中的序列号的位置。这样可以顺序的将多个段同时发送提高通信性能。这种机制也被称为滑动窗口控制。
6.4.7 窗口控制与重发控制
在使用窗口控制中,如果出现段丢失该怎么办?
首先考虑确认应答未能返回的情况。在这种情况下,数据已经到达对端,是不需要再进行重发的。然而在没有使用窗口控制的时候,没有收到确认应答的数据都会被重发。而使用了窗口控制,某些确认应答即便丢失也无需重发。
其次,考虑一下某个报文段丢失的情况。
6.4.8 流控制
发送端根据自己的实际情况发送数据。
TCP提供一种机制 可以让发送端根据接收端的实际接受能力控制发送的数据量。这就是所谓的流控制。
它的具体操作是,接收端主机向发送端主机通知自己可以接受数据的大小,于是发送端会发送不超过这个限度的数据。该大小限度就被称为窗口大小。
TCP首部中,专门有一个字段用来通知窗口大小。接受主机将自己可以接受的缓冲区大小放入这个字段中通知给发送端。这个字段的值越大,说明网络的吞吐量越高。
不过接收端的这个缓冲区一旦面临数据溢出,窗口大小的值也会随之被设置为一个更小的值通知给发送端,从而控制数据发送量。也就是说,发送端会根据接收端主机的指示,对发送数据的量进行控制。这也就形成了完整的TCP控制流。(流量控制)。
6.4.9 拥塞控制
有了TCP 的窗口控制,收发主机之间即使不再以一个数据段为单位发送确认应答,也能够连续发送大量数据包。然而,如果在通信刚开始就发送大量数据,也可能会引发其他问题。
一般来说,计算机网络都处在一个共享环境当中,如果有其他主机之间的通信使得网络拥塞,在出现网络拥堵时,如果突然发送一个较大量的数据,有可能使得网络瘫痪。
TCP为了防止该问题,在通信一开始就会通过一个叫做慢启动 的算法得出的数值,对发送数据量进行控制。
首先,为了在发送端调节所要发送数据的两,定义一个叫做拥塞窗口的概念。于是在慢启动 的时候,将这个拥塞窗口的大小设置为1个数据段发送数据,之后每收到一次确认应答ACK,拥塞窗口的值就加1.在发送数据包时,将拥塞窗口的大小与接收端主机通知的窗口大小比较,按照他们当中比较小的值,发送比其还小的数据量。
不过,随着包的每次往返,拥塞窗口也会以1、2、4 等指数函数的增粘,拥堵状况激增甚至导致网络拥塞的发生。为了防止这些,引入了慢启动阀值的概念。只要拥塞窗口的值超过了这个阀值,在每收到一次确认应答时,只允许以下面的这种比例放大拥塞窗口:
TCP的通信开始时,并没有设置相应的慢启动阀值。而是在超时重发时,才会设置为当时拥塞窗口的一半。
6.4.10 提高网络利用率的规范
Nagle 算法
TCP为了提高网络的利用率,经常使用一个叫做Nagle的算法。
该算法是指发送端即使还有应该发送的数据,但如果这部分数据很少的话,则进行延迟发送的一种处理机制。 具体来说,就是仅仅在下列条件之一才能发送数据。如果两个条件都不满足,那么暂时等待一段时间以后再进行数据发送。
已发送的数据都已经收到确认应答。
可以发送最大段长度MSS的数据时。
根据这个算法虽然网络利用率可以提高,但是可能会发生某种程度的延迟。为此,在窗口系统以及机械控制等领域中使用TCP时,往往会关闭对该算法的启用。
延迟确认应答
当某个接收端收到这个小窗口的通知后,会以他为上限发送数据,从而又降低了网路的利用率。为此,引入了一个方法,那就是收到数据以后并不立即返回确认应答,而是延迟一段时间的机制。
TCP文件传输中,绝大多数是每个数据返回一次确认应答。
捎带应答
根据应用层协议,发送出去的消息到达对端,对端进行处理以后,会返回一个回执。
这些应用协议使用同一个连接进行数据交换。即使是使用WWW的HTTP协议,从1.1 版本以后也是如此。
在此类通信当中,TCP的确认应答和回执数据可以通过一个包发送。这种方式叫做捎带应答。通过这种机制,可以使收发数据量减少。
6.4.11 使用TCP的应用
TCP使用各种各样的控制机制。甚至会使用本书中未提及的其他更为复杂的控制机制。TCP采用这些机制可以提供高速、可靠的通信服务。
如果需要应用自己处理一些更为细节的控制,使用UDP协议是不错的选择。如果转发量较多、对可靠性的要求比价高时,可以选择使用TCP。TCP和UDP两者各有长短,在设计和开发应用时,应准确掌握他们各自协议的特点酌情选择 。
6.6 UDP首部的格式
6.7 TCP首部格式
控制位 :
CWR:congestion window reduced
CWR 标志与后面的ECE标志都用于IP首部的ECN字段。ECE标志位1时,则通知对方已经将拥塞窗口缩小。
ECE ECN -Echo
ECE 标志 表示ECN-echo。置1会通知通信对方,从对方到达这边的网络有拥塞。在收到数据包的IP首部中ECN为1时将TCP首部中的ECE设置为1.
URG urgent flag
表示包中有需要紧急处理的数据。对于需要紧急处理的数据,会在后面的紧急指针中再进行解释。
ACK acknowledgement flag
该位为1时,确认应答的字段变为有效。TCP规定除了最初建立连接时的SYN包之外,该位必须置为1.
PSH push flag
该位为1时,表示需要将收到的数据立刻传给上层应用协议。PSH为0时,则不需要立即传而是先进行缓存。
RST reset flag
该位为1时表示TCP连接中出现异常必须强制断开连接。
SYN synchronize flag
用于建立连接。SYN 为1表示希望建立连接,并在其序列号的字段进行序列号初始值的设定。
FIN fin flag
该位为1时,表示今后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换FIn位置为1的TCP段。
窗口大小window size