此系列博客,图片文字观点均是来自《图解TCP/IP》,仅作为学习用途。
1、传输层的作用
TCP/IP中有两个具有代表性的传输协议,就是TCP和UDP,TCP提供可靠的通信传输,而UDP则常被用来让广播和细节控制交给应用的通信传输。
1.1 传输层定义
IP首部有一个字段用来表示网络层的上一层所采用的是哪一种传输协议,根据这个字段的协议号便可知道IP传输数据部分是TCP还是UDP。TCP/UDP也要设定一个编号,为了识别自己所传输的数据部分究竟应该交给那个应用。这个编号也就是端口号。
1.2 通信处理
TCP/IP中众多应用协议大多以客户端/服务端的形式运行。作为服务端的程序有必要提前启动,准备接收客户端的请求。这些服务端程序在UNIX系统中称为守护进程。例如HTTP的服务端程序是httpd(HTTP守护进程),ssh的服务端程序是sshd(SSH守护进程),在UNIX系统中并不需要将这些守护进程逐个启动,而是启动一个可以代表他们接收客户端请求的inetd(互联网守护进程)服务程序。它是一种超级守护进程,该超级守护进程接收到客户端请求会创建(fork)新的进程,并转换(exec)为sshd等各守护进程。
确认一个请求是发给哪个服务端可以通过所收到数据的目标端口号轻松识别。端口号22转给sshd,80转给httpd。
1.3 两种传输层协议TCP和UDP
*TCP
TCP是面向连接的、可靠的流协议。流是指不间断的数据结构。当应用程序采取TCP发送消息,虽然可以保证发送的顺序,但是数据流是没有任何间隔的,所以一般会设置表示长度或间隔的字段。TCP为提供可靠性传输,实行"顺序控制"、"重发机制"此外还具备"流控制"、"拥塞控制"提高网络利用率等众多功能。
*UDP
UDP是不具有可靠性的数据报协议,细微的处理会交给上层的应用去完成。在UDP情况下,虽然可以确保发送消息的大小,但是不能保证消息一定会到达。
1.4 TCP和UDP的区分
TCP用于在传输层有必要实现可靠传输的情况,由于它是面向有链接并具备顺序控制、重发控制等机制,所以它可以为应用提供可靠传输。
UDP主要用于那些高速传输和实时性有较高要求的通信或广播通信。假如IP电话采用TCP,数据传输过程中数据丢失被重发,这样就无法流畅的传输通话人的声音,导致无法正常交流。而采用UDP,它不会进行重发机制,从而不会有声音大幅度延迟到达的情况,即使有部分数据丢失也只会影响某一小部分的通话。
TCP/UDP根据应用的目的按需使用。
套接字:应用在使用TCP或UDP的时候会使用到操作系统提供的类库,这种类库一般称为API,使用TCP/UDP通信时,又会广泛使用到套接字(sockt)的API,应用程序利用套接字可以设置对端的IP地址,端口号、并实现数据的发送和接收。
2、端口号
2.1 端口号定义
和数据链路层的MAC地址、网络层IP地址相似,端口号是传输层中类似于地址的概念。MAC地址是为了识别同一链路中不同的计算机,IP地址是用来识别TCP/IP网络中互联的主机和路由器,端口号是用来是被计算机中进行通信的不同应用程序,也叫做程序地址。
2.2 根据端口号识别应用
计算机上可以同时运行多个应用程序,传输层协议利用端口号识别本机中正在进行通信的应用程序,并准确的将数据传输。
2.3 通过IP地址、端口号、协议号进行通信识别
TCP/IP或UDP/IP通信中常常采用5个信息来识别一个通信。分别是:源IP地址、目标IP地址、协议号(表示上层是TCP还是UDP)、源端口号、目标端口号。
2.4 端口号如何确定(2018.11.22)
两种方法确定端口号:
(1)标准既定的端口号
也叫做静态方法,指每个应用程序都有其指定的端口号,并不是说可以随意地使用任何一个端口号,每个端口号都有对应的使用目的。HTTP、TELNET、FTP等广为人知的应用协议所使用的端口号是固定的,这些端口号也被称为知名端口号。知名端口号一般从0到1024的数字分配,还有一些端口号也被注册,从1024到49151数字之间。但是这些端口号可以用于任何通信用途。
(2)时序分配法
时序分配法也叫动态分配法,此时服务端有必要监听端口号,客户端可以不确定端口号。这种方法下客户端应用程序不必自己设置端口号,而是交给操作系统处理,操作系统会为每一个应用程序分配互不冲突的端口号。这种机制下,即使是同一个客户端程序发起的多个TCP连接,识别这些通信连接的数字也不会全相同。动态分配端口号取值:49152-65535。
2.5 端口号与协议
端口号由传输层协议决定,因此不同的传输协议可以使用相同的端口号。TCP/UDP使用同一个端口号,但是使用目的不同。IP层会根据首部中的协议号传给相应协议的模块。知名端口号与传输层协议无关,端口号一致都分配同一种程序进行处理。
TCP知名端口号
3、UDP (用户数据报协议)
3.1 UDP的特点及目的
UDP不提供复杂的控制机制,利用IP提供面向无连接的通信服务,并且它是将应用程序发来的数据在收到的那一刻,立即按照原样发送到网络上的一种机制。
即使出现网络拥堵,UDP无法进行流量控制避免网络拥塞的行为,即使出现丢包,UDP也不负责重发,甚至包的顺序乱掉也没有纠正的功能。如果需要这些细节控制,就需要交给UDP的应用程序去处理。
UDP面向无连接可以随时发送数据,加上UDP本身处理既简单又高效,常用于以下几个方面:包总量较少的通信(DNS、SNMP)、视频音频等多媒体通信(即时通信)、限定于LAN等特定网络中的应用程序、广播通信。UDP可以理解为按照程序员编程思路在传送数据。
4、TCP(控制传输协议)
UDP是一种本身没有复杂控制面向无连接的一种协议也就是说它将部分控制转移给应用程序去处理。自己只提供基本功能。与UDP不同,TCP可以说是对传输、发送、通信进行控制的协议。
TCP可以实现对数据传输时各种控制功能,可以进行丢包时的重发机制,可以对次序乱掉的分包进行顺序控制。TCP作为一种面向有连接的协议,只有在确认通信对端存在时才发送数据。
连接是指各种设备、线路或网络中进行通信的两个应用程序为了相互传递消息而专有的、虚拟的通信线路也叫做虚拟线路。一旦建立了连接、进行通信的应用程序只使用这个虚拟的通信线路发送和接收数据,就可以保障信息的传输。应用程序可以不用考虑提供尽职服务的IP网络上可能发生的各种问题,依然可以转发数据。TCP则负责控制连接的建立、断开、保持等管理工作。
4.1 TCP的特点和目的
TCP通过校验和、序列号、确认应答、重发控制、连接管理以及串口控制等机制实现可靠性传输。
4.2 通过序列号与确认应答提高可靠性
TCP通过肯定的确认应答(ACK)实现可靠的数据传输,当发送端将数据发出去之后会等待对端的确认应答,如果有确认应答说明数据已经成功到达对端,反之则数据丢失的可能性很大。未收到确认应答并不意味着数据丢失,也有可能数据对方已经收到,只是返回的确认应答在途中丢失,也会导致发送端因没有收到确认应答,而认为数据没有到达目的地从而重新发送。对于目标主机而言,会放弃收到的重复的数据包,需要引入一种机制能够识别是否已经收到数据,又能判断是否需要接收。
上述的确认应答、重发控制以及重复控制等功能都可以通过序列号实现。序列号是按顺序给发送数据的每一个字节(8位字节)都标上号码的编号。接收端查询接收数据TCP首部中的序列号和数据的长度,将自己下一步应该接收的序号作为确认应答反送回去。这样通过序列号和确认应答号,TCP实现可靠传输。
4.3 重发超时如何确定
重发超时是指在重发数据前,等待确认应答到来的那个特定时间间隔。如果超过了这个时间仍然未收到确认应答,发送端将进行数据重发。TCP会在每次发包时计算往返时间及偏差,将这个往返时间和偏差相加,重发超时的时间就是比这个总和稍大的值。在Unix和windows中超时都以0.5s为单位控制。数据也不会无限、反复的发送,达到一定的重发次数之后如果还没有确认应答返回,就判断网络和对端主机发生异常,强制关闭连接,并通知应用通信异常强行终止。
4.4 连接管理(2018.11.23)
TCP提供面向有连接的通信传输。面向有连接是指在数据通信开始之前先做好通信两端之间的准备工作。
UDP是一种面向无连接的通信协议,不检查对端是否可以通信、直接将UDP包发送出去,TCP相反,会在数据通信前,通过TCP首部发送一个SYN包作为建立连接的请求等待应答。如果对端发来确认应答,则认为可以进行数据通信。如果对端的确认应答没有到达就不会进行数据通信。此外在通信结束会进行断开连接的处理(FIN包)。可以使用TCP的首部用于控制的字段来管理TCP连接,一个连接的建立和断开正常过程至少需要来回发送7个包才能完成。
4.5 TCP以段为单位发送数据
在建立TCP连接的同时,也可以确定数据包单位,称为最大消息长度MSS(Maximum Segment Size),理想情况是最大消息长度不会在IP层中被分片。TCP在传送最大数据时,是以MSS的大小将数据进行分割发送,进行重发时也是以MSS为单位。MSS是在三次握手的时候在两端主机之间计算出来,两端的主机在发送建立请求的时候会在TCP首部写入MSS的大小,然后会在两者之间选择一个较小的值投入使用。
4.6 利用窗口控制提高速度
TCP以1个段为单位,每发一个段进行一次确认应答的处理,如下图,这样包的往返时间越长通信性能也就越低。
因此TCP引入了窗口这个概念,即使在往返时间较长的情况下,也能控制网络性能的下降。如下图,确认应答不再是以每个分段,而是以更大单位进行确认,转发时间会被大幅度缩短,发送端主机发送一个段以后不必要一直等待确认应答,而是继续发送。
窗口大小就指无需等待确认应答而可以继续发送数据的最大值。这个机制使用了大量的缓冲区,通过对多个段同时进行确认应答的功能。如下图所示,窗口内的数据没有收到确认应答也可以发送出去,发送端主机在等到确认应答返回之前必须在缓冲区保留这部分数据。对于已经确认收到的数据可以从缓冲区清除。收到确认应答的情况下,将窗口滑动到确认应答中的序列号的位置上。
4.7 窗口控制和重发机制
首先考虑确认应答未能返回的情况,此时数据已经到达对端,是不需要重新发送的,在没有窗口控制的时候,没有收到确认应答的数据会重发,使用了窗口控制之后,某些确认应答丢失也无需重发。如下图:
其次考虑某段报文丢失的情况,接收端接收到序号以外的数据会针对当前为止收到的数据返回确认应答。(注意:即使接收到包序号不连续也不会丢弃而是将其保存在缓冲区。)
如下图,当某一段报文丢失后,发送端会一直收到序号为1001的确认应答,窗口比较大(也就是该窗口数据发送完之后才移动)又出现报文段丢失,所以发送端在这个窗口范围内会一直接收到同一个序号的确认应答,当发送端连续三次收到同一个确认应答会将所对应的数据重发。这种机制称为高速重发机制。
4.8 流控制
为了防止发送端数据量过大,超过接收端缓冲区大小,造成丢失数据之后又重发,TCP提供了一种机制可以让发送端根据接收端实际接受能力控制发送的数据量。也就是所谓的流控制。具体操作是,接收端主机向发送端主机通知自己可以接受数据的大小,这个大小也就是窗口大小。TCP首部中有一个字段用来通知窗口大小。发送端主机会根据接收端主机指示,对发送数据的量进行控制。下图为窗口大小控制流量过程。
4.9 拥塞控制
一般来说,计算机网络处于一个共享的环境,如果网络此时已经因为其他通信拥堵了,此时再发送一个较大量的包,可能造成整个网络的瘫痪。为防止该问题,在通信一开始就会通过一个慢启动的算法得出数值,对发送数据量进行控制。
首先为了再发送端调节所要发送的数据的量,定义一个叫做拥塞窗口的概念,在慢启动的时候,将拥塞窗口大小设置为1个数据段1MSS(有时候也可以大于1MSS,根据以太网标准MSS,慢启动可以从3MSS开始)发送数据,之后每一次收到确认应答(ACK),拥塞窗口的值就加1,在发送数据包时,将拥塞窗口的大小与接收端主机通知的窗口大小作比较,然后按照他们中小的值,发送比其还小的数据量。
为防止拥塞窗口指数式增长造成拥堵状况激增甚至导致网络拥塞的发生,引入慢启动阀值得概念。只要拥塞窗口的值超过这个阀值,只准以下面这种形式放大拥塞窗口:
TCP开始通信时,并没有设置相应的慢启动阀值,而是在超时重发时,才会设置为当时拥塞窗口的一半。
高速重发时,慢启动阀值大小设置成当时窗口一半,然后将窗口设置为该慢启动阀值+3个数据段大小。
TCP通信开始后,网络吞吐量会逐渐上升,随着网络拥堵,吞吐量开始急剧下降。于是会再次进入吞吐量慢慢上升的过程。
4.10 提高网络利用率的规范(2018.11.24)
*Nagle算法
TCP中为了提高网络的利用率,经常使用Nagle算法。该算法是指发送端即使还有应该发送的数据,但是如果这部分数据很少的话,则进行延迟发送的一种处理机制,满足下面两个条件之一则发送,若都不满足则等待一段时间再发送。
(1)已发送的数据都已经收到确认应答
(2)可以发送最大数据段长度的数据时
*延迟确认应答
如果每次收到数据都立刻回复确认应答的话,可能会返回一个较小的窗口,因为刚接收完数据,缓冲区已满,发送端接收到这个小窗口发送数据会以这个窗口为上限,这样网络利用率又降低了。因此,引入一个机制,那就是收到数据之后并不立即返回确认应答,而是延迟一段时间。
在没有收到2*最大段长度的数据为止不做确认应答,其他情况下,最大延迟0.5s发送确认应答。(很多操作系统设置为0.2s)。
其实,采用滑动窗口机制,可不必每一个数据段都进行确认应答。TCP文件传输中绝大多数是两个数据段返回一次确认应答。
*捎带应答
根据应用层协议,发送出去的消息到达对端,对端处理后会返回一个回执。TCP的确认应答和回执数据可以通过一个包发送。这种方式叫做捎带应答。通过这种机制,可以使收发的数据量急剧减少。收到数据后如果立即返回确认应答,就无法捎带应答,而是将所接收到的数据传给应用处理生成返回数据后再进行发送请求为止,必须一直等待确认应答的发送。所以,如果没有启用延迟确认应答就无法实现捎带应答。
4.11 TCP的应用
如果需要应用自己处理一些更为细节上的控制,使用UDP协议是不错的选择,如果转发数据量较多,对可靠性要求比较高,可以选择使用TCP。