功能概述
- 负责进程之间(即端到端)的逻辑通信。
- 复用:不同的发送进程都能用同一个传输层协议。
- 分用;接收方的传输层在收到数据报后能正确向不同的上层应用交付。
- 差错检测。
UDP
UDP协议只在IP数据报服务上增加了复用分用和差错检测的功能。
特点
- 无连接、减少开销和发送数据前的时延。
- 尽力交付而不保证可靠传输。
- 面向报文,无论应用层发多大的报文,在传输层都不切片。
首部
校验
计算校验和时,要在UDP数据报之前添加12B的伪首部,伪首部仅供计算校验和使用,既不下传也不上交。
格式如下:
既检验了UDP数据报,也检验了源IP和目的IP,优点是简单,处理速度快,缺点是功能不强。
TCP
特点
- 面向虚连接
- 每条连接都是点对点的。
- 提供可靠交付(无差错、不丢失、不重复、按序到达)的服务。
- 提供全双工通信。每方都有一个发送缓存(存储待发送的数据、已发送但未收到确认的数据)和一个接收缓存(按序到达但尚未被读取的数据、未按序到达的数据)。
- 面向字节流:把应用层交付下来的数据看作是无结构的字节流。
首部
6个控制位:
窗口:发送报文一方的接收窗口大小,即允许对方发送的数据量。
校验和:校验首部及数据。
紧急指针:本报文段中紧急数据的字节数。
三次握手
- SYN=1 说明这是一个连接请求报文段,然后产生一个随机序号 seq=x。
- SYN=1 说明本机可以接受连接请求,ACK=1 说明确认号字段有效,确认号ack=x+1,说明期望收到的下一个报文的序号为x+1,然后给本报文产生一个随机序号 seq=y。
- 从此报文开始就可携带数据了。ACK=1 说明确认号字段有效,确认号ack=y+1,说明期望收到的下一个报文的序号为y+1,然后给本报文产生序号x+1。
四次挥手
- FIN=1,客户端请求释放连接,序号为u。
- ACK=1,ack=u+1,服务器对客户端的连接释放请求予以确认,客户端-服务器方向的单向连接关闭。
- 服务器发送完数据之后,也请求释放连接。
- 客户端对服务器的连接释放请求予以确认,发送完确认之后,等待2MSL(最长报文段寿命)。考虑最坏情况,经过1MSL,确认报文在即将到达服务器时丢失,服务器将重新请求释放连接,经过1MSL到达客户端。所以2MSL是用于防止确认丢失的。
可靠传输
可靠:保证接收方进程从缓冲区读出的字节流与发送方发出的字节流是完全一样的。
TCP 靠四种手段实现可靠传输:校验、序号、确认、重传。
校验
增加伪首部用于校验。
序号
每一个字节都有一个编号,此处的序号是指一个TCP报文段的第一个字节的编号。
假设主机A上的一个进程想通过一条TCP连接向主机B上的一个进程发送一个数据流。主机A中的TCP将隐式的对数据流中的每一个字节编号。假定数据流由一个包含500000字节的文件组成,其MSS为1000字节,数据流的首字节编号是0。如图所示,该TCP将为该数据流构建500个报文段,给第一个报文段分配序号0,第二个报文段分配序号1000,第三个报文段分配序号2000,以此类推。每一个序号被填入到相应TCP报文段首部的序号字段。
确认
累计确认:接收方对发送方发送的数据采用累计确认的方式,向发送方发送的确认报文的确认字段实质是期望接收到的下一个报文的序号。
冗余确认:当接收方收到了一个比期望序号大的报文段,则向发送方发送一个冗余ACK,即向其重申自己期望收到的下一个报文的序号。
重传
若发送方在规定的时间内(重传时间)没有收到确认就要重传已发送但未收到确认的报文段。
TCP采用自适应算法,动态改变重传时间RTTs(加权平均往返时间),使得其不至于过长或过短。
流量控制
动态控制发送方的发送速度,既要保证速率,也要使其不至于发送太快而使接收方来不及接收。
滑动窗口机制:
接收方在确认报文中的窗口字段中,将自己的接收窗口大小通知发送方,发送方的发送窗口大小取 min(rwnd, cwnd)。
缺陷:发送方收到接收方发来的零窗口通知后,发送方等待接收方发送rwnd > 0的通知,若接收方发送的此通知丢失,则会陷入双方互相等待的困境。
解决:若发送方收到零窗口通知,则启动计时器,计时器到期后,发送方发送一个零窗口探测报文段,接收方收到后回复自己当前的接收窗口大小,若仍是0,则发送方重置计时器,若 > 0,则发送方开始发送数据。
拥塞控制
相比于点对点的流量控制,拥塞控制是全局性的,控制所有发送方的发送速率以免影响网络性能。
拥塞窗口:发送方对当前网络拥塞程度作出估计,然后设置拥塞窗口大小,反映了当前网络的容量。
传输轮次:
注意区分传输轮次和一个回复确认ack,每收到一个ack则cwnd加一,一批报文段全部收到回复后就相当于进行了一次指数增大。
慢开始门限值(ssthresh):cwnd的值在小于此值时,每一个传输轮次后cwnd均以指数规律增长;到达此门限值后,进入拥塞避免阶段,每一个传输轮次中cwnd以加法增大。
常用的拥塞控制算法有:慢开始-拥塞避免算法和快重传-快恢复算法。
为了讨论方便,只在以下假定下讨论:
- 单向发送,且另一方只回复确认。
- 接收方的缓冲空间无限大,则发送窗口的大小只取决于拥塞程度。
慢开始-拥塞避免
慢开始:发生拥塞后,cwnd重置为1。
网络拥塞时的处理:传输进入乘法减小阶段,发送方拥塞窗口重置为1,修改ssthresh为拥塞发生时cwnd的一半,继续慢开始。
快重传-快恢复
第一二阶段与慢开始-拥塞避免算法完全一样。
收到三个冗余ACK后视作网络拥塞,处理为:修改ssthresh,cwnd乘法减小,但不是减为1,而是直接降至新的ssthresh后继续开始加法增大(即所谓快恢复),如此往复。