【计算机网络】传输层——1.提供的服务、TCP报文段和连接管理

1.传输层提供的服务

(1)功能

从通信和信息处理的角度看,传输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。
传输层位于网络层之上,它为运行在不同主机上的进程之间提供了逻辑通信,而网络层提供主机之间的逻辑通信。显然,即使网络层协议不可靠(网络层协议使分组丢失、混乱或重复),传输层同样能为应用程序提供可靠的服务。
从下图可以看出,网络的边缘部分的两台主机使用网络核心部分的功能进行端到端的通信时,只有主机的协议栈才有传输层和应用层,而路由器在转发分组时都只用到下三层的功能(即在通信子网中没有传输层,传输层只存在于通信子网以外的主机中)。

【计算机网络】传输层——1.提供的服务、TCP报文段和连接管理
传输层的功能如下:
1)提供应用进程之间的逻辑通信(即端到端的通信)。与网络层的区别是,网络层提供的是主机之间的逻辑通信。
从网络层来说,通信的双方是两台主机,IP 数据报的首部给出了这两台主机的IP地址。但“两台主机之间的通信”实际上是两台主机中的应用进程之间的通信,应用进程之间的通信又称端到端的逻辑通信
这里“逻辑通信”的意思是:传输层之间的通信好像是沿水平方向传送数据,但事实上这两个传输层之间并没有一条水平方向的物理连接。
2)复用和分用。复用是指发送方不同的应用进程都可使用同一个传输层协议传送数据;分用是指接收方的传输层在剥去报文的首部后能够把这些数据正确交付到目的应用进程。

注意:传输层的复用分用功能与网络层的复用分用功能不同。网络层的复用是指发送方不同协议的数据都可以封装成IP数据报发送出去,分用是指接收方的网络层在剥去首部后把数据交付给相应的协议。

3)对收到的报文进行差错检测(首部和数据部分)。而网络层只检查IP数据报的首部,不检验数据部分是否出错。
4)提供两种不同的传输协议,即面向连接的TCP和无连接的UDP。而网络层无法同时实现两种协议(即在网络层要么只提供面向连接的服务,如虚电路;要么只提供无连接服务,如数据报。不可能在网络层同时存在这两种方式)。
传输层向高层用户屏蔽了低层网络核心的细节(如网络拓扑、路由协议等),它使应用进程看见的是好像在两个传输层实体之间有一条端到端的逻辑通信信道,这条逻辑通信信道对上层的表现却因传输层协议不同而有很大的差别。当传输层采用面向连接的TCP时,尽管下面的网络是不可靠的,但这种逻辑通信信道就相当于一条全双工的可靠信道。但当传输层采用无连接的UDP时,这种逻辑通信信道仍然是一条不可靠信道。

(2)传输层的寻址与端口

1)端口的作用

端口能够让应用层的各种应用进程将其数据通过端口向下交付给传输层,以及让传输层知道应当将其报文段中的数据向上通过端口交付给应用层相应的进程。端口是传输层服务访问点(TSAP),它在传输层的作用类似于IP地址在网络层的作用或MAC地址在数据链路层的作用,只不过IP地址和MAC地址标识的是主机,而端口标识的是主机中的应用进程。
数据链路层的SAP是MAC地址,网络层的SAP是IP地址,传输层的SAP是端口。
在协议栈层间的抽象的协议端口是软件端口,它与路由器或交换机上的硬件端口是完全不同的概念。硬件端口是不同硬件设备进行交互的接口,而软件端口是应用层的各种协议进程与传输实体进行层间交互的一种地址。 传输层使用的是软件端口。

2)端口号

应用进程通过端口号进行标识,端口号长度为16bit, 能够表示65536(216)个不同的端口号。
端口号只具有本地意义,即端口号只标识本计算机应用层中的各进程,在因特网中不同计算机的相同端口号是没有联系的。根据端口号范围可将端口分为两类:

  • 服务端使用的端口号。分为两类,最重要的一类是熟知端口号,数值为0~ 1023,IANA (互联网地址指派机构)把这些端口号指派给了TCP/IP 最重要的一些应用程序,让所有的用户都知道。另一类为登记端口号,数值为1024~49151。它是供没有熟知端口号的应用程序使用的,使用这类端口号必须在IANA登记,以防止重复。一些常用的熟知端口号如下:
    【计算机网络】传输层——1.提供的服务、TCP报文段和连接管理
  • 客户端使用的端口号。数值为49152~65535。由于这类端口号仅在客户进程运行时才动态地选择,因此又称短暂端口号(也称临时端口)。通信结束后,刚用过的客户端口号就不复存在,从而这个端口号就可供其他客户进程使用。

