运输层协议概述
进程之间的通信
运输层向它上面的应用层提供通信服务。
当网络边缘部分的两台主机 使用网络核心部分的功能进行端到端的通信时,都要使用协议栈中的运输层;而网络核心部分中的路由器在转发分组时只用到下三层的功能。
Q1:我们知道,IP 协议能够把源主机A发送出的分组,按照首部中的目的地址,送交到目的主机B,那么,为什么还需要运输层呢?
A1:真正进行通信的实体是在主机中的哪个构件是主机中的应用进程,是一台主机中的应用进程和另一台主机中的应用进程在交换数据(即通信)。
因此严格地讲,两台主机进行通信就是两台主机中的应用进程互相通信。IP协议虽然能把分组送到目的主机,但是这个分组还停留在主机的网络层而没有交付主机中的应用进程。
**在计算机网络中实际进行通信的真正实体,是位于通信两端主机中的进程;**也就是说,端到端的通信是应用进程之间的通信
进程之间的通信图例说明
主机A的应用进程 AP1和主机B的应用进程AP2通信,而与此同时,应用进程AP3也和对方的应用进程AP4通信。这表明运输层有一个很重要的功能------复用(multiplexing)和分用(demultiplexing)。
- 复用:发送方不同应用进程都可以使用同一个运输层协议传输数据
- 分用:接收方运输层在去掉报文首部可以将数据正确交付目的的应用进程
运输层向应用层实体屏蔽了下面网络核心的细节 (例如网络拓扑、所采用的路由选择协议等),它使应用进程看见的就好像是在两个运输层实体之间有一条端到端的逻辑通信信道。
网络层与运输层的通信区别
网络层为主机之间的通信提供服务;而运输层则在网络层的基础上,为应用进程之间的通信提供服务。
运输层还要对收到的报文进行差错检测 。------在网络层,IP 数据报首部中的检验和字段,只检验首部是否出现差错而不检查数据部分。
运输层的两个协议
- 用户数据报协议UDP (User Datagram Protocol)
- 传输控制协议 TCP (Transmission Control Protocol)
按照 OSI 的术语,两个对等运输实体在通信时传送的数据单位叫作运输协议数据单元TPDU (Transport Protocol Data Unit)。但在TCP/IP体系中 ,则根据所使用的协议是TCP或UDP,分别称之为TCP报文段或UDP用户数据报
**传输控制协议TCP:**为其上层提供的是面向连接的可靠的数据传输服务。使用TCP通信的双方,在传送数据之前必须首先建立TCP连接(逻辑连接,而非物理连接)。数据传输结束后必须要释放TCP连接。
TCP为了实现可靠传输,就必须使用很多措施,例如TCP连接管理、确认机制、超时重传、流量控制以及拥塞控制等。
TCP的实现复杂,TCP报文段的首部比较大,占用处理机资源比较多。
用户数据报协议UDP:为其上层提供的是无连接的不可靠的数据传输服务。
使用UDP通信的双方,在传送数据之前不需要建立连接。
UDP不需要实现可靠传输,因此不需要使用实现可靠传输的各种机制。
UDP的实现简单,UDP用户数据报的首部比较小。
运输层的端口
我们知道,运输层有分用和复用的功能,为了正确交付应用层所指明的应用进程,应当给每个应用进程赋予一个明确的标志。
运行在计算机上的进程是使用进程标识符(Process ldentification,PIlD)来标识的
然而,因特网上的计算机并不是使用统一的操作系统,而不同操作系统(Windows、Linux、MacOS)又使用不同格式的进程标识符。
为了使运行不同操作系统的计算机的应用进程之间能够基于网络进行通信,就必须使用统一的方法对TCP/IP体系的应用进程进行标识。
应用进程的交互需要经过应用层和运输层的界面上一些"门",而"门"设为通信的抽象终点。
这些抽象终点 的正式名称就是协议端口(protocol port),一般就简称为端口(port)。 每一个端口用一个称为端口号(portnumber)的正整数来标志。主机的操作系统提供了接口机制,使得进程能够通过这种机制找到所要找的端口。
请注意,这种在协议栈层间的抽象的协议端口是软件端口 ,和路由器或交换机上的硬件端口是完全不同的概念。**硬件端口是不同硬件设备进行交互的接口,而软件端口是应用层的各种协议进程与运输实体进行层间交互的地点。**不同的系统具体实现端口的方法可以是不同的(取决于系统使用的操作系统)。
TCP/IP体系结构的运输层使用端口号来标识和区分应用层的不同应用进程。
TCP/IP的运输层 用一个16位端口号来标志一个端口。但请注意,端口号只具有本地意义,它只是为了标志本计算机应用层中的各个进程在和运输层交互时的层间接口。
在互联网不同计算机中 ,相同的端口号是没有关联的。
16位的端口号可允许有65535个不同的端口号。
服务器使用的端口号与客户端使用的端口号
服务器使用的端口号
客户端使用的端口号
分用和复用的运行
UDP的复用分用
运输层端口号举例
1.用户pc在浏览器输入web服务器域名,向DNS客户进程发送请求报文
2.DNS服务器收到报文后
3.PC收到DNS响应报文
4.用户PC中的HTTP客户进程向web服务器发送HTTP请求报文
5.Web服务器收到PC请求报文
6.PC接收到Web响应报文
数据协议报UDP
UDP的特点
(1)UDP是无连接的,即发送数据之前不需要建立连接(当然,发送数据结束时也没有连接可释放),因此减少了开销和发送数据之前的时延。
(2)UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态表
(3)**UDP是面向报文的。**发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。UDP对应用层交下来的报文,保留这些报文的边界。
这就是说,应用层交给UDP多长的报文,UDP 就照样发送,即一次发送一个报文
(4) UDP没有拥塞控制,因此网络出现的拥塞不会使源主机的发送速率降低。这对某些实时应用是很重要的。
很多的实时应用(如IP电话、实时视频会议等)要求源主机以恒定的速率发送数据,并且允许在网络发生拥塞时丢失一些数据,但却不允许数据有太大的时延。UDP 正好适合这种要求。
(5)UDP支持一对一、一对多、多对一和多对多的交互通信。
(6)UDP的首部开销小,只有8个字节,比 TCP的20个字节的首部要短。
UDP的传输特点
主机H的操作系统为这三个进程分别指派了端口。
应用层和运输层之间的小方框代表端口。在端口小方框中间还画有队列,表示端口具有缓存的功能,可以把收到的数据暂时存储一下。
在两个运输层之间有一条虚线,表示在两个运输层之间可以进行通信,**而不是一条连接。但这种通信是不可靠的通信,**即所发送的报文在传输过程中有可能丢失,同时也不保证报文都能按照发送的先后顺序到达终点。
图上画出了多对一的通信(a→x, b→x)。如果改成a→x,a→y,则是一对多的情况了。
UDP的复用分用
主机H1中的3个应用进程,把用户数据通过各自的端口传送到了运输层后,就共用一个网络层协议,把收到的UDP用户数据报组装成不同的IP数据报,发送到互联网。这就是UDP的复用功能。
主机H2的网络层收到3个IP数据报后,提取出数据部分(即 UDP用户数据报),然后根据其首部中的目的端口号,分别传送到相应的端口,以便上层的应用进程到端口读取数据。这就是UDP的分用功能。
UDP的首部格式
用户数据报UDP有两个字段:数据字段和首部字段。
首部字段只有8个字节,由4个字段组成,每个字段的长度都是2字节。
各字段意义如下:
(1)源端口 源端口号。在需要对方回信时选用。不需要时可用全0。
(2)目的端口 目的端口号。这在终点交付报文时必须使用 。
(3)长度
UDP用户数据报的长度,其最小值是8(仅有首部)。
(4)检验和
检测UDP用户数据报在传输中是否有错。有错就丢弃 。
伪首部: UDP用户数据报首部中检验和的计算方法有些特殊。在计算检验和时,要在UDP用户数据报之前增加12个字节的伪首部。
所谓"伪首部"是因为这种伪首部并不是UDP用户数据报真正的首部。只是在计算检验和时,临时添加在 UDP用户数据报前面,得到一个临时的UDP用户数据报。
检验和就是按照这个临时的UDP用户数据报来计算的,伪首部既不向下传送也不向上递交,而仅仅是为了计算检验和。
接收方UDP报文的端口号不正确
如果接收方UDP发现收到的报文中的目的端口号不正确(即不存在对应于该端口号的应用进程),就丢弃该报文,并由网际控制报文协议 ICMP 发送"端口不可达"差错报文给发送方。
UDP计算检验和
二进制反码求和末尾进位会回卷
传输控制协议TCP
TCP的主要特点
(1) **TCP是面向连接的运输层协议。**这就是说,应用程序在使用TCP协议之前,必须先建立TCP 连接。在传送数据完毕后,必须释放已经建立的TCP连接。
(2)每一条TCP连接只能有两个端点(endpoint),每一条 TCP连接只能定点对点的(一对一)。
(3)**TCP提供可靠交付的服务,**通过TCP连接传送的数据,无差错、不丢失、不重复,并且按序到达。
(4) **TCP提供全双工通信。**TCP允许通信双方的应用进程在任何时候都能发送数据。TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。
**在发送时,**应用程序在把数据传送给TCP的缓存后,就可以做自己的事,而TCP在合适的时候把数据发送出去;
在接收时 ,TCP把收到的数据放入缓存,上层的应用进程在合适的时候读取缓存中的数据。
(5)面向字节流。TCP中的"流"(stream)指的是流入到进程或从进程中流出的字节序列。
"面向字节流"的含义是:虽然应用程序和 TCP 的交互是一次一个数据块(大小不等) 。但TCP把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。TCP并不知道所传送的字节流的含义。
TCP不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系。
**但接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。**当然,接收方的应用程序必须有能力识别收到的字节流,把它还原成有意义的应用层数据。
(例如,发送方应用程序交给发送方的TCP共10个数据块,但接收方的TCP可能只用了4个数据块就把收到的字节流交付上层的应用程序)。
TCP传输报文的特点
TCP与UDP传输报文的比较
TCP和 UDP 在发送报文时所采用的方式完全不同。TCP并不关心应用进程一次把多长的报文发送到TCP的缓存中,而是根据对方给出的窗口值和当前网络拥塞的程度,来决定一个报文段应包含多少字节。(UDP发送报文长度应用进程给出的)。
如果应用进程传送到TCP缓存的数据块太长,TCP就可以把它划分为短一些的数据块再传送。如果应用进程一次只发来一个字节,TCP也可以等待积累足够多的字节后再构成报文段发送出去。
TCP的连接
TCP把连接作为最基本的抽象。TCP的许多特性都与TCP是面向连接的这个基本特性有关。
每一条TCP连接有两个端点,TCP连接的端点叫作套接字(socket)或插口。
套接字socket的表示方式
TCP连接的表示方式
可靠传输的工作原理
TCP报文段的首部格式
**TCP虽然是面向字节流的,但 TCP传送的数据单元却是报文段。**一个TCP报文段分为首部和数据两部分,而 TCP的全部功能都体现在它首部中各字段的作用。
首部部分字段
(1)源端口和目的端口: 各占2个字节,分别写入源端口号和目的端口号。
(2)**序号:**占4字节。序号范围是[0,-1],共(即4294 967296)个序号。序号增加到-1]后,下一个序号就又回到0。
在一个 TCP连接中传送的字节流中的每一个字节都按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置。首部中的序号字段值则指的是本报文段所发送的数据的第一个字节的序号。
例如,一报文段的序号字段值是301,而携带的数据共有100字节。这就表明:本报文段的数据的第一个字节的序号是301,最后一个子节的序号是400。
显然,下一个报文段(如果还有的话)的数据序号应当从401开始,即下一个报文段的序号字段值应为401。
这个字段的名称也叫作"报文段序号"。
(3)**确认号:**占4字节,是期望收到对方下一个报文段的第一个数据字节的序号。
例如,B正确收到了A发送过来的一个报文段,其序号字段值是501,而数据长度是200字节(序号501~700),这表明B正确收到了A发送的到序号700为止的数据。
于是B在发送给A的确认报文段中把确认号置为701。请注意,现在的确认号不是501,也不是700,而是701。
(4)**数据偏移:**占4位,它指出 TCP报文段的数据起始处距离 TCP报文段的起始处有多远。这个字段实际上是指出 TCP报文段的首部长度。
因此数据偏移的最大值是60字节,这也是TCP首部的最大长度(即选项长度不能超过40字节)。
(5)保留:占6位,保留为今后使用,但目前应置为0。
(6)**紧急 URG (URGent):**当URG=1时,表明紧急指针字段有效------它告诉系统此报
文段中有紧急数据,应尽快传送(相当于高优先级的数据),而不要按原来的排队顺序传送。当URG置1时,发送应用进程就告诉发送方的TCP有紧急数据要传送。 于是发送方TCP 就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍是普通数据。这时要与首部中紧急指针(Urgent Pointer)字段配合使用。
例如,已经发送了很长的一个程序要在远地的主机上运行。但后来发现了一些问题,需要取消该程序的运行。
因此用户从键盘发出中断命令(Control-C)。如果不使用紧急数据,那么这两个字符将存储在接收TCP的缓存末尾。只有在所有的数据被处理完毕后这两个字符才被交付接收方的应用进程。这样做就浪费了许多时间。
(7)**确认ACK:**仅当 ACK =1时确认号字段才有效。当ACK=0时,确认号无效。 TCP规定,在连接建立后所有传送的报文段都必须把ACK置为1。
(8)**推送 PSH (PuSH):**当两个应用进程进行交互式的通信时,有时在一端的应用进程
希望在键入一个命令后立即就能够收到对方的响应。在这种情况下,TCP 就可以使用推送(push)操作。这时,发送方TCP把PSH置为1,并立即创建一个报文段发送出去。
接收方TCP收到PSH=1的报文段,就尽快地(即"推送"向前)交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。
(9)**复位RST (ReSeT):**当RST =1时,表明TCP连接中出现严重差错(如主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。
将RST置为1,还用来拒绝一个非法的报文段或拒绝打开一个连接。RST也可称为重建位或重置位。
(10)**同步SYN(SYNchronization):**在连接建立时用来同步序号。
当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使SYN=1和ACK =1。
因此,SYN置为1就表示这是一个连接请求或连接接受报文。
(11)**终止FIN (FINish):**用来释放一个连接。
当FIN=1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。
(12)**窗口:**占2字节。窗口值是[0,-1]之间的整数。窗口指的是发送本报文段的一方的接收窗口(而不是自己的发送窗口)。
窗口值告诉对方:从本报文确认号算起,接收方目前允许对方发送的数据量(以字节为单位)。之所以要有这个限制,是因为接收方的数据缓存空间是有限的:
- 例如,发送了一个报文段,其确认号是701,窗口字段是1000。
- 这就是告诉对方:"从701号算起,我(即发送此报文段的一方)的接收缓存空间还可接收1000个字节数据(字节序号是701~1700),你在给我发送数据时,必须考虑到我的接收缓存容量。"
总之,窗口值作为接收方让发送方设置其发送窗口的依据。
(13)**检验和:**占2字节。检验和字段检验的范围包括首部和数据这两部分。
和UDP用户数据报一样,在计算检验和时,要在TCP报文段的前面加上12字节的伪首部
,伪首部的格式与UDP用户数据报的伪首部一样。但应把伪首部第4个字段中的17改为6(TCP 的协议号是6),把第5字段中的UDP长度改为TCP长度。
接收方收到此报文段后,仍要加上这个伪首部来计算检验和。若使用IPv6,则相应的伪首部也要改变。
(14)**紧急指针:**占2字节,紧急指针仅在URG =1时才有意义,它指出本报文段中
的紧急数据的字节数(紧急数据结束后就是普通数据)。因此,紧急指针指出了紧急数据的末尾在报文段中的位置。当所有紧急数据都处理完时,TCP就告诉应用程序恢复到正常操作。
(15)**选项:**长度可变,最长可达40字节。当没有使用"选项"时,TCP的首部长度
是20字节。选项功能有如下:
(16)填充:最后的填充字段仅仅是为了使整个TCP首部长度是4字节的整数倍。