基本理论和基本机制
端到端的连接
传输层vs网络层
网络层:提供主机之间的逻辑通信
传输层:提供应用进程之间的逻辑通信
位于网络层之上、依赖网络层服务、对网络层服务进行可能的增强
1.多路复用和多路分用:
接收端:多路分用
相同目的地址目的端口号的UDP会被导向同一个socket
每个srcIp srcPort DestIp DestPort 导向自己独有的socket(创建多个socket)
(服务器也可以让一个进程创建多个线程与tcp连接绑定)
发送端:多路复用
2.可靠数据传输机制
什么是可靠?不错、不乱、不丢
可靠数据传输协议
- 可靠数据传输对应用层、传输层、链路层都很重要
- 网络Top-10问题
-
信道的不可靠性决定了可靠数据传输协议(RDT)的复杂性
可靠数据传输协议
- 只考虑单向数据传输(但是控制信息双向流动)
- 利用状态机(Finite State Machine,FSM)刻画传输协议
滑动窗口协议
- 窗口 :允许使用的序列号范围
窗口尺寸为N:最多有N个等待确认的消息 - 滑动窗口 :随着协议的运行,窗口在序列号空间内向前滑动
- 滑动窗口协议:GBN,SR
GBN
1.发送方 分组头部包含k-bit序列号
窗口尺寸为N,最多允许N个分组未确认

ACK(n):确认到序列号n包含n的分组均以被正确接收(可能收到重复ACK)
为空中的分组设计计时器
超时时间:重传序列号大于等于n,还未收到ACK的所有分组
3.流量控制机制
4.拥塞控制机制
Internet的传输层协议:(TCP/UDP均不保障延迟/带宽)
TCP(可靠的、按序交付服务):

序列号:表示本报文段所发送数据的第一个字节的编号。而不是报文段的编号(这里防止被攻击混入其他的段难以检测的问题)。
建立TCP连接时,双方随即选择序列号
ACKs表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。
累计确认:该序列号之前所有的字节均已被正确接收到(GBN)

TCP在IP层提供的不可靠服务基础上实现可靠数据传输服务
流水线机制
累积确认
TCP使用单一重传定时器
触发重传的事件
超时
收到重复ACK
渐进式
暂不考虑重复ACK
暂不考虑流量控制
暂不考虑拥塞控制
1.点对点 一个sender 一个 reciever
2.可靠的、按序的字节流
3.流水线机制
TCP拥塞控制
拥塞原因
- 拥塞 :非正式定义:“太多发送主机发送了太多数据或者发送速度太快
,以至于网络无法处理”。(导致大量的资源浪费)
表现:
分组丢失(路由器缓存溢出)
分组延迟过大(在路由器缓存中排队)
拥塞控制方法(为什么选在传输层做拥塞控制)
- 端到端拥塞控制
网络层不需要显式的提供支持
端系统通过观察loss,delay等网络行为判断是否发生拥塞(TCP采取这种方法) - 网络辅助的拥塞控制
路由器向发送方显式地反馈网络拥塞信息
简单的拥塞指示(1bit):SNA,DECbit, TCP/IP ECN, ATM)
指示发送方应该采取何种速率
案例:

TCP拥塞控制原理
- Sender限制发送速率
LastByteSent-LastByteAcked<= CongWin
rate ≈ CongWin*RTT Bytes/sec - CongWin:
动态调整以改变发送速率
反映所感知到的网络拥塞 - 如何感知网络拥塞
Loss事件=timeout或3个重复ACK
发生loss事件后,发送方降低速率 - 如何合理地调整发送速率
加性增—乘性减: AIMD
原理:逐渐增加发送速率,谨慎探测可用带宽,直到发生loss
Additive Increase: 每个RTT将CongWin增大一个MSS(最大段长度)——拥塞避免
Multiplicative Decrease: 发生loss后将CongWin减半
慢启动: SS
原理:当连接开始时,指数性增长
TCP连接建立时,CongWin=1
例:MSS=500 byte,RTT=200msec,初始速率=20k bps,可用带宽可能远远高于初始
速率:希望快速增长
指数性增长:初始速率很慢,但是快速攀升
每个RTT将CongWin翻倍
收到每个ACK进行操作
SS慢启动
何时应该指数性增长切换为线性增长(拥塞避免)?
当CongWin达到Loss事件前值的1/2时.
实现方法:利用一个变量 Threshold, Loss事件发生时, Threshold被设为Loss事件前CongWin值的1/2。
Loss事件处理办法
3个重复ACKs:CongWin切到一半然后线性增长
Timeout事件:CongWin直接设为1个MSS,然后指数增长,达到threshold后, 再线性增长(拥塞更严重了)
TCP拥塞控制算法
Th = ?
CongWin = 1 MSS
/* slow start or exponential increase */
While (No Packet Loss and CongWin < Th) {
send CongWin TCP segments
for each ACK increase CongWin by 1
}
/* congestion avoidance or linear increase */
While (No Packet Loss) {
send CongWin TCP segments
for CongWin ACKs, increase CongWin by 1
}
Th = CongWin/2
If (3 Dup ACKs) CongWin = Th;
If (timeout) Cong
4.接收方/发送方缓存
5.全双工:同一连接中能传输双数据流
6.面向连接(连接管理)
通信双发在发送数据之前必须建立连接
连接状态只在连接的两端中维护,在沿途节点并不维护状态
TCP连接包括:两台主机上的缓存、连接状态变量、socket等
客户端初始化的序列号是随机的



7.流量控制机制:发送方不会传输的太多、太快以至于淹没接收方(buffer溢出)

接收方为TCP连接分配buffer
上层应用可能处理buffer中数据的速度较慢
速度匹配机制
Receiver通过在Segment的头部字段将RcvWindow 告诉Sender
Sender限制自己已经发送的但还未收到ACK的数据不超过接收方的空闲RcvWindow尺寸
Receiver告知SenderRcvWindow=0时,即使=0发送方也可以发送一个很小的段,防止接收不到接下来的RecvWindow
8.复用/分用
UDP(不可靠的交付任务):
1.基于“尽力而为”的网络层,没有做(可靠性)
丢失
非按序到达
2.基于Internet IP协议
复用/分用
简单的错误校验
3.无连接
UDP发送方和接收方之间不需要握手
每个UDP段的处理独立于其他段
UPD优点:
1.无需建立连接(减少延迟)-DNS
2.实现简单,无需维护连接状态
3.头部开销小(8byte)
4.没有拥塞控制:应用可更好的控制发送时间和速率
常用于流媒体应用
1.容忍丢失
2.速率敏感
DNS/SNMP
在UDP上实现可靠数据传输
- 在应用层增加可靠性机制
-
应用特定的错误恢复机制
UDP报文段格式
UDP校验和:检测UDP段在传输过程中是否发生错误
网友评论