第五章 运输层
1.运输层的功能:为应用进程之间提供端到端的逻辑通信,为应用层提供通信服务。(网络层是为主机到主机之间提供逻辑通信)
2.运输层的两个重要协议:用户数据包协议UDP和传输控制协议TCP
3.运输层的端口(协议端口号)
(1) 软件端口时是应用层的各种协议进程与运输实体进行层间交互的一种地址
(2) 服务器端口号:熟知或系统端口号0~1023,登记端口号1024~49151
(3) 客户端端口号:49151~65535 短暂端口号,仅在客户进程运行时才动态选择
4.用户数据报协议UDP
4.1 特点:
- UDP时面向无连接的,不需要建立连接就可以传输数据
- UDP尽最大可能交付,不保证可靠交付
- UDP是面向报文,对应用层传输的报文添加首部后就直接发送,不合并不拆分
- UDP没有拥塞控制
- UDP支持一对一,一对多,多对一,多对多
- UDP首部八个字节,开销小
4.2 UDP首部格式:源端口|目的端口|长度|校验和
4.3 计算校验和:和IP数据报首部校验和一样,反码算术运算
5.传输控制协议TCP
5.1 特点:
- TCP时面向连接的,先建立TCP连接才能传输数据,传输完成需要释放以及建立的TCP连接
- TCP连接两个端口(套接字),点对点
- TCP提供可靠交付
- TCP提供全双工通信
- TCP是面向字节流,TCP根据对方给出的窗口值和网络拥塞状况来决定一个数据报的长度,如果缓存数据太长则划分短一些再传送,如果数据太短,则等待积累更多后一起传送。
套接字socket = (IP地址:端口号) , TCP连接:: = {socket1,socket2} = {(IP1:port1),(IP2:port2)}(指两个端口的套接字)
5.2 可靠的传输原理
(1) 停止等待协议:(在不可靠的传输网络上实现可靠传输)(自动重传请求ARQ)
- 无差错情况:A发送一个分组M1,B收到向A确认,A继续发送分组M2,依次下去….直到全部发送完。
- 出现差错:B接受分组出现差错则直接丢弃,A没有收到确认消息,就一直等待,直到超时重传。A发送一个分组都会暂时保留这个分组的副本,为发生超时重传时使用;分组和确认分组必须编号,确认哪些收到哪些没有收到;超时计时器必须比数据在分组传输的平均往返时间更长一些。
- 确认丢失和确认迟到:B的确认M1消息丢失了,A超时重传M1,B收到后丢弃重复的M1,重传确认M1;B的确认M1消息迟到了,A重传后也收到确认了,这个时候迟到的确认M1来了,A收到后丢弃。
- 信道利用率:总时间 = A的发送时间TD+往返时间RTT+确认消息发送时间TA。信道利用率 = A的发送时间TD/总时间。往返时间一般远大于发送时间,故信道利用率极低!
5.3 连续ARQ协议:维持一个滑动窗口,收到一个确认分组后就向前滑动窗口,发送下一个分组。
Tips:接收方不必对没有分组都进行确认,而是采取累积确认的方法,对按需到达的最后一个分组发送确认。注意这里如果中间丢失了一个分组M,接收方只能接受M前面的分组确认,发送方只能回退到丢失的M分组位置,对后面的分组再一次发送!
5.4 TCP报文的首部格式P194
5.5 TCP可靠传输的实现
(1) 以字节为单位的滑动窗口:维护一个发送窗口和接受窗口,发送窗口根据收到的确认序号不断更新发送窗口,其内部有三个指针,依次指向窗口的起始序号,窗口已发送字节尾部序号,窗口允许发送的尾部序号,这三个指针不断更新;接受窗口则按序接受数据,并发送按序接受的最高序号的确认信息。具体过程参考书中P197
(2) 超时重传时间的选择
记录每个报文的往返时间RTT,TCP保留一个加权平均往返时间RTTs。超时重传的时间RTO = RTTs+4×RTTd,RTTd为RTT的偏差的加权平均值。
Karn算法:在计算加权平均RTTs时,只要报文段重传了,就不采用其往返时间样本,这样得出的加权平均RTTs和RTO就较准确。而后提出了karn的修正方法,只要报文段重传了,就取新的重传时间为2倍的旧的重传时间。
(3) 选择确认SACK
TCP接受方收到的数据字节流不连续,通过选择确认,让发送放只重传缺少的数据,而不是重传所有没有收到确认的数据。
5.6 TCP的流量控制(让发送方的发送速率不要太快,要让接收方来得及接收)
(1) 利用滑动窗口控制流量:发送方的发送窗口不能超过接收方给出的接受窗口的数值
(2) 传输效率:TCP要控制发送缓存发送的时机来保证传输效率。
- 缓存数据到达MSS就组成TCP报文发送出去
- 发送方应用进程指明要求发送的报文段,用TCP支持的推送push操作
- 发送方计时期限到了就把已有的缓存发送出去,但必须小于最长报文段长度MS
- Nagle算法:先发送第一个字节,收到确认后再把缓存中的数据组成TCP报文发送出去
- 解决糊涂窗口综合症:发送方不发送很小的报文段的同时,接收方也不要在缓存只有一点的时候就发送确认信息给发送方
5.7 TCP的拥塞控制
(1) 拥塞控制的概念:防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载
(2) 拥塞的几种状态:
- 轻度拥塞:当网络的吞吐量明显小于理想的吞吐量时进入轻度拥塞
- 拥塞状态:当提供的负载达到某一数值时,网络的吞吐量反而随提供的负载的增大而下降时进入拥塞状态
- 死锁:当提供的负载继续增大到某一数值时,网络的吞吐量就下降到零,网络已无法工作,则进入死锁
(3) 开环和闭环控制
- 开环控制:在设计网络时事先将有关发生拥塞的因素考虑周到,力求网络在工作时不产生拥塞
- 闭环控制:监测网络系统以便监测拥塞在何时何处发生;把拥塞发生的信息传送到可采取行动的地方;调整网络系统的运行以解决出现的问题
(4) 控制拥塞的方法:
- 慢开始和拥塞避免
慢开始:由小到大增加发送窗口和拥塞窗口(cwnd小于等于发送窗口),每次都乘以2;拥塞避免:当拥塞窗口超过慢开始门限ssthresh后,让拥塞窗口缓慢增大,即每经过一个RTT就加1(即加法增大)。如果网络发生超时,即有可能发生拥塞,就将ssthresh减小为cwnd的一半(乘法减小)。
- 快重传和快恢复
快重传:每收到一个失序的报文段就立即发出重复确认,使发送方及早知道有报文段没有到达对方,二不要等待自己发送数据时进行捎带;快恢复:执行乘法减小时,把ssthresh减小一半后不执行慢开始把cwnd设置为1,而是把cwnd设置为慢开始门限ssthresh减半后的数值,然后开始执行拥塞避免算法。
(5) 发送方窗口的上限值 = Min[rwnd,cwnd]
5.8 随机早期检测RED(分组丢弃策略)
(1) 尾部丢弃策略:路由器的队列满了之后,以后到达的分组就直接丢弃
(2) 维持两个参数:THmax和THmin,采用加权平均计算平均队列长度Lav,当Lav小于THmin就加入到队列,若大于THmax则直接丢弃,若大于THmin小于THmax就以概率p丢弃。
(3) 好处:当Lav超过THmin时只会有少量分组被丢弃,使得少量TCP减小其窗口值,进而使得到达路由器的分组就变少了,因此Lav减小,从而避免了网络拥塞
5.9 TCP的运输连接管理
(1) 客户和服务器:主动发起连接的叫客户,被动等待连接的叫服务器
(2) TCP的连接建立:
- Client的TCP向Server发出连接请求报文,其首部的同步位SYN=1,序号seq = J,Client进入SYN-SENT状态
- Server收到连接请求报文后,如果同意连接,就发送确认报文。其首部的SYN和ACK都置为1,同时选择一个序号seq = K,确认号为ACK = J+1,Server进入SYN-REVD状态,
- Client收到Server发出的确认报文后,还要向Server发出确认报文,其首部ACK=1,确认号为K+1,序号为J+1,然后Client进入ESTABLISHED状态,即建立连接
- Server收到Client发出的确认报文后,立即进入ESTABLISHED状态,双方可以开始传输数据
(2) TCP的连接释放:
- Client先向其TCP发出连接释放请求,并停止发送数据。其TCP报文的首部FIN=1,序号seq=u(前一个发送数据的序号+1),这是Client进入FIN_WAIT1状态
- Server收到Client发来的连接释放请求后,立即发出确认,确认号ack = u+1,序号seq=v,并把ACK置1,Server进入CLOSE-WAIT状态
- Client收到确认报文后,进入FIN_WAIT2状态,等待Server发出连接释放请求
- Server等待其数据发送完后,其应用程序就通知TCP释放连接,其首部FIN=1,ACK=1,seq=w,ack=u+1,进入LAST-ACK最后确认状态
- Client收到Server的连接释放请求后,必须对此确认,其报文首部ACK=1,ack=w+1,seq=u+1,然后进入TIME-WAIT状态,
- Server收到Client的确认报文后,进入CLOSED状态,Client等到2MSL后进入CLOSED状态。
Tips:为什么要等到2MSL?
答案:一是为了保证最后发出的确认报文能够到达Server,避免Server没有收到FIN+ACK报文超时重发后Client能收到并重发确认报文;二是避免已发送的连接请求报文段出现在本连接中,经过2MSL能让本连接持续的时间内所产生的所有报文都从网络中消失,在下一个连接中不会出现旧的连接请求报文。