传输层 UDP TCP 小结
传输层概述
- 面向通信部分的最高层,用户功能中的最低层。传输层位于网络层之上,网络层提供主机间的逻辑通信,传输层为不同主机上的进程(端到端)提供逻辑通信。
- 复用(发送方不同的应用进程使用同一个传输层协议传输数据);分用(接受方的传输层剥去报文后将数据交给正确的应用进程)
- 差错检测:首部和报文部分(网络层只检查IP数据报首部)。
- 提供两种不同的传输协议:面向连接的TCP(传输层向上提供全双工的可靠逻辑信道);无连接的UDP(传输层向上提供一条不可靠的逻辑信道)
注意:路由器在转发分组时都只用到了下三层的功能。在通信子网中没有传输层,传输层只存在于通信子网外的主机中。
UDP:
在IP数据报服务之上加了两个最基本的服务:复用和分组、差错检测
UDP无需建立连接,不用维护连接状态,而且分组首部开销小;面向报文,对应用层的报文加首部就向下交给IP层,接受方UDP对IP交上来的数据包去首部交给上层应用。
TCP:
TCP提供全双工通信,允许双方在任何时候都能发送数据,TCP连接的两端都设有发送缓存(准备发送的数据、已发送但未收到确认的数据)和接收缓存(按序到达但未被接收应用程序读取,不按序到达的数据)
TCP 与 UDP 区别:
TCP |
UDP |
面向连接,提供全双工通信,信道可靠 |
无连接,信道不可靠,可靠性交由应用层负责 |
TCP提供流量控制和拥塞控制 |
不提供流量控制和拥塞控制(UDP只是在IP数据报服务之上加了两个最基本的服务:复用和分组、差错检测) |
首部最短20个字节,开销大 |
首部8个字节,开销小 |
面向字节,每一个字节都会有一个编号 |
面向报文,报文不可分割(对于应用层交下来的报文,在添加首部后就向下交给IP层) |
适用可靠性更重要的场所:HTTP,FTP |
适用于速度快,实时性高的场景:DNS、IP电话、实时视频会议 |
TCP连接管理——三次握手
第一步:客户机的TCP向服务器的TCP发送一个连接请求报文段,该报文段不含应用层数据,其首部SYN同步位 置为1,客户机还会随机选择一个起始序号seq=x。(并进入SYN_SEND状态)
第二步:服务器的TCP收到连接请求报文段后,若同意连接则想客户端发回确认,并为该TCP连接分配TCP缓存和变量。在确认报文段中确认位ACK和同步位SYN都被置为1,确认号字段为x+1,服务器随机产生起始序号seq=y,确认报文也同样不包含应用层数据。(服务器进入SYN_RECV状态)
第三步:客户机收到确认报文段后,还要向服务器给出确认,此时客户机也要为该连接分配缓存和变量,该报文段的确认位ACK位被置为1,序号字段为x+1,确认号字段为ack=y+1。(ESTABLISHED)
【不使用二次握手的原因:主机A发出的连接请求没有收到主机B的确认,于是经过一段时间后,主机A又重新向主机B发送连接请求,且建立成功,顺序完成数据传输。考虑这样一种特殊情况,主机A第一次发送的连接请求并没有丢失,而是因为网络节点导致延迟达到主机B,主机B以为是主机A又发起的新连接,于是主机B同意连接,并向主机A发回确认,但是此时主机A根本不会理会,主机B就一直在等待主机A发送数据,导致主机B的资源浪费。】
TCP连接管理——四次挥手
第一步:客户机打算关闭连接,发送连接释放报文段,并停止发送数据并主动关闭TCP连接,报文段中的终止位FIN=1,序号可定为u。
第二步:服务器收到连接释放报文段即发出确认,确认位ACK=1,确认号ack=u+1,报文段本身序号定为v。此时客户机到服务器这个方向就释放了,TCP连接处于半关闭状态,但服务器发送数据,客户机仍要接受。
第三步:当服务器已经没有要向客户机发送的数据时,就通知TCP释放连接,此时会发出终止位FIN=1的连接释放的报文段。ACK=1,seq=w,ack=u+1。
第四步:客户机收到连接释放报文段后,必须发回确认,在确认报文段中,确认位字段ACK=1,确认号ack=w+1,序号seq为u+1。此时连接还没有释放掉,必须经过两个2MSL(报文最大生存时间)后,A才进入到连接关闭状态。【原因:保证最后发送的ACK到达。见https://www.zhihu.com/question/36930631】
TCP可靠传输
校验(同UDP),序号,确认(累计确认),重传(超时重传,冗余ACK)
关于冗余ACK:TCP规定当发送方收到对同一个报文段的三个冗余ACK时,就可以认为跟在这个被确认报文段之后的报文段已经丢失。会进行快速重传。
TCP流量控制:
基于滑动窗口协议,接受方根据自己的缓存大小,动态调整发送方的发送窗口大小,这就是接受窗口(rwnd),同时发送方根据其对当前网络拥塞程度的估计而确定的窗口值,称为拥塞窗口(cwnd)。发送窗口的实际大小取cwnd,rwnd的最小值。
传输层的滑动窗口可以动态变化,数据链路层的滑动窗口大小不能动态变化。
TCP拥塞控制
1.慢开始和拥塞避免:
慢开始:每经过一个传输轮次(往返时延RTT),拥塞窗口会加倍,即呈指数形式增长,一直增大到一个规定的慢开始门限,则使用拥塞避免算法。
拥塞避免:拥塞窗口每经过一个往返时延RTT就增加一个MSS(最大报文段长度MSS),使拥塞窗口的大小按照线性规律缓慢增长,而当超时时,门限为当前拥塞窗口的一半。拥塞窗口重新设置为1.
2.快重传和快恢复
快重传:当发送方收到三个重复的ACK报文时(丢了包自然代表网络出现了拥塞),直接重传对方未收到的报文段。
快恢复:当发送端收到连续三个冗余ACK时,把慢开始门限设置为出现拥塞时拥塞窗口的一半,而拥塞窗口的值即为慢开始门限的数值。
在流量控制中,慢开始、拥塞避免、快恢复、快重传应该是同时应用到拥塞控制机制中,当发送方检测到超时就采用慢开始和拥塞避免,当发送方接受到冗余ACK时就采用快重传和快恢复。