运输层是整个网络体系结构中的关键层次之一。一定要弄清以下一些重要概念:
(1)运输层为相互通信的应用进程提供逻辑通信。
(2)端口和套接字的意义。
(3)无连接的UDP的特点。
(4)面向连接的TCP的特点。
(5)在不可靠的网络上实现可靠传输的工作原理,停止等待协议和ARQ协议。
(6)TCP的滑动窗口、流量控制、拥塞控制和连接管理。
一、运输层概述
1.进程之间的通信
运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。我们知道,IP协议能够把源主机A发送出的分组按照首部中的目的地址送交到目的主机B,那么,为什么还需要运输层呢?这是因为,真正进行通信的实体是在主机中的进程,是这个主机中的一个进程和另一个主机中的一个进程在交换数据(即通信)。IP协议虽然能把分组送到目的主机,但是这个分组还停留在主机的网络层而没有交付主机中的应用进程。网络层是为主机之间提供逻辑通信,而运输层为应用进程之间提供端到端的逻辑通信。
运输层有一个很重要的功能一一复用和分用。复用是指应用层所有的应用进程都可以通过运输层再传送到IP层(网络层)。分用是指运输层从IP层收到数据后必须交付指明的应用进程。
2.运输层的两个主要协议
面向连接的TCP和无连接的UDP。当运输层采用TCP协议时,尽管下面的网络是不可靠的(只提供尽最大努力服务),但这种逻辑通信信道就相当于一条全双工的可靠信道。但当运输层采用无连接的 UDP协议时,这种逻辑通信信道仍然是一条不可靠信道。
UDP在传送数据之前不需要先建立连接。远地主机的运输层在收到UDP报文后,不需要给出任何确认。虽然UDP不提供可靠交付,但在某些情况下UDP却是一种最有效的工作方式。
TCP则提供面向连接的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。
3.运输层的端口
应用层的进程是很多的,需要将它们区分开来,为每个进程赋予一个非常明确的标志至关重要。解决办法是在运输层使用协议端口号,简称端口。这就是说,虽然通信的终点是应用进程,但我们只要把要传送的报文交到目的主机的某一个合适的目的端口,剩下的工作(即最后交付目的进程)就由TCP或UDP来完成。这里的端口指的是软件端口,是应用层的各种协议进程与运输实体进行层间交互的一种地址。和设备上的硬件端口完全不同。
TCP/IP的运输层用一个16位(65535个)端口号来标志一个端口。端口号只具有本地意义,标志本计算机应用层中的各个进程在和运输层交互时的层间接口,不同计算机中,相同的端口号是没有关联的。
端口号分为下面两大类:
(1)服务器端使用的端口号。这里又分为两类,熟知端口号(0~1023),指派给一些最重要的应用程序,让所有用户都知道。另一类登记端口号(1023~49151),这类端口号是为没有熟知端口号的应用程序使用的。
(2)客户端使用的端口号。49152~65535,这类端口号仅在客户进程运行时才动态选择,是留给客户进程选择暂时使用。
二、用户数据报协议UDP
1.UDP的主要特点是:
1)UDP是无连接的。
2)UDP使用尽最大努力交付,即不保证可靠交付。
3)UDP是面向报文的。UDP对应用层交下来的报文,既不合并,也不拆分,应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。在接收方的UDP,在去除首部后就原封不动地交付上层的应用进程。
4)UDP没有拥塞控制,因此网络出现的拥塞不会使源主机的发送速率降低。
5)UDP支持一对一、一对多、多对一和多对多的交互通信。
6)UDP的首部开销小,只有8个字节,比TCP的20个字节的首部要短。
三、传输控制协议TCP概述
1.TCP的特点:
1)TCP是面向连接的运输层协议。建立连接、传送数据、释放连接。
2)每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的。
3)TCP提供可靠交付的服务。
4)TCP提供全双工通信。TCP允许通信双方的应用进程在任何时候都能发送数据。 TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。
5)面向字节流。“面向字节流"的含义是:虽然应用程序和TCP的交互是一次一个数据块(大小不等),但 TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流。
TCP并不关心应用进程一次把多长的报文发送到TCP的缓存中,而是根据对方给出的窗口值和当前网络拥塞的程度来决定一个报文段应包含多少个字节(UDP发送的报文长度是应用进程给出的)。如果应用进程传送到TCP缓存的数据块太长,TCP就可以把它划分短一些再传送。如果应用进程一次只发来一个字节,TCP也可以等待积累有足够多的字节后再构成报文段发送出去。
2.TCP的连接
每一条TCP连接有两个端点。TCP连接的端点叫做套接字(不是主机,不是主机的IP地址,不是应用进程,也不是运输层的协议端口)。端口号拼接到IP地址即构成了套接字,表示方法是在点分十进制的IP地址后面写上端口号,中间用冒号或逗号隔开,若IP地址是192.3.4.5而端口号是80,那么得到的套接字就是(192.3.4.5:80)。
四、可靠传输的工作原理
1.停止等待协议
“停止等待"就是每发送完一个分组(本应叫报文,这里是讨论可靠传输的原理,因此把传送的数据单元都称为分组)就停止发送,等待对方的确认。在收到确认后再发送下一个分组。只要超过了一段时间仍然没有收到确认,就认为刚才发送的分组丢失了,因而重传前面发送过的分组。这就叫做超时重传。
注意:
1)发送完一个分组后,必须暂时保留已发送的分组的副本(为发生超时重传时使用)。
2)分组和确认分组都必须进行编号。这样才能明确是哪一个发送出去的分组收到了确认,而哪一个分组还没有收到确认。
确认丢失和确认迟到
确认丢失:当接收方B发回的确认丢失时,发送方A超时重传分组,但实际上B已经收到过分组了,这时B采取以下行动:丢弃这个重复的分组,不向上层交付;向A发送确认。
确认迟到:接收方B发回的确认并没有丢失,在网络里滞留导致超时重传,过一段时间后确认才到达A,对于重复的确认:A收下后就丢弃。B仍然会收到重复的分组,并且同样要丢弃它,并重传确认分组。
像上述的这种可靠传输协议常称为自动重传请求ARQ ,意思是重传的请求是自动进行的。
3.连续ARQ协议
发送窗口:发送窗口内的所有分组可以连续发送出去而不需要等待对方的确认。发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置。
接收方一般都是采用累积确认的方式。这就是说,接收方不必对收到的分组逐个发送确认,而是在收到几个分组后,对按序到达的最后一个分组发送确认,这就表示:到这个分组为止的所有分组都己正确收到了。
五、TCP报文段的首部格式
1)源端口和目的端口
2)序号。占4字节,序号范围是[0,232一1 ],TCP是面向字节流的。在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。
3)确认号。是期望收到对方下一个报文段的第一个数据字节的序号。若确认号为N,则表明:到序号N-1为止的所有数据都己正确收到。
4)数据偏移。占4位,指出TCP报文段的首部长度,单位是4字节。
5)紧急URG。当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据),而不要按原来的排队顺序来传送。于是发送方 TCP就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍是普通数据。这时要与首部中紧急指针(Urgent pointer)字段配合使用。
6)确认ACK 。仅当ACK=1时确认号字段才有效。当ACK=0 时,确认号无效。
7)推送PSH。接受方立即响应PSH=1的报文段,而不再等到整个缓存都填满了后再向上交付。
8)复位RST。RST=1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。
9)同步SYN。当SYN=1而ACK=0 时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使SYN=1 和ACK=1。因此,SYN置为1就表示这是一个连接请求或连接接受报文。
10)终止FIN。用来释放一个连接。当FIN=1时,表明此报文段的发送方的数据己发送完毕,并要求释放运输连接。
11)窗口。窗口指的是发送本报文段的一方的接收窗口(而不是自己的发送窗口)。窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量。例如,发送了一个报文段,设确认号是701,窗口字段是1 000。这就表明,从701号算起,发送此报文段的一方还有接收1 000个字节数据(字节序号是701~1700)的接收缓存空间。
12)检验和。检验和字段检验的范围包括首部和数据这两部分。
13)紧急指针。紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数。即使窗口为零时也可发送紧急数据。
最大报文段长度MSS,MSS是每一个TCP报文段中的数据字段的最大长度。
六、TCP可靠传输的实现
1.以字节为单位的滑动窗口
发送窗口表示:在没有收到B的确认的情况下,A 可以连续把窗口内的数据都发送出去。凡是己经发送过的数据,在未收到确认之前都必须暂时保留,以便在超时重传时使用。
A的发送窗口一定不能超过B的接收窗口数值,发送方的发送窗口的大小还要受到当时网络拥塞程度的制约。
2.超时重传时间的选择
由于TCP的下层是互联网环境,发送的报文段可能只经过一个高速率的局域网,也可能经过多个低速率的网络,并且每个IP数据报所选择的路由还可能不同。如果把超时重传时间设置得太短,就会引起很多报文段的不必要的重传,使网络负荷增大。但若把超时重传时间设置得过长,则又使网络的空闲时间增大,降低了传输效率。
加权平均往返时间RTTS。
每当第一次测量到RTT样本时,RTTs值就取为所测量到的RTT样本值。但以后每测量到一个新的RTT样本,就按下式重新计算一次RTTs:
新的RTTs=(1-a)*(旧的RTTs)+a*(新的RTT样本) 0<=a<1,一般取0.125
超时重传时间RTO=RTTs+4*RTTD
RTTD是RTT的偏差的加权平均值,它与RTTs和新的RTT样本之差有关。新的RTTD=(1-b)*(旧的RTTD)+b*|RTTS-新的RTT样本| b一般取0.25
七、TCP的流量控制
所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。利用滑动窗口机制可以很方便地在TCP连接上实现对发送方的流量控制。
八、TCP的拥塞控制
所谓拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。拥塞控制所要做的都有一个前提,就是网络能鸲承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。
流量控制往往指点对点通信量的控制,是个端到端的问题(接收端控制发送端)。流量控制所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接收。
TCP的拥塞控制方法
即慢开始(slow-start)、拥塞避免(congestion avoidance)、快重传(st retransmit)和快恢复(fast recovery)。
1.慢开始和拥塞避免
发送方维持一个叫做拥塞窗口 cwnd的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞窗口。
慢开始算法的思路是这样的。当主机开始发送数据时,如果立即把大量数据字节注入到网络,那么就有可能引起网络拥塞,因为现在并不清楚网络的负荷情况。经验证明,较好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是说,由小到大逐渐增大拥塞窗口数值。通常在刚刚开始发送报文段时,先把拥塞窗口cwnd设置为一个最大报文段MSS 的数值]。而在又收到一个对新的报文段的确认后,把拥塞窗口增加至多一个MSS的数值。拥塞窗口 cwnd每次的增加量=min(N,MSS),其中N是原先未被确认的、但现在被刚收到的确认报文段所确认的字节数。
为了防止拥塞窗口cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限ssthresh 状态变量,当cwnd>ssthresh时,便停止使用慢开始算法而改用拥塞避免算法。
拥塞避免算法的思路是让拥塞窗口cwnd缓慢地增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加0,而不是加倍。这样,拥塞窗口cwnd按线性规律缓慢增长,比慢开始算法的拥塞窗口增长速率缓慢得多。
快重传算法让发送方及早知道有报文段没有到达对方。快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认,而不要等待自己发送数据时才进行捎带确认。送方只要一连收到三个重复确认就知道接收方确实没有收到某个缺失的报文段,因而立即进行重传,这样就不会出现超时,发送方也不会误认为出现了网络拥塞。
发送方知道现在只是丢失了个别的报文段,于是不启动满开始,而是执行快恢复算法。这时,发送方调整门限值减半,同时设置拥塞窗口等于门限值,并开始拥塞避免算法。
九、TCP的运输连接管理
运输连接有三个阶段:连接建立、数据传送和连接释放。TCP连接的建立采用客户服务器方式。主动发起连接建立的应用进程叫做客户,而被动等待连接建立的应用进程叫做服务器。
1.TCP的连接建立——三报文握手建立TCP连接
在本例中,A主动打开连接,而B被动打开连接。最初两端的TCP进程都处于CLOSED(关闭)状态。
1)一开始,B的TCP服务器进程先创建传输控制块TCB,准备接受客户进程的连接请求。然后服务器进程就处于LISTEN(收听)状态,等待客户的连接请求。如有,即作出响应
2)A的TCP客户进程也是首先创建传输控制模块TCB,然后向B发出连接请求报文段,这时首部中的同步位SYN=1,同时选择一个初始序号seq=x。TCP规定,SYN报文段(即SYN=1的报文段)不能携带数据,但要消耗掉一个序号。这时,TCP客户进程进入 SYN-SENT(同步己发送)状态。
3)B收到连接请求报文段后,如同意建立连接,则向A发送确认。在确认报文段中应SYN位和ACK位都置1,确认号是ack=x + 1,同时也为自己选择一个初始序号seq=y。请注意,这个报文段也不能携带数据,但同样要消耗掉一个序号。这时TCP服务器进程进入SYN-RCVD(同步收到)状态。
4)TCP客户进程收到B的确认后,还要向B给出确认。确认报文段的ACK置1,确认号 ack = y + 1,而自己的序号seq=x+ 1。TCP的标准规定,ACK报文段可以携带数据。但如果不携带数据则不消耗序号,在这种情况下,下一个数据报文段的序号仍是seq:x + 1。这时,TCP连接己经建立,A进入ESTABLISHED(己建立连接)状态。
5)当B收到A的确认后,也进入ESTABLISHED状态。
上面给出的连接建立过程叫做三报文握手。
2.TCP的连接的释放
数据传输结束后,通信的双方都可释放连接。现在A和B都处于ESTABLISHED状态。
1)A的应用进程先向其TCP发出连接释放报文段,并停止再发送数据,主动关闭 TCP连接。A把连接释放报文段首部的终止控制位FIN置1 ,其序号seq=u,它等于前面己传送过的数据的最后一个字节的序号加1。这时A进入FIN-WAIT-1(终止等待D状态,等待B的确认。请注意,TCP规定,FIN报文段即使不携带数据,它也消耗掉一个序号。
2)B收到连接释放报文段后即发出确认,确认号是ack=u + 1,而这个报文段自己的序号是v,等于B前面己传送过的数据的最后一个字节的序号加1。然后B就进入CLOSEWAIT(关闭等待)状态。TCP服务器进程这时应通知高层应用进程,因而从A到B这个方向的连接就释放了,这时的TCP连接处于半关闭状态,即A己经没有数据要发送了,但B若发送数据,A仍要接收。也就是说,从B到A这个方向的连接并未关闭,这个状态可能会持续一些时间。
3)A收到来自B的确认后,就进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段。
4)若B己经没有要向A发送的数据,其应用进程就通知TCP释放连接。这时B发出的连接释放报文段必须使FIN=1。现假定B的序号为w(在半关闭状态B可能又发送了一些数据)。B还必须重复上次己发送过的确认号ack=u + 1。这时B就进入LAST-ACK(最后确认)状态,等待A的确认。
5)A在收到B的连接释放报文段后,必须对此发出确认。在确认报文段中把ACK置1,确认号ack = w + 1,而自己的序号是seq=u + 1(根据TCP标准,前面发送过的F报文段要消耗一个序号)。然后进入到TIME-WAIT(时间等待)状态。请注意,现在TCP连接还没有释放掉。必须经过时间等待计时器设置的时间2MSL后,A才进入到CLOSED状态。
原文:https://www.cnblogs.com/cs0915/p/12335284.html