3)套接字

在网络中通过IP地址来标识和区别不同的主机,通过端口号来标识和区分一台主机中的不同应用进程。在网络中采用发送方和接收方的套接字(Socket) 组合来识别端点。所谓套接字,实际上是一个通信端点,即套接字= (主机IP地址,端口号)。它唯一地标识网络中的一台主机和其上的一个应用(进程)。
在网络通信中,主机A发给主机B的报文段包含目的端口号和源端口号,源端口号是“返回地址”的一部分, 即当B需要发回一个报文段给A时,B到A的报文段中的目的端口号便是A到B的报文段中的源端口号( 完全的返回地址是A的IP地址和源端口号)。

(3)无连接服务与面向连接服务

面向连接服务就是在通信双方进行通信之前,必须先建立连接,在通信过程中,整个连接的
情况一直被实时地监控和管理。通信结束后,应该释放这个连接。
无连接服务是指两个实体之间的通信不需要先建立好连接,需要通信时,直接将信息发送到
“网络”中,让该信息的传递在网.上尽力而为地往目的地传送。

TCP/IP协议族在IP层之上使用了两个传输协议:一个是面向连接的传输控制协议(TCP),采用TCP时,传输层向上提供的是一条全双工的可靠逻辑信道;另一个是无连接的用户数据报协议(UDP),采用UDP时,传输层向上提供的是一条不可靠的逻辑信道

TCP提供面向连接的服务,在传送数据之前必须先建立连接,数据传送结束后要释放连接。TCP不提供广播或组播服务。由于TCP提供面向连接的可靠传输服务,因此不可避免地增加了许多开销,如确认、流量控制、计时器及连接管理等。这不仅使协议数据单元的头部增大很多,还要占用许多的处理机资源。因此TCP主要适用于可靠性更重要的场合,如文件传输协议(FTP)、超文本传输协议(HTTP)、 远程登录(TELNET)等。

UDP是一个无连接的非可靠传输层协议。它在IP之上仅提供两个附加服务:多路复用和对数据的错误检查。IP知道怎样把分组投递给一台主机,但不知道怎样把它们投递给主机上的具体应用。UDP在传送数据之前不需要先建立连接,远程主机的传输层收到UDP报文后,不需要给出任何确认。由于UDP比较简单,因此执行速度比较快、实时性好。使用UDP的应用主要包括小文件传送协议(TFTP)、 DNS、SNMP和实时传输协议(RTP)。

注意:

  • IP数据报和UDP数据报的区别:
    IP数据报在网络层要经过路由的存储转发;而UDP数据报在传输层的端到端的逻辑信道中传输,封装成IP数据报在网络层传输时,UDP数据报的信息对路由是不可见的。
  • TCP和网络层虚电路的区别:
    TCP报文段在传输层抽象的逻辑信道中传输,对路由器不可见;虚电路所经过的交换结点都必须保存虚电路状态信息。在网络层若采用虚电路方式,则无法提供无连接服务;而传输层采用TCP不影响网络层提供无连接服务。

2.TCP协议

(1)TCP协议的特点

TCP是在不可靠的IP层之上实现的可靠的数据传输协议,它主要解决传输的可靠、有序、无丢失和不重复问题。TCP 是TCP/IP体系中非常复杂的一个协议,主要特点如下:
1)TCP是面向连接的传输层协议。
2)每条TCP连接只能有两个端点,每条TCP连接只能是点对点的(一对一)。
3)TCP提供可靠的交付服务,保证传送的数据无差错、不丢失、不重复且有序。
4)TCP提供全双工通信,允许通信双方的应用进程在任何时候都能发送数据,为此TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。
发送缓存用来暂时存放以下数据:发送应用程序传送给发送方TCP准备发送的数据:TCP已发送但尚未收到确认的数据。接收缓存用来暂时存放以下数据:按序到达但尚未被接收应用程序读取的数据;不按序到达的数据。
5) TCP是面向字节流的,虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序交下来的数据仅视为一连串的无结构的字节流。

