计算机网络基础之传输层

1.传输层作用

  • 传输层实现应用进程间的端到端(end-to-end)通信

  • 向应用层提供通信服务

2.多路分解与复用

  • 多路复用:所有应用进程的数据通过传输层传输到IP层;

  • 多路分解:传输层收到的数据交付给相应的应用进程。

3.用户数据报协议UDP

端到端的、尽力而为的、无连接的数据报传输服务 1.无连接的 2.尽最大努力交付,即不保证可靠交付 3.面向报文的(在IP的功能上简单扩展了端到端) 4.没有拥塞控制 5.支持一对一、一对多、多对一和多对多的交互通信(需要组播的通信都是建立在UDP之上)

 

4.传输控制协议TCP

端到端的、可靠的、面向连接的字节流服务 a).面向连接:先建立逻辑连接,进行双向数据流传输,通信结束后撤销连接 b).面向字节流 c).点对点的全双工通信 d).可靠传输:对一个连接上传输的每个字节编号,通过接收确认和重传来保证可靠传输 c).流量控制:防止发送方发出的数据超出接收方的接收能力

 

多路复用:源、目的端口 连接管理:序号、确认号、SYN、FIN 可靠传输:序号、确认号 流量控制:接收窗口 拥塞控制:未在TCP首部中体现(序号、确认号、接收窗口)

4.1.连接管理
  • 每条TCP连接是一对点到点的字节流

  • 每条TCP连接者两个端点,即套接字(sokect)={IP : port}

  • 每条TCP连接由两个端点唯一标识,TCP连接={socket1, socket2} = {{IP1 : port1}, {IP2 : port2}}

  • TCP连接有3个阶段:连接建立、数据传输、连接释放

1)TCP连接建立的目的

①使通信双方确知对方的存在 ​ ②双方确定自己的初始序列号,并通知对方 ​ ③允许双方协商一些参数(最大报文长度、窗口大小等) ​ ④对传输实体资源进行分配

2)TCP连接建立的方式

采用客户端服务器方式(C/S),主动发起连接建立的应用进程叫做客户端,被动等待连接建立的叫服务器端。

3)连接建立(三次握手)

①服务器进程B被动打开连接,进入LISTEN(收听)状态,等待客户端发出请求 ​ ②客户进程A主动打开连接,向B发送连接请求报文段(报文段不挟带数据),SYN=1,序号=x,进入SYN-SENT(同步已发送)状态 ​ ③服务器进程B收到请求后,向A发送确认报文段(报文段不挟带数据),SYN=1,ACK=1,确认号=x+1,序号=y,进入SYN-RCVD(同步收到)状态 ​ ④客户进程A收到确认后,向B发送确认报文段(报文段可以携带数据,不携带数据时不消耗序号,下一个序号依然是x+1),ACK=1,确认号=y+1,序号=x+1,进入ESTABLISHED(已建立连接)状态,B收到确认后,也进入ESTABLISHED状态

 

为什么A需要向B发送最后一个确认报文段:为了防止“已失效的连接请求报文段”突然又传到B发生错误,以至于B一直等待A发送数据,B的资源被浪费。

4)连接释放(四次挥手)

①A,B都处于ESTABLISHED状态; ​ ②客户进程A主动关闭连接,向B发送连接释放请求报文段(报文段不挟带数据),FIN=1,序列号=u,进入FIN-WAIT-1(终止等待1)状态; ​ ③B收到A的连接释放报文段后,应答确认,ACK=1,确认号=u+1,序号=v,进入CLOSE-WAIT (关闭等待)状态,B仍然可以向A发送数据,A进入FIN-WAIT-2(终止等待2)状态; ​ ④若B已经没有向A的数据,其应用进程通知TCP连接释放,B向A发送连接释放报文段,FIN=1,ACK=1,确认号=u+1,序号=w,进入LAST-ACK(最后确认)状态; ​ ⑤A收到B的链接释放报文段后,应答确认,ACK=1,确认号=w+1,序号=u+1,进入TIME-TIME-WAIT(时间等待)状态,B收到A的确认后,进入CLOSED状态

 

