五、传输层
从通信和信息处理的角度看,运输层向上提供通信服务,属于面向通信部分的最高层,同时也是用户功能中的最底层。
问题:我们知道IP协议能够把源主机A发送出的分组按照首部中的目的IP送交到目的主机B,那么为什么还需要运输层呢?
答:从IP层来说,通信的两端是两个主机。但真正进行通信的实体是在主机中的进程,IP协议虽然能讲分组送到主机,但这个分组还停留在网络层而没有交付主机中的应用进程。从运输层的角度看,通信的真正端点并不是主机,而是主机的进程。也就是说端到端通信是应用进程之间的通信。
网络层是为主机之间提供逻辑通信,而运输层为应用进程之间提供端到端的逻辑通信。运输层还要对收到的报文进行差错检测。
5.1运输层的两个主要协议
1)用户数据报协议UDP(User Datagram Protocol)
2)传输控制协议TCP(Transmission Control Protocol)
5.2运输层的端口
应用层的所有应用进程都可以通过运输层再传送到IP层,这就是复用。
运输层从IP层收到数据报后必须交付给指明的应用进程,这叫做分用。
实现上述的方法就是在运输层使用协议端口号,通常称为端口。这就是说,虽然通信的重点是应用进程,但我们只要把传送的报文交到目的主机的某一个合适的目的端口,剩下的工作(即交付给目的进程)就由TCP完成。
TCP/IP的运输层用16位端口号来标志一个端口。值得注意的是,端口号只具有本地意义,它只是为了标志本计算机应用层中的各个进程在和运输层交互时的层间接口。在不同的计算机中,相同的端口号是没有关联的。16位的端口号可允许有65535个端口。
因此,两个计算机中的进程要相互通信,不仅需要知道对方的IP地址,还要知道对方的端口号。因特网上的计算机通信是采用客户-服务器方式。
运输层的端口号共分为以下两大类
1)服务器端使用的端口号
又称为系统端口号、熟知端口号,数值为0-1023。IANA把这些端口号指派给了TCP/IP最重要的一些应用程序,让所有的用户都知道。当一种新的应用程序出现后,必须给它指派一个熟知端口,否则因特网上的其他应用进程就无法和它进行通信。
另一类叫做登记端口号,数值为1024-49151.这类端口号是为没有熟知端口号的应用程序使用的。使用这类端口号必须在INANA登记。
2)客户端使用的端口号
数值为49152-65535.这类端口号仅在客户进程运行时才动态选择,因此又叫做短暂端口号。
5.3用户数据报协议UDP
UDP只在IP数据报服务之上增加了复用分用以及差错检测的功能。
主要特点:
1)无连接的
2)尽最大努力交付
3)UDP是面向报文的。发送发的UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。
4)UDP没有拥塞控制。因此网络出现拥塞不会使源主机的发送速率降低。这对如IP电话、实时视频会议的实时应用很重要。这些应用要求源主机以恒定的速率发送数据。并且允许在网络发生拥塞时丢失一些数据,但不允许数据有太大时延。
5)UDP支持一对一、一对多、多对一、多对多的交互通信。
6)UDP的首部只有8字节,开销小。
5.4传输控制协议TCP
TCP主要特点:
1)面向连接
2)每一条TCP连接只能是点对点的。
3)TCP提供可靠交付服务。
4)提供全双工通信。
5)面向字节流。
5.4.1TCP的连接
TCP连接的端口是套接字。套接字是IP地址加端口号。
格式:socket = (IP地址:端口号)
每一条TCP连接唯一地被通信两端的两个套接字所确定。即:
TCP连接 ::= {socket1, socket2} = {(ip1: port1), (ip2: port2)}
5.4.2可靠传输的工作原理
为了实现可靠传输,可以使用一些可靠传输协议,当出现差错时让发送方重传出现差错的数据,同时在接收方来不及处理收到的数据时,及时告诉发送方适当降低发送数据的速度。
1.停止等待协议
停止等待就是每发送完一个分组就停止发送,等待对方的确认,在收到确认后再发送下一个分组。
5.5 TCP报文段的首部格式
一个TCP报文分为首部和数据两部分。
TCP首部的前20个字节是固定的,后面4n个字节是根据需要而增加的选项。因此TCP首部的最小长度是20字节。
首部固定部分个字段的意义:
1)源端口和目的端口 各占2字节。
2)序号 占4字节。在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。首部中的序号字段值则指的是本报文段所发送的数据的第一个字节的序号。例如,一报文段的序号字段值是301,而携带的数据共有100字节。则下一个报文段的序号字段值为401.
3)确认号 占4字节,示期望收到对方下一个报文段的第一个数据字节的序号。若确认号为N,则表明到序号N-1为止的所有数据都已正确收到。
4)数据偏移 占4位,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。这个字段实际上是指出TCP报文段的首部长度。TCP报文首部的最大长度是60字节。
5)保留 占6位,保留位今后所用,目前置0.
下面有六个控制位说明本报文段的性质。
6)紧急URG 当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送,而不要按原来的排队顺序来传送。
7)确认ACK 当ACK=1时确认号字段才有效。TCP规定,在连接建立后所有传送的报文都必须把ACK置1.
8)推送PSH 当两个应用进程进行交互通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应。在这个时候,发送方将PSH置1,并立即创建一个报文段发送出去。接收方TCP收到PSH=1的报文后,就尽快交付给进程,而不再等待缓存都填满后再交付。
9)复位RST 当RST=1时,表明TCP连接中出现重大错误,需要释放连接。还可以用来拒绝打开一个连接或非法报文。
10)同步SYN 在连接建立时用来同步序号。当SYN = 1而ACK = 0时,表明这是一个连接请求报文。若对方同意连接,则应在响应的报文段中使SYN=1和ACK=1.因此SYN=1表示这是一个连接请求或连接接收报文。
11)终止FIN 用来释放一个连接。当FIN=1时,表明此报文段的发送方的数据已经发送完毕,并要求释放运输连接。
12)窗口 占2字节。指明了现在允许对方发送的数据量。
13)校验和 占2字节。校验和字段检验首部和数据两部分。
14)紧急指针 占2字节。仅在URG=1才有意义,指出本报文段中的紧急数据字节数。
15)选项 长度可变,最长可达40字节。
MSS最大报文段长度,是每一个TCP报文段中的数据字段的最大长度。
5.6超时重传时间的选择
TCP采用自适应算法,它记录一个报文发出的时间及确认的时间。这两个时间差就是报文段的往返时间RTT。TCP保留了RTT的一个加权平均往返时间RTTs。
超时重传时间应略大于RTTs。
5.7TCP的流量控制
流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。
例子如图
上述情况中,A和B在相互等待,如果没有其他措施,将会持续死锁。
因此,TCP位每一个连接设置了一个持续计时器。只要TCP连接的一方收到零窗口的通知,就启动持续计时器。若持续计时器设置的时间到期,就发送一个零窗口探测报文段,而对方在收到该报文后给出了现在的窗口值。如果窗口值仍为0,则重新设置持续计时器,不为0则僵局打破。
应用进程把数据传送给TCP的发送缓存后,剩下的发送任务就由TCP来控制了。可以用不同的机制来控制TCP报文段的发送时机。例如,第一种机制是TCP维持一个变量,它等于最大报文段长度MSS。只要缓存中存放的数据达到MSS字节时,就组装成一个TCP报文段发送出去。第二种机制是由发送方的应用进程指明要发送报文段,即TCP支持的推送操作。第三种机制是发送方的一个计时器期限到了,这时就把当前已有的缓存数据装入报文段发送出去。
5.8TCP拥塞控制
拥塞:对资源的需求 > 可用资源
拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。拥塞控制是一个全局性的问题。
相反,流量控制往往指点对点通信量的控制。它所做的就是抑制发送端发送数据的速率,以便使接收端来得及接收。
5.9TCP的运输连接管理
TCP是面向连接的协议。运输连接是用来传送TCP报文的。TCP运输连接的建立和释放是每一次面向连接的通信中必不可少的过程。因此运输连接由三个阶段:连接建立、运输数据、连接释放。
1)TCP连接建立过程
要解决以下三个问题:
a.要使每一方能够确知对方的存在。
b.要允许双方协商一些参数(如最大窗口值、是否使用窗口扩大选项和时间戳选项以及服务质量等)
c.能够对运输实体进行分配。
TCP连接的建立采用C/S模式。主动发起连接建立的应用进程叫做客户端,被动等待连接建立的应用进程叫做服务器。
三次握手(TCP建立连接过程)
上图中画出了TCP建立连接的过程。假定主机A运行的是TCP客户程序,而B运行TCP服务器程序。最初两端的TCP进程都处于CLOSED状态。
传输控制块TCB:存储了每一个连接中的一些重要信息,如:TCP连接表,打破发送和接收缓存的指针,到重传队列的指针,当前的发送和接收序号等。
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状态。
问题:为什么A还要发送一次确认呢?这主要是防止已失效的连接请求报文段又传送到了B,B以为A又发出一次新的连接请求,于是向A发出确认报文段。如果不采用三次握手,那么只要B发出确认,连接就建立了。由于现在A并没有发出新的建立连接的请求,因此不会理睬B的确认,也不会向B发送数据。而B却以为新的运输连接已经建立,并一直等待A发来的数据。B的许多资源就这样白白浪费了。
TCP连接释放过程采用四次握手。