《计算机网络——自顶向下方法》读书笔记——运输层(UDP、TCP、滑动窗口)
UDP:首部8字节
只提供最低限度的服务,多路分解、多路复用和差错检验。多路复用是从不同的套接字收集数据并发送,多路分解是将接收到的数据交付到不同的套接字。UDP的套接字是目的IP和目的端口号的二元组,而TCP的套接字是源、目的IP和端口号的四元组。
缺点:没有流量控制和拥塞控制,丢包率高,不可靠;优点:无连接,没有建立连接的时延,首部小。
可以在应用层实现可靠传输,将包分片、累积确认、重传等功能放在应用层实现。
滑动窗口协议(流量控制、差错控制):
用于流量控制和差错控制,发送方已发出但未经确认的包的大小不能超过接收方缓冲区的大小。
双方有各自的序号、缓存、窗口大小,通过ACK和重传保证可靠性,各自维护发送和接收窗口,有如下三种基本的滑动窗口协议:
(1)停等协议:窗口大小为1的滑动窗口协议
(2)回退N步:如果一个分组的ACK超时,重传该分组和之后的所有分组,采用累积确认
(3)选择重传:接收方缓存乱序分组,不使用累积确认,窗口大小要≤序号空间的一半,否则无法判断是一次重传还是新的分组。如图,窗口大小为3,序号空间为4,对接收方来说两种情况是一样的,无法判断分组0是重传还是新的分组。
TCP是在选择重传的基础上加了累积确认,累积确认会延迟一会发送ACK,减少ACK报文的数量。
TCP:基于序号、确认号、累积确认、滑动窗口(缓存乱序分组、流量控制、重传)、拥塞控制等机制
1、报文头,首部有固定的20字节,再加上选项
序号:本数据报文中第一个字节的序号
确认号:希望收到的下一个数据报文中的第一个字节的序号
数据偏移:表示本报文数据段距离报文段有多远
RST|SYN|FIN:用于连接的建立与拆除,如果端口不接受连接,RST置为1
窗口:根据缓存空间确定接收方的接收窗口的大小,用于流量控制
2、拥塞控制(加性增,乘性减)
TCP会根据每个数据包的RTT估计往返时间,设置超时间隔,每次超时会将超时间隔加倍
快速重传:收到3个冗余ACK,则重传该ACK的下一个报文段。因为2次冗余ACK可能是IP路由等原因产生的分组乱序,3次冗余ACK的话丢包的可能性较大。
拥塞控制是端到端的,IP层不提供拥塞控制。流量控制主要是控制端到端的速率,保证接收方可以正常接收数据;拥塞控制主要是控制全局网络的速率。没有显示的拥塞控制指令,ACK和丢包(三次冗余ACK)充当信号。分为三部分:
(1)慢启动
cwnd(拥塞窗口)通常设置为1个MSS,初始发送速率为MSS/RTT,对于每个ACK窗口增加一个MSS,每经过一个RTT,cwnd翻倍。
当cwnd<ssthresh(慢启动阈值)时慢启动,cwnd>ssthresh时拥塞避免(线性增长)
(2)拥塞避免
每经过一个RTT窗口大小增加1个MSS,收到3个冗余ACK将ssthresh的值记录为cwnd的一半,在慢开始和拥塞避免阶段,只要收到3个冗余ACK就将ssthresh减为cwnd的一半,cwnd置为1,重新慢开始
(3)快速恢复
收到3个冗余ACK后,ssthresh减为cwnd的一半,cwnd不是置为1,而是从ssthresh开始增长,重新进入拥塞避免阶段
3、三次握手和四次挥手
三次握手:为什么是三次,抽象一点的解释:第一次B(接收方)知道A(发送方)能发,第二次A知道B能收发,第三次B知道A能收,经过三次握手,双方都知道了对方能收发,可以通信。假如是两次:第一次握手超时,再发送SYN建立连接,然后服务器收到了超时的握手建立了连接,客户端不会再响应,浪费了服务器资源。
四次挥手:TIME_WAIT状态持续两个MSL,MSL是IP数据包在互联网上生存的最大时间,可以重传丢失的ACK,典型值为30s,1min,2min。保证重新生成的socket不受到之前残留的延迟重发报文的影响