(2)TCP报文段

TCP传送的数据单元称为报文段。一个TCP报文段分为TCP首部和TCP数据两部分,整
个TCP报文段作为IP数据报的数据部分封装在IP数据报中,如下图所示。其首部的前20B
是固定的。TCP报文段的首部最短为20B,后面有4N字节是根据需要而增加的选项,通常长
度为4B的整数倍。
TCP报文段既可以用来运载数据,又可以用来建立连接、释放连接和应答。
各字段意义如下:
1)源端口和目的端口字段。各占2B。端口是运输层与应用层的服务接口,运输层的复用和分用功能都要通过端口实现。
2)序号字段。占4B。TCP是面向字节流的(即TCP传送时是逐个字节传送的),所以TCP连接传送的数据流中的每个字节都编上一个序号。序号字段的值指的是本报文段所发送的数据的第一个字节的序号。
例如,一报文段的序号字段值是301,而携带的数据共有100B, 表明本报文段的数据的最后一个字节的序号是400,因此下一个报文段的数据序号应从401开始。
【计算机网络】传输层——1.提供的服务、TCP报文段和连接管理
3)确认号字段。占4B,是期望收到对方的下一个报文段的数据的第一个字节的序号。若确认号为N,则表明到序号N-1为止的所有数据都已正确收到。
例如,B正确收到了A发送过来的一个报文段,其序号字段是501,而数据长度是200B (序号501~700),这表明B正确收到了A发送的到序号700为止的数据。因此B期望收到A的下一个数据序号是701,于是B在发送给A的确认报文段中把确认号置为701。
4)数据偏移(即首部长度)。占4位,这里不是IP数据报分片的那个数据偏移,而是表示首部长度,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。“数据偏移”的单位是32位(以4B为计算单位)。因此当此字段的值为15时,达到TCP首部的最大长度60B。
5)保留字段。占6位,保留为今后使用,目前置为0,该字段可以忽略不计。
6)紧急位URG。URG= 1时,表明紧急指针字段有效。它告诉系统报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。但URG需要和紧急指针配套使用,即数据从第一个字节到紧急指针所指字节就是紧急数据。
7)确认位ACK。只有当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置1。
8)推送位PSH (Push)。 接收TCP收到PSH= 1的报文段,就尽快地交付给接收应用进程,而不再等到整个缓存都填满后再向上交付。
9)复位位RST (Reset)。RST=1时,表明TCP连接中出现严重差错(如主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。
10)同步位SYN。同步SYN= 1表示这是一个连接请求或连接接收报文。当SYN=1,ACK=0时,表明这是一个连接请求报文,对*同意建立连接,则在响应报文中使用SYN=1,ACK=1。即SYN= 1表示这是一个连接请求或连接接收报文。
11)终止位FIN (Finish)。 用来释放一个连接。FIN= 1表明此报文段的发送方的数据已发送完毕,并要求释放传输连接。
12) 窗口字段。占2B。它指出现在允许对方发送的数据量,接收方的数据缓存空间是有限的,因此用窗口值作为接收方让发送方设置其发送窗口的依据,单位为字节。
例如,假设确认号是701,窗口字段是1000。这表明,从701号算起,发送此报文段的一方还有接收1000B数据(字节序号为701~ 1700)的接收缓存空间。
13)校验和。占2B。 校验和字段检验的范围包括首部和数据两部分。在计算校验和时,和UDP一样,要在TCP报文段的前面加上12B的伪首部(只需将UDP伪首部的第4个字段,即协议字段的17改成6,其他的和UDP一样)。
14)紧急指针字段。占16位,指出在本报文段中紧急数据共有多少字节(紧急数据放在本报文段数据的最前面)。
15)选项字段。长度可变。TCP最初只规定了-一种选项,即最大报文段长度(Maximum Segment Size,MSS)。MSS是TCP报文段中的数据字段的最大长度。
16)填充字段。这是为了使整个首部长度是4B的整数倍。

(3)TCP连接