A必须经过时间等待计时器设置的时间2MSL(默认2分钟)后,进入CLOSED状态:确保A发送的最后一个ACK报文段能够到达B;防止“已失效的连接请求报文段”出现在本连接中。

4.2可靠传输
  • 发送方的TCP:维护一个发送缓冲区

  • 维护3个指针:LastByteAcked、LastByteSent、LastByteWritten

  • 发送窗口=min(通知窗口,拥塞窗口)

  • 累积确认(Cumulative ACK) :对按序到达的最后一个报文段进行确认

  • 选择确认(Selective ACK) :确认接收到的不连续的数据块的边界(使用首部的SACK选项,不影响确认号字段的使用)

 

4.3.流量控制

目的:为了防止发送方给慢接收方发数据造成接受崩溃,缓冲区溢出 原理:接收方通知发送方自己的接受窗口大小,发送方的发送窗口≤接收方的接受窗口

问题:

B向A发送了零窗口报文段后,B的接受缓存有了一些存储空间,于是B向A发送了rwnd=400的报文段,然而报文段在传送过程中丢失,这样A一直等待B发送的非零窗口通知,B一直等待A发送数据,从而形成死锁局面。

解决:

TCP为每一个连接设置一个持续计时器,只要TCP链接一方收到零窗口通知,就启动持续计时器,计时器到期,发送零窗口探测报文段,而对方就在确认这个探测报文段时给出现在的窗口值,①如果窗口仍然是零,那么重新设置持续计时器;②否则死锁的僵局就可以打破。

4.自适应重传
1)超时重传

报文段的往返时间:RTT 加权平均往返时间:RTTS RTT的偏差加权平均值:RTTD 超时重传时间:RTO RTTS = (1 - α) * RTTS + α * 新的RTT样本值 (α一般为1/8) RTTD = (1 - β) * RTTD + β * | RTTS - 新的RTT样本值 | (β一般为1/4) RTO = RTTS + 4 * RTTD

Karn算法: ①每次超时重传一个报文段时,停止计算新RTT样本值 ②每次超时重传一个报文段时,就把超时重传时间RTO增大y倍(一般为2倍) ③当不发生报文段重传时,才计算RTTS和超时重传时间RTO

2)快速重传

原因:超时重传作为TCP最基本的重传机制,效率较低。

 

超时的粗粒度实现方法导致连接在等待一个定时器超时时,很长一段时间连接无效。

基本思想: ①接收方:当报文段到达,立刻回复ACK,即使该序号已被确认过 ②发送方:收到一个重复ACK(同一个确认的再一次重传称为重复确认),就知道接收方必定收到乱序到达的报文段,表明其前面的分组可能丢失。收到3个重复ACK时,立刻触发重传。

5.拥塞控制
1)窗口大小

MaxWindow = min (cwnd, AdvertisedWindow) 拥塞窗口cwnd (Congestion Windows):拥塞控制算法决定,可以同时发出的最大字节数以防止造成网络拥塞 通知窗口 (AdvertisedWindow):接收方决定,可以同时发出的最大字节数以防止超出接收方的接收能力

2)拥塞控制算法

①慢启动 把初始拥塞窗口 cwnd 设置为不超过2至4个SMSS(最大报文段长度),在每收到一个对新的报文段的确认后,把cwnd增加1个 SMSS 的数值数(每经过一个传输轮次,cwnd就加倍) 设置一个慢开始门限ssthresh 当cwnd < ssthresh时,使用慢开始算法 当cwnd ≥ ssthresh时,使用拥塞避免算法 

②拥塞避免(加法增大):每经过一个往返时间RTT把发送方的cwnd加1,使得cwnd慢性增加 ③快重传(乘法减小):收到3个重复ACK立即触发重传 ④快恢复(在快重传之后)

  1. ssthresh减小为当前cwnd的一半:ssthresh = cwnd / 2

  2. 新拥塞窗口 cwnd = 新的 ssthresh

  3. 执行拥塞避免 (AIMD),使cwnd缓慢线性增大。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值