零、TCP与UDP区别
- TCP
- 面向连接(逻辑连接关系):发送数据前需要建立连接,完事后也需要释放连接
- 仅支持单播
- 面向字节流:不分包,看作一连串无结构的字节流
- 可靠传输,流量控制与拥塞控制
- 首部:20-60字节
- UDP
- 面向无连接:不需要维护连接状态,随时发送数据
- 支持单播、多播、广播
- 面向应用报文:对应用层报文加上UDP首部,直接发送
- 不可靠传输:尽最大努力传输,如果出错,仅丢弃
- 首部:8字节
一、流量控制
- 为什么需要流量控制
- 发送方与接收方的速度不一定匹配,如果发送方过快,接收方过慢,则可能发生数据包丢失
- 滑动窗口机制
- 接收方通过发送窗口限制控制发送方传输的传输窗口
- 会产生死锁
- 发生情形:接收方发给发送方的窗口数据报文丢失了,发送方在等待一个非零窗口值,接收方在等待发送方新的数据
- 持续计时器:TCP为每个连接设定一个持续计时器,持续计时器超时,发送方发送一个零窗口探测报文(1字节数据),接收方给出当前窗口值
- 如果零窗口探测报文丢失怎么办?
- 零窗口探测报文也有重传计时器
二、拥塞控制
-
什么是拥塞
- 网络中需求的资源供大于求,网络性能就会变差
- 当网络负载到达一定限额时,吞吐量将不会继续增大,甚至减小
- 拥塞控制的死锁:随着网络负载的变大,网络的吞吐量会逐步降低,从轻度拥塞要重度拥塞,直至吞吐量为0,进入死锁
-
拥塞控制算法(发送方维护拥塞窗口cwnd,慢开始门限ssthresh)
- 慢开始
- 1—慢开始门限:指数增长
- 拥塞避免
- 门限—发生重传:线性增长
- 发生重传后,门限值需要变为当前值的一半
- 快重传
- 原因:重传不一定说明网络拥塞了,尽量减少这种误判的影响
- 尽快重传,不要等到重传计时器到了才重传,不会误认为拥塞了
- 快恢复
- 发送方收到三个连续确认,就知道有一个漏了,不用慢开始,而是执行快恢复
- 门限值变为一半,窗口值也减少到一半,进入拥塞避免
- 慢开始
-
拥塞窗口与滑动窗口的区别
- 区别与联系
流量控制与拥塞控制的区别。为什么要把流量控制与拥塞控制分为两个名词?
- 滑动窗口取决于接收端的缓存大小,拥塞窗口取决于当前网络的负载能力。滑动窗口位于传输层(区别于数据链路层的),拥塞控制更关注网络层
三、可靠传输
- TCP基于以字节为单位的滑动窗口来实现可靠传输
- 发送方的发送窗口与接收方的接收窗口在同一时间不一定一样大,会有延迟
- 对于不按序到达的数据,会放在缓存里,不会丢弃
- 接收方:累计确认与捎带确认
四、连接建立
- 三报文握手
- 客户A 发送 连接请求报文 (SYN=1, seq=x) 不携带数据
- TCP服务器B 发送 请求确认报文段 (SYN=1, ACK=1, ack=x+1,seq=y)不携带数据
- 客户A 发送 TCP确认报文段 (ACK=1, seq=x+1,ack=y+1) 可携带数据
- 为什么客户A最后要发送一个确认报文段?
- 假设是两报文握手,那么假如客户A的连接请求中途被长时间滞留,所以客户A重新发送了一个连接请求,与服务器通过两报文握手后成功交互至连接释放,但被滞留的连接请求到达服务器时,服务器误以为有一个新的连接,于是向客户A发送请求确认报文,但始终得不到客户的返回,进入死锁
五、连接释放
- 保活计时器
- 确保客户在线,每当服务器接收到客户的数据,就重新设置保活计时器
- 当保活计时器到时,服务器会发送探测报文段,假如连续发送10个报文都无响应,则服务器关闭连接
- 四报文挥手
- 客户A 发送 连接释放报文 (FIN=1, ACK=1,seq=u,ack=v)
- 服务器 发送 确认释放报文 (ACK=1,seq=v,ack=u+1)
- 服务器 发送 连接释放报文 (FIN=1,ACK=1,seq=w,ack=u+1)
- 客户A 发送 确认释放报文 (ACK=1,seq=u+1,ack=w+1)
- 服务器已关闭连接
- 客户A等到2MSL后关闭
- 为什么等待2MSL后才关闭?
- 假设客户的最后一条确认释放报文丢失了,但客户已关闭连接,TCP服务器会将之前发送的连接释放报文进行超时重传,但此时客户无响应,进入死锁