TCP连接管理
建立的是虚连接(抽象出来的连接),不是物理连接
unix 为例
// SOCK_STREAM标志为TCP
SOCKET* socket = socket(AF_INTF, SOCK_STREAM);
// connect、bind...
连接建立的过程
第一步
客户端发送SYN置1,seq=client_isn(随机产生的序号)。
无数据消耗序号
第二步
服务端返回一个SYN置1,seq=server_isn(随机产生序号),ack=client_isn + 1(期望接受的下一个byte的序号)
无数据,消耗序号。
第三步
客户端发送SYN置0,seq=client_isn + 1,ack=server_isn + 1(期望服务器发给下一个byte的序号)。
可以包含数据,不消耗序号
连接关闭
第一步
客户端发送FIN置1的包,seq=x
第二步
服务器发送1个ACK置1,seq=x + 1的确认包,服务器关闭连接,并发送FIN=1,seq=y包。
第三步
客户端收到FIN,回复ACK=y+1。
端口探测
TCP,发送包端口不存在地址不存在,发送RST。
UDP,ICMP。
如何知道端口上有进程占用:可以使用nmap
三个标志位的意义
SYN: 初始化一个TCP连接。
FIN:client或者server关闭TCP连接。
RST:端口上没有进程监听。
拥塞控制
congestion: 拥塞(top 10 problem)
拥塞表现:
- 很长的延时。(数据包在节点排队)
- 丢包。(缓存溢出)
流程控制:端到端的控制,接收方的缓冲区没有额外空间。
拥塞控制:整个网络的带宽不足,指网络上的router。
三种场景
无重传、无流控、无拥控
output link capacity: R
original data:
λ
i
n
\lambda_{in}
λin
through put:
λ
o
u
t
\lambda_{out}
λout
最大的预计输出量: R 2 \frac {R} {2} 2R
发生拥塞的预计输出量: l i m λ i n → ∞ = R 2 lim_{\lambda_{in} \to \infin} = \frac {R} {2} limλin→∞=2R
存在重传
重传数据 + 原始数据: λ i n ′ \lambda_{in}' λin′
理想情况: λ i n = λ i n ′ \lambda_{in} = \lambda_{in}' λin=λin′, λ i n ′ = λ o u t \lambda_{in}' = \lambda_{out} λin′=λout
分组迟到(冗余情况)
假设每个分组都发送了2次, λ i n ′ = R 2 \lambda_{in}' = \frac {R} {2} λin′=2R, λ o u t = R 4 \lambda_{out} = \frac {R} {4} λout=4R
有两个主机共享一个router
router中存在两个输入两个输出:
- 主机一: λ i n 1 , λ o u t 1 \lambda_{in_1}, \lambda_{out_1} λin1,λout1
- 主机二: λ i n 2 , λ o u t 2 \lambda_{in_2},\lambda_{out_2} λin2,λout2
当 λ i n 1 → ∞ \lambda_{in_1} \to \infin λin1→∞ 有 λ o u t 2 → 0 \lambda_{out_2} \to 0 λout2→0。
控制方法
- 端到端的拥塞控制(没有明确的反馈)
- 基于网络的拥塞控制(有直接反馈信息)
基于网络的拥塞控制
当网络中的router发生拥塞时,这个router直接会反馈给发送方**“I am congested!”**
到达端后也会反馈给发送方。
ATM—异步传输网络
Asynchronous Transfer Mode,面向虚电路的方式处理包交换。
ABR:available bit rate。
分组固定53bytes。
RM cells
RM cells: 资源管理信元,发送方产生,一定比例夹杂在数据信元中。
- NI bit: 不是很大的拥塞。
- CI bit: 较大拥塞。
两个bytes的ER(explicit rate 显示速率),表示发送方可以支持的最大速率。
one-bit EFCI(显示转发拥塞指示)in data cells(CI bit will be put)
TCP的拥塞控制
端到端的拥塞控制,基于IP层不支持基于网络的拥塞控制。
没感知到拥塞,适当增加发送速率。
感知到拥塞就适当降低。
如何限制发送速度
定义cwnd为拥塞窗口。
L a s t B y t e S e n t − L a s t B y t e A c k e d ≤ c w n d LastByteSent - LastByteAcked \leq cwnd LastByteSent−LastByteAcked≤cwnd
发送方发送的数据量 λ = m i n ( c w n d , r w n d ) \lambda = min(cwnd, rwnd) λ=min(cwnd,rwnd)
cwnd是动态的,由判断拥塞的函数随时改变。
速率: r a t e = c w n d R T T rate = \frac {cwnd} {RTT} rate=RTTcwnd bytes/sec
如何判断网络拥塞
- 丢包
- 发送方收到三个冗余确认认为丢包
- 超时
TCP时自记时,收到确认,窗口会扩大。
何种算法改变发送速率
有以下三种规则:
- 丢包指示拥塞(lost)
- 应答指示无拥塞(ACK)
- 试探性感知带宽:适当增加速率,直到产生丢包事件。
TCP拥塞控制方法
慢启动
特点:从一个很小的cwnd开始,指数级增加发送速率,直到产生丢包事件。
最开始:cwnd =1 MSS
过程:每一轮(一个RTT)增加一倍的报文段数量。
each ACK recieved,cwnd = cwnd + 1 (MSS)
何时结束:
- 丢包事件, s s t h r e s h = c w n d 2 ssthresh = \frac {cwnd} {2} ssthresh=2cwnd,cwnd = 1 (MSS)开始消耗网络中的拥塞,回到慢启动的状态。
- 当window达到 s s t h r e s h ssthresh ssthresh时,进入拥塞避免状态。
- 收到三个冗余ACK, s s t h r e s h = c w n d 2 ssthresh = \frac {cwnd} {2} ssthresh=2cwnd, c w n d = s s t h r e s h + 3 ( M S S ) cwnd = ssthresh + 3 (MSS) cwnd=ssthresh+3(MSS),开始快速重传和快速回复。
拥塞避免状态
一轮(1 RTT)增长1 MSS,cwnd增涨 M S S 2 c w n d \frac {MSS^2} {cwnd} cwndMSS2
- 丢包
- s s t h r e s h = c w n d 2 ssthresh = \frac {cwnd} {2} ssthresh=2cwnd
- c w n d = 1 cwnd = 1 cwnd=1 (MSS)
- 开始慢启动
快速重传
当发生冗余ACK,立即重新传送这个包。
快速回复
每收到一个冗余ACK,cwnd增加一个MSS。
以下两种情况:
- 超时
- s s t h r e s h = c w n d 2 ssthresh = \frac {cwnd} {2} ssthresh=2cwnd
- c w n d = 1 cwnd = 1 cwnd=1 (MSS)
- 开始慢启动
- 新的ACK(说明快速重传已经到达接收方)(每产生拥塞)
- c w n d = s s t h r e s h cwnd = ssthresh cwnd=ssthresh
- 降低cwnd后进入拥塞避免状态
3个冗余ACK,一般使用的标准(Reno):
s
s
t
h
r
e
t
h
=
c
w
n
d
2
c
w
n
d
=
s
s
t
h
r
e
t
h
+
3
M
S
S
ssthreth = \frac {cwnd} {2} \\ cwnd = ssthreth + 3 MSS
ssthreth=2cwndcwnd=ssthreth+3MSS
TCP—“long, fat pipes”