TCP是面向连接的协议,因此每个TCP连接都有三个阶段:连接建立、数据传送和连接释放。TCP连接的管理就是使运输连接的建立和释放都能正常进行。
在TCP连接建立的过程中,要解决以下三个问题:
1)要使每一方都能够确知对方的存在。
2)要允许双方协商一些参数(如最大窗口值、是否使用窗口扩大选项、时间戳选项及服务质量等)。
3)能够对运输实体资源(如缓存大小、连接表中的项目等)进行分配。
TCP把连接作为最基本的抽象,每条TCP连接有两个端点,TCP连接的端点不是主机,不是主机的IP地址,不是应用进程,也不是传输层的协议端口。TCP连接的端口称为套接字或插口。端口拼接到IP地址即构成套接字。.
每条TCP连接唯一地被通信两端的两个端点(即两个套接字)确定。
TCP连接的建立采用客户机/服务器方式。主动发起连接建立的应用进程称为客户机(Client),而被动等待连接建立的应用进程称为服务器(Server)。
1.TCP连接的建立
【计算机网络】传输层——1.提供的服务、TCP报文段和连接管理连接的建立经历以下3个步骤,通常称为三次握手,如上图所示。
第一步: 客户机的TCP首先向服务器的TCP发送一个连接请求报文段。这个特殊的报文段中不含应用层数据,其首部中的SYN标志位被置为1。另外,客户机会随机选择一个起始序号:seq=x(连接请求报文不携带数据,但要消耗一个序号)。
第二步: 服务器的TCP收到连接请求报文段后,如同意建立连接,就向客户机发回确认,并为该TCP连接分配TCP缓存和变量。在确认报文段中,SYN和ACK位都被置为1,确认号字段的值为x+1,并且服务器随机产生起始序号seq=y(确认报文不携带数据,但也要消耗一个序号)。确认报文段同样不包含应用层数据。
第三步: 当客户机收到确认报文段后,还要向服务器给出确认,并且也要给该连接分配缓存和变量。这个报文段的ACK标志位被置1,序号字段为x+ 1,确认号字段ack=y+1。该报文段可以携带数据,若不携带数据则不消耗序号。
成功进行以上三步后,就建立了TCP连接,接下来就可以传送应用层数据。TCP提供的是全双工通信,因此通信双方的应用进程在任何时候都能发送数据。

注意:服务器端的资源是在完成第二次握手时分配的,而客户端的资源是在完成第三次握手时分配的,这就使得服务器易于受到SYN洪泛攻击。

2.TCP连接的释放
参与TCP连接的两个进程中的任何一个都能终止该连接。TCP连接释放的过程通常称为四次握手,如下图所示。
【计算机网络】传输层——1.提供的服务、TCP报文段和连接管理

第一步: 客户机打算关闭连接时,向其TCP发送-一个连接释放报文段,并停止发送数据,主动关闭TCP连接,该报文段的FIN标志位被置1, seq=u, 它等于前面已传送过的数据的最后一个字节的序号加1 (FIN 报文段即使不携带数据,也要消耗一一个序号)。
TCP是全双工的,即可以想象为一条TCP连接上有两条数据通路。发送FIN报文时,发送FIN的一端不能再发送数据,即关闭了其中一条数据通路,但对方还可以发送数据。
第二步: 服务器收到连接释放报文段后即发出确认,确认号是ack=u+ 1,而这个报文段自己的序号是v,等于它前面已传送过的数据的最后-一个字节的序号加1。此时,从客户机到服务器这个方向的连接就释放了,TCP连接处于半关闭状态。但服务器若发送数据,客户机仍要接收,即从服务器到客户机这个方向的连接并未关闭。
第三步: 若服务器已经没有要向客户机发送的数据,就通知TCP释放连接,此时其发出.
FIN= 1的连接释放报文段。
第四步: 客户机收到连接释放报文段后,必须发出确认。在确认报文段中,ACK字段被置为1,确认号ack=w+1,序号seq=u+1。此时TCP连接还未释放,必须经过时间等待计时器
设置的时间2MSL后,A才进入连接关闭状态。
对上述TCP连接建立和释放的总结如下:
1)连接建立。分为3步:
①SYN=1,seq=x。
②SYN=1,ACK=1,seq=y,ack=x+ 1。
③ACK=1,seq=x+ 1,ack=y+ 1。
2)释放连接。分为4步:
①FIN=1,seq=u。
②ACK=1,seq=v, ack=u+ 1。
③FIN=1,ACK= l, seq=w,ack=u+ 1。
④ACK=1,seq=u+ 1,ack=w+ 1。