一、传输层提供的服务
1.1 传输层的功能
1.1.1 传输层的功能如下:
传输层提供应用进程之间的逻辑通信(即端到端的通信)。与网络层的区别是:网络层提供的是主机之间的逻辑通信。
1.1.2 复用和分用
传输层要还要对收到的报文进行差错检测(首部和数据部分)。而网络层只检测IP数据报的首部,不检验数据部分是否出错。
提供两种不同的传输协议,即面向连接的TCP和无连接的UDP。而网络层无法同时实现两种协议(即在网络层要么只提供面向连接的服务:虚电路...;要么只提供无连接的服务:数据报...
当传输层采用的是面向连接的TCP时,尽管下面的网络是不可靠的,但这种逻辑通信的信道就相当于一条全双工的可靠信道。但当传输层采用无连接的UDP服务时,这种逻辑通信仍然是不可靠的信道。
1.2 传输层的寻址与端口
1.2.1 端口的作用
端口能够让应用层的各种应用进程将其数据通过端口向下交付给传输层,以及让传输层知道应当将其报文段的数据向上交付给应用层相应的进程。端口时传输层服务访问点,它在传输层的作用类似于IP地址在网络层的作用或MAC在数据链路层的作用,只不过IP地址和MAC地址标识的是主机,而端口标识的是主机中的应用进程。
1.2.2 端口号
应用进程通过端口号进行标识,端口号的长度为16bit,能够表示65536个不同的端口号。端口号只具有本地意义,即端口号只标识本计算机应用层中的各进程。
根据端口号的范围将端口号分为两类:
- 服务器端使用的端口号:其又分为两类,最重要的是熟知端口号,数值为0~1023;另一类是登记端口号,数值为1024~49151。它是供没有熟知端口号的应用进程使用的,必须进行登记,以防重复。
- 客户端使用的端口号,短暂性端口号,可以让客户进程反复使用
1.2.3 套接字
在网络中通过IP地址来标识和区别不同的主机,通过端口号来标识和区分一台主机中的不同应用进程,端口号拼接到IP地址即构成了套接字Socket。套接字,实际上是一个通信断点
套接字Socket = IP地址 + 端口号,可以唯一地标识网络中的一台主机和其上的一个应用进程。
1.3 无连接服务和面向连接服务
面向连接服务就是在通信双方进行通信之前,必须建立连接,在通信过程中,整个连接的情况一直被实时地监控和管理。通信结束后,必须释放连接。
无连接服务是指两个实体之间的通信不需要先建立好连接,需要通信时,直接将信息发送到"网络"中,让该信息的传递在网上尽力而为地往目的地传送。
TCP提供面向连接的服务,在传送数据之前必须建立连接,数据传送结束后要释放连接。TCP不提供广播或组播服务。TCP主要适用于可靠性更重要的场合:文件传输协议(FTP),超文本传输协议(HTTP),远程登陆(TELNET)
UDP是一个无连接的非可靠传输协议。它在IP之上提供了两个附加服务:多路复用和对数据的错误检查。使用UDP的应用主要包括小文件输送协议(TETP),DNS,SNMP和实时传输协议(RTP)。
IP数据报和UDP数据报的区别:
IP数据报在网络层要经过路由的存储转发;而UDP数据报在传输层的端到端的逻辑信息中传输,封装成IP数据报在网络层中传输时,UDP数据报的信息对路由是不可见的。
TCP和网络层虚电路的区别:TCP报文段在传输层抽象的逻辑信道中传输,对路由器不可见;虚电路所经过的交换节点都必须保存虚电路状态信息,在网络层中若采用虚电路方式,则无法提供无连接服务;而传输层采用TCP不影响网络层提供无连接服务。
二、UDP协议
2.1 UDP数据报
2.1.1 UDP概述
UDP仅在IP数据报服务之上增加了两个最基本的服务:复用和分用以及差错检测
UDP的优点:
- UDP无须建立连接
- 无连接状态
- 分组首部开销小
- 应用层能更好地控制要发送的数据和发送时间
- UDP支持一对一,一对多,多对一和多对多的交互通信
- UDP是面向报文的。报文是不可拆分的,是UDP数据报处理的最小单位。
2.1.2 UDP的首部格式
UDP数据报包含两个部分:UDP首部和用户数据。
UDP首部有8B,由四个字段组成:
- 源端口:源端口号,在需要对方回信时使用,不需要时可用全0
- 目的端口:目的端口号,在终点交付报文时必须使用到
- 长度:UDP数据报的长度(包括首部和数据)其最小值是8(仅有首部)
- 检验和:检测UDP数据报在传输中是否有错,有错就进行丢弃。该字段是可选的,如果计算机不想计算校验和时,则直接使这些校验和为0。
2.2 UDP校验
在计算校验和之前,要在UDP数据报之前增加12B的伪首部,临时添加在UDP数据前面,将UDP数据报视为许多个16位的字串,将这些16位数进行无进制相加,最后按二进制反码求这些16位字的和。
注意:
检验时,若UDP数据报部分的长度不是偶数字节,则需填入一个全0字节。但是此字节和位首部一样是不发送的
如果UDP校验和校验出UDP数据报是错误的,那么可以丢弃,也可以上传,但是要附上错误报告,告诉上层这是错误的数据报。
通过伪首部,不仅可以检查源端口号,目的端口号和UDP用户数据报的数据部分,还可以检查IP数据报的源IP地址和目的地址。
三、TCP协议
3.1 TCP协议的特点
- TCP连接是面向连接的传输层协议,TCP连接是一个逻辑连接
- 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点(一对一)
- TCP提供可靠传输服务,保证传输的数据无差错,不丢失,不重复且有序
- TCP提供全双工通信,允许通信双方的应用进程在任何时候都能发送数据,为此TCP连接的两端都设有发送缓存和接受缓存,用来临时存放双向通信的数据
- TCP是面向字节流的,虽然应用程序和TCP的交互是一次一个数据快(大小不等)但TCP把应用程序交下来的数据仅视为一连串无结构的字节流。
3.2 TCP报文段
TCP传送的数据单元称为报文段。TCP的报文段既可以用来运载数据,又可以用来建立连接、释放连接和应答。一个报文段分为首部和数据两个部分,整个TCP报文报作为IP数据报的数据部分封装到IP数据报中,其首部的前20B是固定的。TCP首部最短为20B,后面有4N字节是根据需要而增加的选项,长度为4B的整数倍。
TCP的全部功能体现在其首部的各个字段中,各字段的意义是:
源端口和目标端口
序号
确认号
数据偏移
保留
紧急位
确认位ACK
推送位PSH
复位位RST
同步位SYN
终止位FIN
窗口
检验和
紧急指针
选项
填充
3.3 TCP连接管理
TCP是面向连接的协议,因此每一个TCP连接都有三个阶段:连接建立,数据传送,连接释放。TCP连接的管理就是使运输连接的建立和释放都能正常进行。
在TCP建立连接的过程中,我们需要解决一下三个问题:
- 要使每一方能够确定对方的存在
- 要允许双方协商一些参数
- 能够运输实体资源进行分配
3.3.1 TCP连接的建立(3次握手)
建立连接前,服务器进程处于LISTEN状态,等待客户的连接请求
第一步,客户机的TCP首先向服务器的TCP发送连接请求报文段。
第二步,客户机的TCP收到确认报文段后,还要向服务器给出确认,并为该TCP连接分配缓存和变量
第三步,当客户机收到确认报文段后,还要向服务器给出确认,并为该TCP连接分配缓存和变量。
3.3.2 TCP连接的释放(4次握手)
第一步,客户机打算关闭连接时,向其TCP发送连接释放报文段,并停止发送数据,主动关闭TCP连接。该报文段的终止位FIN置1,序号seq = u,它等于前面已传送过的数据的最后一个字节的序号+1,FIN报文段即使不携带数据,也消耗一个序号。
第二步,服务器收到解释报文段后发出确认
第三步,若服务器已经没有要向客户机发送的数据,就通知TCP释放连接
第四步,客户机收到连接释放报文段后,必须发出确认。
3.4 TCP的可靠传输
TCP的任务是在IP层不可靠的、尽力而为服务的基础上,建立一种可靠的数据传输服务。TCP使用; 校验、序号、确认和重传等机制来达到这一目的。
3.4.1 序号
TCP首部的序号字段用来保证数据能有序地提交给应用层,TCP把数据视为一个无结构但有序的字节流,序号建立在传送的字节流上。
3.4.2 确认
TCP首部的确认号是期望收到对方的下一个报文段的数据的第一个字节的序号。发送缓存区会继续存储那些已发送但未接收到确认的报文段,以便在需要时重传。
TCP默认使用累积确认,即TCP只确认数据流中至第一个丢失字节为止的字节。
3.4.3 重传
3.4.3.1 超时重传
TCP每发送一个报文段,就对这个报文段设置一个计时器。计时器设置的重传时间到期但还未收到确认时,就要重传这个报文段。
为了计算超时计时器的重传时间,TCP采用了一种自适应的算法,它记录一个报文段发出的时间,以及收到相应确认的时间,这两个时间之差称为报文段的往返时间。
3.4.3.2 冗余ACK(冗余确认)
发送方通常可以在超时事件发生之前通过所谓的冗余ACK来较好的检测丢包情况。冗余ACK就是再次确认某个报文段的ACK,而发送方先前已经收到了该报文段的确认。TCP规定每当比期望序号大的失序报文段到达时,就发送一个冗余ACK,指明下一个期待字节的序号。
TCP规定当发送方收到对同一个报文段的3个冗余ACK时,就可以认为跟在这个被确认报文段之后的报文段已经丢失。
3.5 TCP的流量控制
TCP提供流量控制服务来消除发送方(发送速度太快)使接收方缓存区溢出的可能性,因此,可以说流量控制是一个速度匹配服务(匹配发送方的发送速率和接收方的接收速率)
3.6 TCP的拥塞控制
拥塞控制和流量控制的区别:拥塞控制是让网络能够承担先有的网络负荷,是一个全局性过程,涉及所有主机,所有路由器,以及与见地网络传输性能有关的所有因素。相反,流量控制往往是指点对点的通心量的控制,是一个端到端的问题,它所要做的是抑制发送端发送数据的速率,以便接收端来得及接收。
TCP协议要求发送发维护一下两个窗口:接收窗口和发送窗口
- 接收窗口:
- 发送窗口:
3.6.1 慢开始和拥塞避免
3.6.1.1 慢开始
在TCP刚刚好连接好并开始发送TCP报文段,先令拥塞窗口cwnd = 1,即一个最大报文段长度MSS,每收到一个对新报文段的确认后,将cwnd + 1,即增大一个MSS。从1->2->4->8...
慢开始到了一个规定的慢开始门限,然后改用拥塞避免算法。
3.6.1.2 拥塞避免算法
拥塞避免算法的思路是让拥塞窗口cwnd慢慢增大,具体做法是:让拥塞窗口cwnd按线性规律缓慢增长,
3.6.1.3 网络拥塞的处理
当出现网络拥塞,就要把慢开始门限设置为出现拥塞时的发送方的cwnd的一半,但不能小于2。
3.6.2 快重传和快恢复
3.6.2.1 快重传
当发送方连续收到三个重复的ACK报文,直接重传对方尚未收到的报文段,而不必等待那个报文段设置的重传计时器超时。
3.6.2.2 快恢复
快恢复算法:当发送方连续收到三个重复的ACK报文,执行:乘法减小:算法,把慢开始门限设置为此时发送方cwnd的一半,开始执行线性增长。